ST (Structured Text) - это текстовый язык высокого уровня. Является одним из пяти языков, поддерживаемых стандартом МЭК 61131-3.
В Owen Logic доступно создание функций и функциональных блоков на языке ST.
Синтаксис
Ключевые слова могут быть введены в символах верхнего и нижнего регистра. Пробелы и табуляция не влияют на синтаксис и могут быть использованы везде.
Имена переменных, функций и функциональных блоков подчиняются следующим правилам:
Имя не должно содержать пробелов и спецсимволов (например, !, @ и т.д.). Исключение – символ нижнего подчеркивания (_);
Имя должно начинаться с буквы;
Имя переменной может содержать только буквы латинского алфавита;
Имя не должно содержать несколько символов нижнего подчеркивания(_), размещенных подряд (т.е. имя i__Test недопустимо, а имя i_Te_st - допустимо);
Регистр имен объектов не учитывается (ITest и iTEST будет интерпретироваться как одно и то же имя);
На длину имени не накладывается никаких ограничений;
Имя не должно совпадать с один из зарезервированных ключевых слов (например, VAR, INT, и т.д.);
Рекомендуется для имен переменных использовать венгерскую нотацию и стиль lowerCamelCase.
Использование функций в других элементах программы на ST
Функцию можно вызвать в другой функции или функциональном блоке. Для этого нужно использовать следующий формат (неформальный вызов):
Имя функции (перечисление через запятую входов функции)
Пример
FUNCTION rFun1: REAL;
VAR_INPUT
rIn1 : REAL;
rIn2 : REAL;
END_VAR
rFun1 := rIn1 + rIn2;
END_FUNCTION
Есть функция rFun1:
Ее вызов в функции rFun2 будет выглядеть следующим образом:
FUNCTION rFun2: REAL;
VAR_INPUT
rIn1_0 : REAL;
rInf1_1 : REAL;
rInf1_2 : REAL;
END_VAR
rFun2 := rIn1_0 * rFun1(rInf1_1, rInf1_2);
END_FUNCTION
Функция rFun2 будет возвращать число, равное произведению rIn1_0 на сумму rInf1_1 и rInf1_2, которые задаются на входе этой функции.
Использование одного функционального блока в другом
Экземпляры одного функционального блока могут быть созданы в другом функциональном блоке, а именно в области объявления локальных переменных в формате:
(краткое обозначение):(имя функционального блока)
После создания экземпляра функционального блока можно начинать работу с его данными. Входы экземпляра блока доступны для записи извне. Выходы – для чтения.
Вызвать экземпляр можно по-разному. В качестве примера рассмотрим вызов счетчика для прямого счета, который создается как шаблон при создании функционального блока.
Через формальный вызов:
FUNCTION_BLOCK fb2 VAR_INPUT xIn : BOOL; END_VAR VAR_OUTPUT xAlarmMax : BOOL; udiQ : UDINT; END_VAR VAR fb1 : functionblock1; //объявление экземпляра функционального блока END_VAR fb1 (U := xIn, Q => udiQ); //вызов экземпляра функционального блока IF fb1.Q > 10 THEN xAlarmMax := TRUE; END_IF END_FUNCTION_BLOCK
ПримечаниеОбратите внимание на специфический оператор копирования значения из выходных переменных блока («=>»).Через обращение к входам/выходам функционального блока (объявление переменных аналогичное):
fb1.U := xIn; //запись данных на вход ФБ fb1 (); //вызов экземпляра функционального блока udiQ := fb1.Q; //чтение выхода экземпляра ФБ IF fb1.Q > 10 THEN xAlarmMax := TRUE; END_IF
На выходе fb2 будет индикация превышения 10 импульсов и накопленное значение счетчика.
Документирование в редакторе ST
Редактор ST поддерживает функцию документирования.
Маркером документирования является тройной слэш «///».
Документирование добавляется над объектами: объявление функции / функционального блока, объявление входной / выходной переменной.
Теги для документирования перечислены в таблице ниже.
Тег | Описание |
---|---|
<Description>…</Description> | Описание элемента программы (функции, функционального блока, входной и выходной (только для функционального блока) переменной) |
<Author>…</Author> | Имя создателя функции или функционального блока |
<GroupName>…</GroupName> | Имя группы для группировки функции или функционального блока в библиотеке компонентов |
<OutputDescription>…</OutputDescriotion> | Описание выхода функции |
Документирование функции
///<Description>Преобразователь сопротивления в температуру (Pt1000)</Description>
///<OuptutDescription>Температура</OutputDescription>
///<Author>ОВЕН</Author>
///<GroupName>Температурный датчики</GroupName>
FUNCTION f_PT1000: REAL; // функция для датчика термосопротивления PT1000
VAR_INPUT
///<Description>Сопротивление</Description>
R : REAL;
END_VAR
VAR_OUTPUT
///<OutputDescription>Температура</OutputDescription>
Q : REAL;
END_VAR
После импорта в менеджер компонентов описание функции будет представлено в соответствии с указанными тегами документировани:
Пример документирования функционального блока
///<Description>Счетчик для прямого счета</Description>
///<Author>ОВЕН</Author>
///<GroupName>Таймеры и счетчики</GroupName>
FUNCTION_BLOCK fb_Counter
VAR_INPUT
///<Description>Детектор импульсов</Description>
U : BOOL; //входная переменная с типом данных bool
///<Description>Флаг сброса счетчика</Description>
Res : BOOL; //входная переменная с типом данных bool
///<Description>Предустановленное значение счетчика</Description>
N : UDINT; //входная переменная с типом данных bool
END_VAR
VAR_OUTPUT
///<Description>Значение счетчика</Description>
Q : UDINT; //выходная переменная с типом данных udint
END_VAR
После импорта в менеджер компонентов описание функционального блока будет представлено в соответствии с указанными тегами документирования:
Типы данных
Тип данных переменной определяет род информации, диапазон представлений и множество допустимых операций.
Любую переменную можно использовать только после её объявления. Присваивать значения одной переменной другой можно, только если они одного типа. В противном случае используются преобразователи типов.
Типы данных, поддержанные в Owen Logic, перечислены в таблице ниже:
Название | Тип | Возможные значения | Размер в байтах |
---|---|---|---|
BOOL | Логический | FALSE, TRUE | 4 байта |
UDINT | Целочисленный | 0…4294967295 | 4 байта |
REAL | Вещественный | –1,2×10-38…3,4×1038 | 4 байта |
TIME | Интервал времени | T#0…4294967295ms T#0..4294967s T#0..71582m T#0..1193h T#0..49d T#0..49d17h02m47s295ms | 4 байта |
DT | Время суток и дата | DT#2000-01-01-00:00:00..2136-02-07-6:28:15 | 4 байта |
Зарезервированные ключевые слова
ABS | END_REPEAT | R_EDGE | TASK |
ACTION | END_RESOURCE | READ_ONLY | THEN |
AND | END_STEP | REAS_WRITE | TIME |
ARRAY | END_STRUCT | REAL | TIME_OF_DAY |
AT | END_TRANSITION | REAL_TO_BOOL | TO |
BEGIN | END_TYPE | REAL_TO_UDINT | TOD |
BOOL | END_VAR | REPEAT | TRANSITION |
BOOL_TO_REAL | END_WHILE | RESOURCE | TRUE |
BOOL_TO_UDINT | ENO | RETAIN | TYPE |
BY | EXIT | RETURN | UDINT |
CASE | F_EDGE | SEL | UDINT_TO_BOOL |
CD32 | FALSE | SHL | UDINT_TO_REAL |
CONFIGURATION | FOR | SHR | UINT |
CONTINUE | FROM | SINT | ULINT |
DATE | FUNCTION | STEP | UNTIL |
DATE_AND_TIME | FUNCTION_BLOCK | STRING | USINT |
DC32 | GET_DATE_TIME | STRUCT | VAR |
DINT | GET_TIME | SYS.BLINK | VAR_ACCESS |
DO | IF | SYS.CLOCK | VAR_CONFIG |
DT | INITIAL_STEP | SYS.CLOCKWEEK | VAR_EXTERNAL |
DWORD | INT | SYS.COMPARE_DATE_TIME | VAR_GLOBAL |
ELSE | LINT | SYS.CT | VAR_IN_OUT |
ELSIF | LREAL | SYS.CTN | VAR_INPUT |
EN | LWORD | SYS.CTU | VAR_OUTPUT |
END | MOD | SYS.DTRIG | VAR_TEMP |
END_ACTION | NON_RETAIN | SYS.FTRIG | WHILE |
END_CASE | NOT | SYS.IS_LEAP_YEAR | WITH |
END_CONFIGURATION | OF | SYS.RS | WORD |
END_FOR | ON | SYS.RTRIG | WSTRING |
END_FUNCTION | OR | SYS.TOF | XOR |
END_FUNCTION_BLOCK | POW | SYS.TON | |
END_IF | PROGRAM | SYS.TP |
Конструкции языка
К конструкциям языка ST относятся:
- арифметические операции;
- битовые операции;
- операции преобразования типов данных;
- логические операции;
- операции сравнения;
- операция присвоения;
- конструкция IF – ELSIF – ELSE;
- конструкция CASE;
- конструкция RETURN
- цикл FOR;
- цикл WHILE;
- цикл REPEAT – UNTIL.
Операции
Арифметические операции
Операция | Ключевое слово | Типы данных | Пример использования |
---|---|---|---|
Сложение | + | IN, OUT: UDINT/REAL | OUT := IN1 + IN2 + … |
Умножение | * | OUT := IN1 * IN2 * … | |
Вычитание | - | OUT := IN1 - IN2 | |
Деление | / | OUT := IN1 / IN2 | |
Остаток от целочисленного деления | MOD | OUT := IN1 MOD IN2 | |
Абсолютное значение | ABS (IN) | IN, OUT: REAL | OUT := ABS (IN1) |
Возведение в степень | POW (IN, N)IN – основаниеN – степень | IN, N, OUT: REAL | OUT := POW (IN1, N) |
Битовые операции
Операция | Ключевое слово | Типы данных | Пример использования |
---|---|---|---|
Побитовый сдвиг влево | SHL (IN, N) | IN, OUT: UDINT N: 1..32 | OUT := SHL (IN1, N) |
Побитовый сдвиг вправо | SHR (IN, N) | OUT := SHR (IN1, N) | |
Дешифратор. Преобразует двоичный код в позиционный код. | DC32 (IN) | IN, OUT: UDINT | OUT := DC32 (IN1) |
Шифратор. Преобразует позиционный код в двоичный код. | CD32 (IN) | IN, OUT: UDINT | OUT := CD32 (IN1) |
Операции преобразования типов данных
Операция | Ключевое слово | Типы данных | Пример использования |
---|---|---|---|
UDINT в REAL | UDINT_TO_REAL (IN) | IN: UDINT OUT: REAL | OUT := UDINT_TO_REAL (IN) |
UDINT в BOOL | UDINT_TO_BOOL (IN) | IN: UDINT OUT: BOOL | OUT := UDINT_TO_BOOL (IN) |
UDINT в TIME | UDINT_TO_TIME (IN) | IN: UDINT OUT: TIME | OUT := UDINT_TO_TIME (IN) |
UDIMT в DT | UDINT_TO_DT (IN) | IN: UDINT OUT: DT | OUT := UDINT_TO_DT (IN) |
REAL в UDINT | REAL_TO_UDINT (IN) | IN: REAL OUT: UDINT | OUT := REAL_TO_UDINT (IN) |
REAL в BOOL | REAL_TO_BOOL (IN) | IN: REAL OUT: BOOL | OUT := REAL_TO_BOOL (IN) |
BOOL в REAL | BOOL_TO_REAL (IN) | IN: BOOL OUT: REAL | OUT := BOOL_TO_REAL (IN) |
BOOL в UDINT | BOOL_TO_UDINT (IN) | IN: BOOL OUT: UDINT | OUT := BOOL_TO_UDINT (IN) |
TIME в UDINT | TIME_TO_UDINT (IN) | IN: TIME OUT: UDINT | OUT := TIME_TO_UDINT (IN) |
DT в UDINT | DT_TO_UDINT (IN) | IN: DT OUT: UDINT | OUT := DT_TO_UDINT (IN) |
Логические операции
Операция | Ключевое слово | Типы данных | Пример использования |
---|---|---|---|
Логическое отрицание «НЕ» | NOT | IN, OUT: BOOL | OUT := NOT IN1 |
Конъюнкция Логическое умножение «И» | AND & | OUT := IN1 AND IN2 OUT := IN1 & IN2 | |
Дизъюнкция Логическое сложение «ИЛИ» | OR | OUT := IN1 OR IN2 | |
Исключающее ИЛИ | XOR | OUT := IN1 XOR IN2 |
Операции сравнения
Операция | Ключевое слово | Типы данных | Пример использования |
---|---|---|---|
Больше | > | IN: UDINT/REAL OUT: BOOL | OUT := IN1 > IN2 |
Больше или равно | >= | OUT := IN1 >= IN2 | |
Равно | = | OUT := IN1 = IN2 | |
Меньше или равно | <= | OUT := IN1 <= IN2 | |
Меньше | < | OUT := IN1 < IN2 | |
Неравно | <> | OUT := IN1 <> IN2 |
Приоритеты операций
Операция | Ключевое слово |
---|---|
Скобки | (выражение) |
Вызов функции и функционального блока | Пример: fb1(); function1 := … ; |
Битовые операции | |
Унарный минус | – |
Логическое отрицание | NOT |
Возведение в степень | POW |
Умножение | * |
Деление | / |
Остаток от целочисленного деления | MOD |
Сложение | + |
Вычитание | – |
Операции сравнения | >.< <=, >= |
Равно | = |
Неравно | <> |
КонъюнкцияЛогическое умножение «И» | &AND |
Исключающее ИЛИ | XOR |
ДизъюнкцияЛогическое сложение «ИЛИ» | OR |
Присвоение
Для обозначения присвоения используется парный знак «:=». В правой и левой части выражения должны быть операнды одного типа (автоматического приведения типов не предусмотрено). В левой части выражения (принимающая сторона) может быть использована только переменная. Правая часть может содержать выражение или константу.
Оператор IF
Оператор IF позволяет проверить одно или несколько условий, и, если хотя бы одно из условий является истинным, выполнить заданные для этого условия выражения. После выполнения выражений производится выход из оператора – то есть оставшиеся условия уже не проверяются.
Рассмотрим работу оператора на примере сигнализации выхода значения температуры за допустимые границы:
FUNCTION_BLOCK fb //имя функционального блока
VAR_INPUT //объявление входных переменных
rTemp : REAL;
END_VAR
VAR_OUTPUT //объявление выходных переменных
xHigh : BOOL;
xLow : BOOL;
END_VAR
VAR //объявление локальных переменных
rHighTemp : REAL := 20;
rLowTemp : REAL := 10;
END_VAR
//область кода
IF rTemp > rHighTemp THEN
xHigh := TRUE;
ELSIF rTemp < rLowTemp THEN
xLow := TRUE;
ELSE
xHigh := FALSE;
xLow := FALSE;
END_IF
END_FUNCTION_BLOCK
Если условие в операторе IF выполняется (значение переменной rTemp больше rHighTemp), то переменной xHigh будет присвоено значение TRUE и произойдет выход из оператора (следующее условие проверяться не будет). Если же условие не выполняется, то произойдет проверка следующего условия, размещенного во вложенном операторе ELSIF. Если условие в ELSIF выполняется (значение переменной rTemp меньше rLowTemp), то переменной xLow будет присвоено значение TRUE и произойдет выход из оператора (следующее условие проверяться не будет). Если ни одно из условий в IF и ELSIF не выполняется (то есть значение температуры находится в допустимых пределах), то произойдет выполнение выражений, размещенных во вложенном операторе ELSE – присвоение переменным xHigh и xLow значения FALSE.
Использование вложенных операторов ELSIF и ELSE является необязательным. Внутри оператора IF может быть размещено произвольное число операторов ELSIF.
Конструкция допускает вложенность, то есть внутри одного IF может быть еще один и т.д. Также внутри оператора IF могут быть использованы циклы и оператор CASE.
Оператор CASE
Оператор CASE позволяет сравнить значение заданной целочисленной переменной (селектора) с набором констант или целочисленных значений (метками), и в случае совпадения выполнить заданные для этой метки выражения. После выполнения выражений производится выход из оператора.
Рассмотрим работу оператора на примере:
FUNCTION_BLOCK fb1 //имя функционального блока
VAR_INPUT //объявление входных переменных
udiSel : UDINT;
END_VAR
VAR_OUTPUT //объявление выходных переменных
xOut1 : BOOL;
xOut2 : BOOL;
xOut3 : BOOL;
xOut4 : BOOL;
END_VAR
//область кода
xOut1 := FALSE;
xOut2 := FALSE;
xOut3 := FALSE;
xOut4 := FALSE;
CASE udiSel OF
0:
xOut1 := TRUE;
1..3:
xOut2 := TRUE;
4, 6:
xOut3 := TRUE;
ELSE
xOut4 := TRUE;
END_CASE
END_FUNCTION_BLOCK
Если значение udiSel:
Равно 0, то xOut1 примет значение TRUE;
Попадет в диапазон 1..3, то xOut2 примет значение TRUE;
Равно 4 или 6, то xOut3 примет значение TRUE;
Не попадет ни в одно из указанных значений, то xOut4 примет значение TRUE;
Как видно из примера – метка может включать в себя несколько значений, перечисленных через запятую «4, 6», или диапазон «1..3». При этом значения одной из меток не должны совпадать со значениями других. Также, при указании диапазона значений начало диапазона должно быть меньше его конца.
Вложенный оператор ELSE является необязательным; размещенные в нём выражения выполняются в том случае, если значение селектора не совпало ни с одной из меток.
Действия, предусмотренные для обработки каждого из случаев CASE, могут использовать циклы, операторы IF и CASE.
Оператор RETURN
Оператор RETURN позволяет выйти из программного объекта.
Пример использования:
IF xDone THEN
RETURN;
END_IF;
udiCounter := udiCounter + 1;
Если переменная xDone примет значение TRUE, то выражение «udiCounter := udiCounter + 1» выполнятся не будет (как и все, что будет находится ниже в теле программы).
Цикл FOR
Оператор FOR применяется для организации цикла с заранее известным числом итераций. Обычно он используется для операций над массивами данных.
Внутри цикла могут использоваться операторы IF и CASE, а также другие операторы цикла.
В качестве примера рассмотрим реализацию пузырьковой сортировки от меньшего к большему:
FUNCTION_BLOCK MaxI_MinI //Максимальное и минимальное число при помощи пузырьковой
// сортировки от меньшего к большему
VAR_INPUT //объявление входных переменных
udiX1, udiX2, udiX3, udiX4, udiX5 : UDINT;
//Добавление необходимого кол-ва входных переменных и определение типа данных
END_VAR
VAR_OUTPUT //объявление выходных переменных
udiMaxI, udiMinI : UDINT;
END_VAR
VAR //объявление локальных переменных
udiI, udiJ, udiN, udiK : UDINT;
audiX : ARRAY [1..5] OF UDINT; //Задается диапазон массива и тип данных массива
END_VAR
//область кода
//объявление массива
audiX[1] := udiX1;
audiX[2] := udiX2;
audiX[3] := udiX3;
audiX[4] := udiX4;
audiX[5] := udiX5;
udiN := 5; // задается кол-во чисел для сортировки (размер массива)
FOR udiI := 1 TO udiN-1 DO
FOR udiJ := 1 TO udiN-udiI DO
IF audiX[udiJ] > audiX[udiJ+1] THEN
udiK := audiX[udiJ];
audiX[udiJ] := audiX[udiJ+1];
audiX[udiJ+1] := udiK;
END_IF;
END_FOR;
END_FOR;
udiMaxI := audiX[udiN]; //выводится последнее (максимальное) число массива
udiMinI := audiX[1]; //выводится первое (минимальное) число массива
END_FUNCTION_BLOCK
Переменная udiI называется итератором (счетчиком) цикла. Эта переменная должна принадлежать целочисленному знаковому типу (UDINT). После каждого выполнения тела цикла происходит изменение значения итератора – по умолчанию на +1. Пользователь может сам задать «шаг» итератора с помощью вложенного оператора BY. После этого сразу происходит переход к следующей итерации – то есть весь цикл выполняется «от начала и до конца». Структура будет выглядеть следующим образом:
// udiI будет принимать значения 1, 4, 7, 10 и т.д.
FOR udiI := 1 TO udiN-1 BY 3 DO
.. // код цикла
END_FOR
Итератор (счетчик) цикла, его начальное и конечное значение, а также приращение являются целочисленными. Они вычисляются до входа в цикл и изменение значений переменных, входящих в любое из этих выражений, не приведет к изменению числа итераций.
Досрочно выйти из цикла можно при помощи оператора EXIT. Пример структуры:
FOR udiI := 1 TO udiN-1 DO
IF audiX[2] > 100 THEN
EXIT;
ELSE
.. // код цикла
END_IF
END_FOR
Пропустить шаг цикла можно при помощи оператора CONTINUE.
FOR udiI := 1 TO udiN-1 DO
IF udiI = 3 THEN
CONTINUE;
ELSE
.. // код цикла
END_IF
END_FOR
Цикл WHILE
Оператор WHILE используется для создания цикла с заранее неизвестным числом итераций. Завершение цикла произойдет, если проверяемое условие вернет FALSE. При этом проверка условия выполняется ДО выполнения выражения (цикл с предусловием). Таким образом, если условие сразу возвращает FALSE, то цикл не выполнится ни разу.
Внутри цикла могут использоваться операторы IF и CASE, а также другие операторы цикла.
Пример конструкции:
WHILE rVar < 100 DO
rVar := rVar + 1;
END_WHILE
Результатом выполнения данного цикла (с начальным значением переменной rVar := 10) будет число 100.
Досрочно выйти из цикла можно при помощи оператора EXIT.
Пропустить шаг цикла можно при помощи оператора CONTINUE.
Цикл REPEAT UNTIL
Оператор REPEAT используется для создания цикла с заранее неизвестным числом итераций. Завершение цикла произойдет, если проверяемое условие вернет TRUE. При этом проверка условия выполняется ПОСЛЕ выполнения выражения (цикл с постусловием). Таким образом, если условие сразу возвращает TRUE, то цикл выполнится один раз.
Внутри цикла могут использоваться операторы IF и CASE, а также другие операторы цикла.
Пример конструкции:
REPEAT
IF rVar > 100 THEN
EXIT;
END_IF;
rVar := rVar + 1;
UNTIL rVar > 180
END_REPEAT;
Результатом выполнения данного цикла (с начальным значением переменной rVar := 10) будет число 101.
Для досрочного выхода из цикла можно использовать оператор EXIT.
Пропустить шаг цикла можно при помощи оператора CONTINUE.
Системные функции
Функция GET_TIME
Функция GET_TIME возвращает значение типа TIME (4 байта), содержащее время, прошедшее с момента последнего включения прибора, в миллисекундах.
Пример
VAR
Time_1 : TIME := T#0ms;
Time_2 : TIME := T#0ms;
Q : BOOL := FALSE;
END_VAR
IF Time_1 := T#0ms THEN
Time_1 := GET_TIME();
END_IF
Time_2 := GET_TIME();
IF (Time_2 - Time_1) >= T#1000ms THEN
Q := NOT Q;
Time_1 := T#0ms;
Time_2 := T#0ms;
END_IF
Функция GET_DATE_TIME
Функция GET_DATE_TIME возвращает значение тип DT (4 байта), содержащее данные часов реального времени, в секундах с 00:00:00 1.01.2000 г., с учетом часового пояса, установленного в приборе.
Пример
VAR
Ton_UNIX : UDINT;
Ton_DT : DT;
END_VAR
Ton_DT := GET_DATE_TIME();
Ton_UNIX := DT_TO_UDINT(Ton_DT);
Системные функциональные блоки
В редакторе ST поддержаны системные функциональные блоки:
Использование системных функциональных блоков в других элементах программы аналогично использованию пользовательских функциональных блоков.
Для каждого системного функционального блока редактор предлагает подсказку по его использованию.
Триггеры
RS-триггер с приоритетом выключения (SYS.RS)
RS-триггер с приоритетом выключения (SYS.RS) используется для переключения с фиксацией состояния во время поступления коротких импульсов на соответствующий вход. На выходе Q появится логическая «1» по фронту сигнала на входе S.
Обозначение | Тип данных | Описание |
---|---|---|
Входы | ||
S | BOOL | Вход SET |
R | BOOL | Вход RESET |
Выходы | ||
Q | BOOL | Выход триггера |
FUNCTION_BLOCK RS_trigger //имя функционального блока
VAR_INPUT //объявление входных переменных
R_in : BOOL;
S_in : BOOL;
END_VAR
VAR_OUTPUT //объявление выходных переменных
Q_out : BOOL;
END_VAR
VAR //объявление локальных переменных
RS_1: SYS.RS;
END_VAR
//область кода
RS_1(R := R_in, S := S_in, Q => Q_out);
END_FUNCTION_BLOCK
В случае одновременного поступления сигналов на оба входа приоритетным является сигнал входа R.
SR-триггер с приоритетом включения (SYS.SR)
SR-триггер с приоритетом включения (SYS.SR) используется для переключения с фиксацией состояния во время поступления коротких импульсов на соответствующий вход. На выходе Q появится логическая «1» по фронту сигнала на входе S.
Обозначение | Тип данных | Описание |
---|---|---|
Входы | ||
S | BOOL | Вход SET |
R | BOOL | Вход RESET |
Выходы | ||
Q | BOOL | Выход триггера |
FUNCTION_BLOCK SR_trigger //имя функционального блока
VAR_INPUT //объявление входных переменных
S_in : BOOL;
R_in : BOOL;
END_VAR
VAR_OUTPUT //объявление выходных переменных
Q_out : BOOL;
END_VAR
VAR //объявление локальных переменных
SR_1: SYS.SR;
END_VAR
//область кода
SR_1(S := S_in, R := R_in, Q => Q_out);
END_FUNCTION_BLOCK
В случае одновременного поступления сигналов на оба входа приоритетным является сигнал входа S.
Детектор переднего фронта импульса (SYS.RTRIG)
Детектор переднего фронта импульса (SYS.RTRIG) используется в случае необходимости иметь реакцию на изменение состояния дискретного входного сигнала. На выходе Q генерируется единичный импульс по переднему фронту входа I.
Обозначение | Тип данных | Описание |
---|---|---|
Входы | ||
I | BOOL | Вход триггера |
Выходы | ||
Q | BOOL | Выход триггера |
FUNCTION_BLOCK R_trigger //имя функционального блока
VAR_INPUT //объявление входных переменных
RT_in : BOOL;
END_VAR
VAR_OUTPUT //объявление выходных переменных
RT_out : BOOL;
END_VAR
VAR //объявление локальных переменных
RTrig_1: SYS.RTRIG;
END_VAR
//область кода
RTrig_1(I := RT_in, Q => RT_out);
END_FUNCTION_BLOCK
Детектор заднего фронта импульса (SYS.FTRIG)
Детектор заднего фронта импульса (SYS.FTRIG) используется в случае необходимости иметь реакцию на изменение состояния дискретного входного сигнала. На выходе Q генерируется единичный импульс по переднему фронту входа I.
Обозначение | Тип данных | Описание |
---|---|---|
Входы | ||
I | BOOL | Вход триггера |
Выходы | ||
Q | BOOL | Выход триггера |
FUNCTION_BLOCK F_trigger //имя функционального блока
VAR_INPUT //объявление входных переменных
FT_in : BOOL;
END_VAR
VAR_OUTPUT //объявление выходных переменных
FT_out : BOOL;
END_VAR
VAR //объявление локальных переменных
FTrig_1: SYS.FTRIG;
END_VAR
//область кода
FTrig_1(I := FT_in, Q => FT_out);
END_FUNCTION_BLOCK
D-триггер (SYS.DTRIG)
D-триггер (SYS.DTRIG) используется для формирования импульса включения выхода на интервал времени импульса на входе D, выходной интервал будет синхронизирован с тактовой частотой на входе С.
На выходе Q триггера появится сигнал логической «1» по фронту тактовых импульсов на входе С при наличии сигнала логической «1» на входе D. Возврат выхода Q в сигнал логического «0» произойдет по фронту тактовых импульсов на входе С при наличии сигнала логического «0» на входе D.
Вход S принудительно устанавливает выход Q в состояние логической «1».
Вход R является приоритетным и устанавливает выход Q в состояние логического «0».
Обозначение | Тип данных | Описание |
---|---|---|
Входы | ||
S | BOOL | Вход SET |
D | BOOL | Вход триггера |
C | BOOl | Тактовая частота |
R | BOOL | Вход RESET |
Выходы | ||
Q | BOOL | Выход триггера |
FUNCTION_BLOCK D_trigger //имя функционального блока
VAR_INPUT //объявление входных переменных
S_in : BOOL;
D_in : BOOL;
C_in : BOOL;
R_in : BOOL;
END_VAR
VAR_OUTPUT //объявление выходных переменных
Q_out : BOOL;
END_VAR
VAR //объявление локальных переменных
DTrig_1: SYS.DTRIG;
END_VAR
//область кода
DTrig_1(S := S_in, D := D_in, C := C_in, R := R_in, Q => Q_out);
END_FUNCTION_BLOCK
Таймеры
Импульс включения заданной длительности (SYS.TP)
Импульс включения заданной длительности (SYS.TP) используется для формирования импульса включения выхода на заданный интервал времени. На выходе Q блока появляется сигнал логической «1» по фронту входного сигнала I. После запуска выход Q не реагирует на изменение значения входного сигнала в течение интервала Tимп. По истечение интервала Tимп выходной сигнал сбрасывается в логический «0».
Обозначение | Тип данных | Описание |
---|---|---|
Входы | ||
I | BOOL | Включение таймера |
T | TIME | Длительность импульса |
Выходы | ||
Q | BOOL | Выход таймера |
FUNCTION_BLOCK TP_timer //имя функционального блока
VAR_INPUT //объявление входных переменных
I_in : BOOL := FALSE;
END_VAR
VAR_OUTPUT //объявление выходных переменных
Q_out : BOOL;
END_VAR
VAR
TP_1: SYS.TP;
END_VAR
//область кода
TP_1(I := I_in, T := T#1000ms);
//где ms - миллисекунды, s - секунды, m - минуты, h - часы, d - дни
Q_out := TP_1.Q;
END_FUNCTION_BLOCK
FUNCTION_BLOCK TP_timer //имя функционального блока
VAR_INPUT //объявление входных переменных
I_in : BOOL := FALSE;
T_in : UDINT := 5000;//миллисекунд
END_VAR
VAR_OUTPUT //объявление выходных переменных
Q_out : BOOL;
END_VAR
VAR
TP_1: SYS.TP;
T_time: TIME;
END_VAR
//область кода
T_time := UDINT_TO_TIME(T_in);
TP_1(I := I_in, T := T_time, Q => Q_out);
END_FUNCTION_BLOCK
Таймер с задержкой включения (SYS.TON)
Таймер с задержкой включения (SYS.TON) используется для операции задержки передачи сигнала. На выходе Q таймера появится сигнал логической «1» с задержкой относительно фронта входного сигнала I продолжительностью не менее длительности Ton и выключится по спаду входного сигнала.
Обозначение | Тип данных | Описание |
---|---|---|
Входы | ||
I | BOOL | Запуск таймера (по переднему фронту) |
T | TIME | Задержка на включение |
Выходы | ||
Q | BOOL | Выход таймера |
FUNCTION_BLOCK TON_timer //имя функционального блока
VAR_INPUT //объявление входных переменных
I_in : BOOL := FALSE;
END_VAR
VAR_OUTPUT //объявление выходных переменных
Q_out : BOOL;
END_VAR
VAR
TON_1: SYS.TON;
END_VAR
//область кода
TON_1(I := I_in, T := T#1000ms);
//где ms - миллисекунды, s - секунды, m - минуты, h - часы, d - дни
Q_out := TON_1.Q;
END_FUNCTION_BLOCK
FUNCTION_BLOCK TON_timer //имя функционального блока
VAR_INPUT //объявление входных переменных
I_in : BOOL := FALSE;
Ton_in : UDINT := 5000;//миллисекунд
END_VAR
VAR_OUTPUT //объявление выходных переменных
Q_out : BOOL;
END_VAR
VAR
TON_1: SYS.TON;
Ton_time: TIME;
END_VAR
//область кода
Ton_time := UDINT_TO_TIME(Ton_in);
TON_1(I := I_in, T := Ton_time, Q => Q_out);
END_FUNCTION_BLOCK
Таймер с задержкой выключения (SYS.TOF)
Таймер с задержкой отключения (SYS.TOF) используется для задержки отключения выхода. На выходе Q таймера появится сигнал логической «1» по фронту сигнала на входе I, отсчет времени задержки отключения Toff начнется по каждому спаду входного сигнала. После отключения входного сигнала на выходе появится сигнал логического «0» с задержкой Toff.
Обозначение | Тип данных | Описание |
---|---|---|
Входы | ||
I | BOOL | Запуск таймера (по заднему фронту) |
T | TIME | Задержка на включение |
Выходы | ||
Q | BOOL | Выход таймера |
FUNCTION_BLOCK TOF_timer //имя функционального блока
VAR_INPUT //объявление входных переменных
I_in : BOOL := FALSE;
END_VAR
VAR_OUTPUT //объявление выходных переменных
Q_out : BOOL;
END_VAR
VAR
TOF_1: SYS.TOF;
END_VAR
//область кода
TOF_1(I := I_in, T := T#1000ms;
//где ms - миллисекунды, s - секунды, m - минуты, h - часы, d - дни
Q_out := TOF_1.Q;
END_FUNCTION_BLOCK
FUNCTION_BLOCK TOF_timer //имя функционального блока
VAR_INPUT //объявление входных переменных
I_in : BOOL := FALSE;
Ton_in : UDINT := 5000;//миллисекунд
END_VAR
VAR_OUTPUT //объявление выходных переменных
Q_out : BOOL;
END_VAR
VAR
TOF_1: SYS.TOF;
Tof_time: TIME;
END_VAR
//область кода
Tof_time := UDINT_TO_TIME(Tof_in);
TOF_1(I := I_in, T := Tof_time, Q => Q_out);
END_FUNCTION_BLOCK
Интервальный таймер (SYS.CLOCK)
Интервальный таймер (SYS.CLOCK) используется для формирования импульса включения выхода Q по часам реального времени. Время включения Ton и отключения Тoff выхода устанавливают в качестве параметров таймера.
Обозначение | Тип данных | Описание |
---|---|---|
Входы | ||
Ton | DT | Время включения |
Toff | DT | Время выключения |
Mask | UDINT | Выбор используемых величин |
Выходы | ||
Q | BOOL | Выход таймера |
Указание переменной Mask необязательно.
Если значение переменной Mask не указано, то по умолчанию блок работает с маской Mask = 63 (0b111111),
Где:
Mask = 63 (0b111111)
0 бит – если 1, то используются секунды
1 бит – если 1, то используются минуты
2 бит – если 1, то используются часы
3 бит – если 1, то используются дни
4 бит – если 1, то используются месяцы
5 бит – если 1, то используются годы
FUNCTION_BLOCK CLOCK_timer //имя функционального блока
VAR_INPUT //объявление входных переменных
I_in : BOOL;
END_VAR
VAR_OUTPUT //объявление выходных переменных
Q_out : BOOL;
END_VAR
VAR
CLOCK_1: SYS.CLOCK;
END_VAR
//область кода
CLOCK_1(Ton := DT#2023-09-28-7:20:55, Toff := DT#2023-09-28-12:30:59);
Q_out := CLOCK_1.Q;
END_FUNCTION_BLOCK
Интервальный таймер с недельным циклом (SYS.CLOCKWEEK)
Интервальный таймер с недельным циклом (SYS.CLOCKWEEK) используется для формирования импульса включения выхода Q по часам реального времени с учетом дней недели. Время включения Ton и отключения Toff выхода Q и дни недели работы устанавливают в качестве параметров таймера.
Обозначение | Тип данных | Описание |
---|---|---|
Входы | ||
Ton | DT | Время включения |
Toff | DT | Время выключения |
DayOfWeekMask | UDINT | Выбор используемых дней |
DateTimeMask | UDINT | Выбор используемых величин |
Выходы | ||
Q | BOOL | Выход таймера |
Указание переменных DayOfWeekMask и DateTimeMask необязательно.
Если значение переменной DayOfWeekMask не указано, то по умолчанию блок работает с маской DayOfWeekMask = 63 (0b111111),
Если значение переменной DateTimeMask не указано, то по умолчанию блок работает с маской DayOfWeekMask = 127(0b1111111),
Где:
DayOfWeekMask = 127 (0b1111111)
0 бит – если 1, то учитываются понедельники
1 бит – если 1, то учитываются вторники
2 бит – если 1, то учитываются среды
3 бит – если 1, то учитываются четверги
4 бит – если 1, то учитываются пятницы
5 бит – если 1, то учитываются субботы
6 бит – если 1, то учитываются воскресенья
DayOfWeekMask = 63 (0b111111)
0 бит – если 1, то используются секунды
1 бит – если 1, то используются минуты
2 бит – если 1, то используются часы
3 бит – если 1, то используются дни
4 бит – если 1, то используются месяцы
5 бит – если 1, то используются годы
FUNCTION_BLOCK CLOCKWEEK_timer //имя функционального блока
VAR_INPUT //объявление входных переменных
I_in : BOOL;
END_VAR
VAR_OUTPUT //объявление выходных переменных
Q_out : BOOL;
END_VAR
VAR
CLOCKWEEK_1: SYS.CLOCKWEEK;
END_VAR
//область кода
CLOCKWEEK_1(Ton := DT#2023-09-28-7:20:55, Toff := DT#2023-09-28-12:30:59);
Q_out := CLOCKWEEK_1.Q;
END_FUNCTION_BLOCK
Генераторы
Генератор прямоугольных импульсов (SYS.BLINK)
Генератор прямоугольных импульсов (SYS.BLINK) используется для формирования прямоугольных импульсов пульсации. На выходе Q генератора формируются импульсы с заданными параметрами длительности включенного (Твкл – сигнал логической «1») и отключенного (Тоткл – сигнал логического «0») состояния на время действия управляющего сигнала на входе I (сигнал логической «1»).
Обозначение | Тип данных | Описание |
---|---|---|
Входы | ||
I | BOOL | Разрешение на работу |
Th | TIME | Длительность логической единицы |
Tl | TIME | Длительность логического нуля |
Выходы | ||
Q | BOOL | Выход генератора |
FUNCTION_BLOCK BLINK_generator //имя функционального блока
VAR_INPUT //объявление входных переменных
I_in : BOOL := FALSE;
END_VAR
VAR_OUTPUT //объявление выходных переменных
Q_out : BOOL;
END_VAR
VAR
BLINK_1: SYS.BLINK;
END_VAR
//область кода
BLINK_1(I := I_in, Th := T#1000ms, Tl := T#1000ms);
//где ms - миллисекунды, s - секунды, m - минуты, h - часы, d - дни
Q_out := BLINK_1.Q;
END_FUNCTION_BLOCK
FUNCTION_BLOCK BLINK_generator //имя функционального блока
VAR_INPUT //объявление входных переменных
I_in : BOOL := FALSE;
Th_in : UDINT := 5000;//миллисекунд
Tl_in : UDINT := 5000;//миллисекунд
END_VAR
VAR_OUTPUT //объявление выходных переменных
Q_out : BOOL;
END_VAR
VAR
BLINK_1: SYS.BLINK;
Th_time: TIME;
Tl_time: TIME;
END_VAR
//область кода
Th_time := UDINT_TO_TIME(Th_in);
Tl_time := UDINT_TO_TIME(Tl_in);
BLINK_1(I := I_in, Th := Th_time, Tl := Tl_time, Q => Q_out);
END_FUNCTION_BLOCK
Счетчики
Инкрементный счетчик с автосбросом (SYS.CT)
Инкрементный счетчик с автосбросом (SYS.CT) используется для подсчета заданного числа импульсов N (вход N – уставка числа импульсов). На выходе Q счетчика появится импульс сигнала логической «1» с длительностью рабочего цикла прибора (Tцикл), если число приходящих на вход С импульсов достигнет установленного значения N.
Обозначение | Тип данных | Описание |
---|---|---|
Входы | ||
C | BOOl | Вход счетчика |
N | UDINT | Уставка счетчика |
Выходы | ||
Q | BOOL | Сигнализация достигнутой уставки (длительность один цикл) |
FUNCTION_BLOCK CT_counter //имя функционального блока
VAR_INPUT //объявление входных переменных
C_in : BOOL;
N_in : UDINT := 10;
END_VAR
VAR_OUTPUT //объявление выходных переменных
Q_out : BOOL;
END_VAR
VAR //объявление локальных переменных
CT_1: SYS.CT;
END_VAR
//область кода
CT_1(C := C_in, N := N_in, Q => Q_out);
END_FUNCTION_BLOCK
Универсальный счетчик (SYS.CTN)
Универсальный счетчик (SYS.CTN) используется для прямого и обратного счета. Операция «прямой счет» выполняется по переднему фронту импульса на входе прямого счета U, что увеличивает значение выходного сигнала Q. Импульсы, приходящие на вход D («обратный счет»), уменьшают значение выхода Q. В случае поступления на вход R сигнала логической «1», выход счетчика Q устанавливается в значение входа N.
Обозначение | Тип данных | Описание |
---|---|---|
Входы | ||
U | BOOl | Вход для прямого счета |
D | BOOL | Вход для обратного счета |
R | BOOL | Сброс состояния выхода на значение N |
N | UDINT | Уставка |
Выходы | ||
Q | UDINT | Накопительное значение импульсов |
FUNCTION_BLOCK CTN_counter //имя функционального блока
VAR_INPUT //объявление входных переменных
U_in : BOOL;
D_in : BOOL;
R_in : BOOL;
N_in : UDINT := 10;
END_VAR
VAR_OUTPUT //объявление выходных переменных
Q_out : UDINT;
END_VAR
VAR //объявление локальных переменных
CTN_1: SYS.CTN;
END_VAR
//область кода
CTN_1(U := U_in, D := D_in, R := R_in, N := N_in, Q => Q_out);
END_FUNCTION_BLOCK
Инкрементный счетчик (SYS.CTU)
Инкрементный счетчик (SYS.CTU) используется для подсчета числа импульсов, приходящих на вход С. На выходе Q счетчика появится импульс сигнала логической «1», если число приходящих на вход импульсов достигнет установленного значения на входе N (N – уставка).
Обозначение | Тип данных | Описание |
---|---|---|
Входы | ||
U | BOOl | Вход для прямого счета |
R | BOOL | Сброс состояния счетчика в 0 |
N | UDINT | Уставка |
Выходы | ||
Q | BOOL | Сигнализация достигнутой уставки |
FUNCTION_BLOCK CTU_counter //имя функционального блока
VAR_INPUT //объявление входных переменных
C_in : BOOL;
R_in : BOOL;
N_in : UDINT := 10;
END_VAR
VAR_OUTPUT //объявление выходных переменных
Q_out : BOOL;
END_VAR
VAR //объявление локальных переменных
CTU_1: SYS.CTU;
END_VAR
//область кода
CTU_1(C := C_in, R := R_in, N := N_in, Q => Q_out);
END_FUNCTION_BLOCK