Язык структурированного текста ST
Язык ST (Structured Text) является языком высокого уровня (типа Паскаля). Был популярен в середине 70-х годов XX века для сложных компьютерных приложений. Предназначен для универсального анализа данных. Удобен для программ, включающих числовой анализ или сложные алгоритмы. Может использоваться в главных программах, в теле функции или FBD, а также для описания действий внутри элементов редакторов SFC или Flow Chart. Обладает высокой читабельностью исходного кода, ключевые слова, такие как AND, OR, NOT, IF, THEN, ELSE, WHILE и т. д., легко понимаемы. Прост в сопровождении, если имена переменных понятны, имеются комментарии, код хорошо структурирован.
Язык ST можно использовать, например, для того, чтобы вызывать функциональные блоки, выполнять функции и распределения, условно выполнять и повторять их.
При вводе ключевых слов, разделителей и комментариев осуществляется непосредственная проверка по буквам. При обнаружении ключевого слова, разделителя или комментария, они идентифицируются через цветное оттенение. При вводе несанкционированных ключевых слов (утверждений или операторов) они также идентифицируются через цветное оттенение. Согласно IEC 61131-3 ключевые слова должны быть введены в символах верхнего регистра. Пробелы и метки табуляции не влияют на синтаксис, они могут использоваться везде.
Объект может быть выбран с помощью правой кнопки мыши при одновременном вызове контекстно-зависимого меню. В FFB, например, возможно вызвать соответствующее описание блока, используя правую кнопку мыши.
Операторы языка ST
Выражения.Выражения состоят из операндов и операторов.
Операнды.Операндом является литерал, переменная, структурированная переменная, компонент структурированной переменной, обращение к функции, выход FB/DFB или прямой адрес.
При доступе к массивам переменных ARRAY элемент указателя позволяет использовать только литералы и переменные типа ANY_INT или выражения, сформированные с ними:
var1[i] :=8 ;
var2.otto[4] := var3 ;
var4[1+i+j*5]:=4;
В табл. 10.1 приведены заданные по умолчанию типы данных прямых адресов.
Таблица 10.1 – Типы данных прямых адресов
Вход
| Выход
| Заданные по умолчанию
типы данных
| Возможные
типы данных
| %IХ
| %QX
| BOOL
| BOOL
| %I
| %Q
|
|
| %IB
| %QB
| BYTE
| BYTE
| %IW
| %QW
| INT
| INT, UINT, WORD
| %ID
| %QD
| REAL
| REAL, DINT, UDINT, TIME
| Если типы данных DINT, UINT, UDINT, WORD или TIME необходимо назначить прямому адресу, это осуществляется через явное объявление командой VAR...END_VAR.
Типы данных операндов, обрабатываемых в утверждении, должны быть идентичны. При обработке операндов различных типов данных сначала выполняется преобразование типов.
Пример преобразования:
r3 := r4 + SIN_REAL(INT_TO_REAL(i1)) ;
В примере целая переменная i1 преобразована в вещественную переменную прежде, чем она добавляется к вещественной переменной r4.
Исключением является тип данных TIME вместе с арифметическими операторами «*» (умножение) и «/» (деление). Операнд типа данных TIME может быть обработан вместе с операндом типа данных ANY_NUM. Результат этого утверждения будет иметь тип данных TIME.
Пример умножения:
t1 := t2 * i4 ;
В примере переменная времени t2 умножена на целую переменную i4, а результат сохраняется в переменной времени t1.
Операторы. Оператор – символ арифметической или логической операции, которая будет выполнена. Операторы являются обобщенными, т. е. они автоматически корректируются к типу данных операнда.
Оценка выражения включает приложение операторов к операндам в порядке, определенном правилом старшинства операторов. Оператор с самым высоким старшинством в выражении будет выполнен в первую очередь, затем будет выполнен оператор со следующим ниже старшинством и так до тех пор, пока обработка не завершится. Операторы с равным старшинством выполняются слева направо, как написано в выражении. Этот порядок может быть изменен через заключение в скобки.
Операторы языка программирования ST приведены в таблице 10.2.
Таблица 10.2 – Операторы языка программирования ST
Оператор
| Значение
| Операнд
| Правило старшинства
| ()
| Заключение в скобки
| Выражение
| 1 (наивысший)
| FUNCNAME (список фактических параметров)
| Функции вызов
| Выражение, литерал, переменная, прямой адрес типа данных ANY
|
| **
| Возведение в степень
| Выражение, литерал, переменная, прямой адрес типа данных REAL (основание), ANY_NUM (экспонента)
|
| –
| Отрицание
| Выражение, литерал, переменная, прямой адрес типа данных ANY_NUM
|
| NOT
| Дополнение
| Выражение, литерал, переменная, прямой адрес типа данных ANY_BIT
|
| *
| Умножение
| Выражение, литерал, переменная, прямой адрес типа данных ANY_NUM или TIME
|
| /
| Деление
| Выражение, литерал, переменная, прямой адрес типа данных ANY_NUM
|
| MOD
| Модуль
| Выражение, литерал, переменная, прямой адрес типа данных ANY_NUM
|
| +
| Сложение
| Выражение, литерал, переменная, прямой адрес типа данных ANY_NUM или TIME
|
|
Продолжение таблицы 10.2
Оператор
| Значение
| Операнд
| Правило старшинства
| -
| Вычитание
| Выражение, литерал, переменная, прямой адрес типа данных ANY_NUM или TIME
|
| <
| Меньше чем
| Выражение, литерал, переменная, прямой адрес типа данных ANY_ELEM
|
| >
| Больше чем
| Выражение, литерал, переменная, прямой адрес типа данных ANY_ELEM
|
| ≤
| Меньше или равно
| Выражение, литерал, переменная, прямой адрес типа данных ANY_ELEM
|
| ≥
| Больше или равно
| Выражение, литерал, переменная, прямой адрес типа данных ANY_ELEM
|
| =
| Равенство
| Выражение, литерал, переменная, прямой адрес типа данных ANY_ELEM
|
| <>
| Неравенство
| Выражение, литерал, переменная, прямой адрес типа данных ANY_ELEM
|
| &, AND
| Логическое И
| Выражение, литерал, переменная, прямой адрес типа данных ANY_BIT
|
| XOR
| Логическое исключающее ИЛИ
| Выражение, литерал, переменная, прямой адрес типа данных ANY_BIT
|
| OR
| Логическое ИЛИ
| Выражение, литерал, переменная, прямой адрес типа данных ANY_BIT
| 11 (низший)
| Заключение в скобки используется, чтобы изменить порядок обработки операторов.
Если операнды А, В, С и D имеют значения 1, 2, 3 и -4, A+B-C*D= -9, a (A+B-C)*D = 0.
При возведении в степень значение первого операнда (основание) возводится в степень значения второго операнда (экспонента).
Пример возведения в степень:
OUT := IN1 ** IN2 ;
В примере переменная OUT будет равна 625.0, если IN1 = 5.0 и IN2 = 4.0.
С помощью отрицания осуществляется реверсирование знака для значения операнда.
Пример отрицания:
OUT := - IN1 ;
В примере переменная OUT будет равна -4, если IN1 = 4.
С помощью оператора NOT выполняется поразрядная инверсия операнда.
Пример оператора NOT: OUT := NOT IN1 ;
В примере переменная OUT будет равна 0011001100, если IN1 = 1100110011.
При умножении значение первого операнда умножается на второй операнд.
Пример умножения:
OUT := IN1 * IN2 ;
В общем случае типы данных операндов обрабатываемого утверждения должны быть идентичны. Исключением является умножение на операнд с типом данных TIME. В этом случае операнд типа данных TIME может быть обработан вместе с операндом типа данных ANY_NUM. Результат этого утверждения будет иметь тип данных TIME.
Пример умножения:
t1 := t2 * t4 ;
В примере переменная времени t2 умножается на целую переменную t4, а результат сохраняется в переменной времени t1.
При делении значение первого операнда делится на значение второго операнда.
Пример деления:
OUT := IN1 / IN2 ;
В общем случае типы данных операндов утверждения, которое будет обработано, должны быть идентичны. Исключением является деление вместе с типом данных TIME. В этом случае операнд типа данных TIME может быть обработан вместе с операндом тина данных ANY_NUM. Результат этого утверждения будет иметь тип данных TIME.
Пример деления
t1 := t2 / i4 ;
В примере переменная времени t2 будет разделена на целую переменную i4, а результат сохранен в переменной времени t1.
В операторе MOD значение первого операнда делится на значение второго операнда, а остаточный член от деления (по модулю) возвращается как результат.
Пример оператора MOD:
OUT := IN1 MOD IN2 ;
В примере переменная OUT будет равна 1, если IN1=7 и IN2=2.
При сложении значение первого операнда складывается со значением второго операнда.
Пример сложения:
OUT := IN1 + IN2 ;
При вычитании значение второго операнда вычитается из значения первого операнда.
Пример вычитания:
OUT := IN1 IN2 ;
При использовании оператора «больше чем» значение первого операнда сравнивается со значением второго операнда. Если первый операнд больше чем второй, результатом будет булева единица (1). Если первый операнд меньше второго или равен второму операнду, результатом будет булев нуль (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.
При использовании оператора «не равно» значение первого операнда сравнивается со значением второго операнда. Если первый операнд не равен второму, результатом будет булева единица. Если первый операнд равен второму, результатом будет булев нуль.
Пример оператора «не равно»:
OUT := IN1 <> 10 ;
В примере переменная OUT будет равна 1, если переменная IN1 не равна 10, иначе 0.
При использовании оператора «меньше или равно» значение первого операнда сравнивается со значением второго операнда. Если первый операнд меньше второго или равен второму операнду, результатом будет булева единица. Если первый операнд больше чем второй, результатом будет булев 0.
Пример оператора «меньше или равно»:
OUT := IN1 ≤ 10 ;
В примере переменная OUT будет равна 1, если переменная IN1 меньше или равна 10, иначе 0.
При использовании оператора «меньше чем» значение первого операнда сравнивается со значением второго операнда. Если первый операнд меньше чем второй операнд, результатом будет булева единица. Если первый операнд больше второго или равен второму операнду, результатом будет булев нуль.
Пример оператора «меньше чем»:
OUT := IN1 < 10 ;
В примере переменная OUT будет равна 1, если переменная IN1 меньше чем 10, иначе 0.
При использовании оператора «логическое И» осуществляется логическая операция И между операндами.
Пример логического И:
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 связывание происходит поразрядно.
Утверждения.Утверждения являются командами языка программирования ST. Утверждения должны закрываться точками с запятой. Одна строка может содержать несколько утверждений (отделяемые точками с запятой).
Следующие утверждения доступны:
· распределения;
· объявления VAR...END_VAR;
· объявления функциональных блоков;
· команды IF...THEN...END_IF;
· ELSE;
· ELSIF ... THEN;
· CASE ... OF ... END_CASE;
· FOR ... TO ... BY ... DO ... END_FOR;
· WHILE ... DO ... END_WHILE;
· REPEAT;
· EXIT;
· фиктивное утверждение.
Распределение заменяет текущее значение одиночной или многоэлементной переменной на результат выполнения выражения.
Распределение состоит из переменной, введенной слева от оператора распределения, далее следует оператор распределения (:=), а затем выражение, которое должно быть выполнено. Обе переменных должны иметь одинаковый тип данных.
Пример утверждения:
А:=В;
Это утверждение используется, чтобы заменить значение переменной А на текущее значение переменной В. Если А и В имеют совпадающие типы данных, одиночное значение из В будет передано в А. Если А и В имеют тип данных пользователя, значения всех компонентов будут перемещены из В в А.
Распределение также применяется для того, чтобы распределить:
· литерал переменным
С:=25;
· значение переменной, которое будет возвращено функцией или функциональным блоком:
В := MOD_INT(C,A) ;
A:=TON1.Q;
· значение переменной, которое является результатом операции:
X := (A+B-C)*D ;
VAR...END_VAR
Утверждение VAR применяется для объявления используемых функциональных блоков и для объявления прямых адресов, если они не применяются с заданными по умолчанию типами данных. В пакете Concept команда VAR не может использоваться для объявления переменных. Объявление переменных очень легко выполняется через редактор переменных.
Утверждение END_VAR идентифицирует конец объявления. Утверждение VAR...END__VAR вводится только один раз в начале секции. Все блоки FB/DFB и используемые прямые адреса, которые отличаются от заданных по умолчанию типов данных, должны быть здесь объявлены.
Объявление блоков FB/DFB и прямых адресов применяется только к текущей секции. Если тот же самый тип FFB или тот же самый адрес будут использоваться в другой секции, тип FFB или адрес соответственно должны быть объявлены снова в той секции.
В объявлении функциональных блоков FB и блоков DFB каждому используемому блоку назначается имя экземпляра блока, которое служит для идентификации функционального блока в проекте. Имя экземпляра должно быть уникальным для всего проекта; не имеется никакого различия между заглавными или строчными буквами. Имя экземпляра должно удовлетворять соглашениям стандарта по имени, иначе появится сообщение об ошибках.
После ввода имени экземпляра следует ввод типа функционального блока , например CTD_DINT, ROL_WORD, SIN_REAL.
С обобщенными типами функциональных блоков (например MUX, SEL) тип данных не вводится. Он будет определен типом данных фактических параметров. Если фактические параметры состоят из литералов, для функционального блока будет принят тип данных INT.
Может быть объявлено любое число имен экземпляров для FB/DFB, оно зависит от частоты использования FB/DFB.
Пример объявления функциональных блоков FB и DFB приведен на рисунке 10.1.

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

Рисунок 10.2 – Объявление прямых адресов
Утверждение IF … THEN … END_IF. Здесь утверждение IF определяет, что утверждение группы утверждений выполняется, только если значение связанного булева выражения равно 1 (истина). Утверждение THEN идентифицирует конец условия и начало утверждений. Утверждение END_IF идентифицирует конец утверждений.
Пример утверждений IF…THEN…END_IF:
IF A>B THEN
C:=SIN_REAL(A)*COS_REAL(B) ;
B:=C – A ;
END_IF ;
Пример утверждения IF FLAG THEN:
IF FLAG THEN
C:=SIN_REAL(A)*COS_REAL(B) ;
B:=C – A ;
END_IF ;
Утверждении IF NOT...THEN...END_IF. Здесь утверждение NOT может использоваться, чтобы инвертировать условие (выполнение обоих утверждений в состоянии 0).
Пример утверждения IF NOT...THEN...END_IF:
IF NOT FLAG THEN:
C:=SIN_REAL(A) * COS_REAL(B) ;
B:=C A ;
END_IF ;
Для создания сложных утверждений выбора можно вложить любое количество утверждений IF…THEN…END_IF.
Утверждение ELSE всегда следует за IF...THEN, ELSIF...THEN или за CASE утверждением.
Если утверждение ELSE следует после IF или ELSIF, утверждение и/или группа утверждений будут выполнены, только если значение связанных булевых выражений IF и ELSIF утверждений будет 0 (ложно). Если условие IF или ELSIF утверждения будет 1 (истина), утверждение и/или группа утверждений не будут выполнены.
Если утверждение ELSE следует за CASE, утверждение или группа утверждений выполняются при условии, что никакая метка не имеет значение селектора. Если метка содержит значение селектора, утверждение и/или группа утверждений не будут выполнены.
Пример утверждения ELSE
IF A>B THEN
C:=SIN_REAL(A) * COS_REAL(B) ;
B:=C A ;
ELSE
C:=A + B ;
B:=C * A ;
END_IF ;
Для создания сложных утверждений выбора можно вложить любое количество утверждений IF…THEN…ELSE…END_IF.
Утверждение ELSIF…THEN. Утверждение ELSIF всегда следует за утверждением IF...THEN. Утверждение ELSIF определяет, что утверждение и/или группа утверждений будут выполнены, только если значение связанного булева выражения утверждения IF будет равно 0 (ложно) и значение связанного булева выражения утверждения ELSIF будет равно 1 (истина). Если условие утверждения IF будет равно 1 (истина) и/или условие утверждения ELSIF будет равно 0 (ложно), утверждение или группа утверждений не будут выполнены.
Утверждение THEN идентифицирует конец условия(й) ELSIF и начало утверждений.
Пример утверждения ELSIF...THEN
IF A>B THEN
C:=SIN_REAL(A) * COS_REAL(B) ;
B:=SUB_REAL(C,A) ;
ELSIF A=B THEN
C:=ADD_REAL(A,B) ;
B:=MUL_REAL(C,A) ;
END_IF ;
Можно вложить любое количество утверждений IF…THEN…ELSIF…THEN…END_IF, чтобы создать сложные утверждения выбора.
Пример утверждения ELSIF...THEN
IF A>B THEN
IF B=C THEN
C:=SIN_REAL(A) * COS_REAL(B) ;
ELSE
B:=SUB_REAL(C,A) ;
END_IF ;
ELSIF A=B THEN
C:=ADD_REAL(A,B) ;
B:=MUL_REAL(C,A) ;
ELSE
C:= DIV_REAL (A,B) ;
END_IF ;
Утверждение CASE…OF…END_CASE. Утверждение CASE состоит из выражения типа данных INT (селектор) и списка групп утверждений. Каждой группе задана метка, которая содержит одно число, или большее количество целых чисел (ANY_INT), или диапазонов целочисленных значений. Первая группа утверждений будет выполнена, если она имеет метку, содержащую определенное значение селектора. Иначе никакое утверждение не будет выполнено.
Утверждение OF идентифицирует начало меток.
Внутри утверждения CASE ELSE утверждение может быть сделано утверждение о том, какие утверждения будут выполняться, если не имеется никакой метки, содержащей значение селектора.
Утверждение END_CASE идентифицирует конец утверждения(й).
Пример утверждения CASE...OF...END_CASE приведен на рисунке 10.3.

Рисунок 10.3 – Утверждение CASE...OF...END_CASE
Утверждение FOR…TO…BY…DO…END_FOR. Утверждение FOR используется, если число повторений может быть определено заранее. Иначе используются WHILE или REPEAT.
Утверждение FOR повторяет последовательность утверждений, пока утверждение END_FOR не достигнуто. Число повторений определяется начальным или конечным значением и переменной управления. Начальное или конечное значение и переменная управления должны быть одного и того же типа данных (DINT или INT), и не могут быть изменены одним из повторяемых утверждений. Утверждение FOR увеличивает значение переменной управления от начального значения до конечного значения. Значение приращения по умолчанию равно 1. Конечное условие будет проверяться в начале каждого повторения, что означает невыполнение последовательности утверждений, когда начальное значение больше конечного значения.
Это правило позволяет избегать бесконечных контуров.
Диапазоны значений применительно к конечному значению INT: от 32 767 до 32 766 DINT: от 2 147 483 646 до 2 147 483 645.
Утверждение DO идентифицирует конец определения повторения и начало утверждений. Повторение может быть завершено с использованием утверждения EXIT.
Утверждение END_FOR идентифицирует конечное утверждение(я).
Пример утверждения FOR…TO…BY…DO…END_FOR приведен на рисунке 10.4.

Рисунок 10.4 – Утверждение FOR…TO…BY…DO…END_FOR
Если должно использоваться приращение, отличное от 1, это может быть определено с использованием BY. Приращение, начальное/конечное значение и переменная управления должны быть одного и того же типа данных (DINT или INT). Критерием направления обработки (вперед, назад) является знак при выражении BY. Если это выражение положительно, контур выполняется в прямом направлении, если оно отрицательно, контур выполняется в обратном направлении.
Пример приращения на +1 приведен на рисунке 10.5.

Рисунок 10.5 – Приращение на +1
Пример приращения на -1 представлен на рисунке 10.6.

Рисунок 10.6 – Приращение на -1
Если приращение в примере на рисунке 10.7 j>0, утверждения не будут выполнены, потому что при первом сравнении, i=10.

Рисунок 10.7 – Критический контур
Пример еще одного критического контура приведен на рисунке 10.8. Если приращение в этом примере j < 0, утверждения не будут выполнены, потому что при первом сравнении, i = 1.

Рисунок 10.8 – Критический контур
Бесконечный контур может сформироваться, только если приращение будет 0. Если эта ситуация обнаружена во время анализа секции, будет сгенерировано сообщение об ошибках. Если ошибка обнаружена во время выполнения программы, сообщение об ошибках будет сгенерировано в дисплее событий. Пример бесконечных контуров приведен на рисунке 10.9.

Рисунок 10.9 – Бесконечный контур
Утверждение WHILE…DO…END_WHILE. Утверждение WHILE приводит к повторению выполнения последовательности утверждений до связанного булева выражения, значение которого равно 0 (ложно). Если выражение было ложно изначально, группа утверждений не будет выполнена вообще.
Утверждение DO идентифицирует конец определения повторения и начало утверждений.
Повторение может быть завершено преждевременно с использованием утверждения EXIT.
Утверждение END_WHILE идентифицирует конечное утверждение(я).
Пример утверждения WHILE...DO...END_WHILE:
var := 1
WHILE var <= 100 DO
var := var + 4;
END_WHILE ;
Утверждение WHILE нельзя применить для того, чтобы выполнить синхронизацию процессов, например таких, как ожидание контура с конечным условием, определенным внешним образом. Это означает, что формирование бесконечного контура не позволяется, так как может привести к разрушению программы, если не будет предотвращено с помощью функции Project → Code Generation Options → Enable Loop Control .
Утверждение WHILE нельзя использовать в алгоритме, который не может гарантировать удовлетворение условия окончания контура или выполнение утверждения EXIT. Это означает, что формирование бесконечного контура не позволяется, так как может привести к разрушению программы, если это не предотвращено использованием функции Project → Code Generation Options → Enable Loop Control.
Утверждение REPEAT…UNTIL…END_REPEAT. Утверждение REPEAT приводит к повторению выполнения последовательности утверждений (по крайней мере, один раз), пока связанное булево условие не равно 1 (истина).
Утверждение UNTIL идентифицирует конечное условие.
Повторение может быть завершено с использованием утверждения EXIT.
Утверждение END_REPEAT идентифицирует конец утверждения(й).
Пример утверждения REPEAT...UNTIL...END_REPEAT:
var := 1
REPEAT
var := var + 2
UNTIL var >= 101
END_REPEAT ;
Утверждение EXIT используется, чтобы завершить утверждения повторения (FOR, WHILE, REPEAT) прежде, чем конечное условие выполнено.
Если утверждение EXIT располагается внутри вложенного повторения, то покидается контур, в котором расположено утверждение EXIT. После выполнения утверждения EXIT выполняется первое утверждение после конца контура: END_FOR, END_WHILE или END_REPEAT.
Пример утверждения EXIT:
SUM : = 0 ;
FOR I := 1 TO 3 DO
FOR J := 1 TO 2 DO
IF FLAG=1 THEN EXIT;
END_IF ;
SUM := SUM + J ;
END_FOR ;
SUM := SUM + I ;
END_FOR
Если переменная FLAG имеет значение 0, переменная SUM будет равна 15 после выполнения утверждений. Если переменная FLAG имеет значение 1, переменная SUM будет 6 после выполнения утверждений.
Фиктивные утверждения создаются с помощью точки с запятой (;).
|