Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка IEC 1131-3(200%).doc
Скачиваний:
16
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

5. Язык структурированный текст (st)

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

Основной синтаксис ST

ST программа - это список ST операторов. Каждый оператор заканчивается точкой с запятой (;). Имена используемые в исходном коде (идентификаторы переменных, константы, ключевые слова) разделены неактивными разделителями (пробелами, символами окончания строки и табуляции) или активными разделителями, которые имеют определенное значение (например, разделитель “>” означает сравнение “больше чем”. В текст могут быть введены комментарии. Комментарий должен начинаться с “(“ и заканчиваться “)”.Каждый оператор заканчивается точкой с запятой (“;”). Основные операторы языка ST:

- оператор присвоения (variable := expression);

- вызов подпрограммы или функции;

- вызов функционального блока;

- операторы выбора (IF, THEN, ELSE, CASE);

- итеративные операторы (FOR, WHILE, REPEAT);

- управляющие операторы (RETURN, EXIT);

- специальные операторы для связи с такими языками как SFC.

Неактивные разделители могут быть свободно введены между активными разделителями, константами и идентификаторами. Неактивные разделители - это пробелы, символы окончания строки и табуляции. В отличие от неформатных языков, таких как IL конец строки может быть введен в любом месте программы. Для улучшения читаемости программ нужно использовать неактивные разделители в соответствии со следующими правилами:

- Не пишите более одного оператора в строке

- Используйте табуляцию для сдвига сложных операторов

- Вводите комментарии для улучшения читаемости строк и параграфов

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

Выражения ST объединяют операторы и операнды (переменные или константы). Для одного выражения (объединяющего операнды с одним ST оператором), тип операндов должен быть одним и тем же. Это одно выражение имеет тот же тип, что и его операторы и может быть использовано в более сложном выражении. Например:

(boo_var1 AND boo_var2) BOO тип

not (boo_var1) BOO тип

(sin (3.14) + 0.72) REAL ANALOG тип

(t#1s23 + 1.78) неправильное выражение

Скобки используются для того, чтобы отделить подчасти выражения и явно определить приоритетность операций. Когда в сложном выражении нет скобок, приоритетность ST операторов задана неявно. Например:

2 + 3 * 6 равно 2+18=20 оператор * имеет высший приоритет

(2+3) * 6 равно 5*6=30 приоритет задается скобками

Предупреждение: Максимальное количество вложенных скобок - 8.

Вызовы функций и функциональных блоков

Стандартные ST вызовы функций могут быть использованы для каждого из следующих объектов:

- Подпрограммы

- Библиотечные функции и функциональные блоки, написанные на IEC языках

- “C” функции и функциональные блоки

- Функции преобразования типов

Вызовы подпрограмм или функций

Имя: имя вызываемой подпрограммы или библиотечной функции написанной на IEC языке или “C”

Значение: вызывает ST, IL, LD, или FBD подпрограммы или функции или “C” функции и дает возвращаемое значение.

Синтаксис: <variable> := <subprog> (<par1>,...<parN>);

Операнды: За типом возвращаемого значения и параметрами вызова должен следовать интерфейс определенный для подпрограммы.

Возвращаемое значение: значение, возвращаемое подпрограммой.

Вызовы подпрограмм могут быть использованы в выражении. Они также могут быть использованы в переходах SFC.

Примечание: Вызов подпрограмм на другом языке возможен только в тех редакторах, которые поддерживают многоязыковое программирование.

Пример 1: Вызов подпрограммы:

(* Основная ST программа *)

(* получает аналоговое значение и превращает его во временное значение *)

ana_timeprog := SPlimit ( tprog_cmd );

appl_timer := tmr (ana_timeprog * 100);

(* Вызывается FBD программа 'SPlimit' *)

Пример 2: Вызов функции

(* функции использующиеся в сложных выражениях: min, max, right, mlen and left - стандартные "C" функции *)

limited_value := min (16, max (0, input_value) );

rol_msg := right (message, mlen (message) - 1) + left (message, 1);

Вызов функциональных блоков

Имя: имя экземпляра функционального блока.

Значение: вызывает функциональный блок из библиотеки и передает возвращаемые параметры.

Синтаксис: (* вызвать функциональный блок *)

<blockname> ( <p1>, <p2> ... );

(получить возвращаемые параметры *)

<result> := <blockname>. <ret_param1>;

...

<result> := <blockname>. <ret_paramN>;

Операнды: Параметры и выражения, которые имеют тот же тип, что и параметры этого функционального блока.

Возвращаемое значение: См. Синтаксис получения возвращаемых параметров

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

Пример3:

(*вызов функционального блока ST программой *)

(* объявить экземпляр функционального блока в словаре: *)

(* trigb1 : block R_TRIG - определение переднего фронта*)

(* активизация функционального блока из языка ST *)

trigb1 (b1);

(* доступ к возвращаемым параметрам *)

if (trigb1.Q) Then nb_edge := nb_edge + 1; End_if;

Специфические булевские операторы языка ST

Следующие логические операторы являются специфическими для языка ST:

- REDGE определение восходящего фронта

- FEDGE определение падающего фронта

Могут быть использованы другие логические операторы, такие, как:

- NOT логическое отрицание

- AND(&) логическое И (AND)

- OR логическое ИЛИ (OR)

- XOR логическое исключающее ИЛИ (OR)

“REDGE” оператор

Имя: REDGE

Значение: определяет передний фронт булевского выражения

Синтаксис: <edge> := REDGE ( <boo_expression>,<memo_variable> );

Операнды: Первый операнд - любая булевская переменная или сложное выражение, второй операнд - внутренняя переменная, использующаяся для хранения последнего состояния выражения

Возвращаемое значение: TRUE если значение выражения меняется с FALSE на TRUE. FALSE во всех остальных случаях.

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

Предупреждение: Булевская переменная для хранения последнего состояния выражения не может быть использована в качестве триггера для фронтов нескольких выражений.

Если выражение - это булевская переменная с именем “xxx”, то нужно объявить уникальное имя внутренней переменной “EDGE_xxx” и использовать его в выражении REDGE для этой переменной. Этот метод гарантирует, что эта переменная не будет изменена во время других вычислений REDGE.

Пример 4:

(*ST программа, использующая REDGE оператор*)

(*Эта программа считает передние фронты булевского входа*)

(*Bi120 - переменная булевского входа*)

(*Edge_Bi120 - память состояние переменной Bi120*)

If REDGE (Bi120, Edge_Bi120) Then

Counter := Counter + 1;

End_if;

Примечание: Этот оператор не из IEC1131-3. Вы можете использовать стандартный блок R_TRIG. Он сохраняется для совместимости.

“FEDGE” оператор

Имя: FEDGE

Значение: определяет задний фронт булевского выражения

Синтаксис: <edge> := FEDGE ( <boo_expression>,<memo_variable> );

Возвращаемое значение: TRUE если значение выражения меняется с TRUE на FALSE. FALSE во всех остальных случаях.

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

Предупреждение: Булевская переменная для хранения последнего состояния выражения не может быть использована в качестве триггера для фронтов нескольких выражений.

Если выражение - это булевская переменная с именем “xxx”, то нужно объявить уникальное имя внутренней переменной “EDGER_xxx” и использовать его в выражении FEDGE для этой переменной. Этот метод гарантирует, что эта переменная не будет изменена во время других вычислений FEDGE.

Пример 5:

(*ST программа, использующая FEDGE оператор*)

(*Эта программа считает передние фронты булевского входа*)

(*Bi120 - переменная булевского входа*)

(*Edge_Bi120 - память состояние переменной Bi120*)

If FEDGE (Bi120, Edge_Bi120) Then

Counter := Counter + 1;

End_if;

Примечание: Этот оператор не из IEC1131-3. Вы можете использовать стандартный блок F_TRIG. Он сохраняется для совместимости.

Основные операторы ST

Основные операторы языка ST:

Присвоение

Оператор RETURN

Структура IF-THEN-ELSIF-ELSE

Оператор CASE

Итерационный оператор WHILE

Итерационный оператор REPEAT

Итерационный оператор FOR

Оператор EXIT

Присвоение

Имя: :=

Значение: присваивает значение выражению

Синтаксис: <variable> := <any_expression>;

Операнды: переменная должна быть внутренняя или выход, переменная и выражение должны иметь один и тот же тип.

Пример 6:

(* 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

Значение: заканчивает выполнение текущей программы

Синтаксис: RETURN;

Операнды: (нет)

Пример 7:

(* 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-ELSE

Имя: 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, то никаких инструкций не выполняется.

Пример 8:

(*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

Имя: CASE... OF... ELSE... END_CASE

Значение: выполняет один или несколько списков ST операторов, выбор осуществляется в соответствии с целым выражением

Синтаксис:

CASE <integer_expression> OF

<value> : <statements> ;

<value> , <value> : <statements> ;

...

ELSE

<statements> ;

END_CASE;

Значением CASE должна быть целая константа. Несколько значений разделенных запятыми могут указывать на один и тот же список операторов. Оператор ELSE - дополнительный.

Пример 9:

(*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

Имя: WHILE... DO... END_WHILE

Значение: итерационная структура для группы ST операторов, условие вычисляется прежде выполнения итерации

Синтаксис:

WHILE <boolean_expression> DO

<statement> ;

<statement> ;

...

END_WHILE ;

Предупреждение: Изменение состояния входных переменных нельзя использовать для описания условия оператора WHILE, т.к. все итерации конструкции WHILE вычисляются в течение одного цикла выполнения программы контроллера (в течение этого цикла входные переменные не меняются, а обновятся лишь в начале нового цикла).

Пример 10:

(*ST программа, использующая оператор WHILE*)

(* эта программа использует "C" функции для чтения *)

(* символов из последовательного порта *)

string := ''; (* empty string *)

nbchar := 0;

WHILE ((nbchar < 16) & ComIsReady ( )) DO

string := string + ComGetChar ( );

nbchar := nbchar + 1;

END_WHILE;

Итерационный оператор REPEAT

Имя: REPEAT... UNTIL... END_REPEAT

Значение: итерационная структура для группы ST операторов, условие вычисляется после выполнения итерации

Синтаксис:

REPEAT

<statement> ;

<statement> ;

...

UNTIL <boolean_condition>

END_REPEAT ;

Предупреждение: Изменение состояния входных переменных не может быть использовано для описания условия оператора REPEAT.

Пример 11:

(*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

Имя: 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;

Пример 12:

(*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

Имя: EXIT

Значение: выход из итерационных операторов FOR, WHILE, REPEAT

Синтаксис: EXIT;

Операнды: (нет)

EXIT, обычно, используется в операторе IF внутри блоков FOR, WHILE, REPEAT.

Пример 13:

(* 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;

Пример 14: Стабилизация и поддержание давления от 300ат до 320ат в колонне синтеза обеспечиваются путем открытия и закрытия дискретной задвижки обратного клапана в системе турбокомпрессора в соответствии с данными от датчика Д1.1. Если давление в системе меньше, чем 300ат, то ПЛК включает задвижку, тем самым перекрывая обратный клапан; давление в системе начинает возрастать. При достижении давления в колонне синтеза в 320ат ПЛК выключает задвижку (давление в системе начинает падать) до момента, пока давление не снизится до 300ат, а затем снова включает ее. Если время снижения давления до 300ат превышает заданное (например, 20сек), либо давление повысилось до 340ат при открытом обратном клапане, то выдается сигнал об аварии, и автоматически выключается дискретный выход управления двигателем турбокомпрессора, что обеспечивает его остановку. В нормальном режиме работы дискретный выход управления двигателем турбокомпрессора постоянно включен.

Температура корпуса колонны синтеза контролируется через датчик Д1.2. В нормальном режиме температура ниже 2000С. При превышении порогового уровня в 2000С ПЛК выдает дискретный сигнал «1» (в нормальном режиме работы «0») на двигатель циркуляционного насоса, переводящий его в режим ускоренной работы, что обеспечивает большую скорость потока азотоводородной смеси и, соответственно, усиленное охлаждение стенок колонны синтеза. Выключение ускоренного режима циркуляционного насоса ПЛК производит по достижении температуры датчика Д1.2 в 1700С. Если за 20сек температура не снижается до 1700С, то включается вспомогательный насос охладительной системы. Выключение ускоренного режима циркуляционного насоса и выключение вспомогательного насоса охладительной системы ПЛК производит по достижении температуры датчика Д1.2 в 1700С.

Показания о температуре химической реакции синтеза с датчика Д1.3 ПЛК усиливает и выдает на аналоговый выход для подключения индикационного прибора.

Контроль температуры хладагента (воды) холодильника ПЛК выполняет по сигналу от датчиков Д2.1, Д2.2. В нормальном режиме работы ПЛК выдает сигнал «0» на выходы по управлению насосами охладительной системы, что соответствует режиму нормальной работы главного насоса охладительной системы и отключению вспомогательного. При возникновении разницы температур между Д2.1 и Д2.2 (нагреве хладагента при прохождении холодильника) в 500С ПЛК переводит главный насос в ускоренный режим, подавая на выход по управлению «1», с задержкой выключения 1мин.

Полученный аммиак отводится из сепаратора насосом по следующей программе ПЛК. При достижении уровня аммиака в сепараторе до уровня датчика верхнего уровня Д3.2 (датчик Д3.3 уже включен) он срабатывает, и включается насос сепаратора, уровень начинает падать. При достижении нижнего уровня датчик Д3.3 выключается, ПЛК отключает насос. Сигнал об аварии и включение насоса сепаратора производится при срабатывании датчика аварийного уровня Д3.1, при наличии сигнала от датчика Д3.2 и отсутствии от Д3.3.

По показателям датчиков нормальной скорости вращения валов двигателей Д4.1-Д4.3 ПЛК определяет исправность последних. Срабатывание датчика Д4.1 свидетельствует о нормальной или ускоренной работе двигателя главного насоса системы охлаждения. При отсутствии последнего ПЛК выдает сигнал об аварии и включает вспомогательный насос системы охлаждения. Срабатывание датчика Д4.2 указывает на включение двигателя вспомогательного насоса системы охлаждения. Если сигнал от ПЛК на включение вспомогательного насоса и состояние датчика Д4.2 не совпадают, ПЛК выдает сигнал об аварии и отключает турбокомпрессор, понижая давление, чтобы оградить систему от перегрева от химической реакции синтеза. Отсутствие сигнала с датчика Д4.3 соответствует неисправности двигателя циркуляционного насоса, ПЛК выдает сигнал об аварии, отключает турбокомпрессор. При анализе сигналов от датчиков Д4.1-Д4.3 ПЛК также учитывает тот факт, что вал двигателей набирает нормальную скорость вращения только по истечении 3-5 секунд после подачи на них напряжения питания.

Таблица 5.1 – Сигналы ввода/вывода

Обозначение

Комментарии

Тип

Входные сигналы

Д1.1

Датчик давления азотоводородной смеси в колонне синтеза

аналоговый

Д1.2

Датчик температуры стенок корпуса колонны синтеза

аналоговый

Д1.3

Датчик температуры хим. реакции синтеза аммиака

аналоговый

Д2.1;Д2.2

Датчики температуры хладагента (воды) холодильника

аналоговый

Д3.1

Датчик аварийного верхнего уровня аммиака в сепараторе

дискретный

Д3.2

Датчик верхнего уровня аммиака в сепараторе

дискретный

Д3.3

Датчик нижнего уровня аммиака в сепараторе

дискретный

Д4.1-Д4.3

Датчики нормальной скорости вращения вала двигателя

дискретный

Выходные сигналы

ОК

Обратный клапан

дискретный

ТК

Турбокомпрессор

дискретный

ГН

Главный насос системы охлаждения

дискретный

ВН

Вспомогательный насос системы охлаждения

дискретный

НС

Насос сепаратора

дискретный

ЦН

Циркуляционный насос

дискретный

А

Сигнал аварии

дискретный

ТР

Температура химической реакции

аналоговый

На рисунке 5.1 приведена функциональная схема технологического процесса синтеза аммиака.

На рисунке 5.2 приведен алгоритм программы системы управления синтезом аммиака. Задача рассмотрена как совокупность независимых последовательных событий.

Ниже приведен код решающий задачу на языке ST в среде IsaGraf. Для решения необходимо использовать FBD блоки TON (4 экземпляра) и 1 блок TOF. Все обозначения переменных транслированы на английский язык. Кроме того, в обозначениях датчиков вместо точки (ее использовать синтаксически запрещено) подставлен знак подчеркивания.

Рисунок 5.1 – Функциональная схема промышленной установки синтеза аммиака

Рисунок 5.2 – Алгоритм синтеза аммиака

(* Включение системы и отсчет времени с момента запуска *)

if not(TK) and not(A) then

TK:=true;

end_if;

(* Загрузка значений выходов таймеров в начале цикла *)

TMR0:=TON0.Q;

TMR1:=TON1.Q;

TMR2:=TON2.Q;

TMR3:=TON3.Q;

(* Масштабирование значения температуры химического процесса *)

TR:=D1_3*10;

(* Проверка Д1.1 *)

if D1_1<300 then OK:=true; end_if;

if D1_1>=320 then OK:=false; end_if;

if (D1_1>=340 and not(OK)) or TMR1 then

A:=true;

TK:=false;

end_if;

(* Проверка Д1.2 *)

if D1_2>=200 then CN:=true; end_if;

if D1_2<=170 then

CN:=false;

VN:=false;

end_if;

if D1_2>170 and TMR2 then

VN:=true;

TON3(true,t3);

end_if;

(* Контроль температуры воды холодильника *)

GN:=TOF0.Q; (* Задержка выключения главного насоса *)

TOF0(false,t5); (* Запуск задержки выключения *)

if abs (D2_1-D2_2)>=50.0 then (* Включение главного насоса, при большой разности температур хладагента *)

TOF0 (true,t5); (* На следующем цикле true попадет в GN и таймер будет запущен на выключение *)

end_if;

(* Нормальное условие включения насоса сепаратора *)

if D3_2 and D3_3 then NS:=true; end_if;

(* Условие выключения насоса сепаратора *)

if not(D3_3) then NS:=false; end_if;

(* Включение насоса сепаратора при аварийном состоянии датчиков уровня в сепараторе *)

if D3_1 and D3_2 and not(D3_3) then

A:=true;

NS:=true;

end_if;

(* Вызов аварийной ситуации, если главный насос не работает спустя 5 сек после его запуска *)

if not(D4_1) and CN and TON2.ET>=t#5s then

A:=true;

VN:=true;

end_if;

(* Проверка неравенства состояния вспомогательного насоса и его индикатора работоспособоности *)

if D4_2<>VN then TON3(true,t3); end_if;

(* Вызов аварийной ситуации если неработоспособен вспомогательный насос или циркуляционный насос *)

if TMR3 or (not(D4_3) and TMR0) then

A:=true;

TK:=false;

end_if;

(* Обновление входов таймеров в конце цикла *)

TON0(TK,t0);

TON1(not(OK),t2);

TON2(CN,t2);

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

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