Il instruction list список инструкций

Текстовый язык IL
(Instruction
List)
относится к ассемблероподобным языкам,
т. е.
к языкам низкого (машинного) уровня, что
существенно облегчает, например, вызов
функциональных блоков и функций «условно»
или «безусловно», выполнение назначений
и условных или безусловных переходов
внутри секции.

Язык IL,
позволяет создавать высокоэффективные
и оптимизи­рованные функции. Его можно
рекомендовать для написания наи­более
критических мест в программе.

Ассемблероподобные
языки использовались для программиро­вания
компьютеров в 50-е годы прошлого века и
все еще предла­гаются некоторыми
изготовителями ПЛК, особенно
программи­стами, поддерживающими
микроРС. Программу можно написать с
помощью любого текстового редактора.

При вводе ключевых
слов, разделителей и комментариев в
ре­дакторе предусмотрена непосредственная
по буквам проверка. При обнаружении
ключевого слова, разделителя или
комментария они идентифицируются через
цветовое оттенение. При введении
не­санкционированных ключевых слов
(назначений или операторов) они будут
также идентифицироваться через цветовое
оттенение.

Согласно стандарту
IEC
61131-3 ключевые слова должны быть введены
в символах верхнего регистра.

Пробелы и метки
табуляции не влияют на синтаксис, они
мо­гут использоваться везде.

Генерация объектного
кода вместе с проверкой синтаксиса
бу­дет выполняться, когда секция
закрыта. Любые найденные ошибки затем
отображаются в окне сообщений. Однако
проверка синтак­сиса может также
осуществляться во время создания
программы или блока DFB
командой Project
→ Analyze
Section.

Команды (инструкции)
языка
IL

Список инструкций
составлен из последовательности команд.
Каждая команда начинается в новой ячейке
и состоит из операто­ра (в случае
необходимости с модификатором) и (если
требуется для соответствующей операции)
сопровождается одним или несколькими
операндами (рисунок 9.1). Если используется
несколько операндов, они отделяются
запятыми. Команде может предшествовать
метка с двоеточием. Команда может
сопровождаться комментарием.

Рисунок 9.1 – Формат
записи команды в языке IL

Язык IL

так называемый аккумуляторно-ориентированный
язык, т. е. каждая команда использует
или изменяет текущее содержимое
аккумулятора (тип временной памяти).
Стандарт IEC
61131-3 обозначает этот аккумулятор как
результат.

Список команд
должен всегда начинаться с оператора
LD
(ко­манда загрузки аккумулятора) и
заканчиваться оператором сохра­нения
ST.

Пример сложения:

LD
10

ADD
25

ST
A

Пример показывает
загрузку литерала 10 в аккумулятор,
добавление литерала 25 и внесение
результата в переменную А. Содержимое
переменной и аккумулятора теперь 35.
Любая после­дующая команда работала
бы с содержимым аккумулятора 35, если
она не начинается с LD.

Операции сравнения
также всегда касаются аккумулятора.
Булев результат сравнения вносится в
аккумулятор, следовательно, это является
текущим содержанием аккумулятора.

Пример сравнения:

LD
B

GT
10

В примере значение
переменной В загружено в аккумулятор
и сравнивается с литералом 10. Если В
меньше или равно 10, содержимое аккумулятора
равно 0 (FALSE).
Если В больше чем 10, содержимое аккумулятора
есть 1 (TRUE).

Операнды.
Операндом может быть литерал, переменная,
структурированная переменная, элемент
структурированной переменной, выход
FB/DFB
или прямой адрес.

Когда осуществляется
доступ к массивам переменных (ARRAY),
элемент указателя допускает только
литералы и переменные типа ANY_INT.

Пример сохранения:

LD
var1[i]

ST
var2.otto[4]

В таблица 9.1
приведены заданные по умолчанию типы
данных прямого адреса.

Таблица 9.1

Вход

Выход

Заданные по
умолчанию типы данных

Возможные типы
данных

%IХ,%I

%QX,%Q

BOOL

BOOL

%IВ

%QB

BYTE

BYTE

%IW

%QW

INT

INT,
UINT, WORD

%ID

%QD

REAL

REAL,
DINT, UDINT, TIME

Назначение типов
данных, отличных от заданных по умолчанию
типов данных прямого адреса, должно
выполняться через явное объявление
(VAR…END_VAR).
В пакете Concept
объявление VAR…END_VAR
не может использоваться для объявления
переменных. Объявление переменных очень
легко выполнить через редактор переменных.

Операнд и текущее
содержимое аккумулятора должны иметь
одинаковый тип данных. Если необходимо
обработать операнды различных типов
данных, сначала выполняется преобразование
типов. Исключением является тип данных
TIME
вместе с арифметическими операторами
MUL
и DIV.
Эти два оператора позволяют обработать
операнд типа данных TIME
вместе с операндом типа данных ANY_NUM.
В этом случае результат этих команд
будет иметь тип данных TIME.

Пример
преобразования:

LD i1

INT_TO_REAL

ADD r4

ST
r3

В примере целая
переменная i1
преобразована в вещественную переменную
прежде, чем она добавлена к вещественной
перемен­ной r4.

Пример умножения:

LD
t2

MUL
i4

ST
t1

В примере переменная
времени t2
умножена на целую пере­менную i4,
а результат сохраняется в переменной
времени t1.

Модификаторы.
Модификаторы влияют на выполнение
пред­шествующего оператора.

Модификатор N
используется, чтобы инвертировать
побитно значение операнда. Модификатор
N может применяться только к операндам
типа данных ANY_BIT.

Пример модификатора
N:

LD
A

ANDN
B

ST
C

В примере С = 1, если
А = 1 и В = 0.

Модификатор С
используется, чтобы выполнить
соответствующую команду, если значение
аккумулятора равно 1 (TRUE).
Модификатор С может применяться только
к операндам типа данных BOOL.

Пример модификатора
С:

LD
A

AND
B

JMPC
START

В примере переход
к START
выполняется, только если А = 1 (TRUE)
и В = 1 (TRUE).

Если модификатор
С объединен с модификатором N,
соответствующая команда выполняется,
только если значение аккумуля­тора
равно булеву 0 (FALSE).

Пример
CN:

LD A

AND B

JMPCN
START

В примере переход
к START
выполняется, только если А = 0
(FALSE)
и/или В = 0 (FALSE).

Модификатор (
(левая круглая скобка) используется,
чтобы задержать оценку операнда до
появления оператора (правая круглая
скобка). Число операций правой круглой
скобки должно быть рав­ным числу
модификаторов левой круглой скобки.
Круглые скобки могут быть вложенными.

Пример:

LD
A

AND
B

AND(C

OR
D

)

ST
E

В примере Е будет
равно 1 если С и/или D
равны 1, а А и B
равны 1.

Этот же пример
может также программироваться следующим
образом:

LD A

AND В

AND(

LD C

OR D

)

ST E

Операторы.

Оператор является
символом для арифметической или
логической операции, которая будет
выполнена, или для вызова функции.

Операторы являются
обобщенными, т. е. они автоматически
корректируются к типу данных операнда.

Операторы языка
программирования IL
приведены в таблицах 9.2-9.8.

Таблица 9.2 –
Операторы загрузки и сохранения

Оператор

Модификатор

Описание

Операнды

Описание

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

Таблица 9.3 –
Операторы установки и сброса

Оператор

Модификатор

Описание

Операнды

Описание

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

Таблица 9.4 –
Логические операторы

Оператор

Модификатор

Описание

Операнды

Описание

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

Таблица 9.5 –
Арифметические операторы

Оператор

Модификатор

Описание

Операнды

Описание

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

Таблица 9.6 –
Операторы сравнения

Оператор

Модификатор

Описание

Операнды

Описание

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

Таблица 9.7 –
Операторы вызова

Оператор

Модификатор

Описание

Операнды

Описание

CAL

C,
CN

(только
если содержимое аккумулятора BOOL
типа данных)

Вызов
функционального блока, DFB или подпрограммы

Имя
экземпляра функционального блока,
DFB или подпрограммы

Функциональный
блок, DFB или подпрограмма вызывается
в ограниченном или неограниченном
виде CAL.

FUNCTIONSNAME

Выполнение
функции

Литерал,
переменная, прямой адрес (тип данных
зависит от функции)

Функция
выполняется по имени функции.

PROCEDURENAME

Выполнение
процедуры

Литерал,
переменная, прямой адрес (тип данных
зависит от процедуры)

Процедура
выполняется по имени процедуры.

Таблица 9.8 –
Операторы структурирования

Оператор

Модификатор

Описание

Операнды

Описание

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

Метки и прыжки

Метки служат целями
для прыжков.

Свойства меток:

  • Метки всегда
    должны быть первыми элементами в строке.

  • Имя должно быть
    свободным в пределах директории и не
    является чувствительным к регистру.

  • Метки могут быть
    32 символа длиной (максимум).

  • Метки должны
    соответствовать IEC
    соглашениям об именовании.

  • Метки отделяются
    двоеточием :
    от следующей инструкции.

  • Метки разрешены
    только в начале»Выражений», иначе
    в батарее может быть обнаружено
    неопределенное значение.

Пример:

start: LD
A

AND
B

OR
C

ST
D

JMP
start

Свойства прыжков:

  • При помощи JMP
    прыжок к метке может быть ограниченным
    или неограниченным.

  • JMP
    может использоваться с модификаторами
    C
    и CN
    (только если содержимое батарей типа
    данных BOOL).

  • Прыжки могут
    производится в пределах программы и
    секций DFB.

  • Прыжки возможны
    только в текущей секции.

Возможные места
назначения:

  • первая LD
    инструкция вызова EFB/DFB с присваиванием
    входных параметров (см. start2),

  • нормальная LD
    инструкция (см. start1),

  • CAL
    инструкция, которая не работает с
    присваиванием входных параметров (см.
    start3),

  • JMP
    инструкция (см. start4),

  • конец списка
    инструкций (см. start5).

Пример

start2:
LD A

ST
counter.CU

LD
B

ST
counter.R

LD
C

ST
counter.PV

CAL
counter

JMPCN
start4

start1:
LD A

AND
B

OR
C

ST
D

JMPC
start3

LD
A

ADD
E

JMP
start5

start3:
CAL counter (

CU:=A

R:=B

PV:=C
)

JMP
start1

start4:
JMPC start1

start5:

Команда
VAR
предназначена для объявления используемых
функциональных блоков и для объявления
прямых адресов, если они не должны
использоваться с заданным по умолчанию
типом данных. В пакете Concept
команда VAR
не может применяться для объявления
переменных. Объявление переменных очень
легко выполняется через редактор
переменных.

Команда
END_VAR
идентифицирует конец объявления.

Команда
VAR…END_VAR
вводится только один раз в начале секции.
Все блоки FB/DFB
и используемые прямые адреса, кото­рые
отличаются от заданного по умолчанию
типа данных, должны быть здесь объявлены.

Объявление
блоков FB/DFB
и прямых адресов применяется только к
текущей секции. Если тот же самый тип
FFB
или тот же самый адрес должен также
использоваться в другой секции, тип FFВ
или адрес соответственно должен быть
объявлен снова в этой секции.

Объявление
функциональных блоков и блоков
DFB.
Перед
вызовом функционального блока или блока
DFB
он должен быть объявлен с использованием
команд VAR
и END_VAR.
В этом объявлении каждому применяемому
экземпляру блока FB/DFB
назначается имя. Имя экземпляра должно
быть уникально для всего проекта; нет
никакого различия между заглавными или
строч­ными буквами. Имя экземпляра
должно удовлетворять соглашениям
стандарта по имени в противном случае
появится сообщение об ошибках.

Тип
функционального блока, например CTD_DINT,
ROL_WORD,
SIN_REAL,
будет введен после имени экземпляра.

Для
обобщенных типов функциональных блоков
(например, MUX,
SEL)
не имеется никакого обозначения типа
данных. Оно будет определено типом
данных фактических параметров. Если
фактические параметры состоят из
литералов, для функционального блока
будет принят тип данных INT.

Любое
число имен экземпляра может быть
объявлено для бло­ков FB/DFB.

Пример
объявления функциональных блоков и DFB
приведен на рисунке 9.2.

Рисунок 9.2 –
Объявление функциональных блоков и DFB

Объявление
прямых адресов.
В
этом объявлении каждому используемому
прямому адресу, который имеет тип данных,
отличающийся от заданного по умолчанию
типа данных, назначается тип данных по
выбору.

Пример
объявление прямых адресов приведен на
рисунке 9.3.

Рисунок
9.3 – Объявление прямых адресов

Вызовы
функциональных блоков и блоков
DFB.
Чтобы
найти имена доступных функциональных
блоков и блоков DFB,
нужно обратиться к библиотекам блоков.
Существуют три способа для вызова
функционального блока и блока DFB:

  • оператором
    с CAL
    и списком входных параметров;

  • оператором
    CAL
    и загрузкой или сохранением входных
    параметров;

  • с помощью входных
    операторов.

Если функциональный
блок не имеет входов или входы не будут
параметрированы, функциональный блок
должен все равно вызываться прежде, чем
его выходы могут использоваться.

Каждый
экземпляр FB/DFB
может вызываться только один раз.

Оператор
CAL
со списком входных параметров.
Функциональные
блоки и DFB
могут вызываться командой, состоящей
из команды CAL,
следующей за именем экземпляра FB/DFB
и списка распределения значений
(фактических параметров) к формальным
параметрам в круглых скобках. Порядок
распечатки формальных параметров в
обращении функционального блока не
имеет значения. Список фактических
параметров может иметь конец строки
сразу же после запятой. Не требует­ся,
чтобы всем формальным параметрам были
присвоены значе­ния. Если формальному
параметру не задано значение, началь­ное
значение, определенное в редакторе
переменных, будет ис­пользоваться
при выполнении функционального блока.
Если начальное значение не было
определено, будет использоваться
значение по умолчанию (0).

Команда
CAL
(..) завершает назначение параметров
функцио­нального блока и DFB.
После этого передача значений в FB/DFB
больше невозможна. Теперь могут
считываться только выходные значения.

Примеры
CAL
со списком входных параметров приведены
на рисунках 9.4 и 9.5

Рисунок 9.4 – Пример
использования команды CAL
(вариант 1)

Рисунок 9.5 – Пример
использования команды CAL
(вариант 2)

Оператор
CAL
с загрузкой и сохранением входных
пара­метров.
Функциональные
блоки и DFB
могут вызываться списком команд,
состоящим из команд загрузки фактических
пара­метров, сохранения в формальных
параметрах и вызова команды CAL.
Порядок загрузки и сохранения параметров
не имеет значе­ния. Не требуется, чтобы
всем формальным параметрам были заданы
значения. Если формальному параметру
не присвоено значение, начальное
значение, определенное в редакторе
переменных, будет использоваться при
выполнении функцио­нального блока.
Если начальное значение не было
определено, будет использоваться
значение по умолчанию (0).

Команда
CAL
FBNAME
завершает назначение параметров
функциональных блоков и DFB.
После этого передача значения этих
параметров в блок FB/DFB
больше невозможна. Теперь могут
считываться лишь их выходные значения.

Только
команды загрузки и сохранения для
текущих назначений параметров FB/DFB
позволяются между первой командой
загрузки фактического параметра и
вызовом функционального блока и блока
DFB.
Никакие другие команды не разрешаются
в этом состоянии.

Примеры
команды CAL
с загрузкой и сохранением входных
параметров приведены на рисунке 9.6.

Рисунок 9.6 – Пример
команды CAL
с загрузкой и сохранением входных
параметров

Использование
входных операторов.

Функциональные блоки могут вызываться
списком команд, состоящим из команд
загрузки фактических параметров,
сохранения в формальны параметры,
входного оператора. Порядок загрузки
и сохранения параметров не имеет
значения. Список фактических параметров
может иметь конец строки сразу же после
запятой. Не требуется, чтобы всем
формальным параметрам были заданы
значения. Если формальному параметру
не задано значение, начальное значение,
определенное в редакторе переменных,
будет использоваться при выполнении
функционального блока. Если начальное
значение не было определено, будет
использоваться значение по умолчанию
(0).

Возможные
входные операторы для различных
функциональных блоков находятся по
таблице 9.9. Никакие другие входные
операторы не доступны.

Таблица
9.9 – Возможные входные операторы

Входной оператор

Тип
FB

S1,
R

SR

S,
R1

RS

CLK

R_TRIG

CLK

F_TRIG

CU,
R,
PV

CTU_INT,
CTU_DINT, CTU_UINT, CTU_UDINT

CU,
LD, PV

CTD_INT,
CTD_DINT, CTD_UINT, CTD_UDINT

Продолжение таблицы
9.9

CU,
CD,
R, LD, PV

CTUD_INT,
CTUD_DINT, CTUD_UINT, CTUD_UDINT

IN,
PT

TP

IN,
PT

TON

IN,
PT

TOF

Вызов
входного оператора завершает назначение
параметров функционального блока. После
этого передача значений в блок FB
больше невозможна Теперь могут считываться
лишь выходные значения.

Только
команды загрузки и сохранения для
текущего назначе­ния параметров
блоков FB/DFB
позволяются между первой ко­мандой
загрузки фактического параметра и
вызовом FB/DFB.
Никакие другие команды не разрешаются
в этом расположении.

Пример
использования входных операторов
приведен на рисунке 9.7.

Рисунок 9.7 – Пример
использования входных операторов

Команда
CAL
COUNT
не разрешается, так как функциональный
блок
уже вызывается командой PV.

Использование
выхода функционального блока и блока
DFB.

Выходы
FB/DFB
могут всегда использоваться, если
переменная (доступная только для чтения)
также может использоваться.

Пример
использования выхода функционального
блока и блока DFB
приведен на рисунке 9.8.

Рисунок 9.8 –
Использование выхода функционального
блока

Пример
на рисунке 9.9 показывает, объявление и
вызов функционального блока на языках
IL
и FBD.

Рисунок 9.9 –
Объявление и вызов функционального
блока на языках IL
и FBD

Обращения
к функциям.
Чтобы
найти имена доступных функций, следует
обратиться к библиотекам блоков.

Функции
вызываются списком команд, состоящим
из первого фактического параметра,
загруженного в аккумулятор, и имени
функции. В случае необходимости этот
список сопровождается списком
дополнительных фактических параметров.
Важную роль играет порядок распечатки
формальных параметров в обращении к
функции. Список фактических параметров
может иметь конец строки сразу же после
запятой. После выполнения функции
ре­зультат функции сохраняется в
аккумуляторе и в операнде с по­мощью
оператора ST
или используется для прямой дальнейшей
обработки.

Пример
обращения к функции с фактическим
параметром при­веден на рисунке 9.10,
а пример обращения к функции с несколькими
фактическими параметрами – на рисунке
9.11.

Рисунок 9.10 –
Обращения к функции с фактическим
параметром

Рисунок 9.11 –
Обращения к функции с несколькими
фактическими параметрами

Функция
может также вызываться списком команд,
состоя­щим из первого фактического
параметра, загруженного в аккумулятор,
и имени функции. Этот список сопровождается
спи­ском присвоения значений фактических
параметров формаль­ным параметрам.
Порядок распечатки формальных параметров
в этом случае не имеет значения. Однако
фактический параметр, загруженный с
помощью оператора LD,
продолжает быть первым параметром
функции.

Пример
обращения к функции с несколькими
фактическими параметрами приведен на
рисунке 9.12.

Рисунок 9.12 –
Обращение к функции с несколькими
фактическим параметрами

Если значение,
которое будет обработано, находится
уже в аккумуляторе, команда загрузки
может быть опущена.

Пример обращения
к функ­ции с обработкой значения
ак­кумулятора:

LIMIT_REAL B,C

ST result

Если
обработка результата должна продолжиться
немедленно, команда сохранения может
быть опущена.

Пример обращения
к функции с прямой непрерывной обработкой
результата:

LD A

LIMIT_REAL B,C

MUL
E

Пример
объявления и обращения к функции на
языках IL
и FBD
приведен на рисунке 9.13

Рисунок
9.13 – Объявление и обращение к функциям
на языках IL
и FBD

Комментарии.
В IL-редакторе
комментарии начинаются с символьной
цепочки «(* и заканчиваются символьной
цепочкой *)». Любой комментарий может
быть введен между этими двумя символьными
цепочками. Комментарии отображаются в
цвете.

Согласно стандарту
комментарии позволяются только в конце
строки. Стандарт не разрешает также
вложение комментариев.

Проверка
синтаксиса и генерация объектного кода.

Генерация объектного кода будет
выполнятся вместе с проверкой синтаксиса,
когда секция закрывается. Любые найденные
ошибки затем отображаются в окне
сообщений.

Оптимизация
кода во время выполнения программы
достигается реализацией арифметики
целого числа (например «+» или «-») через
простые команды процессора вместо
вызовов блоков EFB.
Команды процессора выполняются намного
быстрее, чем вызов блоков EFB,
но они не генерируют сообщения об ошибках
типа переполнения арифметики или
массива. Эта опция должна использоваться,
только если есть уверенность, что не
имеется никаких арифметических ошибок
в программе.

Пример самого
быстрого кода:

LD
in1

ADD 1

ST out1

Опция
Fastest code (restricted checking).

(Project
→ Code
generation
options).
Если выбрать эту опцию, сложение in1+1
будет выполняться командой процессора
add.
В этом случае код выполняется быстрее,
чем при вызове блока EFB
ADD_INT.
Однако ошибка во время выполнения
программы не будет сгенерирована, если
in1
есть 32767. В этом случае разрядная сетка
переменной out1
переполняется из 32767 в – 32768!

Опция
Unassigned parameters cause warnings.

(Option
→ Preferences
→ Analysis).
Стандарт разрешает вызывать функции и
функциональные блоки без распределения
всех входных параметров. Этим неиспользуемым
параметрам неявно присваивается 0 или
они сохраняют значение из последнего
вызова (только функциональные блоки).

Активизация флажка
опции отобразит список неиспользуемых
параметров в окне сообщения во время
генерации объектного кода.

Опция
Enable
Loop
Control.
(Project
→ Code
generation
options)
При активизации флажка осуществляется
проверка внутри IL-
и ST-секций
для контуров, чтобы определить, можно
ли эти контуры покинуть снова внутри
некоторого периода времени. Разрешенное
время для контуров зависит от определенного
времени сторожа (Watchdog
time).
Разрешенное время всегда немного меньше,
чем время сторожа. Использование этой
опции предотвратит зацикливание
программы на воспроизведение контура
(бесконечный контур). Если бесконечный
контур обнаруживается, обработка
вызванной секции завершается и
обрабатывается сразу следующая секция.
Последующее сканирование обработает
секцию снова, пока бесконечный контур
не будет обнаружен или пока секция
правильно не завершится.

Интерактивные
функции.

Редакторы языков IL
и ST
делают доступными три режима анимации:

  • анимацию двоичных
    переменных;

  • анимацию выбранных
    переменных;

  • создание
    контролируемых полей.

Анимация
прямых адресов и прямых входов/выходов
блоков FB
невозможна.

Анимация
двоичных переменных.

Анимация двоичных значений активизируется
командой меню Online
→ Animate
binary
values.
Этот режим отображает текущее сигнальное
состояние двоичных переменных в окне
редактора:

  • переменная красного
    цвета имеет значение 0;

  • переменная зеленого
    цвета имеет значение 1;

  • переменная желтого
    цвета – не двоичная переменная.

Анимация
выбранных переменных.

Диалоговое окно, которое отображает
текущие сигнальные состояния выбранных
переменных, активизируется командой
меню Online
→ Animate
Selected.
Для анимации выбранных переменных
секция должна быть анимирована. Иначе
следует активизировать анимацию с
помощью команды Online
→ Animate
binary
values.

Выбираемые
переменные и многоэлементные переменные
идентифицируются в буквенном обозначении:

  • переменная красного
    цвета имеет значение 0;

  • переменная зеленого
    цвета имеет значение 1;

  • переменная желтого
    цвета – не двоичная переменная.

Диалоговое окно
отображает имя выбранной переменной
или многоэлементной переменной, ее тип
данных и текущее значение.

Диалоговое окно
остается открытым, пока не будет закрыто
или анимация не будет завершена. Если
открывается несколько секций текстовых
языков и в них вызывается диалоговое
окно, то оно может быть открыто для
каждой секции. Имя секции отображается
в названии диалогового окна.

Несколько
переменных или многоэлементных переменных
могут быть вставлены в диалоговое окно.
Для этого следует выбрать соответственно
желаемые переменные или многоэлементные
переменные и принять их с помощью команды
Online
→ Animate
Selected
в диалоговое окно.

Пример
9.1. Согласно условиям примера 7.1 реализовать
решение задачи на языке IL.

Решение
на языке IL
представлено ниже

VAR

FBI_1_1 : RS;

FBI_1_2 : RS;

FBI_1_3 : TON;

END_VAR

LD vu

ST FBI_1_1.S

LD td

ST FBI_1_1.R1

CAL FBI_1_1

LD FBI_1_1.Q1

ST FBI_1_3.IN

LD t#3s

ST FBI_1_3.PT

CAL FBI_1_3

LD FBI_1_3.Q

ST td

LD FBI_1_3.Q

ST FBI_1_2.S

LD nu

STN FBI_1_2.R1

CAL FBI_1_2

LD FBI_1_2.Q1

ST zd

На рисунке 9.14
представлено окно редактор переменных.

Рисунок 9.14 – Окно
редактора переменных

IL (Instruction List) представляет собой текстовый язык программирования
низкого уровня, который очень похож на Assembler, но к конкретной
архитектуре процессора не привязан. Он позволяет описывать функции,
функциональные блоки и программы, а также шаги и переходы в языке SFC.
Одним из ключевых преимуществ IL является его простота и возможность
добиться оптимизированного кода для реализации критических секторов
программ. Особенности IL делают его неудобным для описания сложных
алгоритмов с большим количеством разветвлений.

Операторы языка¶

Основа языка программирования IL, как и в случае Assembler, это переходы
по меткам и аккумулятор. В аккумулятор загружается значения переменной,
а дальнейшее выполнение алгоритма представляет собой извлечение значения
из аккумулятора и совершение над ним операций. Далее в таблице 4.1
приведены операторы языка IL.

Таблица 1 – Операторы языка IL

Оператор Описание
LD Загрузить значение операнда в аккумулятор
LDN Загрузить обратное значение операнда в аккумулятор
ST Присвоить значение аккумулятора операнду
STN Присвоить обратное значение аккумулятора операнду
S Если значение аккумулятора TRUE, установить логический операнд
R Если значение аккумулятора FALSE, сбросить логический операнд
AND Поразрядное И аккумулятора и операнда
ANDN Поразрядное И аккумулятора и обратного операнда
OR Поразрядное ИЛИ аккумулятора и операнда
ORN Поразрядное ИЛИ аккумулятора и обратного операнда
XOR Поразрядное разделительное ИЛИ аккумулятора и операнда
XORN Поразрядное разделительное ИЛИ аккумулятора и обратного операнда
NOT Поразрядная инверсия аккумулятора
ADD Сложение аккумулятора и операнда, результат записывается в аккумулятор
SUB Вычитание операнда из аккумулятора, результат записывается в аккумулятор
MUL Умножение аккумулятора на операнд, результат записывается в аккумулятор
DIV Деление аккумулятора на операнд, результат записывается в аккумулятор
GT Значение аккумулятора сравнивается со значением операнда(>(greater than)). Значение (TRUE или FALSE) записывается в аккумулятор
GE Значение аккумулятора сравнивается со значением операнда(>=greater than or equal)). Значение (TRUE или FALSE) записывается в аккумулятор
EQ Значение аккумулятора сравнивается со значением операнда (=(equal)). Значение (TRUE или FALSE) записывается в аккумулятор
NE Значение аккумулятора сравнивается со значением операнда (<>(not equal). Значение (TRUE или FALSE) записывается в аккумулятор
LE Значение аккумулятора сравнивается со значением операнда (<=(less than or equal to)). Значение (TRUE или FALSE) записывается в аккумулятор
LT Значение аккумулятора сравнивается со значением операнда (<(less than)). Значение (TRUE или FALSE) записывается в аккумулятор
JMP Переход к метке
JMPC Переход к метке при условии, что значение аккумулятора TRUE
JMPCN Переход к метке при условии, что значение аккумулятора FALSE
CAL Вызов программного или функционального блока
CALC Вызов программного или функционального блока при условии, что значение аккумулятора TRUE
CALCN Вызов программного или функционального блока при условии, что значение аккумулятора FALSE
RET Выход из POU и возврат в вызывающую программу
RETC Выход из POU и возврат в вызывающую программу при условии, что значение аккумулятора TRUE
RETCN Выход из POU и возврат в вызывающую программу при условии, что значение аккумулятора FALSE

Пример программы на языке IL¶

На рис. 1 приведён пример программы на языке IL, которая эквивалентна
следующему логическому выражению C = A AND NOT B:

image1

Рис. 1 – Пример программы на языке IL

Первый оператор примера LD помещает значение переменной A в аккумулятор,
способный хранить значения любого типа. Второй оператор ANDN выполняет
«побитовое И» аккумулятора и обратного значения операнда, результат
всегда помещается в аккумулятор. Последний оператор примера ST
присваивает переменной C значение аккумулятора.

На этот раз давайте разберём

международный стандарт МЭК 61131-3, описывающий языки программирования

для программируемых логических

контроллеров (ПЛК). 

Стандарт МЭК 61131-3 устанавливает пять языков программирования ПЛК, три графических и два текстовых.

Более подробно о данных языках и базисных принципах рассматриваемого стандарта, расскажу в этой статье.

Первоначально стандарт назывался IEC 1131-3 и был опубликован в 1993 г. но в 1997 г. МЭК (IEC) перешел на новую систему обозначений и в названии стандарта добавилась цифра «6». Продвижением стандарта занимается организация PLCopen (http://www.plcopen.org).

Основной целью стандарта было повышение скорости и качества разработки программ для ПЛК, а также создание языков программирования, ориентированных на технологов, обеспечение соответствия ПЛК идеологии открытых систем, исключение этапа дополнительного обучения при смене типа ПЛК.

Системы программирования, основанные на МЭК 61131-3, характеризуются следующими показателями:

  • надежностью создаваемого программного обеспечения. Надежность обеспечивается тем, что программы для ПЛК создаются с помощью специально предназначенной для этого среды разработки, которая содержит все необходимые средства для написания, тестирования и отладки программ с помощью эмуляторов и реальных ПЛК, а также множество готовых фрагментов программного кода
  • возможностью простой модификации программы и наращивания ее функциональности
  • переносимостью проекта с одного ПЛК на другой
  • возможностью повторного использования отработанных фрагментов программы
  • простотой языка и ограничением количества его элементов

Языки МЭК 61131-3 появились не как теоретическая разработка, а как результат анализа множества языков, уже используемых на практике и предлагаемых рынку производителями ПЛК.

Стандарт устанавливает пять языков программирования со следующими названиями:

  • список инструкций (IL — Instruction List)
  • структурированный текст (ST — Structured Text)
  • релейно-контактные схемы, или релейные диаграммы (LD — Ladder Diagram)
  • диаграммы функциональных блоков (FBD — Function Block Diagram)
  • последовательные функциональные схемы (SFC — «Sequential Function Chart»)

Языки IL и ST являются текстовыми. Графическими языками являются LD, FBD, SFC.

В стандарт были введены несколько языков (а не один) для того, чтобы каждый пользователь мог применить наиболее понятный ему язык. 

Программисты чаще выбирают язык IL (похожий на ассемблер) или ST, похожий на язык высокого уровня Паскаль. Специалисты, имеющие опыт работы с релейной логикой, выбирают язык LD. Специалисты по системам автоматического управления (САУ) и схемотехники выбирают привычный для них язык FBD.

Выбор одного из пяти языков определятся не только предпочтениями пользователя, но и смыслом решаемой задачи. 

Если исходная задача формулируется в терминах последовательной обработки и передачи сигналов, то для нее проще и нагляднее использовать язык FBD. Если задача описывается как последовательность срабатываний некоторых ключей и реле, то для нее нагляднее всего будет язык LD. Для задач, которые изначально формулируются в виде сложного разветвленного алгоритма, удобнее будет язык ST.

  • вся программа разбивается на множество функциональных элементов — Program Organization Units (POU), каждый из которых может состоять из функций, функциональных блоков и программ. Любой элемент МЭК-программы может быть сконструирован иерархически из более простых элементов
  • стандарт требует строгой типизации данных. Указание типов данных позволяет легко обнаруживать большинство ошибок в программе до ее исполнения
  • имеются средства для исполнения разных фрагментов программы в разное время, с разной скоростью, а также параллельно. Например, один фрагмент программы может сканировать концевой датчик с частотой 100 раз в секунду, в то время как второй фрагмент будет сканировать датчик температуры с частотой один раз в 10 сек
  • для выполнения операций в определенной последовательности, которая задается моментами времени или событиями, используется специальный язык последовательных функциональных схем (SFC)
  • стандарт поддерживает структуры для описания разнородных данных. Например, температуру подшипников насоса, давление и состояние «включено-выключено» можно описать с помощью единой структуры «Pump» и передавать ее внутри программы как единый элемент данных
  • стандарт обеспечивает совместное использование всех пяти языков, поэтому для каждого фрагмента задачи может быть выбран любой, наиболее удобный, язык

Язык IL напоминает ассемблер и используется для реализации функций, функциональных блоков и программ, а также шагов и переходов в языке SFC. Основным достоинством языка является простота его изучения.

Наиболее часто язык IL используется в случаях, когда требуется получить оптимизированный код для реализации критических секций программы, а также для решения небольших задач с малым количеством разветвлений алгоритма.

В основе языка лежит понятие аккумулятора и переходов по меткам.

Пример программы на зыке IL с комментариями приведен в листинге 1.

Начинается программа с загрузки в аккумулятор значения переменной. Дальнейшие шаги программы состоят в извлечении содержимого аккумулятора и выполнении над ним ограниченного числа допустимых действий (их в языке всего 24).

<p>
				</p><p>Листинг 1. Пример программы на языке IL</p>

Листинг 1. Пример программы на языке IL

Язык ST является текстовым языком высокого уровня и очень сильно напоминает Паскаль:

Листинг 2. Пример программы на языке ST

IF Voltage>220 THEN

   Current:=Current — 10;  (*Если V>220 В, то уменьшить ток на 10*)

ELSE

   Current:=50; Speed:= ON;(*Установить ток 50А и включить мотор*)

END_IF;

Язык ST имеет много отличий от языка Паскаль и разработан специально для программирования ПЛК. Он содержит множество конструкций для присвоения значений переменным, для вызова функций и функциональных блоков, для написания выражений условных переходов, выбора операторов, для построения итерационных процессов. 

Этот язык предназначен в основном для выполнения сложных математических вычислений, описания сложных функций, функциональных блоков и программ.

Графический язык релейной логики впервые появился в виде электрических схем, которые состояли из контактов и обмоток электромагнитных реле (Рис. 1). 

Рис. 1. Пример программы на языке LD (слева) и ее эквивалент в виде электрической цепи с реле и выключателями (справа)

Рис. 1. Пример программы на языке LD (слева) и ее эквивалент в виде электрической цепи с реле и выключателями (справа)

Такие схемы использовались в автоматике конвейеров для сборки автомобилей до эры микропроцессоров.

Язык релейной логики был интуитивно понятен людям, слегка знакомым с электротехникой и поэтому оказался наиболее распространенным в промышленной автоматике. Обслуживающий персонал легко находил отказ в оборудовании, прослеживая путь сигнала по релейной диаграмме.

Однако язык LD проблематично использовать для реализации сложных алгоритмов, поскольку он не поддерживает подпрограммы, функции, инкапсуляцию и другие средства структурирования программ с целью повышения качества программирования. Эти недостатки затрудняют многократное использование программных компонентов, что делает программу длинной и сложной для обслуживания.

Инкапсуляция (от лат. in capsule — в оболочке) — это заключение данных и функционала в оболочку. В объектно-ориентированном программировании в роли оболочки выступают классы: они не только собирают переменные и методы в одном месте, но и защищают их от вмешательства извне.

Для выполнения арифметических функций в язык LD были добавлены функциональные блоки, которые выполняли операции сложения, умножения, вычисления среднего и т.д. 

Сложные вычисления в этом языке невозможны. Недостатком является также то, что только маленькая часть программы умещается на мониторе компьютера или панели оператора при программировании.

Несмотря на указанные недостатки, язык LD относится к наиболее распространенным в мире, хотя используется для программирования только простых задач.

FBD является графическим языком и наиболее удобен для программирования процессов прохождения сигналов через функциональные блоки.

Язык FBD удобен для схемотехников, которые легко могут составить электрическую схему системы управления на «жесткой логике», но не имеют опыта программирования.

Функциональные блоки представляют собой фрагменты программ, написанных на IL, SFC или других языках, которые могут быть многократно использованы в разных частях программы и которым соответствует графическое изображение, принятое при разработке функциональных схем электронных устройств, см. Рис. 2.

Рис. 2. Пример программы на языке FBD

Рис. 2. Пример программы на языке FBD

Язык FBD может быть использован для программирования функций, функциональных блоков и программ, а также для описания шагов и переходов в языке SFC. Функциональные блоки инкапсулируют данные и методы, чем напоминают объектно-ориентированные языки программирования, но не поддерживают наследование и полиморфизм.

Все то, что во время компиляции или исполнения программы может содержать или обрабатывать значения различных типов — является полиморфным, например:

  • переменные, меняющие свое значение на значение другого типа
  • объекты, обладающие свойствами, которые могут менять значение текущего типа на значение другого типа
  • функции, принимающие аргументы различных типов

Но пожалуй, самое лаконичное определение полиморфизма, можно найти в книге Бенджамина Пирса «Типы в языках программирования»: Термин «полиморфизм» обозначает семейство различных механизмов, позволяющих использовать один и тот же участок программы с различными типами в различных контекстах.

Под контекстом, грубо говоря, понимается набор всех доступных переменных в текущем участке программы.

Типичным применением языка FBD является описание «жесткой логики» и замкнутых контуров систем управления.

Язык функциональных блоков является удобным также для создания и пополнения библиотеки типовых функциональных блоков, которую можно многократно использовать при программировании задач промышленной автоматизации.

К типовым блокам относятся блок таймера, ПИД-регулятора, триггера, генератора импульсов, фильтра, и т. п.

SFC называют языком программирования, хотя по сути это не язык, а вспомогательное средство для структурирования программ.

Он предназначен специально для программирования последовательности выполнения действий системой управления, когда эти действия должны быть выполнены в заданные моменты времени или при наступлении некоторых событий. В его основе лежит представление системы управления с помощью понятий состояний и переходов между ними.

Язык SFC предназначен для описания системы управления на самом верхнем уровне абстракции, например, в терминах «Старт», «Наполнение автоклава», «Выполнение этапа № 1», «Выполнение этапа № 2», «Выгрузка из автоклава».

Язык SFC может быть использован также для программирования отдельных функциональных блоков, если алгоритм их работы естественным образом описывается с помощью понятий состояний и переходов.

Например, алгоритм автоматического соединения модема с коммутируемой линией описывается состояниями «Включение», «Обнаружение тона», «Набор номер», «Идентификация сигнала» и переходами «Если длинный — то ждать 20 сек», «Если короткий — перейти в состояние «Набор Номера» и т.д.

На Рис. 3 показан фрагмент программы на языке SFC. 

Программа состоит из шагов и условий переходов.

Шаги показываются на схеме прямоугольниками, условия переходов—жирной перечеркивающей линией.

Программа выполняется сверху вниз.

Начальный шаг на схеме показывается в виде двойного прямоугольника.

Условия переходов записываются рядом с их обозначениями.

Каждый шаг программы может представлять собой реализацию сложного алгоритма, написанного на одном из МЭК-языков.

Рис. 3. Пример программы на языке SFC

Рис. 3. Пример программы на языке SFC

К.Т.Н., ЭКСПЕРТ ПО АВТОМАТИЗАЦИИ ПРОИЗВОДСТВА, ШКОЛА FINE START

Более 10 лет опыта инженером по автоматизации, инженером-программистом АСУ ТП и инженером-проектировщиком АСУ ТП в разных отраслях промышленности. 

Принимал участие в таких крупных проектах автоматизации, как проекты ГУП «Мосгортранс» и ОАО «Линде Газ Рус».

Освоить востребованную профессию в сфере автоматизации производства вы можете в Школе Fine Start. Узнайте детали в каталоге наших профессий

Мы продолжаем изучать программирование ПЛК ОВЕН в универсальной среде программирования CoDeSys. В этой публикации представлены модификаторы и операторы языка IL (список инструкций). С предыдущей публикацией по программированию ПЛК, посвященной знакомству с языками программирования, с использованием которых можно писать программы в CoDeSys, можно ознакомиться здесь.

Язык IL (Instruction List) — список инструкций. Это типичный ассемблер с аккумулятором и переходами по меткам. Набор инструкций стандартизован и не зависит от конкретной целевой платформы. Поскольку IL самый простой в реализации язык, он получил очень широкое распространение до принятия стандарта МЭК. Язык IL позволяет работать с любыми типами данных, вызывать функции и функциональные блоки, реализованные на любом языке. Таким образом, на IL можно реализовать алгоритм любой сложности, хотя текст будет достаточно громоздким.

Общие сведения

Текст на IL — это текстовый список последовательных инструкций. Каждая инструкция записывается на отдельной строке. Инструкция может включать четыре поля, разделенные пробелами или знаками табуляции:

Метка: Оператор Операнд Комментарий

Метка инструкции не является обязательной, она ставится только там, где нужно. Оператор присутствует обязательно. Операнд необходим почти всегда. Комментарий — необязательное поле, записывается в конце строки. Ставить комментарии между полями инструкции нельзя. 

Аккумулятор IL является универсальным контейнером, способным сохранять значения переменных любого типа. Команды сравнения сравнивают значение операнда и аккумулятора, результат сравнения ИСТИНА или ЛОЖЬ вновь помещается в аккумулятор.

Программа на IL выполняется подряд, сверху вниз. Для изменения порядка выполнения и организации циклов применяется переход на метку. Переход на метку может быть безусловным JMP — выполняется всегда, независимо от чего-либо. Условный переход JMPC выполняется только при значении аккумулятора ИСТИНА. Переход можно выполнять как вверх, так и вниз.

Пример IL-программы:

LD 17 (*комментарий*)
ST lint
GE 5
JMPC next
LD idword
EQ istruct.sdword
STN test
next:
Попробуйте разобраться в данной программе самостоятельно, применив знания из следующего раздела

В IL можно использовать следующие операторы и модификаторы.

Модификаторы

Модификаторы С какими операторами используются Описание действия
С с JMP, CAL, RET: инструкция выполняется только тогда, когда результат аккумулятора ИСТИНА.
N с JMPC, CALC, RETC: инструкция выполняется тогда, когда результат аккумулятора ЛОЖЬ.
N в других случаях: отрицание операнда.
Модификаторы

Операторы IL

Ниже приведена таблица всех операторов IL с пояснениями и допустимыми модификаторами.

Оператор Модификатор Значение
LD N Присвоение аккумулятору значения оператора
ST N Присвоение значения аккумулятора операнду
S Присвоить логическому операнду значение ИСТИНА, если значение аккумулятора ИСТИНА
R Присвоить логическому операнду значение ЛОЖЬ
AND N, ( Побитное И
OR N, ( Побитное ИЛИ
XOR N, ( Побитное исключающее ИЛИ
ADD ( Сложение
SUB ( Вычитание
MUL ( Умножение
DTV ( Деление
GT ( Сравнение на больше (>)
GE ( Сравнение на больше или равно (>=)
QE ( Сравнение на равенство (=)
NE ( Сравнение на неравенство (<>)
LE ( Сравнение на меньше или равно (<=)
LT ( Сравнение на меньше (<)
JMP CN Переход к метке
CAL CN Вызов функционального блока
RET CN Выход из POU и возврат в вызывающую программу
) Вычисление задержанной операции

Пример IL программы с использованием некоторых модификаторов:

LD TRUE (*загрузить значение ИСТИНА в аккумулятор*)
AND BOOL1 (*выполнить И с инверсным значением переменной BOOL1*)
JMPC mark (*если значение аккумулятора ИСТИНА, то перейти к метке ” mark”*)
LDN BOOL2 (*сохранить инверсное значение BOOL2 в аккумуляторе*)
ST ERG (*сохранить значение аккумулятора в ERG*)

После оператора можно поставить скобки, тогда значение выражения внутри скобок рассматривается как операнд. Например:

Здесь значение ERG равно 7 Здесь значение переменной ERG равно 10
LD 2 LD 2
MUL 2 MUL (2
ADD 3 ADD 3
ST ERG )
ST ERG

Операция MUL выполняется только тогда, когда программа доходит до “)”. В качестве операнда MUL использует значение 5.


В этой статье мы познакомились с модификаторами и операторами языка IL, используемыми в проектах CoDeSys. На следующем уроке начнем разбираться с операторами языка программирования ST (структурированный текст), используемыми в проектах CoDeSys.

Главная /
Проектирование /
Программирование ПЛК /

Разрабатываю ПО для ПЛК ОВЕН в CoDeSys. Могу написать программу целиком, или часть программы.
Или разработать АСУ на базе ПЛК ОВЕН (включая схемы и чертежи). При необходимости могу создать
ПО и для ПЛК других производителей. Цена зависит от сложности, объёма работ и сроков. Ваши задачи присылайте на почту:
ks-app@mail.ru.
Или пишите в личку в группе ВК.
Подробности см. здесь…

Пожалуй, среди языков программирования ПЛК язык IL самый сложный. И, тем не менее, я начну именно с него.

IL (Instructions List — перечень инструкций) — это текстовый язык программирования — список последовательных инструкций. Он очень похож на язык ассемблера и по сложности сравним с ним (хотя, конечно, здесь всё относительно).

Каждая инструкция в программе записывается на отдельной строке. Инструкция может включать не более четырёх полей, разделённых пробелами или знаками табуляции:

МЕТКА:    ОПЕРАТОР    ОПЕРАНД    КОММЕНТАРИЙ

Пример:

START:  LD  2  (* Записать число в аккумулятор *)

Здесь START — это метка, LD — оператор (команда), 2 — операнд, а строка,
заключённая между (* и *) — это комментарий. Комментарии игнорируются программой. Комментарии можно вставлять только в конце строки или между строками. Метка и комментарий не являются обязательными. Метка может быть в отдельной строке. Оператор (команда, инструкция) должен быть всегда (без него смысл команды теряется). Операнд также необходим для большинства инструкций.

Чтобы код программы лучше воспринимался, поля обычно выравнивают по левому краю. Примерно так:

LD   2    (* Записать число в аккумулятор *)
ADD  3    (* Прибавить к аккумулятору число 3 *)
ST   Res  (* Значение аккумулятора записать в переменную Res *)

Переменные объявляются обычным для языков МЭК способом. Например:

PROGRAM IL_TEST
VAR
  Res : INT;
END_VAR

Примерно так это будет выглядеть в среде разработки CoDeSys 2:

Язык программирования IL

Аккумулятор в IL

Подавляющее большинство инструкций языка IL выполняют какие-либо действия с аккумулятором (точнее,
с его содержимым). В примере выше инструкция LD загружает число 2 в аккумулятор.
А команда ADD прибавляет число 3 к значению аккумулятора (куда, как мы помним,
сначала было загружено число 2). Результат выполнения команды ADD также помещается
в аккумулятор. В итоге в аккумуляторе будет число 5. Команда ST выгружает
значение аккумулятора в переменную Res.

Аккумулятор является неким контейнером для временного хранения данных. Он может хранить значения переменных любого типа.

В аккумулятор можно поместить сначала значение типа BOOL, затем INT и так далее. Однако это не означает, что аккумулятор может одновременно хранить значения разных типов. Он может хранить только одно значение одного типа. Причём тип значения также запоминается аккумулятором. Так что если вы загрузите туда значение одного типа, а затем попробуете выполнить, например, сложение, с другим типом, то компилятор выдаст ошибку:

Несоответствие типов в IL

Невнимательный читатель даже не увидит разницы между первым и вторым рисунком. Однако в первом случае всё правильно, а во втором — ошибка несоответствия типов.

В стандарте МЭК вместо термина “аккумулятор” используется термин “результат” (result). Получается, что инструкция берёт “текущий результат” и создаёт “новый результат”. Однако почти все руководства по программированию, в том числе справочная документация, обычно применяют термин “аккумулятор”.

Зачем использовать IL

И ещё один вопрос, который наверняка мучает начинающих: зачем использовать этот не очень понятный язык, если в стандарте МЭК есть ещё четыре языка, намного более простых, чем IL.

Ответ не будет оригинальным. Язык IL Используется в программировании ПЛК для тех же целей, что и язык ассемблера для программирования компьютеров. То есть там, где нужен максимально быстрый код с минимальным размером исполняемого файла.

Язык IL, можно сказать, не компилируется. Потому что он почти (ключевое слово “почти”) такой же крутой, как машинные команды. Так что можете быть уверены, что ваша программа на IL будет почти всегда быстрее, чем такая же программа на других языках.

Однако это качество требуется очень редко. Поэтому вставки кода на IL имеет смысл делать только на очень критических участках, где требуется максимальное быстродействие.

На этом краткое знакомство с языком IL закончим. Но я буду по мере возможностей о нём рассказывать и дальше.
Так что подписывайтесь на новости, чтобы ничего не пропустить (красная кнопка вверху справа), или
подключайтесь к группе ВК.

yazyki-programmirovaniya-plc-ilВ этой статье, или, скорее, цикле статей хочу поговорить о языках программирования ПЛК и дать их понимание и описание.

Языки программирования ПЛК прошли довольно приличный путь, прежде, чем обрели свой теперешний вид.

Изначально ПЛК представляли собой вообще устройства с жестко зашитой логикой работы. Что, конечно же, было весьма неудобно для случаев, если нужно было что-то поменять в цикле производства. Приходилось фактически изготавливать новый контроллер. Хотя это был самый дешёвый вариант. Затем были придуманы контроллеры, которые можно было перепрограммировать с помощью релейной логики. И именно от них и пошла аббревиатура ПЛК (PLC — programmable logic controller).

Затем появились контроллеры с программированием на машинно-ориентированном языке, что значительно облегчало адаптацию их под новые нужды производства. Но, с другой стороны, требовало постоянного привлечения профессиональных программистов. Затем для программирования использовались и языки высокого уровня, что опять-таки требовало наличия программистов.

Кроме того, каждый производитель промышленных контроллеров изобретал свой язык и способ программирования своих изделий. Что, безусловно, облегчало программирование контроллеров и не требовало наличия программистов, но вносило сумбур и чересчур большое разнообразие языков на рынке, что создавало сложности для потребителя.

И этот бардак длился до тех пор, пока МЭК (IEC) не был предложен стандарт, включающий в себя 5 (пять) языков программирования промышленных контроллеров, который поддержали и со временем дополнили большинство производителей контроллеров. Этот стандарт именуется МЭК (IEC) 61131-3.

Как я уже сказал, этот стандарт предусматривает 5 языков. Языки эти не были выдуманы разработчиками стандарта, а взяты из всего лучшего, что было уже наработано производителями ПЛК. Эти языки достаточно просты, ориентированы не на программистов, а на инженеров, которые разбираются и понимают процессы, требующие автоматизации с помощью ПЛК, и достаточно легки в освоении.

Итак, что же это за языки.

Хотя, стоп. Для начала — о типах данных.

В языках стандарта типы данных строго контролируются. Это означает, что присвоить одной переменной значение другой можно только, если обе — одного типа. Но есть функции явного преобразования типов.

Возможно и неявное преобразование типов в том случае, если переменной присваивается значение, тип данных которого совместим с типом данных переменной и имеет более узкое множество значений. Например, тип данных SINT (-128…+127) можно присваивать типу INT (-32568…+32567).

Приведу табличку с типами данных МЭК 61131-3

Тип

Нижний предел

Верхний предел

Размер в байтах

Логический тип
BOOL 0 (FALSE) 1 (TRUE) 1 бит
Целочисленные типы
BYTE 8 бит
WORD 16 бит 2
DWORD 32 бита 4
LWORD 64 бита 8
SINT -128 127 1
INT -32768 32767 2
DINT -231 231-1 4
LINT -263 263-1 8
USINT 0 255 1
UINT 0 65535 2
UDINT 0 232-1 4
ULINT 0 264-1 8
Числа с плавающей точкой
REAL ±10±38 4 (из них 23 бита – мантисса)
LREAL ±10±307 84 (из них 52 бита – мантисса)
Строки
STRING 1 на символ
WSTRING 2 на символ
Время
TIME Время длительности (интервал времени)
Дата и время
DATE Календарная дата (в секундах от 01.01.1970 4
TIME_OF_DAY Время суток (макс.=24 часа) 4
DATE_AND_TIME Дата и время 4
Пользовательские типы
ARRAYS Массив
STRUCT Структура
TYPE Одиночный тип

А теперь – языки программирования ПЛК.

Знакомьтесь — ILсписок инструкций (instruction list). Очень напоминает ассемблер. Все действия в нём совершаются через аккумулятор. Сначала в аккумулятор заносится необходимая переменная или величина, а затем с ней совершаются различные операции. Операций не много — всего 24.

Оператор Описание
LD Загрузить значение операнда в аккумулятор
ST Присвоить значение оператора аккумулятору
S Если аккумулятор TRUE, то установить логический операнд (в TRUE)
R Если аккумулятор FALSE, то сбросиь логический операнд (в FALSE)
AND Поразрядное И
OR Поразрядное ИЛИ
XOR Поразрядное исключающее ИЛИ
NOT Поразрядная инверсия аккумулятора
ADD Сложение
SUB Вычитание
MUL Умножение
DIV Деление
MOD Деление по модулю
GT >
GE >=
QE =
NE <>
LE <=
LT <
JMP Переход на метку
CAL Вызов функционального блока
RET Возврат в вызывающую программу

Описанные в таблице инструкции  — это обязательный набор, регламентированный стандартом. Но конкретные реализации языка для контроллера могут дополняться своими инструкциями по желанию производителя.

IL легко конвертируется в язык релейной логики LD, о котором мы поговорим дальше.

Подробнее расписывать этот язык я не буду. Во-первых, сам я им практически не пользуюсь, а во-вторых этот язык устарел и в третьей редакции стандарта МЭК 61131-3 от 2012 года его уже не рекомендуют к использованию.

В продолжении статьи мы поговорим о языке LD – ladder diagramm, или язык релейной логики, который очень хорошо понятен тем, кто имеет дело с электрическими схемами.

Есть замечания к статье? Делитесь ими в комментариях.

И не забывайте делиться статьей с коллегами в соцсетях!

Похожие статьи:

Понравилась статья? Поделить с друзьями:
  • In sink erator model 75 инструкция
  • Indesit dif 16b1 a инструкция
  • Indesit dfg 0507 инструкция по применению
  • Indesit c240g инструкция по эксплуатации
  • Indesit c236g 016 инструкция по эксплуатации