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

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

7 Текстовые языки

 

7.1 Общие элементы

Текстовые языки, определяемые в настоящем стандарте, это IL (перечень инструкций) и ST (структурированный текст). Последовательная функциональная схема (SFC) может использоваться совместно с любым из этих языков.

В подразделе 7.2 определяется семантика языка IL, синтаксис которого приведен в приложении A. В подразделе 7.3 определяется семантика языка ST, синтаксис которого задан.

Текстовые элементы, указанные в разделе 6 являются общими для текстовых языков (IL и ST), определяемых в разделе 7. В частности, приведенные ниже элементы структурирования программы на рисунке 30 являются общими для текстовых языков:

 

TYPE

...END_TYPE

VAR

...END_VAR

VAR_INPUT

...END_VAR

VAR_OUTPUT

...END_VAR

VAR_IN_OUT

...END_VAR

VAR_EXTERNAL

...END_VAR

VAR_TEMP

...END_VAR

VAR_ACCESS

...END_VAR

VAR_GLOBAL

...END_VAR

VAR_CONFIG

...END_VAR

FUNCTION

...END_FUNCTION

FUNCTION_BLOCK

...END_FUNCTION BLOCK

PROGRAM

...END_PROGRAM

METHOD

...END_METHOD

STEP

...END_STEP

TRANSITION

...END_TRANSITION

ACTION

...END_ACTION

NAMESPACE

...END_NAMESPACE

 

Рисунок 30 - Общие текстовые элементы (обзор)

 

7.2 Перечень инструкций (IL)

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

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

7.2.2 Инструкции

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

Инструкции может предшествовать метка идентификации, за которой следует двоеточие ":". Между командами могут вставляться пустые строки.

Пример - Поля списка инструкций

 

МЕТКА

ОПЕРАТОР

ОПЕРАНД

КОММЕНТАРИЙ

START:

LD

%IX1

(* Кнопка *)

 

ANDN

%MX5

(* Не запрещено*)

 

ST

%QX2

(* Вентилятор включен*)

 

7.2.3 Операторы, модификаторы и операнды

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

Стандартные операторы с их разрешенными модификаторами и операндами должны быть такими, как показано в таблице 68.

7.2.3.2 "Текущий результат"

Если иное не оговорено в таблице 68, семантика операторов должна быть следующей:

result:= result OP operand.

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

Пример 1 - Инструкция AND %IX1 интерпретируется как result:= result AND %IX1.

Операторы сравнения интерпретируются с текущим результатом слева от сравнения и операндом справа с логическим результатом.

Пример 2 - Инструкция GT %IW10 имеет логический результат 1, если текущее значение больше, чем значение Input Word 10, и логический результат в противном случае.

7.2.3.3 Модификатор

Модификатор "N" указывает поразрядное логическое отрицание (дополнение до единицы) операнда.

Пример 1 - Инструкция ANDN %IX2 интерпретируется как result:= result AND NOT %IX2.

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

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

result:= result AND (%IX1 OR %IX2)

Операнд должен быть литералом, как определено в 6.3, перечислимым значением или переменной.

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

 

Таблица 67

 

Выражение в скобках для языка IL

 

Номер

Описание

Пример

1

Выражение в скобках начинается с оператора в явном виде:

AND(

 

 

LD

%IX1

(NOTE)

OR

%IX2

 

)

 

 

2

Выражение в скобках (краткая форма)

AND(

%IX1

 

OR% IX2

 

)

 

 

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

 

Модификатор "C" указывает, что связанная инструкция выполняется, только если значение текущего вычисленного результата равно логической 1 (или логическому 0, если оператор объединен с модификатором "N"). В таблице 68 показаны операторы списка инструкций.

 

Таблица 68

 

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

 

Номер

Описание оператора <a>

Модификатор (см. примечание)

Объяснение

1

LD

N

Установить текущий результат, равный операнду

2

ST

N

Сохранить текущий результат по адресу операнда

3

S <e>, R <e>

 

Установить операнд в 1, если текущий результат равен логической 1

Сбросить операнд в 0, если текущий результат равен логической 1

4

AND

N, (

Логическое И

5

&

N, (

Логическое И

6

OR

N, (

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

7

XOR

N, (

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

8

NOT <d>

 

Логическое отрицание (дополнение до единицы)

9

ADD

(

Сложение

10

SUB

(

Вычитание

11

MUL

(

Умножение

12

DIV

(

Деление

13

MOD

(

Деление по модулю

14

GT

(

Сравнение: >

15

GE

(

Сравнение: >=

16

EQ

(

Сравнение: =

17

NE

(

Сравнение: <>

18

LE

(

Сравнение: <=

19

LT

(

Сравнение: <

20

JMP <b>

C, N

Переход к метке

21

CAL <c>

C, N

Вызов функционального блока (см. таблицу 69)

22

RET <f>

C, N

Возврат из вызванной функции, функционального блока или программы

23

)

 

Вычислить отложенную операцию

24

ST?

 

Попытка присваивания. Сохранить с проверкой

Для объяснения модификаторов и оценки выражений см. предшествующий текст.

--------------------------------

<a> Если иное не указано, эти операторы должны быть перегружены или типизированы.

<b> Операнд инструкции JMP должен быть меткой инструкции, к которой должно переходить выполнение. Когда инструкция JMP содержится в конструкции ACTION... END_ACTION, операнд должен быть меткой внутри той же самой конструкции.

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

<d> Результатом этой операции должно быть побитовое логическое отрицание (дополнение до единицы) текущего результата.

<e> Типом операнда этой инструкции должен быть BOOL.

<f> Эта инструкция не имеет операнда.

 

7.2.4 Функции и функциональные блоки

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

Общие правила и свойства вызова функции и вызова функционального блока также применимы и в IL. Свойства для вызова функциональных блоков и функций определены в таблице 69.

 

Таблица 69

 

Вызовы для языка IL

 

Номер

Описание

Пример (см. примечание)

1a

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

CAL C10(%IX10, FALSE, A, OUT, B)

CAL CMD_TMR(%IX5, T#300ms, OUT, ELAPSED)

1b

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

CAL C10(

// FB имя экземпляра

CU := %IX10,

R := FALSE, PV:= A,

Q => OUT,

CV => B)

CAL CMD_TMR(

IN := %IX5,

PT := T#300ms,

Q => OUT,

ET => ELAPSED,

ENO => ERR)

2

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

LD

A

ADD

D5

ST

C10.PV

LD

%IX10

ST

C10.CU

CAL

C10

// FB имя экземпляра

LD

C10.CV

// текущий результат

3a

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

LIMIT(

// Имя функции

EN := COND,

IN := B,

MN := 1,

MX := 5,

ENO => TEMPL

)

ST

A

// Новый текущий результат

3b

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

LD 1

//установить текущий результат

LIMIT B, 5

// и использовать его как IN

ST

A

// Новый текущий результат

4a

Вызов метода с перечнем формальных параметров

FB_INST.M1(

// Имя метода

EN := COND,

IN := B,

MN := 1,

MX := 5,

ENO => TEMPL

)

ST

A

// Новый текущий результат

4b

Вызов метода с перечнем неформальных параметров

LD

1

//установить текущий результат

FB_INST.M1 B, 5

// и использовать его как

IN ST

A

// новый текущий результат

Примечание - В приведенных выше примерах предполагается объявление

VAR

C10

: CTU;

CMD_TMR

: TON;

A, B

: INT;

ELAPSED

: TIME;

OUT, ERR, TEMPL, COND: BOOL;

END_VAR

 

7.2.4.2 Функция

Функции вызываются путем помещения имени функции в поле оператора. Параметры задаются вместе в одном поле операнда или же каждый параметр - в поле операнда строка за строкой.

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

Функции могут иметь результат. Как показано в свойствах 3 таблицы 69, при успешном выполнении инструкции RET или после достижения конца программного компонента, программный компонент предоставляет результат как "текущий результат".

Если вызвана функция, которая не имеет результата, то "текущий результат" является неопределенным.

7.2.4.3 Функциональный блок

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

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

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

Если вызван экземпляр функционального блока, то "текущий результат" является неопределенным.

7.2.4.4 Методы

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

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

Дополнительные параметры (начиная со второго), при необходимости, задаются в поле операнда, разделенные запятыми, в порядке их объявления.

Методы могут иметь результат. Как показано в свойствах 4 таблицы 69, при успешном исполнении инструкции RET или при достижении конца программного компонента, программный компонент предоставляет результат как "текущий результат".

Если вызван метод, который не имеет результата, то "текущий результат" является неопределенным. В таблице 69 приведены альтернативные вызовы языка IL.

Стандартные входные операторы стандартных функциональных блоков, определенные в таблице 70, могут использоваться в сочетании со свойством 2 (загрузка/сохранение) в таблице 69. Данный вызов эквивалентен CAL с перечнем параметров, который содержит только одну переменную с именем входного оператора.

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

Пример 1

Вместе с объявлением

VAR C10: CTU; END_VAR

в последовательности команд

 

LD

15

PV

C10

 

дает такой же результат, что и

 

CAL

C10(PV:=15)

 

Пропущенные входы R и CU имеют значения, присвоенные им раньше. Поскольку вход CU детектирует передний фронт, данным вызовом будет установлено только значение входа PV; отсчет не может произойти, поскольку непредоставленный параметр не может измениться. В отличие от этого результаты последовательности

 

LD

%IX10

CU

C10

 

в отсчете при максимуме в каждом втором вызове зависят от скорости изменения входа %IX10. Каждый вызов использует ранее установленные значения для PV и R.

Пример 2

С бистабильными функциональными блоками, с получением декларации

VAR FORWARD: SR; END_VAR

это приводит к неявно условному поведению. Последовательность

 

LD

FALSE

S1

FORWARD

 

не изменяет состояние бистабильного FORWARD. Следующая последовательность

 

LD

TRUE

R

FORWARD

 

сбрасывает бистабильное состояние.

 

Таблица 70

 

Стандартные операторы функционального блока для языка IL

 

Номер

Функциональный блок

Входной оператор

Выходной оператор

1

SR

S1, R

Q

2

RS

S, R1

Q

3

F/R_TRIG

CLK

Q

4

CTU

CU, R, PV

CV, Q, также RESET

5

CTD

CD, PV

CV, Q

6

CTUD

CU, CD, R, PV

CV, QU, QD, также RESET

7

TP

IN, PT

CV, Q

8

TON

IN, PT

CV, Q

9

TOF

IN, PT

CV, Q

Примечание - LD (загрузка) не является необходимой как входной оператор стандартного функционального блока, поскольку функциональные возможности LD включены в PV.

 

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

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