Операторы IL
Следующая таблица представляет стандартные операторы языка 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, другие стандартные операторы можно найти в главе “Стандартные операторы, функциональные блоки и функции”.

Операция: загружает значение в текущий результат
Допустимые модификаторы: N
Операнд: константа, внутренняя, входная или выходная переменная
Пример:
(* ПРИМЕР LD ОПЕРАЦИЙ *)
LDex: LD false (* результат := FALSE boolean constant *)
LD true (*результат := TRUE boolean constant *)
LD 123 (*результат := integer constant *)
LD 123.1 (*результат := real constant *)
LD t#3ms (*результат := time constant *)
LD boo_var1 (*результат := boolean variable *)
LD ana_var1 (*результат := analog variable *)
LD tmr_var1 (*результат := timer variable *)
LDN boo_var2 (*результат := NOT ( boolean variable ) *)

Операция: запоминает текущий результат в переменной
Текущий результат этим оператором не изменяется
Допустимые модификаторы: N
Операнд: внутренняя или выходная переменная
Пример:
(* ПРИМЕР ST ОПЕРАЦИЙ *)
STboo: LD false
ST boo_var1 (* boo_var1 := FALSE *)
STN boo_var2 (* boo_var2 := TRUE *)
STana: LD 123
ST ana_var1 (* ana_var1 := 123 *)
STtmr: LD t#12s
ST tmr_var1 (* tmr_var1 := t#12s *)

Операция: запоминает TRUE в булевской переменной, если текущий результат имеет значение TRUE. Никаких операций не выполняется, если текущий результат равен FALSE. Текущий результат не модифицируется.
Допустимые модификаторы: (нет)
Операнд: внутренняя или выходная булевская переменная
Пример:
(* ПРИМЕР S ОПЕРАЦИЙ *)
SETex: LD true (*текущий результат := TRUE *)
S boo_var1 (* boo_var1 := TRUE *)
(*текущий результат не изменяется *)
LD false (*текущий результат := FALSE *)
S boo_var1 (* ничего не делать - boo_var1 не изменяется *)

Операция: запоминает FALSE в булевской переменной если текущий результат имеет значение TRUE. Никаких операций не выполняется если текущий результат равен FALSE. Текущий результат не модифицируется.
Допустимые модификаторы: (нет)
Операнд: внутренняя или выходная булевская переменная
Пример:
(* ПРИМЕР R ОПЕРАЦИЙ *)
RESETex: LD true (*текущий результат:= TRUE *)
R boo_var1 (* boo_var1 := FALSE *)
(*текущий результат не изменяется *)
ST boo_var2 (* boo_var2 := TRUE *)
LD false (*текущий результат:= FALSE *)
R boo_var1 (*ничего не делать - boo_var1 не изменяется *)

Операция: прыгает на указанную метку
Допустимые модификаторы: C N
Операнд: метка определенная в той же IL программе
Пример:
(* следующий пример проверяет значение аналогового селектора (0 или 1 или 2) *)
(* чтобы установить один из 3 булевских выходов. Проверка "равно 0" делается *)
(* оператором JMPC *)
JMPex: LD selector (* selector is 0 or 1 or 2 *)
BOO (* превращение в boolean *)
JMPC test1 (* if selector = 0 then *)
LD true
ST bo0 (* bo0 := true *)
JMP JMPend (* конец программы*)
test1: LD selector
SUB 1 (* уменьшить selector: теперь 0 или 1 *)
BOO (* превращение в boolean *)
JMPC test2 (* if selector = 0 then *)
LD true
ST bo1 (* bo1 := true *)
JMP JMPend (* конец программы*)
test2: LD true (* последняя возможность *)
ST bo2 (* bo2 := true *)
JMP end: (* конец IL программы*)

Операция: заканчивает текущий список инструкций. Если IL последовательность - подпрограмма, то текущий результат возвращается в вызывающую подпрограмму.
Допустимые модификаторы: C N
Операнд: (нет)
Пример:
(* следующий пример проверяет значение аналогового селектора (0 или 1 или 2) *)
(* чтобы установить один из 3 булевских выходов. Проверка "равно 0" делается *)
(* the JMPC operator *)
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 *)

Операция: выполняет задержанную операцию. Задержанная операция обозначается “(“
Допустимые модификаторы: (нет)
Операнд: (нет)
Пример:
(* Следующая программа использует задержанные операции: *)
(* res := a1 + (a2 * (a3 - a4) * a5) + a6; *)
Delayed: LD a1 (* result := a1; *)
ADD( a2 (* задержанный ADD - result := a2; *)
MUL( a3 (* задержанный MUL - result := a3; *)
SUB a4 (* result := a3 - a4; *)
) (*выполнить задержан. MUL-result:=a2*(a3-a4); *)
MUL a5 (* result := a2 * (a3 - a4) * a5; *)
) (* выполнить задержанный ADD *)
(* result := a1 + (a2 * (a3 - a4) * a5); *)
ADD a6 (* result := a1 + (a2 * (a3 - a4) * a5) + a6; *)
ST res (*запомнить текущ. результат в переменной res *)

Подпрограмма или функция ( написанная на любом из языков IL, ST, LD, FBD или “C”) вызывается из языка IL, используя имя в качестве оператора.
Операция: выполняет подпрограмму или функцию - значение возвращенное подпрограммой или функцией запоминается в текущем результате IL
Допустимые модификаторы: (нет)
Операнд: Первый параметр должен быть запомнен в текущем результате перед вызов. Остальные параметры записываются в поле операнда через запятую
Пример:
(* Вызывающая программа: превращает аналоговое значение в временное *)
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 (* возвратить текущий результат в вызывающую программу*)

Операция: вызывает функциональный блок
Допустимые модификаторы: C N
Операнд: Имя функционального блока. Входные параметры блока должны быть присвоены с помощью операторов LD/ST до вызова. Выходные параметры могут быть использованы.
Пример 1:
(* Вызов функционального блока SR : SR1 - экземпляр SR *)
LD auto_mode
AND start_cmd
ST SR1.set1
LD stop_cmd
ST SR1.reset
CAL SR1
LD SR1.Q1
ST command
(* FBD эквивалент : *)

Пример 2
(*Мы предполагаем, что R_TRIG1 - это экземпляр блока R_TRIG и CTU1 - это экземпляр блока CTU*)
LD command
ST R_TRIG1.clk
CAL R_TRIG1
LD R_TRIG1.Q
ST CTU1.cu
LDN auto_mode
ST CTU1.reset
LD 100
ST CTU1.pv
CAL CTU1
LD CTU1.Q
ST overflow
LD CTU1.cv
ST result
(* FBD эквивалент : *)
