Язык программирования ST

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, которые задаются на входе этой функции.

Использование одного функционального блока в другом

Экземпляры одного функционального блока могут быть созданы в другом функциональном блоке, а именно в области объявления локальных переменных в формате:

    (краткое обозначение):(имя функционального блока)

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

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

  1. Через формальный вызов:

    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

    Примечание
    Обратите внимание на специфический оператор копирования значения из выходных переменных блока («=>»).
  2. Через обращение к входам/выходам функционального блока (объявление переменных аналогичное):

        fb1.U := xIn; //запись данных на вход ФБ     fb1 (); //вызов экземпляра функционального блока     udiQ := fb1.Q; //чтение выхода экземпляра ФБ     IF fb1.Q > 10 THEN         xAlarmMax := TRUE;     END_IF

    На выходе fb2 будет индикация превышения 10 импульсов и накопленное значение счетчика.

Предупреждение
Объявлять экземпляр функционального блока в теле функции нельзя.
Предупреждение
В функциональном блоке на ST максимальная вложенность блоков – не более 8.
Предупреждение
Функциональные блоки на ST не поддерживают переменные типа RETAIN.
Предупреждение
Функциональные блоки на ST резервируют место в памяти ПЗУ после их добавления в библиотеку проекта, независимо от того используются они в проекте или нет.

Документирование в редакторе 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

После импорта в менеджер компонентов описание функции будет представлено в соответствии с указанными тегами документировани:

Graphic

 

Пример документирования функционального блока

///<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

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

Graphic

Типы данных

Тип данных переменной определяет род информации, диапазон представлений и множество допустимых операций.

Примечание

Любую переменную можно использовать только после её объявления. Присваивать значения одной переменной другой можно, только если они одного типа. В противном случае используются преобразователи типов.

Предупреждение
Преобразование больших типов в более мелкие может привести к потере информации.

Типы данных, поддержанные в Owen Logic, перечислены в таблице ниже:

НазваниеТипВозможные значенияРазмер в байтах
BOOLЛогическийFALSE, TRUE4 байта
UDINTЦелочисленный0…42949672954 байта
REALВещественный–1,2×10-38…3,4×10384 байта
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 байта

Зарезервированные ключевые слова

ABSEND_REPEATR_EDGETASK
ACTIONEND_RESOURCEREAD_ONLYTHEN
ANDEND_STEPREAS_WRITETIME
ARRAYEND_STRUCTREALTIME_OF_DAY
ATEND_TRANSITIONREAL_TO_BOOLTO
BEGINEND_TYPEREAL_TO_UDINTTOD
BOOLEND_VARREPEATTRANSITION
BOOL_TO_REALEND_WHILERESOURCETRUE
BOOL_TO_UDINTENORETAINTYPE
BYEXITRETURNUDINT
CASEF_EDGESELUDINT_TO_BOOL
CD32FALSESHLUDINT_TO_REAL
CONFIGURATIONFORSHRUINT
CONTINUEFROMSINTULINT
DATEFUNCTIONSTEPUNTIL
DATE_AND_TIMEFUNCTION_BLOCKSTRINGUSINT
DC32GET_DATE_TIMESTRUCTVAR
DINTGET_TIMESYS.BLINKVAR_ACCESS
DOIFSYS.CLOCKVAR_CONFIG
DTINITIAL_STEPSYS.CLOCKWEEKVAR_EXTERNAL
DWORDINTSYS.COMPARE_DATE_TIMEVAR_GLOBAL
ELSELINTSYS.CTVAR_IN_OUT
ELSIFLREALSYS.CTNVAR_INPUT
ENLWORDSYS.CTUVAR_OUTPUT
ENDMODSYS.DTRIGVAR_TEMP
END_ACTIONNON_RETAINSYS.FTRIGWHILE
END_CASENOTSYS.IS_LEAP_YEARWITH
END_CONFIGURATIONOFSYS.RSWORD
END_FORONSYS.RTRIGWSTRING
END_FUNCTIONORSYS.TOFXOR
END_FUNCTION_BLOCKPOWSYS.TON
END_IFPROGRAMSYS.TP

Конструкции языка

К конструкциям языка ST относятся:

Примечание
При записи выражений допустимо использовать переменные (входные, выходные и локальные) и константы.

Операции

Арифметические операции
ОперацияКлючевое словоТипы данныхПример использования
Сложение+IN, OUT: UDINT/REALOUT := IN1 + IN2 + …
Умножение*OUT := IN1 * IN2 * …
Вычитание-OUT := IN1 - IN2
Деление/OUT := IN1 / IN2
Остаток от целочисленного деленияMODOUT := IN1 MOD IN2
Абсолютное значениеABS (IN)IN, OUT: REALOUT := ABS (IN1)
Возведение в степеньPOW (IN, N)IN – основаниеN – степеньIN, N, OUT: REALOUT := 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: UDINTOUT := DC32 (IN1)

Шифратор.

Преобразует позиционный код в двоичный код.

CD32 (IN)IN, OUT: UDINTOUT := CD32 (IN1)
Операции преобразования типов данных
ОперацияКлючевое словоТипы данныхПример использования
UDINT в REALUDINT_TO_REAL (IN)

IN: UDINT

OUT: REAL

OUT := UDINT_TO_REAL (IN)

UDINT в BOOLUDINT_TO_BOOL (IN)

IN: UDINT

OUT: BOOL

OUT := UDINT_TO_BOOL (IN)

UDINT в TIMEUDINT_TO_TIME (IN)

IN: UDINT

OUT: TIME

OUT := UDINT_TO_TIME (IN)

UDIMT в DTUDINT_TO_DT (IN)

IN: UDINT

OUT: DT

OUT := UDINT_TO_DT (IN)

REAL в UDINTREAL_TO_UDINT (IN)

IN: REAL

OUT: UDINT

OUT := REAL_TO_UDINT (IN)

REAL в BOOLREAL_TO_BOOL (IN)

IN: REAL

OUT: BOOL

OUT := REAL_TO_BOOL (IN)

BOOL в REALBOOL_TO_REAL (IN)

IN: BOOL

OUT: REAL

OUT := BOOL_TO_REAL (IN)

BOOL в UDINTBOOL_TO_UDINT (IN)

IN: BOOL

OUT: UDINT

OUT := BOOL_TO_UDINT (IN)

TIME в UDINTTIME_TO_UDINT (IN)

IN: TIME

OUT: UDINT

OUT := TIME_TO_UDINT (IN)

DT в UDINTDT_TO_UDINT (IN)

IN: DT

OUT: UDINT

OUT := DT_TO_UDINT (IN)

Логические операции
ОперацияКлючевое словоТипы данныхПример использования
Логическое отрицание «НЕ»NOTIN, OUT: BOOLOUT := NOT IN1

Конъюнкция

Логическое умножение «И»

AND

&

OUT := IN1 AND IN2

OUT := IN1 & IN2

Дизъюнкция

Логическое сложение «ИЛИ»

OROUT := IN1 OR IN2
Исключающее ИЛИXOROUT := 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 поддержаны системные функциональные блоки:

Использование системных функциональных блоков в других элементах программы аналогично использованию пользовательских функциональных блоков.

Для каждого системного функционального блока редактор предлагает подсказку по его использованию.

Graphic

Триггеры

RS-триггер с приоритетом выключения (SYS.RS)

RS-триггер с приоритетом выключения (SYS.RS) используется для переключения с фиксацией состояния во время поступления коротких импульсов на соответствующий вход. На выходе Q появится логическая «1» по фронту сигнала на входе S.

ОбозначениеТип данныхОписание
Входы
SBOOLВход SET
RBOOLВход RESET
Выходы
QBOOLВыход триггера

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.

ОбозначениеТип данныхОписание
Входы
SBOOLВход SET
RBOOLВход RESET
Выходы
QBOOLВыход триггера

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.

ОбозначениеТип данныхОписание
Входы
IBOOLВход триггера
Выходы
QBOOLВыход триггера

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.

ОбозначениеТип данныхОписание
Входы
IBOOLВход триггера
Выходы
QBOOLВыход триггера

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».

ОбозначениеТип данныхОписание
Входы
SBOOLВход SET
DBOOLВход триггера
CBOOlТактовая частота
RBOOLВход RESET
Выходы
QBOOLВыход триггера

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».

ОбозначениеТип данныхОписание
Входы
IBOOLВключение таймера
TTIMEДлительность импульса
Выходы
QBOOLВыход таймера

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 и выключится по спаду входного сигнала.

ОбозначениеТип данныхОписание
Входы
IBOOLЗапуск таймера (по переднему фронту)
TTIMEЗадержка на включение
Выходы
QBOOLВыход таймера

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.

ОбозначениеТип данныхОписание
Входы
IBOOLЗапуск таймера (по заднему фронту)
TTIMEЗадержка на включение
Выходы
QBOOLВыход таймера

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 выхода устанавливают в качестве параметров таймера.

ОбозначениеТип данныхОписание
Входы
TonDTВремя включения
ToffDTВремя выключения
MaskUDINTВыбор используемых величин
Выходы
QBOOLВыход таймера
Примечание

Указание переменной 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

Примечание
Время включения Ton и отключения Тoff выхода могут быть выбраны только в пределах одного года.
Интервальный таймер с недельным циклом (SYS.CLOCKWEEK)

Интервальный таймер с недельным циклом (SYS.CLOCKWEEK) используется для формирования импульса включения выхода Q по часам реального времени с учетом дней недели. Время включения Ton и отключения Toff выхода Q и дни недели работы устанавливают в качестве параметров таймера.

ОбозначениеТип данныхОписание
Входы
TonDTВремя включения
ToffDTВремя выключения
DayOfWeekMaskUDINTВыбор используемых дней
DateTimeMaskUDINTВыбор используемых величин
Выходы
QBOOLВыход таймера
Примечание

Указание переменных 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»).

ОбозначениеТип данныхОписание
Входы
IBOOLРазрешение на работу
ThTIMEДлительность логической единицы
TlTIMEДлительность логического нуля
Выходы
QBOOLВыход генератора

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.

ОбозначениеТип данныхОписание
Входы
CBOOlВход счетчика
NUDINTУставка счетчика
Выходы
QBOOLСигнализация достигнутой уставки (длительность один цикл)

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.

ОбозначениеТип данныхОписание
Входы
UBOOlВход для прямого счета
DBOOLВход для обратного счета
RBOOLСброс состояния выхода на значение N
NUDINTУставка
Выходы
QUDINTНакопительное значение импульсов

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 – уставка).

ОбозначениеТип данныхОписание
Входы
UBOOlВход для прямого счета
RBOOLСброс состояния счетчика в 0
NUDINTУставка
Выходы
QBOOLСигнализация достигнутой уставки

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