БИБЛИОТЕКА НОРМАТИВНЫХ ДОКУМЕНТОВ

ГОСТ Р МЭК 61131-3-2016. Национальный стандарт Российской Федерации. Контроллеры программируемые. Часть 3. Языки программирования

7.3 Структурированный текст (ST)

7.3.1 Общие положения

Текстовый язык программирования "Structured Text, ST" предоставляется из языка программирования Паскаль для использования в настоящем стандарте.

7.3.2 Выражения

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

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

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

Операторы языка ST обобщены в таблице 71.

 

Таблица 71

 

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

 

Номер

Описание

Операция <a>

Символ

Пример

Приоритет

1

Скобки

(выражение)

(A+B/C), (A+B)/C, A/(B+C)

11 (Самый высокий)

2

Вычисление результата функции и метода

- если результат объявлен

Идентификатор (перечень параметров)

LN(A), MAX(X,Y), myclass.my_method(x)

10

3

Разыменование

"ГОСТ Р МЭК 61131-3-2016. Национальный стандарт Российской Федерации. Контроллеры программируемые. Часть 3. Языки программирования"

"ГОСТ Р МЭК 61131-3-2016. Национальный стандарт Российской Федерации. Контроллеры программируемые. Часть 3. Языки программирования"

9

4

Отрицание

-

-A, - A

8

5

Унарный плюс

+

+B, + B

8

5

Дополнение

NOT

NOT C

8

7

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

**

A**B, B ** B

7

8

Умножить

*

A*B, A * B

6

9

Разделить

/

A/B, A / B / D

6

10

Модуль

MOD

A MOD B

6

11

Добавить

+

A+B, A + B + C

5

12

Вычесть

-

A-B, A - B - C

5

13

Сравнение

< , > , <= , >=

A<B A < B < C

4

14

Равенство

=

A=B, A=B & B=C

4

15

Неравенство

<>

A<>B, A <> B

4

16a

Логическое И

&

A&B, A & B, A & B & C

3

16b

Логическое И

AND

A AND B

3

17

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

XOR

A XOR B

2

18

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

OR

A OR B

1 (Низший)

<a> Те же правила применимы к операндам этих операторов как к входам соответствующих стандартных функций.

<b> Результат вычисления выражения A**B должен быть таким же, как результат вычисления функции EXPT(A, B).

 

Разработчик определяет явные и неявные преобразования типа.

При вычислении выражения применяются следующие правила:

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

Пример 1

Если A, B, C и D типа INT со значениями 1, 2, 3 и 4, соответственно, тогда

A+B-C*ABS(D)

вычисляется до -9, а

(A+B-C)*ABS(D)

вычисляется до 0.

2 Операторы равного приоритета должны применяться как записанные в выражении слева направо.

Пример 2

A+B+C вычисляется как (A+B)+C.

3 Когда оператор имеет два операнда, первым вычисляется крайний слева операнд.

Пример 3

В выражении

SIN(A)*COS(B) выражение SIN(A) вычисляется вначале, за ним следует COS(B), затем следует вычисление произведения.

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

Пример 4

Для выражения(A>B)&(C<D) достаточно, если

A<=B, чтобы оценить только (A>B), чтобы решить, что значение выражения равно FALSE.

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

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

Приведенные ниже условия при выполнении операторов рассматриваются как ошибки:

a) сделана попытка деления на нуль;

b) операнды не относятся к корректному типу данных для операции;

c) результат числовой операции превышает диапазон значений для ее типа данных.

7.3.3 Операторы

7.3.3.1 Общие положения

Операторы языка ST обобщены в таблице 72. Максимально допустимая длина операторов устанавливается разработчиком.

 

Таблица 72

 

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

 

Номер

Описание

Примеры

1

Присваивание

переменная := выражение;

 

1a

Переменная и выражение простого типа данных

A:= B; CV:= CV+1; C:= SIN(X);

1b

Переменные и выражение простого типа данных с неявным преобразованием типа в соответствии с рисунком 11

A_Real:= B_Int;

1c

Переменная и выражение типа данных, определяемого пользователем

A_Struct1:= B_Struct1;

C_Array1 := D_Array1;

1d

Экземпляры типа функционального блока

A_Instance1:= B_Instance1;

 

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

 

2a <b>

 

FCT(17);

2b <b>

2c <b>

Вызов функционального блока и использование выходной переменной функционального блока

CMD_TMR(IN:= bln1, PT:= T#300ms);

A:= CMD_TMR.Q;

FB_INST.M1(17);

3

ВОЗВРАТ

RETURN;

 

Выбор

 

4

IF ...

THEN ...

 

ELSIF ...

THEN ...

 

ELSE ...END_IF

D:= B*B - 4.0*A*C;

IF D < 0.0

THEN NROOTS:= 0;

ELSIF D = 0.0

THEN

NROOTS:= 1;

X1:= - B/(2.0*A);

ELSE

NROOTS:= 2;

X1:= (- B + SQRT(D))/(2.0*A);

X2:= (- B - SQRT(D))/(2.0*A);

END_IF;

5

CASE ... OF

...

ELSE ...

END_CASE

TW:= WORD_BCD_TO_INT(THUMBWHEEL);

TW_ERROR:= 0;

CASE TW OF

1,5:

DISPLAY:= OVEN_TEMP;

2:

DISPLAY:= MOTOR_SPEED;

3:

DISPLAY:= GROSS - TARE;

4,6..10:

DISPLAY:= STATUS(TW - 4);

ELSE

DISPLAY:= 0;

 

TW_ERROR:= 1;

END_CASE;

QW100:= INT_TO_BCD(DISPLAY);

 

Итерация

 

6

FOR ... TO ... BY ... DO

...

END_FOR

J:= 101;

FOR I:= 1 TO 100 BY 2 DO

IF WORDS[I] = 'KEY' THEN

J:= I;

EXIT;

END_IF;

END_FOR;

7

WHILE ... DO

...

END_WHILE

J:= 1;

WHILE J <= 100 & WORDS[J] <> 'KEY' DO

J:= J+2;

END_WHILE;

8

REPEAT ...

UNTIL ...

END_REPEAT

J:= -1;

REPEAT

J:= J+2;

UNTIL J = 101 OR WORDS[J] = 'KEY'

END_REPEAT;

9 <a>

 

J:= 1;

WHILE (J <= 100 AND WORDS[J] <> 'KEY') DO

..IF (J MOD 3 = 0) THEN

CONTINUE;

END_IF;

 

(* если j = 1,2,4,5,7,8, ... тогда этот оператор*);

...

END_WHILE;

10 <a>

Выход из итерации

EXIT; (см. также в свойстве 6)

11

Пустой оператор

;

<a> Если оператор EXIT или CONTINUE (свойство 9 или 11) поддерживается, то он должен поддерживаться для всех операторов итерации (FOR, WHILE, REPEAT), которые поддерживаются в реализации.

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

 

7.3.3.2 Присваивание (Сравнение, результат, вызов)

7.3.3.2.1 Общие положения

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

Например, оператор

A := B;

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

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

Например, если A и B имеют типы ANALOG_CHANNEL_CONFIGURATION, то значения всех элементов структурированной переменной A должны быть заменены текущими значениями соответствующих элементов переменной B.

7.3.3.2.2 Сравнение

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

Сравнение

A = B

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

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

7.3.3.2.3 Результат

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

7.3.3.2.4

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

- FUNCTION

Функция вызывается оператором, включающим имя функции, за которым следует перечень параметров в скобках, как показано в таблице 72.

Для вызовов функции применяются правила и свойства, определенные в 6.6.1.7 FUNCTION_BLOCK.

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

- METHOD

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

- RETURN

Оператор RETURN обеспечивает ранний выход из функции, функционального блока или программы (например, как результат оценки оператора IF).

7.3.3.3 Операторы выбора (IF, CASE)

7.3.3.3.1 Общие положения

Операторы выбора включают операторы IF и CASE. Оператор выбора выбирает один (или группу) составляющих его операторов для выполнения на основе указанного условия. Примеры операторов выбора приведены в таблице 72.

7.3.3.3.2 IF

Оператор IF указывает, что группа операторов выполняется, только если связанное логическое выражение при вычислении принимает значение 1 (TRUE). Если условие является ложным, то или оператор не выполняется, или выполняется группа операторов следующая за ключевым словом ELSE (или ключевым словом ELSIF, если связанное логическое условие является истинным).

7.3.3.3.3 CASE

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

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

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

7.3.3.4 Операторы итерации (WHILE, REPEAT, EXIT, CONTINUE, FOR)

7.3.3.4.1 Общие положения

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

Операторы WHILE и REPEAT не должны использоваться для достижения межпроцессной синхронизации, например, как "цикл ожидания" с внешне определяемым условием завершения. Для этой цели должны использоваться элементы SFC.

Ошибка возникает, если оператор WHILE или REPEAT используется в алгоритме, для которого удовлетворение условия завершения цикла или выполнение оператора EXIT не может быть гарантировано.

Оператор FOR используется, когда число итераций может быть определено заранее; в противном случае используются конструкции WHILE или REPEAT.

7.3.3.4.2 FOR

Оператор FOR указывает, что последовательность операторов выполняется повторно, до ключевого слова END_FOR, в то время как последовательность значений присваивается переменной управления циклом FOR. Переменная управления, начальное значение и конечное значение должны быть выражениями одного и того же целого типа (например, SINT, INT или DINT) и не должны изменяться ни в каком из повторяющихся операторов.

Оператор FOR приращивает переменную управления вверх или вниз от начального до конечного значения в приращениях, определяемых значением выражения. Если конструкция BY пропускается, то значение приращения по умолчанию приравнивается к 1.

Пример -

Цикл FOR, задаваемый выражением

FOR I:= 3 TO 1 STEP -1 DO ...;

завершается, когда значение переменной достигает 0.

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

Итерация завершается, когда значение переменной управления находится вне диапазона, заданного конструкцией TO.

Следующий пример использования оператора FOR приведен в свойстве 6 таблицы 72. В этом примере цикл FOR используется, чтобы определить индекс J первого появления (если это имеет место) строки "KEY" в нечетных элементах массива строк WORDS с диапазоном значений индексов (1..100). Если появление не обнаружено, J будет иметь значение 101.

7.3.3.4.3 WHILE

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

Например, пример FOR...END_FOR может быть переписан с использованием конструкции WHILE...END_WHILE, приведенной в таблице 72.

7.3.3.4.4 REPEAT

Оператор REPEAT вызывает последовательность операторов до ключевого слова UNTIL для выполнения повторно (и, по крайней мере, однократно), пока связанное логическое условие является истинным.

Например, пример WHILE...END_WHILE может быть переписан с использованием конструкции WHILE...END_WHILE, приведенной в таблице 72.

7.3.3.4.5 CONTINUE

Оператор CONTINUE используется для перехода через оставшиеся операторы цикла итерации, в котором CONTINUE размещается после последнего оператора цикла непосредственно перед терминатором цикла (END_FOR, END_WHILE или END_REPEAT).

Пример -

После выполнения операторов, значение переменной, если значение логической переменной FLAG=0 и SUM=9, если FLAG=1.

SUM:= 0;

FOR I:= 1 TO 3 DO

  FOR J:= 1 TO 2 DO

    SUM:= SUM + 1;

    IF FLAG THEN

      CONTINUE;

    END_IF;

    SUM:= SUM + 1;

    END_FOR;

  SUM:= SUM + 1;

END_FOR;

7.3.3.4.6 EXIT

Оператор EXIT используется для завершения итераций до удовлетворения условия завершения.

Когда оператор EXIT размещается внутри вложенных итеративных конструкций, выход происходит от внутреннего цикла, в котором размещен EXIT, то есть управление переходит к следующему оператору после терминатора первого цикла (END_FOR, END_WHILE или END_REPEAT), за которым следует оператор EXIT.

Пример -

После выполнения операторов, значение переменной SUM=15, если значение логической переменной FLAG=0 и SUM=6, если FLAG=1.

SUM:= 0;

FOR I:= 1 TO 3 DO

  FOR J:= 1 TO 2 DO

    SUM:= SUM + 1;

    IF FLAG THEN

      EXIT;

    END_IF;

    SUM:= SUM + 1;

  END_FOR;

  SUM:= SUM + 1;

END_FOR

TOC