- •Материалы для подготовки к зачету
- •1. Введение
- •1.1 Понятие информации
- •1.2 Количество и качество информации
- •1.3 Понятие системы и ее свойства
- •1.4 Основные признаки систем
- •1.5 Понятие «черного ящика»
- •1.6 Иерархическая система
- •1.7 Управляющие системы
- •1.8 Прямая и обратная связь управления
- •1.9 Основные направления развития автоматизации управления
- •1.10 Автоматизированные системы управления технологическими процессами (асу тп)
- •1.11 Автоматизированная система управления производством (асуп)
- •2. Определение плк
- •3. Устройство плк
- •4. Введение в программирование плк
- •5. Компоненты организации программ (pou)
- •Присваивание значений параметрам функции
- •6. Данные и переменные
- •7. Структурированный текст (st)
- •8. Язык линейных инструкций (il)
- •9. Релейные диаграммы (ld)
- •10. Язык функциональных блок-схем – fbd
- •11. Язык программирования sfc (Sequential Function Chart)
8. Язык линейных инструкций (il)
Машинно-независимый МЭК 61131-3 ассемблер. IL поддерживает: * простое программирование на базе аккумулятора * полный набор МЭК 61131-3 операторов * ветвления * инверсию * комментарии * установку / сброс выходов * условные и безусловные переходы Операторы
Стандартные операторы IL с допустимыми модификаторами представлены в таблице.
Оператор |
Модификатор |
Описание |
LD |
N |
Загрузить значение операнда в аккумулятор |
ST |
N |
Присвоить значение аккумулятора операнду |
S |
|
Если аккумулятор ИСТИНА, установить логический операнд (ИСТИНА) |
R |
|
Если аккумулятор ИСТИНА, сбросить логический операнд (ЛОЖЬ) |
AND |
N,( |
Поразрядное И |
OR |
N, ( |
Поразрядное ИЛИ |
XOR |
N,( |
Поразрядное ИЛИ |
NOT |
|
Поразрядная инверсия аккумулятора |
ADD |
( |
Сложение |
SUB |
( |
Вычитание |
MUL |
( |
Умножение |
DIV |
( |
Деление |
MOD |
( |
Деление по модулю |
GT |
( |
> |
GE |
( |
>= |
QE |
( |
= |
NE |
( |
< > |
LE |
( |
<= |
LT |
( |
< |
JMP |
CN |
Переход к метке |
CAL |
CN |
Вызов функционального блока |
RET |
CN |
Выход из POU и возврат в вызывающую программу. |
Операторы S и R применяются только с операндами типа BOOL. Прочие операторы работают с любыми переменными базовых типов.
Приведенный список содержит операторы, поддерживаемые в обязательном порядке.
Модификаторы
Добавление к мнемонике некоторых операторов символов - модификаторов 'С' и 'N' модифицирует смысл инструкции.
Символ 'N' (negation) вызывает инверсию значения операнда до выполнения инструкции. Операнд должен быть типов BOOL, BYTE, WORD или DWORD.
Символ 'С' (condition) добавляет проверку условий к командам перехода, вызова и возврата. Команды JMPC, CALC, RETC будут выполняться только при значении аккумулятора ИСТИНА. Добавление символа 'N' приводит к сравнению условия с инверсным значением аккумулятора. Команды JMPCN, CALCN, RETCN будут выполняться только при значении аккумулятора ЛОЖЬ. Модификатор 'N' без 'С' не имеет смысла в данных операциях и не применяется.
Например: Первый оператор нашего примера LD помещает значение переменной r1 в аккумулятор, способный хранить значения любого типа. Как минимум один входной параметр любой операции берется из аккумулятора. Результат также всегда помещается в аккумулятор. Последний оператор нашего примера ST присваивает переменной sinus значение аккумулятора.
Формат инструкции
Текст на IL — это текстовый список последовательных инструкций. Каждая инструкция записывается на отдельной строке. Инструкция может включать 4 поля, разделенные пробелами или знаками табуляции:
Метка: Оператор Операнд Комментарий
Метка инструкции не является обязательной, она ставится только там, где нужно. Оператор присутствует обязательно. Операнд необходим почти всегда. Комментарий - необязательное поле, записывается в конце строки. Ставить комментарии между полями инструкции нельзя. Пример IL-программы:
МЕТКА1: LD Sync (*пример IL*)
AND Start
S Q
(*для красоты метку можно поставить в отдельную строку*)
МЕТКА2:
LD 2 (* у = 2 + 2 *)
ADD 2
ST y
Для лучшего восприятия строки IL выравнивают обычно в колонки по полям.
Помимо этого, редактор «налету» выполняет синтаксический контроль и выделение цветом. Так, корректно введенные операторы выделяются голубым цветом.
Аккумулятор
Аккумулятор IL является универсальным контейнером, способным сохранять значения переменных любого типа.
Абсолютное большинство инструкции IL выполняют некоторую операцию с содержимым аккумулятора. Операнд, конечно, тоже принимает участие в инструкции, но результат опять помещается в аккумулятор. Например, инструкция SUB 10 отнимает число 10 от значения аккумулятора и помещает результат в аккумулятор. Команды сравнения сравнивают значение операнда и аккумулятора, результат сравнения ИСТИНА или ЛОЖЬ вновь помещается в аккумулятор. Команды перехода на метку способны анализировать аккумулятор и принимать решение - выполнять переход или нет.
В аккумулятор можно поместить значение типа BOOL, затем INT или REAL, транслятор не будет считать это ошибкой. Такая гибкость не означает, что аккумулятор способен одновременно содержать несколько значений разных типов. Только одно, причем тип значения также фиксируется в аккумуляторе. Если операция требует значение другого типа, транслятор выдаст ошибку.
В стандарте МЭК вместо термина «аккумулятор» используется термин «результат» (result). Так, инструкция берет «текущий результат» и формирует «новый результат». Тем не менее почти все руководства по программированию различных фирм широко используют термин «аккумулятор».
Таблица 6.1 – Операторы загрузки и сохранения
Оператор |
Модификатор |
Описание |
Операнды |
Описание |
LD |
N (только для операндов типа BOOL, BYTE, WORD или DWORD) |
Загрузка значений операндов в аккумулятор |
Литерал, переменная, прямой адрес любого типа данных |
Значение операнда загружается в аккумулятор, используя LD. Размер данных аккумулятора автоматически подстраивается для типа данных операции. Это также действительно для производных типов данных. Пример: В примере значение A загружается в аккумулятор с добавлением значения B , и результат сохраняется в E. LD A ADD B ST E |
ST |
N (только для операндов типа данных BOOL, BYTE, WORD или DWORD) |
Сохранение значения аккумулятора в операнде |
переменная, прямой адрес любого типа данных |
Текущее значение аккумулятора сохраняется в операнде, используя ST. тип данных операнда должен соответствовать "типу данных" аккумулятора. Пример: В этом примере значение A загружается в аккумулятор с добавлением значения B , и результат сохраняется в E. LD A ADD B ST E "Старый" результат используется далее, в зависимости от того, следует ли LD за ST или нет. Пример: В этом примере значение A загружается в аккумулятор с добавлением значения B , и результат сохраняется в E. Значение E (текущее содержимое аккумулятора) вычитается из значения B , и результат сохраняется в C. LD A ADD B ST E SUB 3 ST C |
Таблица 6.2 – Операторы установки и сброса
Оператор |
Модификатор |
Описание |
Операнды |
Описание |
S |
- |
Установка операнда в 1, когда содержимое аккумулятора = 1 |
Переменная, прямой адрес данных типа BOOL |
S установка операнда в "1", когда текущее значение аккумулятора равно логической 1. Пример: В этом примере значение A загружается в аккумулятор, если содержимое аккумулятора (значение A) = 1, тогда OUT устанавливается в 1. LD A S OUT Обычно этот оператор используется вместе с оператором сброса R в паре. Пример: В этом примере показан RS Триггер (главный сброс), который управляется через логические переменные A и C. LD A S OUT LD C R OUT |
R |
- |
Установка операнда в 0, когда содержимое аккумулятора = 1 |
Переменная, прямой адрес данных типа BOOL |
R установка операнда в "0", когда текущее содержимое аккумулятора равно логической 1. Пример: В этом примере значение A загружается в аккумулятор, если содержимое аккумулятора (значение A) = 0, тогда OUT устанавливается 1. LD A R OUT Обычно этот оператор используется вместе с оператором установки S в паре. Пример: В этом примере показан SR Триггер (главная установка), который управляется через две логические переменные A и C. LD A R OUT LD C S OUT |
Таблица 6.3 – Логические операторы
Оператор |
Модификатор |
Описание |
Операнды |
Описание |
AND |
N, N(, ( |
Логическое И |
Литерал, переменная, прямой адрес данных типа BOOL, BYTE, WORD или DWORD |
При помощи AND производится логическая операция И между содержимым аккумулятора и операндом. Для BYTE, WORD и DWORD типов данных операция производится побитно. Пример: В примере D = 1, если A, B и C = 1. LD A AND B AND C ST D |
OR |
N, N(, ( |
Логическое ИЛИ |
Литерал, переменная, прямой адрес данных типа BOOL, BYTE, WORD или DWORD |
При помощи OR производится логическая операция ИЛИ между содержимым аккумулятора и операндом. Для BYTE, WORD и DWORD типов данных, связь производится побитно. Пример: В примере D = 1, если A или B = 1 и C = 1. LD A OR B OR C ST D |
XOR |
N, N(, ( |
Логическое исключающее ИЛИ |
Литерал, переменная, прямой адрес данных типа BOOL, BYTE, WORD или DWORD |
При помощи XOR производится логическая операция Исключающее ИЛИ между содержимым аккумулятора и операндом. Если связывается более двух операндов, результат для нечетного числа 1-состояния = 1, и = 0 для четного числа единичных состояний. Для BYTE, WORD и DWORD типов данных, связь производится побитно. Пример: В примере D = 1, если A или B = 1. Если A и B имеют одинаковое состояние (оба 0 или 1), D = 0. LD A XOR B ST D Если связывается более двух операндов, результат для нечетного числа единичных состояний = 1, и 0 для четного числа единичных состояний. Пример: В примере F = 1, если 1 или 3 операнды = 1. F = 0, если 0, 2 или 4 операнды = 1. LD A XOR B XOR C XOR D XOR E ST F |
NOT |
- |
Логическое отрицание |
Содержимое аккумулятора типов данных BOOL, BYTE, WORD или DWORD |
Содержимое аккумулятора инвертируется NOT. Пример: В примере B = 1, если A = 0 и B = 0, если A = 1. LD A NOT ST B |
Таблица 6.4 – Арифметические операторы
Оператор |
Модификатор |
Описание |
Операнды |
Описание |
ADD |
( |
Сложение |
Литерал, переменная, прямой адрес данных типа INT, DINT, UINT, UDINT, REAL или TIME |
При помощи ADD значение операнда прибавляется к значению аккумулятора. Пример: Пример соответствует формуле D = A + B + C LD A ADD B ADD C ST D |
SUB |
( |
Вычитание |
Литерал, переменная, прямой адрес данных типа INT, DINT, UINT, UDINT, REAL или TIME |
При помощи SUB значение операнда вычитается из содержимого аккумулятора. Пример: Пример соответствует формуле D = A - B - C LD A SUB B SUB C ST D |
MUL |
( |
Умножение |
Литерал, переменная, прямой адрес данных типа INT, DINT, UINT, UDINT, REAL или TIME |
При помощи MUL содержимое аккумулятора умножается на значение оператора. Пример: Пример соответствует формуле D = A * B * C LD A MUL B MUL C ST D |
DIV |
( |
Деление |
Литерал, переменная, прямой адрес данных типа INT, DINT, UINT, UDINT, REAL или TIME |
При помощи DIV содержимое аккумулятора делится на значение операнда. Пример: Пример соответствует формуле D = A / B / C LD A DIV B DIV C ST D |
MOD |
( |
Деление по модулю |
Литерал, переменная, прямой адрес данных типа INT, DINT, UINT, UDINT, REAL или TIME |
Для MOD значение первого операнда делится на значение второго операнда, и остаток от деления (модуль) возвращается как результат. Пример: В примере C = 1, если A = 7 и B = 2 C = 1, если A = 7 и B = -2 C = -1, если A = -7 и B = 2 C = -1, если A = -7 и B = -2 LD A MOD B ST C |
Таблица 6.5 – Операторы сравнения
Оператор |
Модификатор |
Описание |
Операнды |
Описание |
GT |
( |
Сравнение: > |
Литерал, переменная, прямой адрес данных типа BOOL, BYTE, WORD, DWORD, STRING, INT, DINT, UINT, UDINT, REAL, TIME, DATE, DT или TOD |
При помощи GT содержимое аккумулятора сравнивается с содержимым операнда. Если содержимое аккумулятора больше, чем содержимое операнда, результат – логическая 1. Если содержимое аккумулятора меньше или равно содержимому операнда, результат – логический 0. Пример: В примере значение D = 1, если A больше 10, иначе значение D = 0. LD A GT 10 ST D |
GE |
( |
Сравнение: >= |
Литерал, переменная, прямой адрес данных типа BOOL, BYTE, WORD, DWORD, STRING, INT, DINT, UINT, UDINT, REAL, TIME, DATE, DT или TOD |
При помощи GE содержимое аккумулятора сравнивается с содержимым операнда. Если содержимое аккумулятора больше или равно содержимому операнда, результат – логическая 1. Если содержимое аккумулятора меньше содержимого операнда, результат – логический 0. Пример: В примере значение D = 1, если A больше или равно 10, иначе, значение D = 0. LD A GE 10 ST D
|
EQ |
( |
Сравнение: = |
Литерал, переменная, прямой адрес данных типа BOOL, BYTE, WORD, DWORD, STRING, INT, DINT, UINT, UDINT, REAL, TIME, DATE, DT или TOD |
При помощи EQ содержимое аккумулятора сравнивается с содержимым операнда. Если содержимое аккумулятора равно содержимому операнда, результат – логическая 1. Если содержимое аккумулятора не равно содержимому операнда, результат – логический 0. Пример: В примере значение D = 1, если A равно 10, иначе значение D = 0. LD A EQ 10 ST D |
NE |
( |
Сравнение: <> |
Литерал, переменная, прямой адрес данных типа BOOL, BYTE, WORD, DWORD, STRING, INT, DINT, UINT, UDINT, REAL, TIME, DATE, DT или TOD |
При помощи NE содержимое аккумулятора сравнивается с содержимым операнда. Если содержимое аккумулятора не равно содержимому операнда, результат – логическая 1. Если содержимое аккумулятора равно содержимому операнда, результат – логический 0. Пример: В примере значение D = 1, если A не равно 10, иначе значение D = 0. LD A NE 10 ST D
|
LE |
( |
Сравнение: <= |
Литерал, переменная, прямой адрес данных типа BOOL, BYTE, WORD, DWORD, STRING, INT, DINT, UINT, UDINT, REAL, TIME, DATE, DT или TOD |
При помощи LE содержимое аккумулятора сравнивается с содержимым операнда. Если содержимое аккумулятора меньше или равно содержимому операнда, результат – логическая 1. Если содержимое аккумулятора больше содержимого операнда, результат – логический 0. Пример: В примере значение D = 1, если A меньше или равно 10, иначе значение D = 0. LD A LE 10 ST D |
LT |
( |
Сравнение: < |
Литерал, переменная, прямой адрес данных типа BOOL, BYTE, WORD, DWORD, STRING, INT, DINT, UINT, UDINT, REAL, TIME, DATE, DT или TOD |
При помощи LT содержимое аккумулятора сравнивается с содержимым операнда. Если содержимое аккумулятора меньше, чем содержимое операнда, результат – логическая 1. Если содержимое аккумулятора больше или равно содержимому операнда, результат – логический 0. Пример: В примере значение D = 1, если A меньше 10, иначе значение D = 0. LD A LT 10 ST D |
Таблица 6.6 – Операторы вызова
Оператор |
Модификатор |
Описание |
Операнды |
Описание |
CAL |
C, CN (только если содержимое аккумулятора BOOL типа данных) |
Вызов функционального блока, DFB или подпрограммы |
Имя экземпляра функционального блока, DFB или подпрограммы |
Функциональный блок, DFB или подпрограмма вызывается в ограниченном или неограниченном виде CAL.
|
FUNCTIONSNAME |
- |
Выполнение функции |
Литерал, переменная, прямой адрес (тип данных зависит от функции) |
Функция выполняется по имени функции.
|
PROCEDURENAME |
- |
Выполнение процедуры |
Литерал, переменная, прямой адрес (тип данных зависит от процедуры) |
Процедура выполняется по имени процедуры.
|
Таблица 6.7 – Операторы структурирования
Оператор |
Модификатор |
Описание |
Операнды |
Описание |
JMP |
C, CN (только если содержимое аккумулятора BOOL типа данных) |
Прыжок к метке |
TAG |
При помощи JMP прыжок к метке может быть ограниченным и неограниченным.
|
RET |
C, CN (только если содержимое аккумулятора BOOL типов данных) |
Возврат к следующей более высокой организационной единице программы |
- |
Каждая подпрограмма и каждый DFB (производный функциональный блок) покидается после выполнения, т.е. происходит возврат к основной вызывающей программе. Если подпрограмма/DFB покидается преждевременно, возврат к основной программе может форсироваться, используя RET (Возврат). RET может использоваться только в подпрограммах или DFBs. Они не могут использоваться в основной программе. |
) |
- |
редактирование отложенных операций |
- |
При помощи закрывающей скобки ) начинается выполнение восстановленного оператора. Число закрывающих скобок должно быть равно числу открывающих скобок. Скобки могут быть вложенными. Пример: В примере E = 1, если C и/или D = 1 и A и B = 1. LD A AND B AND( C OR D ) ST E |
Переход на метку
Программа на IL выполняется подряд, сверху вниз. Для изменения порядка выполнения и организации циклов применяется переход на метку. Переход на метку может быть безусловным JMP - выполняется всегда, независимо от чего-либо. Условный переход JMPC выполняется только при значении аккумулятора ИСТИНА. Переход можно выполнять как вверх, так и вниз. Метки являются локальными, другими словами, переход на метку в другом POU не допускается.
Переходы нужно организовывать достаточно аккуратно, чтобы не получить бесконечный цикл:
LD 1
ST Counter
Loop1:
(*тело цикла*)
LD Counter
ADD 1I
ST Counter
LE 5
JMP Loop1
В примере показана реализация цикла на 5 повторений с одной очевидной ошибкой. Вместо безусловного перехода JMP должен быть JMPC.
В системах с интерпретатором IL или промежуточным кодированием время выполнения перехода оказывается зависимым от направления и расстояния.
Скобки
Последовательный порядок выполнения команд IL можно изменять при помощи скобок. Открывающая скобка ставится в инструкции после операции. Закрывающая скобка ставится в отдельной строке. Инструкции, заключенные в скобки, выполняются в первую очередь. Результат вычисления инструкций в скобках помещается в дополнительный аккумулятор, после чего выполняется команда, содержащая открывающую скобку. Например:
LD 5
MUL (2
SUB 1
)
ST y (*y = 5* (2-1) = 5*)
LD 5
MUL 2
SUB 1
ST y (*y = 5*2-1=9*)
Скобки могут быть вложенными. Каждое вложение требует организации некоего временного аккумулятора. Это вызывает неоднозначность при выходе из блока скобок командами JMP, RET, CAL и LD. Применять эти команды в скобках нельзя.
Вызов функциональных блоков и программ
Вызвать экземпляр функционального блока или программу в IL можно с одновременным присваиванием переменных. Например:
CAL CTD_1(CD := TRUE, LOAD := FALSE, PV := 10)
LD CTD_l.CV
ST y
Аналогичный вызов можно выполнить с предварительным присваиванием значений входных переменных:
LD TRUE
ST CTD_1.CD
LD FALSE
ST СTD_1.LOAD
LD 10
ST CTD_1.PV
CAL CTD_1
LD CTD_1.CV
ST у
Вызов функции
При вызове функции с перечислением параметров в IL существует одна немаловажная особенность. В качестве первого параметра используется аккумулятор:
LD TRUE
SEL 3,4
На ST это равносильно вызову SEL (TRUE,3,4). Очевидно, при вызове функции или оператора с одним параметром список параметров вообще не нужен:
LD ivar1
INT_TO_BOOL
ST bvar1