Основные операторы ST
Основные операторы языка ST:
Присвоение
Оператор RETURN
Структура IF-THEN-ELSIF-ELSE
Оператор CASE
Итерационный оператор WHILE
Итерационный оператор REPEAT
Итерационный оператор FOR
Оператор EXIT

Name: :=
Значение: присваивает значение выражению
Синтаксис: <variable> := <any_expression>;
Операнды: переменная должна быть внутренняя или выход, переменная и выражение должны иметь один и тот же тип
Выражение может быть вызовом подпрограммы или функции из библиотеки ISaGRAF.
Пример:
(* ST программа с присвоением *)
(* variable <<= variable *)
bo23 := bo10;
(* variable <<= expression *)
bo56 := bx34 OR alrm100 & (level >= over_value);
result := (100 * input_value) / scale;
(* присвоение возвращаемого значения подпрограммы *)
rc := PSelect ( );
(* присвоение с вызовом функции *)
limited_value := min (16, max (0, input_value) );

Имя: RETURN
Значение: заканчивает выполнение текущей программы
Синтаксис: RETURN;
Операнды: (нет)
В блоке SFC оператор RETURN определяет конец выполнения только данного блока.
Пример:
(* FBD программа: программируемый счетчик *)

(* ST программа *)
If not (CU) then
Q := false;
CV := 0;
RETURN; (* закончить программу*)
end_if;
if R then
CV := 0;
else
if (CV < PV) then
CV := CV + 1;
end_if;
end_if;
Q := (CV >= PV);

Имя: IF... THEN... ELSIF... THEN... ELSE... END_IF
Значение: выполняет один или два списка ST операторов, выбор осуществляется в соответствии со значением булевского выражения
Синтаксис: IF <boolean_expression> THEN
<statement> ;
<statement> ;
...
ELSIF <boolean_expression> THEN
<statement> ;
<statement> ;
...
ELSE
<statement> ;
<statement> ;
...
END_IF;
Операторы ELSE и ELSIF - дополнительные. Если ELSE опущен и условие равно FALSE, то никаких инструкций не выполняется.
Пример:
(*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;

Имя: CASE... OF... ELSE... END_CASE
Значение: выполняет один или несколько списков ST операторов, выбор осуществляется в соответствии с целым выражением
Синтаксис: CASE <integer_expression> OF
<value> : <statements> ;
<value> , <value> : <statements> ;
...
ELSE
<statements> ;
END_CASE;
Значением CASE должна быть целая константа. Несколько значений разделенных запятыми могут указывать на один и тот же список операторов.
Оператор ELSE - дополнительный.
Пример:
(*ST программа , использующая оператор CASE*)
CASE error_code OF
255: err_msg := 'Division by zero';
fatal_error := TRUE;
1: err_msg := 'Overflow';
2, 3: err_msg := 'Bad sign';
ELSE
err_msg := 'Unknown error';
END_CASE;

Имя: WHILE... DO... END_WHILE
Значение: итерационная структура для группы ST операторов, условие вычисляется прежде выполнения итерации
Синтаксис: WHILE <boolean_expression> DO
<statement> ;
<statement> ;
...
END_WHILE ;
Предупреждение:
Так как ISaGRAF синхронная система входные переменные не обновляются во время итераций WHILE. Изменение состояния входных переменных не может быть использовано для описания условия оператора WHILE.
Пример:
(*ST программа , использующая оператор WHILE*)
(* эта программа использует "C" функции для чтения *)
(* символов из последовательного порта *)
string := ''; (* empty string *)
nbchar := 0;
WHILE ((nbchar < 16) & ComIsReady ( )) DO
string := string + ComGetChar ( );
nbchar := nbchar + 1;
END_WHILE;

Имя: REPEAT... UNTIL... END_REPEAT
Значение: итерационная структура для группы ST операторов, условие вычисляется после выполнения итерации
Синтаксис: REPEAT
<statement> ;
<statement> ;
...
UNTIL <boolean_condition>
END_REPEAT ;
Предупреждение:
Так как ISaGRAF синхронная система входные переменные не обновляются во время итераций REPEAT. Изменение состояния входных переменных не может быть использовано для описания условия оператора REPEAT.
Пример:
(*ST программа , использующая оператор REPEAT*)
(* эта программа использует "C" функции для чтения *)
(* символов из последовательного порта *)
string := ''; (* empty string *)
nbchar := 0;
IF ComIsReady ( ) THEN
REPEAT
string := string + ComGetChar ( );
nbchar := nbchar + 1;
UNTIL ( (nbchar >= 16) OR NOT (ComIsReady ( )) )
END_REPEAT;
END_IF;

Имя: FOR... TO... BY... DO... END_FOR
Значение: выполняет ограниченное число итераций, используя целую аналоговую индексную переменную
Синтаксис: FOR <index> := <mini> TO <maxi> BY <step> DO
<statement> ;
<statement> ;
END_FOR;
Операнды: index: внутренняя аналоговая переменная, увеличивающаяся на каждом витке
mini: начальное значение для индекса (перед первой итерацией)
maxi: максимально-допустимое значение индекса
step: приращение индекса на каждом шаге
Оператор [BY step] - дополнительный. Если он не определен то приращение равно 1.
“While” эквивалент оператора FOR:
index := mini;
while (index <= maxi) do
<statement> ;
<statement> ;
index := index + step;
end_while;
Пример:
(*ST программа , использующая оператор FOR*)
(* эта программа извлекает целые числа из строки *)
length := mlen (message);
target := ''; (* empty string *)
FOR index := 1 TO length BY 1 DO
code := ascii (message, index);
IF (code >= 48) & (code <= 57) THEN
target := target + char (code);
END_IF;
END_FOR;

Имя: EXIT
Значение: выход из итерационных операторов FOR, WHILE, REPEAT
Синтаксис: EXIT;
Операнды: (нет)
EXIT, обычно, используется в операторе IF внутри блоков FOR, WHILE, REPEAT.
Пример:
(*ST программа , использующая оператор EXIT*)
(* эта программа ищет символ в строке *)
length := mlen (message);
found := NO;
FOR index := 1 TO length BY 1 DO
code := ascii (message, index);
IF (code = searched_char) THEN
found := YES;
EXIT;
END_IF;
END_FOR;