Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование промышленных контроллеров. Учебное пособие
.pdf
В текст так же, как и в IL, могут быть введены комментарии, ко-
Оператор
Значение
Операнд
Правило
старшинства
1
2 3 4
( )
Заключение в
скобки
Выражение
1 (наивыс-
ший)
FUNCNAME
(список фактических параметров)
Функция вызова
Выражение, литерал, переменная, прямой адрес типа
данных ANY
2
**
Возведение в
степень
Выражение, литерал, переменная, прямой адрес типа
данных REAL (основание),
ANY_NUM (экспонента)
3
–
Отрицание
Выражение, литерал, переменная, прямой адрес типа
данных ANY_NUM
4
NOT
Дополнение
Выражение, литерал, переменная, прямой адрес типа
данных ANY_BIT
4
*
Умножение
Выражение, литерал, переменная, прямой адрес типа
данных ANY_NUM или
TIME
5
/
Деление
Выражение, литерал, переменная, прямой адрес типа
данных ANY_NUM
5
MOD
Модуль
Выражение, литерал, переменная, прямой адрес
типа данных ANY_NUM
5
+
Сложение
Выражение, литерал, переменная, прямой адрес типа
данных ANY_NUM или
TIME
6
торые должны начинаться символами «(*» и заканчиваться ими же.
В табл. 3.4 представлены основные логические и арифметические
операторы языка ST [4].
Таблица 3.4
51

Окончание табл. 3.4
1
2 3 4
–
Вычитание
Выражение, литерал, переменная, прямой адрес типа
данных ANY_NUM или
TIME
6
<
Меньше чем
Выражение, литерал, переменная, прямой адрес типа
данных ANY_ELEM
7
>
Больше чем
Выражение, литерал, переменная, прямой адрес типа
данных ANY_ELEM
7
≤
Меньше или
равно
Выражение, литерал, переменная, прямой адрес типа
данных ANY_ELEM
7
≥
Больше или
равно
Выражение, литерал, переменная, прямой адрес типа
данных ANY_ELEM
7
=
Равенство
Выражение, литерал, переменная, прямой адрес типа
данных ANY_ELEM
8
<>
Неравенство
Выражение, литерал, переменная, прямой адрес типа
данных ANY_ELEM
8
&, AND
Логическое И
Выражение, литерал, переменная, прямой адрес типа
данных ANY_BIT
9
XOR
Логическое
исключающее
ИЛИ
Выражение, литерал, переменная, прямой адрес типа
данных ANY_BIT
10
OR
Логическое
ИЛИ
Выражение, литерал, переменная, прямой адрес типа
данных ANY_BIT
11 (низший)
Заключение в скобки используется, чтобы изменить порядок обработки операторов. С помощью отрицания осуществляется реверсирование знака для значения операнда. Пример отрицания:
OUT:= –IN1;
В примере переменная OUT будет равна –4, если IN1 = 4.
52

С помощью оператора NOT выполняется поразрядная инверсия
операнда. Пример оператора NOT:
OUT:= NOT IN1;
В примере переменная OUT будет равна 0011001100, если
IN1 = 1100110011.
При умножении значение первого операнда умножается на второй операнд.
В операторе MOD значение первого операнда делится на значение второго операнда, а остаточный член от деления (по модулю) возвращается как результат. Пример оператора MOD:
OUT:= IN1 MOD IN2;
В примере переменная OUT будет равна 1, если IN1 = 7 и IN2 = 2.
При использовании оператора «больше чем» значение первого
операнда сравнивается со значением второго операнда. Если первый
операнд больше, чем второй, результатом будет булева единица (1).
Если первый операнд меньше второго или равен второму операнду,
результатом будет булев нуль (0). Пример оператора «больше чем»:
OUT:= IN1 > 10;
В примере переменная OUT будет равна 1, если IN1 > 10, иначе
– 0.
При использовании оператора «больше или равно» значение
первого операнда сравнивается со значением второго операнда. Если
первый операнд больше второго или равен второму операнду, результатом будет булева единица. Если первый операнд меньше, чем второй, результатом будет булев нуль. Пример оператора «больше или
равно»:
OUT:= IN1 ≥ 10;
В примере переменная OUT будет равна 1, если IN1 ≥ 10, иначе – 0.
При использовании оператора «равно» значение первого операнда сравнивается со значением второго операнда. Если первый опе-
53

ранд равен второму, результатом будет булева единица. Если первый
операнд не равен второму, результатом будет булев нуль. Пример
оператора «равно»:
OUT:= IN1 = 10;
В примере переменная OUT будет равна 1, если IN1 = 10, иначе – 0.
При использовании оператора «не равно» значение первого операнда сравнивается со значением второго операнда. Если первый операнд не равен второму, результатом будет булева единица. Если первый операнд равен второму, результатом будет булев нуль. Пример
оператора «не равно»:
OUT:= IN1 <> 10;
В примере переменная OUT будет равна 1, если переменная
IN1 ≠ 10, иначе – 0.
При использовании оператора «меньше или равно» значение
первого операнда сравнивается со значением второго операнда. Если
первый операнд меньше второго или равен второму операнду, результатом будет булева единица. Если первый операнд больше, чем второй, результатом будет булев нуль. Пример оператора «меньше или
равно»:
OUT:= IN1 ≤ 10;
В примере переменная OUT будет равна 1, если переменная
IN1 ≤ 10, иначе – 0.
При использовании оператора «меньше чем» значение первого
операнда сравнивается со значением второго операнда. Если первый
операнд меньше, чем второй, результатом будет булева единица. Если
первый операнд больше второго или равен второму операнду, результатом будет булев нуль. Пример оператора «меньше чем»:
OUT:= IN1 < 10;
В примере переменная OUT будет равна 1, если переменная
IN1 < 10, иначе – 0.
54

При использовании оператора «логическое И» осуществляется
логическая операция И между операндами. Пример логического И:
OUT:= IN1 AND IN2 AND IN3;
или
OUT:= IN1&IN2&IN3;
В примере переменная OUT будет равна 1, если переменные
IN1, IN2 и IN3 будут равны 1. С типами данных BYTE и WORD связывание происходит поразрядно.
С помощью оператора OR (ИЛИ) осуществляется логическая
операция ИЛИ между операндами. Пример с логическим ИЛИ:
OUT:= IN1 OR IN2 OR IN3;
В примере переменная OUT будет равна 1, если переменные IN1
или IN2, или IN3 будут равны 1. С типами данных BYTE и WORD
связывание происходит поразрядно.
С помощью оператора XOR выполняется логическая операция
«исключающее ИЛИ» между операндами. Пример использования оператора XOR:
OUT:= IN1 XOR IN2;
В примере переменная OUT будет равна 1, если переменные
IN1, IN2 не равны. Если переменные IN1 и IN2 имеют одинаковое состояние (обе равны 0 или 1), переменная OUT будет равна 0.
Если больше, чем два операнда связаны, результат с нечетным
числом единичных состояний будет равен 1, а с четным числом единичных состояний будет равен 0. Пример оператора XOR:
OUT:= IN1 XOR IN2 XOR IN3 XOR IN4 XOR IN5;
В примере переменная OUT будет равна 1, если операнды 1, 3
или 5 будут равны 1. Переменная OUT будет равна 0, если операнды
0, 2 или 4 будут равны 1. С типами данных BYTE и WORD связывание происходит поразрядно.
55

Помимо арифметических и логических операторов при программировании на языке ST также применяются [6]:
1) объявление VAR…END_VAR;
2) присвоение «:=»;
3) оператор RETURN;
4) структура IF-THEN-ELSIF-ELSE;
5) оператор CASE;
6) итерационный оператор WHILE;
7) итерационный оператор REPEAT;
8) итерационный оператор FOR;
9) оператор EXIT.
3.4.2. Объявление VAR...END_VAR
Применяется для объявления используемых функциональных
блоков и для объявления прямых адресов, если они не применяются
с заданными по умолчанию типами данных. Вводится только один раз
в начале секции. Синтаксис оператора выглядит следующим образом:
VAR
<description>;
<description>;
……………...
END_VAR
В объявлении функциональных блоков каждому используемому
блоку назначается имя экземпляра блока, которое служит для идентификации функционального блока в проекте. Имя экземпляра должно
быть уникальным для всего проекта и должно удовлетворять соглашениям стандарта по имени, иначе появится сообщение об ошибках.
Пример объявления функциональных блоков:
VAR
RT1: R_TRIG;
FT1: F_TRIG;
C: CTUD;
END_VAR
56

Пример объявления прямых адресов:
VAR
OUTER_SENSOR AT %IX0.0: BOOL;
INNER_SENSOR AT %IX0.1: BOOL;
RESETBUTTON AT %IX0.2: BOOL;
END_VAR
3.4.3. Присвоение
Присвоение состоит из переменной, введенной слева от оператора присвоения, далее следует оператор присвоения «:=», а затем –
выражение, которое должно быть выполнено. Синтаксис оператора
присвоения:
<variable>:= <any_expression>;
Операнды: переменная должна быть внутренняя или выходная.
Переменная и выражение должны иметь один и тот же тип. Пример:
(*variable<<=variable*)
bo23 := bo10;
3.4.4. Оператор RETURN
Оператор RETURN заканчивает выполнение текущей программы. У данного оператора нет операндов. Синтаксис:
RETURN;
В блоке SFC оператор RETURN определяет конец выполнения
только данного блока. Пример использования оператора RETURN:
If not (CU) then
Q:= false;
CV:= 0;
RETURN; (*закончить программу*)
end_if;
if R then CV:= 0;
57

else
if (CV < PV) then
CV :=CV + 1;
end_if;
end_if;
Q := (CV >= PV);
3.4.5. Структура IF-THEN-ELSIF-ELSE
Выполняет один или два списка ST операторов, выбор осуществляется в соответствии со значением булева выражения. Синтаксис структуры IF-THEN-ELSIF-ELSE:
IF <boolean_expression> THEN
<statement> ;
<statement> ;
ELSIF <boolean_expression> THEN <statement> ;
<statement> ;
ELSE
<statement> ;
<statement> ;
END_IF;
Операторы ELSE и ELSIF являются дополнительными. Утверждение ELSIF всегда следует за утверждением IF...THEN. Утверждение ELSIF определяет, что утверждение и/или группа утверждений
будут выполнены, только если значение связанного булева выражения
утверждения IF будет равно 0 (ложно) и значение связанного булева
выражения утверждения ELSIF будет равно 1 (истина). Если условие
утверждения IF будет равно 1 (истина) и/или условие утверждения
ELSIF будет равно 0 (ложно), утверждение или группа утверждений
не будут выполнены.
Если утверждение ELSE следует после IF или ELSIF, утверждение и/или группа утверждений будут выполнены, только если значение связанных булевых выражений IF и ELSIF утверждений будет
ложным. Если условие IF или ELSIF утверждения будет истинным,
утверждение и/или группа утверждений не будут выполнены. Пример
применения структуры:
58

(*ST программа, использующая оператор IF*)
IF manual AND not (alarm) THEN
level := manual_level;
bx126 := bi12 OR bi45;
ELSIF over_mode THEN
level := max_level;
ELSE
level := (lv16 * 100) / scale;
END_IF;
(* IF структура без ELSE *)
If overflow THEN
alarm_level := true;
END_IF;
3.4.6. Оператор CASE
Утверждение CASE состоит из выражения типа данных Integer
(селектора) и списка групп утверждений. Каждой группе задана метка,
которая содержит одно число, или большее количество целых чисел,
или диапазонов целочисленных значений. Группа утверждений будет
выполнена в том случае, если она имеет метку, содержащую определенное значение селектора. Иначе никакое утверждение не будет выполнено.
Утверждение OF идентифицирует начало меток. Внутри утверждения CASE может быть сделано утверждение ELSE, т. е. утверждение о том, какие утверждения будут выполняться, если не имеется
никакой метки, содержащей значение селектора.
Утверждение END_CASE идентифицирует конец утверждения
или группы утверждений. Синтаксис оператора CASE:
CASE <integer_expression> OF
<value> : <statements> ;
<value> , <value> : <statements> ;
ELSE
<statements> ;
END_CASE;
Далее представлен пример использования оператора CASE:
59

селектор
CASE SELECT OF 1,5 : C:= SIN_REAL(A)*COS_REAL(B)
2: B:=C-A;
6…10:C:=A+B;
ELSE B:=C*A;
C:=A/B; метка
END_CASE;
3.4.7. Итерационный оператор WHILE
WHILE приводит к повторению выполнения последовательности ST-операторов до тех пор, пока связанное булево выражение не
станет ложным. Если выражение было ложно изначально, группа
утверждений не будет выполнена, т. е. условие проверяется прежде
выполнения итерации.
DO идентифицирует конец определения повторения и начало
утверждений. END_WHILE идентифицирует конечное утверждение
или группу конечных утверждений. Синтаксис оператора WHILE:
WHILE <boolean_expression> DO
<statement> ;
<statement> ;
END_WHILE;
Пример применения оператора WHILE:
var := 1
WHILE var <= 100 DO
var := var + 4;
END_WHILE ;
3.4.8. Итерационный оператор REPEAT
Оператор REPEAT – итерационная структура для группы STоператоров. REPEAT приводит к повторению выполнения последовательности утверждений (по крайней мере, один раз), пока связанное
булево условие не станет истинным, т. е. условие вычисляется после
выполнения итерации. Синтаксис оператора REPEAT:
60
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
