
- •Андреев е.В., Брейдо и.В., Войткевич с.В., Пахомов в.В. Языки программирования промышленных логических контроллеров стандарта iec 61131-3
- •Андреев е.В., Брейдо и.В., Войткевич с.В., Пахомов в.В.
- •050718 «Электроэнергетика», 360240 «Автоматизация технологических процессов и производств»
- •О стандарте iec 61131-3
- •2. Язык программирования Instruction List (il)
- •3. Язык программирования Quick Ladder Diagram (ld)
- •4. Язык программирования Functional Block Diagram (fbd)
- •5. Язык структурированный текст (st)
- •6. Язык последовательных функциональных схем sfc
2. Язык программирования Instruction List (il)
Список инструкций или IL - это ассемблер, язык низкого уровня. Инструкции всегда относятся к текущему результату (или IL регистру). Оператор определяет операцию, которая должна быть выполнена с текущим результатом и операндом. Результат операции снова запоминается в текущем результате.
IL программа - это список инструкций. Каждая инструкция должна начинаться с новой строки и должна содержать оператор, с дополнительными модификаторами, если нужно, для специфических операций, один или несколько операндов, разделенных запятой «,». Инструкции может предшествовать метка с двоеточием «:». Если к инструкции присоединен комментарий, то он должен находиться в конце строки. Между инструкциями может быть введена пустая строка. Комментарии могут быть помещены в пустые строки.
Ниже приведен пример общей структуры строки инструкции IL:
Метка Оператор Операнд Комментарий
Start: LD IX1 (* загрузить сигнал IX1 *)
Метки. Инструкции может предшествовать метка с двоеточием «:». Метка может быть помещена на пустую строку. Метки используются в качестве операндов для некоторых операций, таких как прыжки.
В одной программе одно и то же имя не может быть использовано для обозначения более чем одной метки. Имя метки не может совпадать с именем переменной или зарезервированным словом языка, например метка «LD».
Модификаторы оператора. Ниже представлены возможные модификаторы оператора. Символ модификатора должен завершать имя оператора, без пробелов между ними.
N - булевское отрицание операнда;
( - задержанная операция;
С - условная операция.
Модификатор «N» определяет булевское отрицание операнда. Например, инструкция ORN X_1 интерпретируется как элемент ИЛИ-НЕ (функция Пирса).
Модификатор скобка «(» указывает на то, что выполнение инструкции должно быть задержано до тех пор, пока не встретится закрытая скобка оператор «)».
Модификатор «C» указывает на то, что соответствующая инструкция должна быть выполнена, только если текущий результат имеет значение TRUE (отличное от нуля).
Модификатор «C» может комбинироваться с модификатором «N», который указывает на то, что инструкция должна быть выполнена, только если текущий результат имеет значение FALSE (0). Все существующие стандартные операторы языка IL представлены в следующей таблице:
Таблица 2.1 - Операторы языка IL
Оператор |
Модификатор |
Операнд |
Описание |
LD |
N |
переменная, константа |
Загружает операнд |
ST |
N |
переменная |
Запоминает текущий результат |
S R |
|
BOO переменная BOO переменная |
Устанавливает на TRUE Сбрасывает на FALSE |
AND & OR XOR |
N ( N ( N ( N ( |
BOO BOO BOO BOO |
Логическое И логическое И логическое ИЛИ исключающее ИЛИ |
ADD SUB MUL DIV |
( ( ( ( |
переменная, константа
|
Сложение Вычитание Умножение Деление |
GT GE EQ LE LT NE |
( ( ( ( ( ( |
переменная, константа
|
Проверить: > Проверить: >= Проверить: = Проверить: <= Проверить: < Проверить: <> |
CAL JMP RET |
C N C N C N |
Экземпляр функционального блока, Имя, Метка. |
Вызов функционального блока Прыжок на метку Возврат из подпрограммы |
) |
|
|
Выполнить задержанную операцию |
Задержанные операции. Из-за того, что существует только один IL регистр, некоторые операции могут быть задержаны, так что порядок исполнения инструкций может быть изменен. Скобки используются для того, чтобы выделить задержанные операции:
«(» |
модификатор |
указывает операцию, которая должна быть задержана |
«)» |
оператор |
выполняет задержанную операцию |
Открывающаяся скобка «(» указывает на то, что выполнение инструкции должно быть задержано до тех пор пока не встретится закрытая скобка «)». Например, следующая последовательность:
LD X_1
AND( X_2
OR X_3
)
ST F
интерпретируется как:
F = X_1 AND (X_2 OR X_3)
Работая с языками IEC, создавайте полные и понятные комментарии, это существенно упростит процесс отладки программы.
Основные операторы языка IL
Оператор LD
Операция: загружает значение в текущий результат
Допустимые модификаторы: N
Операнд: константа, внутренняя, входная или выходная переменная
Пример 1:
(* ПРИМЕР LD ОПЕРАЦИЙ *)
LD false (* результат = FALSE БУЛЕВСКАЯ КОНСТАНТА*)
LD 123 (*результат = АНАЛОГОВОЯ (ЦЕЛАЯ) КОНСТАНТА*)
Оператор ST
Операция: запоминает текущий результат в переменной. Текущий результат этим оператором не изменяется
Допустимые модификаторы: N
Операнд: внутренняя или выходная переменная
Пример 2:
(* ПРИМЕР ST ОПЕРАЦИЙ *)
Primer1: LD false
ST boo_var1 (* boo_var1= false, булевская константа = false *)
Primer2: LD 123
ST ana_var1 (* ana_var1= 123, аналоговоя (целая) константа =123*)
Оператор S
Операция: запоминает TRUE в булевской переменной, если текущий результат имеет значение TRUE. Никаких операций не выполняется, если текущий результат равен FALSE. Текущий результат не модифицируется.
Допустимые модификаторы: (нет)
Операнд: внутренняя или выходная булевская переменная
Пример 3:
(* ПРИМЕР S ОПЕРАЦИЙ *)
LD true (*текущий результат := TRUE *)
S boo_var1 (* boo_var1 := TRUE *)
(*текущий результат не изменяется *)
LD false (*текущий результат := FALSE *)
S boo_var1 (* ничего не делать - boo_var1 не изменяется *)
Оператор R
Операция: запоминает FALSE в булевской переменной, если текущий результат имеет значение TRUE. Никаких операций не выполняется, если текущий результат равен FALSE. Текущий результат не модифицируется.
Допустимые модификаторы: (нет)
Операнд: внутренняя или выходная булевская переменная
Пример 4:
(* ПРИМЕР R ОПЕРАЦИЙ *)
LD true (*текущий результат = TRUE *)
R boo_var1 (* boo_var1 = FALSE *)
(*текущий результат не изменяется *)
ST boo_var2 (* boo_var2 = TRUE *)
LD false (*текущий результат = FALSE *)
R boo_var1 (*ничего не делать - boo_var1 не изменяется *)
Логические операторы.
Логические операторы AND, OR, XOR и др. действуют аналогично одноименным логическим функциям, поэтому рассматривать примеры всех логических действий нецелесообразно. Рассмотрим лишь один из них:
Пример 5: Так, например логический элемент «Исключающее ИЛИ» («Неравнозначность») выглядит как последовательность инструкций:
(* ПРИМЕР ЛОГИЧЕСКОЙ ОПЕРАЦИИ *)
LD Х_1
XORN Х_2
ST Y
Логическая функция , примет вид:
LD A AND B AND C STN ABC (*ABC - внутренняя переменная*) LD D XOR C OR ABC STN Y |
или (с задержанной операцией) |
LD A AND B AND C OR( D XOR C ) STN Y |
Оператор JMP
Операция: прыгает на указанную метку
Допустимые модификаторы: C N
Операнд: метка определенная в той же IL программе
Пример 6: следующий пример проверяет значение аналогового сигнала (переменная signal которая может принимать значения 0 или 1 или 2), чтобы установить один из 3 булевских выходов. Проверка "равно 0" делается оператором JMPC.
Start: LD signal (* помещаем переменную signal со значением 0, 1 или 2 в регистр*)
BOO (* превращение в boolean *)
JMPC test1 (*если signal ≠ 0 тогда переходим на метку test1*)
LD true (* помещаем булевское значение true в регистр*)
ST bo0 (*устанавливаем первый дискретный выход bo0 в значение true *)
JMP end (* переходим на конец программы*)
test1: LD signal (* помещаем переменную signal со значением 1 или 2 в регистр*)
SUB 1 (* уменьшаем (вычитая 1) переменную signal: теперь ее значение 0 или 1 *)
BOO (* превращение в boolean *)
JMPC test2 (*если signal ≠ 0 тогда переходим на метку test2*)
LD true (* помещаем булевское значение true в регистр*)
ST bo1 (*устанавливаем второй дискретный выход bo1 в значение true *)
JMP end (*переходим на конец программы*)
test2: LD true (* последняя возможность, если переменная signal была равна 2*)
ST bo2 (*устанавливаем третий дискретный выход bo3 в значение true*)
end: (* конец IL программы*)
Оператор RET
Операция: заканчивает текущий список инструкций. Если IL последовательность - подпрограмма, то текущий результат возвращается в вызывающую подпрограмму.
Допустимые модификаторы: C N
Операнд: (нет)
Пример 7: следующий пример проверяет значение аналогового селектора (0 или 1 или 2) чтобы установить только один из 3 булевских выходов. Проверка "равно 0" делается JMPC оператором:
JMPex: LD selector (* selector равен 0 или 1 или 2 *)
BOO (* превращение в boolean *)
JMPC test1 (* if selector = 0 then *)
LD true
ST bo0 (* bo0 := true *)
RET (* end - return 0 *)
(* уменьшить selector *)
test1: LD selector
SUB 1 (* selector теперь 0 или 1 *)
BOO (* превращение в boolean *)
JMPC test2 (* if selector = 0 then *)
LD true
ST bo1 (* bo1 := true *)
LD 1 (* загрузить действительное значение selector *)
RET (* end - return 1 *)
(* последняя возможность *)
test2: RETNC (* возвращает если selector содержит *)
(* неправильное значение *)
LD true
ST bo2 (* bo2 := true *)
LD 2 (* загрузить действительное значение selector *)
(* конец - возврат 2 *)
Вызов подпрограмм или функций.
Подпрограмма или функция (написанная на любом из языков IL, ST, LD, FBD или “C”) вызывается из языка IL, используя имя в качестве оператора.
Операция: выполняет подпрограмму или функцию – значение, возвращенное подпрограммой или функцией, запоминается в текущем результате IL
Первый параметр должен быть запомнен в текущем результате перед вызовом. Остальные параметры записываются в поле операнда через запятую.
Примечание: Вызов подпрограмм на другом языке возможен только в тех редакторах, которые поддерживают многоязыковое программирование.
Пример 8: Вызывающая программа: превращает аналоговое значение в временное
Main: LD bi0
SUBPRO bi1,bi2 (*вызвать подпрограмму, чтобы получить аналоговое значение *)
ST result (* result := значение, возвращенное подпрограммой *)
GT vmax (*проверка переполнения *)
RETC (*возврат по переполнению *)
LD result
MUL 1000 (*превратить секунды в миллисекунды *)
TMR (* превратить в таймер *)
ST tmval (* запоминает превращенное значение в таймере*)
Вызванная подпрограмма 'SUBPRO' : вычисляет аналоговое значение, заданное как двоичное число трех булевских входов: in0, in1, in2 - три параметра подпрограммы.
LD in2
ANA (* result = ana (in2); *)
MUL 2 (* result := 2*ana (in2); *)
ST temporary (* temporary := result *)
LD in1
ANA
ADD temporary (* result := 2*ana (in2) + ana (in1); *)
MUL 2 (* result := 4*ana (in2) + 2*ana (in1); *)
ST temporary (* temporary := result *)
LD in0
ANA
ADD temporary (* result := 4*ana (in2) + 2*ana (in1)+ana (in0); *)
ST SUBPRO (* возвратить текущий результат в вызывающую программу*)
Вызов функциональных блоков.
Оператор CAL.
Операция: вызывает функциональный блок
Допустимые модификаторы: C N
Операнд: Имя функционального блока. Входные параметры блока должны быть присвоены с помощью операторов LD/ST до вызова.
Примечание: Вызов функциональных блоков на языке FBD возможен только в тех редакторах, которые поддерживают многоязыковое программирование
Пример 9: Вызов функционального блока SR1 - экземпляр обычного RS триггера.
LD auto_mode
AND start_cmd
ST SR1.set1
LD stop_cmd
ST SR1.reset
CAL SR1
LD SR1.Q1
ST command
(*FBD эквивалент, входные и выходные переменные представлены прямоугольниками с указанием имен, SR – блок это RS триггер: *)
Пример 10: Рассмотрим автоматизацию поддержки давления в газгольдере на заданном уровне.
Задание: Установка (рисунок 2.1) включает в себя компрессор для нагнетания сжатого под давлением воздуха и газгольдер. Давление в газгольдере, измеряемое манометром (М1) с электрическим выходом, должно постоянно поддерживаться на одном уровне (25МПа≤М1≤30 МПа).
В случае превышения давлением нормы в 30МПа открывается спускная задвижка, путем подачи управляющего сигнала на привод задвижки (ДЗ). Если же давление снизится ниже 25МПа, то происходит включение двигателя компрессора (ДК), который нагнетает сжатый воздух в газгольдер, тем самым повышая давление в нем.
Рисунок 2.1 – Функциональная схема установки
Блок-схема алгоритма работы установки приведена на рисунке 2.2.
Рисунок 2.2 – Блок-схема алгоритма работы установки
Решение: Прежде чем приступать к программированию проанализируем количество и тип используемых сигналов ввода/вывода (таблица 2.2).
Именно от конфигурации сигналов (точек контроля и управления), их количества и типа зависит модель выбираемого ПЛК. Также на ее выбор влияют такие факторы, как стоимость и интеллектуальные возможности ПЛК.
Таблица 2.2 – Сигналы ввода/вывода
Сигналы |
Комментарии |
Тип сигнала |
Входные: |
|
|
М1 |
Текущее давление в газгольдере |
аналоговый |
Выходные: |
|
|
ДК (DK) |
Сигнал открытие/закрытие спускной задвижки, для стравливания давления |
дискретный |
ДЗ (DZ) |
Сигнал включения/выключения компрессора |
дискретный |
Ниже приведен листинг программы – решения:
LD m1 (* помещаем переменную m1 в регистр*)
LE 25 (* сравниваем значение переменной m1 с числом 25 (m1<25) *)
ST dk (* изменение состояния компрессора в зависимости от результата сравнения *)
LD m1 (* помещаем переменную m1 в регистр*)
GE 30 (*сравниваем значение переменной m1 с числом 30 (m1>30)*)
ST dz (* изменение состояния задвижки в зависимости от результата сравнения *)
В программе аналоговая величина сравнивается с числами 25 и 30, которые представляют два уровня давления 25МПа и 30 МПа, однако не следует забывать, что речь идет об условных единицах. В промышленных условиях требуется точная регулировка выходного сигнала датчика (тока, напряжения), его нормализация и сопоставление с измеряемой величиной (давлением, уровнем, интенсивностью).
Попробуйте самостоятельно переписать программу следующим образом: включение компрессора должно происходить при m1<25, а выключение при m1>27. Также передвинуть границу выключения на значение 28 для задвижки.
Для предыдущего задания вынесите строки управления включением и выключением двигателя и задвижки в подпрограммы. В основной программе должны остаться только условия сравнения для m1:
LD m1
LE 25
(* вызов подпрограммы управления компрессором *)
LD m1
GE 30
(* вызов подпрограммы управления задвижкой *)
Выводы по языку: На основе рассмотренных примеров можно сказать, что язык IL предназначен для автоматизации простейших (малых) технологических объектов и процессов. Язык является низкоуровневым, ненаглядным и сильно ограниченным по функциональным возможностям, однако если требуется жесткая экономия ресурсов и высокое быстродействие, язык IL наиболее рационален.