Справочник ST-кода
ST (Structured Text) — текстовый язык стандарта IEC 61131-3, применяемый в OWEN Logic для
программирования контроллеров ПР200. Ниже — синтаксис, который используют встроенные блоки
редактора. Замечание о точности: код проверяется настоящим парсером OWEN Logic,
поэтому окончательный ответ на вопрос «примет ли парсер эту запись» даёт только проверка в редакторе
или stval. Ключевые слова регистронезависимы
(VAR_INPUT и var_input — одно и то же).
Структура файла
Файл описывает один функциональный блок или функцию:
function_block SYS.TON;
var_input
I : bool;
T : time;
end_var
var_output
Q : bool;
end_var
var
lv_time : time;
end_var
if I then
if not Q then
Q := get_time() - lv_time >= T;
end_if
else
Q := false;
end_if
end_function_block
Функция выглядит так:
function SYS.LIMIT : real;
var_input
X, Min, Max : real;
end_var
if X < Min then
LIMIT := Min;
else
LIMIT := X;
end_if
end_function
Объявления разных блоков пишутся своими парами: function … end_function,
function_block … end_function_block.
Объявления переменных
var_input— входы;var_output— выходы;var— локальные переменные. Секция заканчиваетсяend_var.- Несколько имён одного типа перечисляются через запятую:
I, T : bool; - Начальное значение задаётся при объявлении:
needInit : bool := true; - Массивы:
days : array [0..3] of udint := [366, 365, 365, 365];, доступ по индексуdays[i]. - Доступ к отдельному биту целого числа — через точку:
Mask.5. - Строковые комментарии:
// текст до конца строки.
Типы и литералы
В библиотеке SYS используются такие типы:
| Тип | Назначение |
|---|---|
bool | логическое значение: true / false |
udint | целое без знака (в битовых операциях — 32 разряда) |
real | число с плавающей точкой |
time | интервал времени (например, для таймеров) |
dt | дата и время |
Полный набор типов определяет парсер OWEN Logic; в коде можно использовать и другие типы IEC 61131-3. Если тип не поддерживается, проверка отметит его как ошибку.
Операторы
| Оператор | Назначение |
|---|---|
:= | присваивание |
+ - * / | сложение, вычитание, умножение, деление |
MOD | остаток от деления |
** | возведение в степень (например, x ** y) |
= <> < > <= >= | сравнения |
AND OR XOR NOT | логические операции (в том числе побитовые над целыми) |
X.N | доступ к биту N |
Инструкции
// Ветвление
if A and not B then
...
elsif C then
...
else
...
end_if
// Выбор
case value of
0: Q := true;
1: Q := false;
else Q := false;
end_case
// Циклы
for i := 0 to 31 do
...
end_for
while x > 10 do
x := x / 10;
end_while
exit — досрочный выход из цикла, return — выход из функции или блока.
Вызов функционального блока с именованными параметрами и присвоением выходов:
fb(Ton := Ton, Toff := Toff, Mask := DateTimeMask, Q => Q);
Встроенные функции и константы
| Функция | Назначение |
|---|---|
get_time() | текущее время (тип time) — база для таймеров |
get_date_time() | текущие дата и время (тип dt) |
dt_to_udint(), udint_to_time() | преобразования времени |
bool_to_udint(), udint_to_bool() | преобразования логического типа |
real_to_udint(), udint_to_real() | преобразования вещественного типа |
CONST.PI, CONST.E, CONST.POS_INF, CONST.NEG_INF |
математические константы |
Библиотека SYS
В редактор встроены 44 готовых блока и функции. Ниже — их имена и интерфейсы (выверены по исходникам библиотеки).
Функциональные блоки (16)
| Блок | Входы → Выход | Назначение |
|---|---|---|
SYS.TON | I:bool, T:time → Q:bool | задержка включения |
SYS.TOF | I:bool, T:time → Q:bool | задержка отключения |
SYS.TP | I:bool, T:time → Q:bool | импульс заданной длительности |
SYS.BLINK | I:bool, Th:time, Tl:time → Q:bool | генератор: время включения Th, выключения Tl |
SYS.RS | S:bool, R:bool → Q:bool | триггер с приоритетом сброса |
SYS.SR | R:bool, S:bool → Q:bool | триггер с приоритетом установки |
SYS.RTRIG | I:bool → Q:bool | фронт (нарастание) |
SYS.FTRIG | I:bool → Q:bool | срез (спад) |
SYS.DTRIG | S,D,C,R:bool → Q:bool | D-триггер с установкой и сбросом |
SYS.TOGGLE | I:bool, Reset:bool → Q:bool | переключение по фронту |
SYS.CTU | C,R:bool, N:udint → Q:bool | счётчик вверх; Q при достижении N |
SYS.CT | C:bool, N:udint → Q:bool | счётчик с автосбросом при N |
SYS.CTN | U,D,R:bool, N:udint → Q:udint | реверсивный счётчик (текущее значение) |
SYS.HYSTERESIS | X,XOn,XOff:real, Init:bool → Q:bool | гистерезис по двум порогам |
SYS.CLOCK | Ton,Toff:dt, Mask:udint → Q:bool | интервал времени суток |
SYS.CLOCKWEEK | Ton,Toff:dt, DayOfWeekMask, DateTimeMask:udint → Q:bool |
интервал по дням недели |
Функции (28)
| Функция | Описание |
|---|---|
SYS.ABS(x) | модуль |
SYS.MIN(a,b), SYS.MAX(a,b) | минимум и максимум для udint |
SYS.FMIN(a,b), SYS.FMAX(a,b) | минимум и максимум для real |
SYS.LIMIT(X,Min,Max) | ограничение значения диапазоном |
SYS.SCALE(X,InMin,InMax,OutMin,OutMax) | линейное масштабирование |
SYS.SIN, SYS.COS, SYS.TAN | тригонометрия |
SYS.ASIN, SYS.ACOS, SYS.ATAN | обратная тригонометрия |
SYS.SQRT(x) | квадратный корень |
SYS.POW(x,y) | степень |
SYS.EXP(x) | экспонента |
SYS.LN(x), SYS.LG(x), SYS.LOG(base,x) |
натуральный, десятичный и логарифм по основанию |
SYS.FACT(n) | факториал (до 12) |
SYS.SHL(x,n), SYS.SHR(x,n) | сдвиг влево и вправо |
SYS.PUTBIT(X,N,B) | установить бит N в значение B |
SYS.EXTRACT(X,N) | прочитать бит N |
SYS.CD32(IN) | индекс старшего установленного бита |
SYS.DC32(IN) | маска бита 2^N (N = IN mod 32) |
SYS.is_leap_year(year) | проверка високосного года |
SYS.compare_date_time(value1,value2,mask) |
сравнение дат/времени по маске полей: 0 — равно, 1 — больше, 2 — меньше |
Пример
Мигание с заданными интервалами и подсчётом циклов:
function_block FB_BlinkCounter;
var_input
Enable : bool;
Ton : time;
end_var
var_output
Lamp : bool;
Count : udint;
end_var
var
blink : SYS.BLINK;
meter : SYS.CTU;
pulse : SYS.RTRIG;
end_var
blink(I := Enable, Th := Ton, Tl := Ton, Q => Lamp);
pulse(I := Lamp);
meter(C := pulse, R := false, N := 100);
Count := meter.Q;
end_function_block
Пример носит иллюстративный характер: точный синтаксис проверяйте в редакторе.