Язык программирования Structured Text (ST)


ST это язык программирования стандарта IEC61131-3, по структуре и синтаксису ближе всего к языку программирования Паскаль. Удобен для написания больших программ и работы с аналоговыми сигналами и числами с плавающей точкой. ST представляет собой набор инструкций высокого уровня, которые могут использоваться в условных операторах ("IF...THEN...ELSE") и в циклах (WHILE...DO). Далее будем рассматривать реализацию ST в среде CoDeSys.

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


Операция

Обозначение

Приоритет

Выражение в скобках

(Выражение)

Самый высокий.

Вызов функции

Имя функции (список параметров)


Возведение в степень

EXPT


Замена знаков

-


Числовое дополнение

NOT


Умножение

*


Деление

/


Абсолютная величина

MOD


Сложение

+


Вычитание

-


Сравнение

< , > ,<=, >=


Неравенство

< >


Равенство

=


Логическое И

AND


Логическое исключающее ИЛИ

XOR


Логическое ИЛИ

OR

Самый низкий


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

Пример: Var2: = Var3 * 10;

После выполнения этой операции Var2 принимает значение в десять раз большее, чем Var3.

Функциональный блок вызывается с помощью имени экземпляра функционального блока и списка входных параметров с присваиванием данных в круглых скобках. В следующем примере вызывается таймер с параметрами IN и PT. Значение выходной переменной Q присваивается переменной А. К выходной переменной можно обратиться с помощью имени экземпляра функционального блока, точки, следующей за ним и имени выходной переменной:

CMD_TMR (IN: = %IX5, PT: = 300);

A: =CMD_TMR.Q


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

Синтаксис:

IF <Boolean_expression1> THEN

<IF_instructions>

{ELSIF <Boolean_expression2> THEN

<ELSIF_instructions1>

.

.

.ELSIF <Boolean_expression n> THEN

<ELSIF_instructions n-1>

ELSE

<ELSE_instructions>}

END_IF;

Часть конструкции фигурных скобках не обязательна. Если <Boolean_expression1> возвращает истину, тогда <IF_Instructions> выполняется. В противном случае будут выполняться остальные логические выражения одно за другим, пока одно из них не возвратит истину. Тогда выполняются инструкции, стоящие после этого логического выражения до следующего ELSIF или ELSE. Если все логические выражения ложны, то выполняются инструкции, стоящие после ELSE.

Инструкция CASE. C помощью инструкции CASE можно нескольким различным значениям целочисленной переменной сопоставить различные инструкции.

Синтаксис:

CASE <Var1> OF

<Value1>:

<Instruction 1>

<Value2>: <Instruction 2>

<Value3, Value4, Value5>:

<Instruction 3>

<Value6 .. Value10>:

<Instruction 4>

...

<Value n>:

<Instruction n>

ELSE

<ELSE instruction>

END_CASE;

Инструкция CASE выполняется согласно следующим правилам:

  • если переменная <Var1> имеет значение <Value i>, то выполняется инструкция <Instruction i>;

  • если <Var1> не принимает ни одного из указанных значений, то выполняется <ELSE Instruction>;

  • чтобы одна и та же инструкция выполнялась при различных значениях переменной <Var1>, необходимо перечислить эти значения через запятую;

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

Цикл FOR. С помощью FOR можно программировать повторяющиеся процессы.

Синтаксис:

INT_Var :INT;

FOR <INT_Var> := <INIT_VALUE> TO <END_VALUE> {BY <Step size>} DO

<Instructions>

END_FOR

Часть конструкции, заключенная в фигурные скобки, не обязательна. <Instructions> выполняются, пока счетчик <INT_Var> не больше <END_VALUE>. Это условие проверяется перед выполнением <Instructions>, поэтому раздел <Instructions> не выполняется, если <INIT_VALUE> больше <END_VALUE>. Всякий раз, когда выполняются <Instructions>, значение <INIT_VALUE> , увеличивается на <Step_size>. <Step_ size> может принимать любое целое значение. По умолчанию шаг устанавливается равным 1.

Цикл WHILE. Цикл WHILE может использоваться, как и цикл FOR, с тем лишь различием, что условие выхода определяется логическим выражением. Это означает, цикл выполняется, пока верно заданное условие.

Синтаксис:

WHILE <Boolean expression>

<Instructions>

END_WHILE

Раздел <Instructions> выполняется циклически до тех пор, пока <Boolean_expression> дает TRUE. Если <Boolean_expression> равно FALSE уже при первой итерации, то раздел <Instructions> не будет выполнен ни разу. Если <Boolean_expression> никогда не примет значение FALSE, то раздел <Instructions> будет выполняться бесконечно. Так же необходимо следить, чтобы цикл не станет бесконечным. Для этого в теле цикла значение входящей в условие переменной обязательно должно изменяться. Например, путем инкремента или декремента счетчика.

Цикл REPEAT. Цикл REPEAT отличается от цикла WHILE тем, что первая проверка условия выхода из цикла осуществляется, когда цикл уже выполнился 1 раз. Это означает, что независимо от условия выхода цикл выполняется хотя бы один раз.

Синтаксис:

REPEAT

<Instructions>

UNTIL <Boolean expression>

END_REPEAT

Раздел <Instructions> выполняется циклически до тех пор, пока <Boolean_expression> дает TRUE. Если <Boolean_expression> равно FALSE уже при первой итерации, то раздел <Instructions> не будет выполнен один раз. Если <Boolean_expression> никогда не примет значение FALSE, то раздел <Instructions> будет выполняться бесконечно, т. е. программист должен быть уверен, что цикл не станет бесконечным. Для этого в теле цикла значение входящей в условие переменной обязательно должно изменяться. Например, путем инкремента или декремента счетчика.

Инструкция EXIT. Если EXIT встречается в циклах FOR, WHILE, REPEAT, то цикл заканчивает свою работу независимо от значения условия выхода.