Обмотки Set и Reset, таймеры
В наборе программных компонентов имеются специализированные обмотки SET и RESET, обозначенные в линейке кнопок как и
Если обмотка S «срабатывает», т.е. примет значение ИСТИНА (TRUE), то изменить это состояние на противоположное, т.е. ЛОЖЬ (или FALSE), можно лишь с помощью обмотки R. Работу обмоток S и R рассмотрим на примере схемы управления включением и выключением катушки кратковременным нажатием двух кнопок (PUSK и STOP).
Создайте новый проект на языке LD и соберите схему
Проект управления обмоткой реле Y2 на языке LD
Все переменные проекта имеют тип BOOL. Для управления кнопками создайте форму визуализации
Визуализация управлением реле Y2
Кнопку пуск необходимо связать с переменной PUSK, кнопку STOP с переменной STOP, индикатор с реле Y2.
Эта схема работает как классический RS – триггер: при кратковременном нажатии кнопки ПУСК срабатывает катушка S, которой присвоено имя Y1, и своими контактом Y1 включает нагрузку – катушку Y2. Выключить реле Y2 можно только нажатием кнопки СТОП.
Одновременное нажатие на ПУСК и СТОП как в классическом RS – триггере недопустимо.
Следует заметить, что катушкам S и R присвоено одно и то же имя. В нашем примере Y1.
Таймеры
Большинство технологических процессов разбито на временные интервалы, чередующиеся события, что и легло в основу самого определения событийно управляемой логики. Для формирования этих временных интервалов и фиксации событий в CoDeSys применяются в основном три типа таймеров: TP, TOF и TON.
Для того, чтобы использовать таймеры, необходимо нажать кнопку «функциональный блок» на панели инструментов.
Вызов ассистента ввода
В открывшемся окне необходимо выбрать интересующий таймер
Окно выбора таймера
На рисунке приведены временные диаграммы, иллюстрирующие работу таймеров.
временные диаграммы работы таймеров
Рассмотрим работу таймеров в контексте нашего примера – пусть необходимо запускать технологическое оборудование (например транспортер) с выдержкой времени 4с при пуске (для того, чтобы оповещать персонал об опасности).
Для этого необходимо добавить таймеры TP и TON (TP для работы звонка, а TON для отсчета выдержки времени включения транспортера). Схема на языке LD приведена на рисунке
программа на языке LD для задержки включения с оповещением
Объявление переменных таймеров показано на рисунках
объявление таймера TP
объявление таймера TON
окно переменных проекта
Уставку срабатывания вводят в следующем формате: буква T, затем #, потом требуемое значение задержки и единицу времени. Временные уставки задают в миллисекундах (mS), секундах (S), или часах (h). Обратите внимание, для корректной работы уставка второго таймера должна быть меньше уставки первого. Проверьте работу вашей программы.
Окно ассистента ввода.
Пусть необходимо нормально разомкнутый контакт соединить с дискретным входом 1, а катушку реле с дискретным выходом 1. Для этого нужно объявить две переменные «А», связанную с дискретным входом, и «B», связанную с 1 дискретным выходом.
Если необходимо работать с другими портами, адреса портов можно посмотреть в окне конфигурации ПЛК
Объявление переменной «А»
Объявление переменной «B»
В окне объявления переменных появились две переменных ,теперь необходимо присвоить их элементам релейной цепи
Присвоение элементам релейной цепи переменных. Теперь можно загрузить программу в ПЛК и проверить ее работу.
TON — реализует функцию таймера на включение временной задержки.
Если входной параметр IN изменяется от False к True, включение задерживается на интервал времени указанный на входе PT. После истечения времени на входе PT, значение True отображается на выходе Q. Время, которое уже прошло указано на выходе ET.
Примечание: вход IN и выход OUT могут иметь отрицательные значения.
Таблица 3.2 Описание параметров функции TON
| Параметр | Тип данных | Описание |
| IN | BOOL | Если на вход поступило True то элемент начинает работу. |
| PT | TIME | Текущий интервал для временной задержки |
| Q | BOOL | TRUE если IN = TRUE и ET >= PT FALSE если IN = FALSE и ET <PT |
| ET | TIME | Прошедший интервал времени |
Временная диаграмма для блока TON изображена на рисунке 3.2.
Рис.3.2 Временная диаграмма TON
TOF — реализует функцию таймера на выключение временной задержки.
Если входной параметр IN изменяется от True к False, выключение задерживается на интервал времени указанный на входе PT. После того как время входа PT истекло, значение False отображается на выходе Q. Время, которое уже прошло указано на выходе ET.
Примечание: вход IN и выход OUT могут иметь отрицательные значения.
Таблица 3.3 Описание параметров функции TOF
| Параметр | Тип данных | Описание |
| IN | BOOL | Если поступило True таймер РТ включается. |
| PT | TIME | Текущий интервал для временной задержки |
| Q | BOOL | TRUE если IN = TRUE и ET <PT FALSE если IN = FALSE и ET >= PT |
| ET | TIME | Прошедший интервал времени |
Временная диаграмма для блока TOF изображена на рисунке 3.3.
Рис.3.3 Временная диаграмма TOF
Создание и использование аналоговых входов и выходов. Чтобы просмотреть значения аналогового модуля необходимо создать переменную. Задать переменной имя, а в поле I\O address указать адрес %IW0; тип данных переменной WORD. Ниже на рисунке показано соединение переменной аналогового входа и переменной аналогового выхода.
Рис. 3.4 Изображение аналоговых сигналов
Пример решения задачи с одним выходом показан на рисунке 3.5.
Рис 3.5 Пример индикации одного выхода
Запускаем PC WORX. Меню File – New Project… — ILC1xx – ILC130ETH.
Создаём функциональный блок (ФБ): правой кнопкой мыши щёлкаем на папке Logical POUs – Insert – Function Block (рис. 3.6).

Рис. 3.6 Вставка ФБ
Задаём ему имя и указываем какой язык будет использоваться — FBD (рис. 3.7).
В main ФБ решаем задание, указывая в таблице переменных входы и выходы. А в главном окне вызываем ФБ и подключаем входы и выходы.
Задание на лабораторную работу:
1. Создать свой функциональный блок, который будет осуществлять индикацию четырёх выходов. В главном окне МЭК программирования использовать 5 входных сигнала, подключаемых к своему функциональному блоку, с разными режимами индикации.
2. Используя потенциометр, подключённый к аналоговому модулю, задействовать выходную индикацию. Использовать значения потенциометра 1, 3, 5, 7, 9. Алгоритм индикации выходов (Q1, Q2, Q3, Q4) выбирается по номеру бригады. В таблице указаны единицей выходы, которые должны гореть.
Таблица 3.4 Выбор варианта
| Значения потенциометра № вар | 1 | 3 | 5 | 7 | 9 |
| 1 | 0001 | 0011 | 0101 | 1101 | 1001 |
| 2 | 1011 | 1000 | 0000 | 0010 | 0110 |
| 3 | 0111 | 1010 | 0100 | 1100 | 1110 |
| 4 | 1111 | 0000 | 0110 | 0010 | 1101 |
| 5 | 0100 | 0011 | 1011 | 1110 | 0001 |
| 6 | 0101 | 0111 | 1000 | 1010 | 1111 |
| 7 | 1100 | 0000 | 0111 | 1001 | 0010 |
| 8 | 0100 | 0011 | 1011 | 110 | 1110 |
| 9 | 1111 | 0001 | 0101 | 1101 | 0110 |
| 10 | 1000 | 0010 | 1001 | 0111 | 1010 |
| 11 | 0110 | 0100 | 1001 | 0111 | 1111 |
| 12 | 0101 | 1011 | 1110 | 0001 | 0110 |
Требования к содержанию протокола:
1. Титульный лист с указанным номером лабораторной работы и темой.
2. Задание к лабораторной работе.
3. Выбор варианта.
4. Описание хода выполнения работы, выбранных блоков и обоснование своего выбора.
5. Описание и иллюстрация правильно работающей программы.
1. Создание функционального блока?
2. Каково назначение элемента SEL?
3. В чём различие между элементами TOF и TON?
4. Какие параметры содержит элемент AND, OR? Таблицы истинности булевых функций.
5. Порядок загрузки программы в память контроллера?
6. Запуск и отладка программы?
7. Как работает аналоговый модуль?
ЛАБОРАТОРНАЯ РАБОТА №3
«РАБОТА В РЕЖИМЕ СИМУЛЯЦИИ»
Цель работы: Научиться работать в режиме off-line (режим симуляции)
Задание на лабораторную работу: Повторить лабораторную работу №2 в режиме симуляции.
1. Создаём новый проект. Выбираем ILC 430 и выше.
2. В Bus Configuration выбираем вкладку Communication, а в ней Simulation.
3. Из Device catalog выбрать Phoenix Contact -> IL -> Bus Coupler — > IBS IL 24 BK T\U. Далее выбрать нужно количество входов и выходов из папок I\O analog, I\O digital, аналоговые и цифровые соответственно.
4. Создаем проект в IEC Programming.
5. Всем созданным переменным в программе присваивается тип переменных – VAR_GLOBAL_PG и сохраняются в папке default по умолчанию.
6. В окне Process data присваиваем переменным входы и выходы с правого окошка.
7. Загружаем проект и стартуем. Внизу, в панели задач, появится программа EasySim. Открыв её можно включать и выключать входы и выходы.
ЛАБОРАТОРНАЯ РАБОТА №4
«СОЗДАНИЕ ФУНКЦИЙ»
Цель работы: Научиться создавать и использовать функции.
Задание на лабораторную работу: На основе минимизации булевых функций создать программу где, функции решаються в FU, а результат в главном окне main.
1. Открываем новый проект. (online или offline режимы).
2. Так же как и функциональный блок, создаём функцию. Созданная функция должна вернуть значение в main.
Выбор варианта задания:
| № вар | Функция №1 | Функция №2 |
| 1. | Y = “1” (1, 3, 7, 9, 11, 12, 15). | Y = “0” (0, 2, 8, 9, 10, 13, 15). |
| 2. | Y = “0” (0, 1, 5, 6, 10, 13, 14). | Y = “1” (1, 2, 4, 6, 9, 13, 15). |
| 3. | Y = “1” (0, 3, 5, 7, 11, 12, 14). | Y = “0” (1, 3, 4, 7, 11, 13, 15). |
| 4. | Y = “0” (0, 1, 2, 4, 10, 13, 15). | Y = “1” (1, 2, 3, 9, 10, 11, 12). |
| 5. | Y = “1” (1, 2, 7, 8, 10, 11, 15). | Y = “1” (1, 6, 7, 8, 10, 12, 13). |
| 6. | Y = “1” (0, 2, 3, 4, 6, 14, 15 ). | Y = “0” (0, 3, 3, 5, 6, 13, 14 ). |
| 7. | Y = “0” (2, 5, 6, 8, 9, 10, 13). | Y = “1” (2, 4, 7, 8, 9, 11, 14). |
| 8. | Y = “0” (4, 6, 7, 9, 11, 13, 15). | Y = “0” (2, 3, 8, 10, 12, 13, 14). |
| 9. | Y = “1” (2, 3, 5, 6, 11, 13, 14). | Y = “1” (0, 3, 4, 6, 9, 10, 15). |
| 10. | Y = “0” (4, 7, 8, 10, 12, 13, 15). | Y = “0” (1, 2, 3, 6, 7, 9, 11). |
ЛАБОРАТОРНАЯ РАБОТА №5
«ЗНАКОМСТВО С ЯЗЫКАМИ ПРОГРАММИРОВАНИЯ IEC 61131-3».
Цель работы: Научиться создавать и использовать функциональные блоки.
Краткие теоретические сведения:
В стандарт IEC 61131-3 входит 5 языков программирования: LD, FBD, IL, SFC, ST.
Рис. 1.1 IL — Список инструкций
Рис. 1.2 ST — Структурный текст
Рис. 1.3 FBD – Диаграммы функциональных блоков
Рис. 1.4 SFC — Язык последовательных функциональных схем
Рис. 1.5 LD – релейных диаграмм.
1.1 Язык программирования LD:
Базовые элементы языка LD: базовыми элементами являются катушки и контакты. Контакт передаёт состояние горизонтальной связи левой стороны горизонтальной связи правой стороны. Это состояние – результат булевой операции И. Контакты бывают нормально разомкнуты и нормально замкнутые.
В нормально разомкнутых контактах состояние левой связи копируется к правой связи, если связанная булева переменная находится в состоянии ON, иначе состояние правой связи будет OFF.
В нормально замкнутых контактах состояние левой связи копируется к правой связи, если связанная булева переменная находится в состоянии OFF, иначе состояние правой связи будет OFF.
Рис.1.1.1 Поле для редактирования элементов языка.
Катушка передаёт состояние горизонтальной связи на левой стороне неизменяемым горизонтальной связи на правой стороне. В этом процессе состояние связанной переменной или прямого адреса будет сохранено. В катушках состояние левой связи копируется к связанным булевой переменной и к правой связи. Катушки обычно следуют за контактами или блоками FB, они могут также сопровождаться контактами. Катушки бывают инвертированными, установленными, катушки сброса.
В инвертированных катушках состояние левой связи копируется к правой связи. Инвертированное состояние левой связи копируется к связанной булевой переменной. Если левая связь находится в состоянии OFF, правая связь будет также в состоянии OFF и связанная переменная будет в состоянии ON.
В установленных катушках состояние левой связи копируется к правой связи. Связанная булева переменная устанавливается в состоянии ON, если левая связь находится в состоянии ON, иначе она остаётся неизменной. Связанная булева переменная может быть сброшена с катушкой сброса.
В катушках сброса состояние левой связи копируется к правой связи. Связанная булева переменная устанавливается в состоянии OFF, если левая связь находится в состоянии ON, иначе она остаётся неизменной. Связанная булева переменная может быть установлена с катушкой установленной.
Программу написанную на языке LD можно конвертировать в язык FBD. Также в языке LD используются переменные, функции и функциональные блоки. Пример использования показан на рисунке ниже.
Рис. 1.1.2 Применение функций и функциональных блоков в LD
1.2 Язык программирования IL.
Проведём аналогию между языками IL и FBD. Пример логического сложения и умножения показаны ниже.
Операторы языка IL
Для любых типов данных используются операторы:
Для любых числовых типов:
Для битовых типов данных – Логические операторы
Для числовых и битовых типов данных:
Для булевых типов данных:
А также могут использоваться в программе:
Примеры программирования на языке IL:
Синтаксис вызова функциональных блоков
Синтаксис операторов JUMP и RETURN
1.3 Язык программирования ST.
Базовые структуры языка ST представлены в таблице 1.3.1
Таблица 1.3.1 Элементы языка ST.
| Объявления, присвоения, операторы | Q_xAccess1 := False; Q_xAccess2 := I_xInput2 & Not I_xInput4; |
| Условия | If I_xInput1 & I_xInput2 Then Q_xAccess1 := True; ElsIf I_xAccess2 & I_xAccess3 Then Q_xAccess2 := True; End_If; |
| Вызов функций и аргументы | iCorrected := Limit(iMin, iBasis, iMax); |
| Вызов функциональных блоков и аргументы | CTU_Access(CU := xPulse, PV := iMaxvalue, RESET := xStop); iDisplay := CTU_Access.QV; xFull := CTU_Access.Q; |
| Циклы | Repeat iLoop := iLoop + 1; Until iLoop = 100 End_Repeat; |
Присвоение значений и операторы. Логическое выражение на языке ST и FBD
| ST | FBD |
| Q_xOutput1 := I_xInput1 & Not I_xInput2 Or I_xInput3; |
Вызов функций. Синтаксис: <Переменная> := <Имя функции (аргументы)>
Например: iCorrection := Limit(iMin,iMeasuredvalue,iMax);
Может использоваться функция как аргумент другой функции:
iCorrection := Limit(iMin,Word_To_Int(wRawsize),iMax);
Это выражение можно изобразить на языке FBD и выглядит оно следующим образом:
Рис. 1.3.1 Пример функции в функции
Вызов функционального блока. Приведём пример вызова функционального блока TON.
| На языке ST можно вызвать двумя способами: Первый способ: TON_Signal(IN := I_xInput, PT := tDelay); Q_xOutput := TON_Signal.Q; tSequence := TON_Signal.ET; Второй способ: TON_Signal.IN := I_xInput,; TON_Signal.PT := tDelay; TON_Signal(); Q_xOutput := TON_Signal.Q; tSequence := TON_Signal.ET; |
Язык ST имеет элементы высокоуровневого языка программирования:
1. Условия – конструкция IF расширенная и упрощенная
| If I_xSensor1 & Not I_xSensor2 Then (* Instructions 1 *) ElsIf I_xSensor2 & Not I_xSensor1 Then (* Instructions 2 *) Else If iMeasuredvalue < 100 Then (* Instructions 3 *) ElsIf iMeasuredvalue > 100 Then (* Instructions 4 *) End_If; End_If; | If (* Boolean condition *) Then (* Instructions *) End_If; |
2.Оператор выбор – CASE
| Case iProcesssize Of 7 : (* Instructions 1 *) -2..1 : (* Instructions 2 *) 2, 4 : (* Instructions 3 *) 8..16, 20..30 : (* Instructions 4 *) Else (* Instructions 5 *) End_Case; | Case iProcessstep Of 0 : (* Initialize *) If xInit_completed Then iProcessstep := 10; End_If; 10 : (* Execute Prozess 1 *) If xProcess1_completed Then iProcessstep := 20; End_If; 20 : (* Execute Prozess 2 *) If xProcess2_completed Then iProcessstep := 30; End_If; (* etc. *) 500 : (* Exceptionalhandling *) iProcessstep := 0; End_Case; |
3. Циклы – FOR, REPEAT, WHILE
Синтаксис цикла FOR:
For iIndex := 1 To 20 By 1 Do
(* The following instructions are executed with *)
(* the values 1 to 20 for the variable iIndex *)
If arrMachine[iIndex].iTemp >= iLimitvalue Then
arrMachine[iIndex].iBroken := True;
xAlarm := True;
Синтаксис циклов REPEAT/ WHILE
| REPEAT | WHILE |
| Repeat iIndex := iIndex + 10; Until iIndex >= iLimit End_Repeat; | While iIndex >= iLimit Do iIndex := iIndex + 10; End_While; |
Задание на лабораторную работу:
Выполнить задания указанные в таблице. Название задания должно совпадать с названием функции либо функционального блока.
| Задания | LD | FBD | IL | ST |
| Fu_XOR 3 | + | + | ||
| Fu_Kod | + | + | ||
| Fu_light | + | + | ||
| Fb_TTrigger | + | + | ||
| Fb_TimeDelay | + | + | ||
| Pg_Lock | + |
1. Fu_XOR 3 – Создать функцию которая будет выполнять действия исключающего ИЛИ.
2. Fu_Kod — Создать функцию кодового замка из лабораторной работы №2.
3. Fu_light – Управление освещением в длинном коридоре.
4. Fb_TTrigger – Создать функциональный блок, который будет работать как Т триггер.
5. Fb_TimeDelay — Создать функциональный блок, который будет выводить индикацию 2х выходов в режиме мигания.
6. Pg_Lock – Сейфовый замок.
1. Создаём проект на 430 ПЛК, включаем симуляцию. Подключение устройств INTERBUS произвести тогда, когда будет окончательно определено количество входов и выходов.
2. В Logic POUs вставить группу с названием FB_Group.
2.1 Вставить функциональные блоки с названиями: Fb_TTrigger_XX, Fb_TimeDelay_XX, Fb_TrafficLight_XX. Где ХХ – название языка на котором написан блок. Например: Fb_TTrigger_LD, Fb_TrafficLight_SFC, Fb_TimeDelay_LD_FBD.
3. В Logic POUs вставить группу с названием FU_Group.
3.1 Вставить функции с названиями: Fu_XOR 3_ХХ, Fu_Kod_ХХ. Где ХХ – название языка на котором написана функция. Например: Fu_XOR 3_LD, Fu_Kod_IL.
4. В каждом функциональном блоке и функции есть таблица переменных. Именно с таблицы переменных начинаем писать программу.
4.1 Открыть таблицу переменных. Создать блоки входных и выходных переменных. Создать переменные, установить тип данных для каждой переменной как показано на рисунке ниже. И так далее для каждого ФБ и функции.

Рис.1.3.2 Таблица переменных
4.2 На рабочем поле набрать программу на требуемом языке, используя подготовленные переменные.
5. Открыв свойства Main, переименовать его и дать название CALL_FB_FU. Вынести на рабочее поле все функциональные блоки и функции.
Посчитать количество входных и выходных переменных. Подключить устройства INTERBUS.
Запустить режим симуляции.
Требования к содержанию протокола:
1.Титульный лист с указанным номером лабораторной работы и темой.
2.Задание к лабораторной работе.
4.Подробное описание хода выполнения работы, выбранных блоков и обоснование своего выбора.
5.Описание и иллюстрация правильно работающих программ.
ЛАБОРАТОРНАЯ РАБОТА №6
“ЗНАКОМСТВО С ЯЗЫКАМИ ПРОГРАММИРОВАНИЯ IEC 61131-3. ЯЗЫК ПРОГРАММИРОВАНИЯ SFC”
Цель работы: Ознакомиться с основами программирования на языке SFC.
Краткие теоретические сведения:
Базовые структуры языка – Шаг – Действие – Переход.

Рис. 1 Базовые структуры
В дереве проекта кроме основного рабочего пространства для программирования языка SFC есть ещё две папки: Transitions – переходы, папка где собраны каждая программа переходов в отдельности; Actions – действия, папка где расположены модули программ для выполняемых действий.
Пример дерева проекта показан на рисунке ниже.
Рис. 2 Дерево проекта
Шаг. Стандартный шаг имеет по умолчанию значение флага. Начальный шаг всегда имеет инициализирующее значение. Шаг может иметь значение прыжка на другой шаг и шаг может быть конечным. Над шагом можно написать комментарий для быстрого определения значения шага.
Рис. 3. Значения шага.
Переход. Программируются переходы от шага к шагу. В переходе всегда входными переменными должны быть названия шагов или действий, а выходной переменной — имя этого перехода.
Действие. Блок действия может быть двух типов: Переменной и детальным действием. Если действие является переменной, т.е. булевым параметром – то оно изображается красным цветом. Если действие является детальным, то оно отображается зелёным цветом.
Рис.4. Действия двух типов
Детальное действие может быть написано на любом языке кроме SFC. Также действие может иметь свой идентификатор. По умолчанию стоит идентификатор N – не запоминаемое, т.е. действие активно столько сколько активен шаг. В иных случаях могут быть использованы и другие идентификаторы представленные в таблице 1.1:
| Значение | Описание | |
| S | Set | This action is continued until it is explicitly reset (even if the corresponding step becomes inactive). |
| R | reset | Terminates the execution of action previously started with character S. |
| L | time limited | After activating the corresponding step, the action is executed for the set time or until step becomes inactive. |
| D | time delayed | Delay starts when step becomes active. After a set time has passed, the action is executed until step is deactivated. If the step becomes inactive, before the set time has passed, the action is not executed. |
| P | pulse | Starts when step becomes active/inactive and is executed once. |
| SD | stored+ time delayed | The action is executed until reset, but only starts after time delay has passed. Even if the step is active for less a time than the time delay. |
| DS | time delayed+ stored | The action is executed until reset, but only starts after time delay has passed. Unlike with the previous character, this does not happen if the step becomes inactive before time delay has passed. |
| SL | stored+ time limited | The action is executed for the set time, even if the step is active for a shorter time. The action can be reset with the character R. |
Разветвления. В SFC используются разветвления двух типов: параллельные и альтернативные. Параллельные используются когда после перехода могут следовать несколько вариантов событий. Альтернативные используются тогда, когда после шага может быть несколько переходов.
Задание на лабораторную работу:
Написать программу на языке программирования SFC, которая будет показывать работу светофоров на перекрёстках. Варианты перекрёстков выбираются согласно номеру варианта.
1. Перекрёсток с мигающим (желтым) режимом. Автомобильный и пешеходный светофор.
2. Перекрёсток Т-образный. Автомобильный и пешеходный светофор.
3. Перекрёсток с трамвайными путями. Автомобильный и трамвайный светофор.
4. Перекрёсток с железнодорожным переездом. Автомобильный и Ж\Д светофор.
5. Перекрёсток с круговым движением. 3 съезда.
6. Перекрёсток с мигающим (желтым) режимом. Автомобильный светофор.
1. Создать Функциональный блок, который имеет 4 входных параметра и 3 выходных параметра.

Рис.5. Функциональный блок светофора
2. Таблица переменных выглядит следующем образом:


Рис. 1.2 Таблица переменных для светофора
3. Светофор на языке SFC показан ниже на рисунке.
Рис. 6. Светофор на языке SFC
4. Переходы представляют собой блок TON, где
— первый входной параметр это имя шага;
— второй входной параметр это имя входа ФБ;
— выходной параметр это имя перехода.
Рис. 7. Пример перехода
Требования к содержанию протокола:
1.Титульный лист с указанным номером лабораторной работы и темой.
2.Задание к лабораторной работе.
4.Подробное описание хода выполнения работы, выбранных блоков и обоснование своего выбора.
5.Описание и иллюстрация правильно работающих программ.
Дата добавления: 2018-08-06 ; просмотров: 4404 ; Мы поможем в написании вашей работы!
Таймеры и триггеры CODESYS. Еще один шаг Arduino к классическому ПЛК

Случается программировать контроллеры (ПЛК) в среде CODESYS. Все, кто имел дело с этой системой, знают, что в любом проекте присутствует библиотека Standard.lib, в которой реализованы базовые таймеры, триггеры, счетчики и некоторое кол-во других функций и функциональных блоков. Многие из этих блоков постоянно используются в программах для ПЛК. А сама библиотека, как и языки программирования CODESYS, является воплощением стандарта IEC 61131-3, т.е. призвана помочь при программировании классических ПЛК задач.
Одна из особенностей программ для ПЛК в том, что основной цикл программы должен выполняться без существенных задержек, в нем не должно быть внутренних циклов с неопределенным временем выхода или синхронных вызовов «задумчивых» функций, особенно это касается коммуникаций по медленным каналам. Обновление входных и выходным образов процесса происходит только на границе основного цикла, и чем дольше мы будем «сидеть» внутри одной итерации цикла, тем меньше мы будет знать о реальном состоянии объекта управления, в конечном итоге сработает watchdog переполнения времени выполнения цикла. Многие могут мне возразить, сказав, что современные ПЛК многозначны, есть с поддержкой аппаратных прерываний. Согласен, но разговор о таких системах не входит в мои планы, я же хочу поговорить о (квази, псевдо — выбирайте) ПЛК однозадачной реализации (без прерываний) на базе микропроцессорной платформы Arduino, в котором есть только один основной цикл. Кстати, не лишним будет сказать, что на написание данной заметки меня сподвигла статья Ардуино-совместимый ПЛК CONTROLLINO, часть 1 о попытке аппаратного воплощения Arduino в пром. ПЛК.
Несколько слов об Arduino. С точки зрения программиста ПЛК, Arduino — это типичный контроллер с одним очень быстрым или, наоборот, очень медленным циклом loop(). На время выполнения цикла не накладывается никаких ограничений, и он может отработать и один, и бесконечное кол-во раз — по замыслу программиста. Когда программа проста и сводится к выполнению последовательных операций, регуляторов, без параллельных событий, то достаточно чередовать операции бесконечными вложенными циклами проверки условий и синхронными задержками типа delay(). Последовательные шаги такой программы будут выполняться буквально построчно, просто и логично. Но, как только возникает необходимость в программировании параллельных операций, необходимо менять парадигму программы.
В однозадачной системе добиться видимой параллельности можно только очень быстрым последовательным сканированием параллельных состояний, не задерживаясь подолгу на каждом вызове функции или проверке условия. С физическими входами-выходами проблем нет, функции отрабатывают достаточно быстро, а вот delay() становится неоправданным тормозом. И вот тут на смену приходят неблокирующие таймеры, те самые, которые в программировании ПЛК являются классикой. Суть в том, что для их работы используется миллисекундный счетчик времени, и все действия привязаны к значениям этого глобального счетчика.
А теперь давайте вспомним ту самую Standard.lib из CODESYS. В ней как раз реализованы МЭК-овские неблокирующие таймеры. Я взял ее за основу и портировал функции таймеров и триггеров в библиотечный код Arduino (С++). Т.е. попытался приблизить Arduino к классическому ПЛК.
Ниже я приведу краткое описание портированных функциональных блоков (FB) CODESYS и их аналоги в моей библиотеке plcStandardLib, все временные диаграммы верны для новой библиотеки Arduino. Подробнее описание исходных блоков можно посмотреть, например, в русскоязычной справке по CODESYS.
TON — функциональный блок «таймер с задержкой включения»
Входы IN и PT типов BOOL и TIME соответственно. Выходы Q и ET аналогично типов BOOL и TIME. Пока IN равен FALSE, выход Q = FALSE, выход ET = 0. Как только IN становится TRUE, начинается отсчет времени (в миллисекундах) на выходе ET до значения, равного PT. Далее счетчик не увеличивается. Q равен TRUE, когда IN равен TRUE, а ET равен PT, иначе FALSE. Таким
образом, выход Q устанавливается с задержкой PT от фронта входа IN.
В Arduino IDE:
Временная диаграмма работы TON:

TOF — функциональный блок «таймер с задержкой выключения»
Входы IN и PT типов BOOL и TIME соответственно. Выходы Q и ET аналогично типов BOOL и TIME. Если IN равен TRUE, то выход Q = TRUE и выход ET = 0. Как только IN переходит в FALSE, начинается отсчет времени (в миллисекундах) на выходе ET. При достижении заданной длительности отсчет останавливается. Выход Q равен FALSE, если IN равен FALSE и ET равен PT, иначе — TRUE. Таким образом, выход Q сбрасывается с задержкой PT от спада входа IN.
В Arduino IDE:
Очень похоже на TON, для краткости:
Временная диаграмма работы TOF:

TP — функциональный блок «импульс-таймер»
Входы IN и PT типов BOOL и TIME соответственно. Выходы Q и ET аналогично типов BOOL и TIME. Пока IN равен FALSE, выход Q = FALSE, выход ET = 0. При переходе IN в TRUE выход Q устанавливается в TRUE и таймер начинает отсчет времени (в миллисекундах) на выходе ET до достижения длительности, заданной PT. Далее счетчик не увеличивается. Таким образом, выход Q генерирует импульс длительностью PT по фронту входа IN.
В Arduino IDE:
Очень похоже на TON, для краткости:
Временная диаграмма работы TP:

R_TRIG — функциональный блок «дeтектор фронта»
Функциональный блок R_TRIG генерирует импульс по переднему фронту входного сигнала. Выход Q равен FALSE до тех пор, пока вход CLK равен FALSE. Как только CLK получает значение TRUE, Q устанавливается в TRUE. При следующем вызове функционального блока выход сбрасывается в FALSE. Таким образом, блок выдает единичный импульс при каждом переходе CLK из FALSE в TRUE.
Пример CODEDESYS на языке ST:
В Arduino IDE:
F_TRIG — функциональный блок «дeтектор спада»
Функциональный блок F_TRIG генерирует импульс по заднему фронту входного сигнала.
Выход Q равен FALSE до тех пор, пока вход CLK равен TRUE. Как только CLK получает значение FALSE, Q устанавливается в TRUE. При следующем вызове функционального блока выход сбрасывается в FALSE. Таким образом, блок выдает единичный импульс при каждом переходе CLK из TRUE в FALSE.
В Arduino IDE:
RS_TRIG — функциональный блок RS-триггер / SR_TRIG — функциональный блок SR-триггер
Переключатель с доминантой выключения, RS-триггер:
Переключатель с доминантой включения:
Входные переменные SET и RESET1 — как и выходная переменная Q1 типа BOOL.
Примеры простейших программ для CoDeSyS

В этом посте представляю несколько простых программ для контроллеров, заточенных под CoDeSyS 2.3 и CoDeSyS 3.5. По максимуму представлены несколько вариантов языков программирования стандарта МЭК — ST, CFC, LD и др. Примеры программ CoDeSyS помогут вам в реализации той или иной задачи по автоматизации.
Из этой статьи вы узнаете:
Всем привет, дорогие друзья, на связи Гридин Семён. Я двигаюсь к своей цели, изучая робототехнике. Я читаю очень много информации по различным механическим узлам, по языкам программирования и одноплатным компьютерам.
Да, я изучаю язык программирования Python. Прохожу тесты в мобильном приложении SoloLearn. Очень рекомендую новичкам, кто только начинает изучать. Прога на русском языке. В каждом уроке вам объясняют значение каждого оператора, каждой команды, каждой функции. После урока вы сдаете тесты и проходите дальше. От простого к сложному.

Если кому интересно, пользуйтесь. Статья будет небольшая, так что не ругайтесь. Так как словами в этой теме много не опишешь, так что скачивайте и применяйте в своих программах.
Кстати, я сделал небольшой раздел электротехнических онлайн расчётов, если интересно, загляните сюда.
Ну что, друзья, поехали дальше…
Необходимое программное обеспечение и оборудование
В принципе я чаще всего применяю контроллеры компании ОВЕН — ПЛК100/150/154, ПЛК63/73, ПЛК110/160.
Насколько я помню, CoDeSyS применяют WAGO, Emko, Raspberry PI, и по-моему некоторые контроллеры ABB.

Итак, что нам нужно, чтобы начать работать:
- Среда программирования CoDeSyS;
- Необходимые библиотеки для среды программирования;
- Target-файл под ваше оборудование.
Более развернутый список контроллеров на CoDeSyS.
Отечественные ПЛК:
- Овен ПЛК
- Фаствел Fastwel IO
- СКБ ПСИС CP6000 (psisCON™)
- НИЛ АП NLcon-CE
- Раскат S-7188 microPLC, модуль 4S-PLCcore
- ПРОЛОГ МСТС
- ЭРГОС ТРС (Робот)
- АРКТУР КЭП-1
- ОАО Автоматика УЗС-К
Зарубежные ПЛК, применяемые в России:
- Beckoff
- Kontron
- WagoIO
- TURC
- Moeller, система программирования Xsoft
- Festo
- ABB
- Панельные ПЛК Berghof
- Mitsubishi топ модель System Q
- PMA
- HollySyS
- IFM
Примеры программ для CoDeSyS
Для помощи вам в разработке ПО для ПЛК прикрепляю небольшой перечень различных примеров.
