Документация → Справочник ST-кода

Справочник 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.TONI:bool, T:time → Q:boolзадержка включения
SYS.TOFI:bool, T:time → Q:boolзадержка отключения
SYS.TPI:bool, T:time → Q:boolимпульс заданной длительности
SYS.BLINKI:bool, Th:time, Tl:time → Q:boolгенератор: время включения Th, выключения Tl
SYS.RSS:bool, R:bool → Q:boolтриггер с приоритетом сброса
SYS.SRR:bool, S:bool → Q:boolтриггер с приоритетом установки
SYS.RTRIGI:bool → Q:boolфронт (нарастание)
SYS.FTRIGI:bool → Q:boolсрез (спад)
SYS.DTRIGS,D,C,R:bool → Q:boolD-триггер с установкой и сбросом
SYS.TOGGLEI:bool, Reset:bool → Q:boolпереключение по фронту
SYS.CTUC,R:bool, N:udint → Q:boolсчётчик вверх; Q при достижении N
SYS.CTC:bool, N:udint → Q:boolсчётчик с автосбросом при N
SYS.CTNU,D,R:bool, N:udint → Q:udintреверсивный счётчик (текущее значение)
SYS.HYSTERESISX,XOn,XOff:real, Init:bool → Q:boolгистерезис по двум порогам
SYS.CLOCKTon,Toff:dt, Mask:udint → Q:boolинтервал времени суток
SYS.CLOCKWEEKTon,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

Пример носит иллюстративный характер: точный синтаксис проверяйте в редакторе.