Библиотека Util содержит:
Мониторы аналоговых сигналов
HYSTERESIS
Функциональный блок HYSTERESIS — гистерезис.

| Имя переменной | Тип данных | Описание |
|---|---|---|
| Входные переменные | ||
| IN | INT | Входное значение |
| HIGH | INT | Верхняя граница |
| LOW | INT | Нижняя граница |
| Выходные переменные | ||
| OUT | BOOL | Выход блока |
ФБ HYSTERESIS реализует функцию гистерезиса. Выход OUT становится TRUE, если входное значение IN меньше LOW. FALSE, если входное значение IN больше HIGH.
Пример:
VAR
fbHys: HYSTERESIS;
aiValue: INT := 50; //входное аналоговое значение
alarmHys: BOOL; //результат ФБ
END_VAR
fbHys (IN := aiValue, LOW := 40, HIGH := 60);
alarmHys := fbHys.OUT; |
LIMITALARM
Функциональный блок LIMITALARM сигнализирует о нахождении входного значения в диапазоне нижней и верхней границы.
| Имя переменной | Тип данных | Описание |
|---|---|---|
| Входные переменные | ||
| IN | INT | Входное значение |
| HIGH | INT | Верхняя граница |
| LOW | INT | Нижняя граница |
| Выходные переменные | ||
| O | BOOL | Выход блока TRUE: Входное значение IN больше HIGH. FALSE: остальное |
Пример:
VAR
fbLim: LIMITALARM;
aiValue: INT; //входное значение
hiLim: INT; //верхняя граница
loLim: INT; //нижняя граница
alarmHigh: BOOL; // TRUE, если IN > HIGH (выход O)
alarmLow: BOOL; // TRUE, если IN < LOW (выход U)
inRange: BOOL; // TRUE, если значение в диапазоне (выход IL)
END_VAR
fbLim (IN := aiValue, HIGH := hiLim, LOW := loLim);
alarmHigh := fbLim.O; // превышение верхнего предела
alarmLow := fbLim.U; // ниже нижнего предела
inRange := fbLim.IL; // в пределах диапазона |
BCD преобразователи
BYTE в формате BCD содержит целые числа в диапазоне от 0 до 99. Для каждого десятичного разряда используются четыре бита. Разряд десятков хранится в битах 4–7. Таким образом, формат BCD похож на шестнадцатеричное представление, с той простой разницей, что в BCD-байте могут храниться только значения от 0 до 99, тогда как шестнадцатеричный байт принимает значения от 0 до FF.
Пример:
Целое число 51 необходимо преобразовать в формат BCD:
5 в двоичном коде — 0101, 1 в двоичном коде — 0001,в результате получается
BYTE 01010001 в BCD-коде, что соответствует значению 51 = 81. BCD_TO_INT
Функция BCD_TO_INT — преобразует один байт в формате BCD в значение типа INT.
| Имя | Тип данных | Описание |
|---|---|---|
| Входные переменные | ||
| B | BYTE | Значение в BCD-коде. Если значение не соответствует формату BCD, то выходное значение равно -1. |
| Выходные переменные | ||
| BCD_TO_INT | INT | Значение типа INT для входного параметра B |
Пример:
i := BCD_TO_INT(73); // результат 49
k := BCD_TO_INT(151); // результат 97
l := BCD_TO_INT(15); // выход: -1, так как значение не соответствует формату BCD |
INT_TO_BCD
Функция INT_TO_BCD — преобразует значение типа INT в байт в формате BCD.
| Имя | Тип данных | Описание |
|---|---|---|
| Входные переменные | ||
| I | INT | Значение типа INT. Некорректное значение (<0 или >99) приводит к возврату 255 |
| Выходные переменные | ||
| INT_TO_BCD | BYTE | Значение формата BCD для входного параметра I |
Пример:
i := INT_TO_BCD(49); // результат 73
k := INT_TO_BCD(97); // результат 151
l := INT_TO_BCD(100); // Ошибка! Выход: 255 |
Битовые/байтовые функции и ФБ
EXTRACT
Функция EXTRACT — возвращает бит с номером N значения X.
| Имя | Тип данных | Описание |
|---|---|---|
| Входные переменные | ||
| X | DWORD | Входное значение |
| N | BYTE | Номер извлекаемого бита. Отсчёт начинается с 0 |
| Выходные переменные | ||
| EXTRACT | BOOL | N-й бит значения X |
Пример:
FLAG := EXTRACT(X:=81, N:=4); // Результат: TRUE, так как 81 в двоичном виде
1010001, поэтому бит "4" равен 1
FLAG := EXTRACT(X:=33, N:=0); // Результат: TRUE, так как 33 в двоичном виде
100001, поэтому бит "0" равен 1 |
PACK
Функция PACK — упаковывает биты B0…B7 в один байт.
| Имя | Тип данных | Описание |
|---|---|---|
| Входные переменные | ||
| B0 | BOOL | Входной бит 0 |
| B1 | BOOL | Входной бит 1 |
| B2 | BOOL | Входной бит 2 |
| B3 | BOOL | Входной бит 3 |
Пример:
VAR
b0: BOOL := TRUE; // бит 0
b1: BOOL := FALSE; // бит 1
b2: BOOL := TRUE; // бит 2
b3: BOOL := FALSE; // бит 3
b4: BOOL := FALSE; // бит 4
b5: BOOL := FALSE; // бит 5
b6: BOOL := FALSE; // бит 6
b7: BOOL := TRUE; // бит 7
packed: BYTE; // упакованный байт
END_VAR
packed := PACK(B0 := b0, B1 := b1, B2 := b2, B3 := b3, B4 := b4, B5 := b5, B6 := b6,
B7 := b7); // packed = 16#85 (1000_0101)
|
PUTBIT
Функция PUTBIT — устанавливает значение указанного бита в переменной типа DWORD.
| Имя | Тип данных | Описание |
|---|---|---|
| Входные переменные | ||
| X | DWORD | Изменяемое значение |
| N | BYTE | Позиция изменяемого бита, начиная с 0 |
| B | BOOL | Значение задаваемого бита |
| Выходные переменные | ||
| PUTBIT | DWORD | Значение с изменённым битом |
Пример:
Var1 := 38; // в двоичном виде: 100110
Var2 := PUTBIT(Var1, 4, TRUE); // Результат: 54 = 2#110110
Var3 := PUTBIT(Var1, 1, FALSE); // Результат: 36 = 2#100100 |
UNPACK
Функциональный блок UNPACK — преобразует один байт в 8 бит.
| Имя | Тип данных | Описание |
|---|---|---|
| Входные переменные | ||
| B | BYTE | Входное значение |
Пример:
VAR
fbUnpack: UNPACK;
Value: BYTE := 16#85; // 1000_0101
b0, b1, b2, b3, b4, b5, b6, b7: BOOL;
END_VAR
fbUnpack(B := Value);
b0 := fbUnpack.B0; // TRUE
b1 := fbUnpack.B1; // FALSE
b7 := fbUnpack.B7; // TRUE |
Регуляторы
PD
Функциональный блок PD — PD регулятор.
| Имя переменной | Тип данных | Описание |
|---|---|---|
| Входные переменные | ||
| ACTUAL | REAL | Фактическое значение, измеренная величина |
SET_POINT | REAL | Заданное значение, уставка |
KP | REAL | Коэффициент пропорциональности P |
TV | REAL | Постоянная времени дифференцирования D [сек]. Если задана как 0, то работает как P-регулятор |
Y_MANUAL | REAL | Y устанавливается в это значение при MANUAL = TRUE |
Y_OFFSET | REAL | Смещение (offset) регулирующего воздействия |
Y_MIN | REAL | Минимальное значение регулирующего воздействия. Если ограничение не требуется, должно быть установлено в 0 |
Y_MAX | REAL | Максимальное значение регулирующего воздействия. Если ограничение не требуется, должно быть установлено в 0 |
MANUAL | BOOL | TRUE: ручной режим, Y не изменяется регулятором; FALSE: Y формируется регулятором |
RESET | BOOL | TRUE: устанавливает Y в значение Y_OFFSET |
| Выходные переменные | ||
| Y | REAL | Управляющее воздействие |
Представляет PD-регулятор.
PD-регулятор непрерывно вычисляет значение ошибки e(t) как разность между заданным значением (уставкой) и измеренной величиной. PD-регулятор формирует корректирующее воздействие на основе пропорциональной и дифференциальной составляющих (обычно обозначаемых P и D соответственно), что и определяет тип регулятора.
Параметры Y_OFFSET, Y_MIN и Y_MAX используются для преобразования регулирующего воздействия y в заданный
диапазон. MANUAL может использоваться для переключения на ручной режим, RESET — для сброса
регулятора. В нормальном режиме работы (MANUAL= FALSE и RESET = FALSE и LIMITS_ACTIVE = FALSE)
регулятор вычисляет ошибку e(t) как разность SET_POINT — ACTUAL, формирует производную по
времени
и
сохраняет эти значения внутренне.
Выход, то есть управляющее воздействие Y, вычисляется следующим образом: 
Таким образом, помимо пропорциональной составляющей (P-части), на Y влияет и текущая скорость изменения ошибки (D-часть). Дополнительно Y ограничивается диапазоном, заданным Y_MIN и Y_MAX. Если Y выходит за эти пределы, LIMITS_ACTIVE устанавливается в TRUE. Если ограничение регулирующего воздействия не требуется, то Y_MIN и Y_MAX должны быть установлены в 0. При MANUAL = TRUE в Y записывается значение Y_MANUAL. PD-регулятор можно легко преобразовать в P-регулятор, установив TV = 0.
Для получения дополнительной информации см.: PID.
Пример:
VAR
fbPD: PD;
actual: REAL := 45.0; // измеренное значение
setPoint: REAL := 50.0; // уставка
yOut: REAL; // выход регулятора
limits: BOOL; // признак ограничения
END_VAR
fbPD(
ACTUAL := actual,
SET_POINT := setPoint,
KP := 2.0,
TV := 12.0,
Y_OFFSET := 0.0,
Y_MIN := 0.0, // нижнее ограничение выхода
Y_MAX := 100.0, // верхнее ограничение выхода
MANUAL := FALSE,
RESET := FALSE
);
yOut := fbPD.Y;
limits := fbPD.LIMITS_ACTIVE; |
PID
Функциональный блок PID — ПИД-регулятор.
| Имя переменной | Тип данных | Описание |
|---|---|---|
| Входные переменные | ||
| ACTUAL | REAL | Фактическое значение, измеренная величина |
SET_POINT | REAL | Заданное значение, уставка |
KP | REAL | Коэффициент пропорциональности P |
| TN | REAL | Время интегрирования I [сек]. TN > 0, иначе регулятор не вычисляется |
TV | REAL | Постоянная времени дифференцирования D [сек]. Если задана как 0, то работает как P-регулятор |
Y_MANUAL | REAL | Y устанавливается в это значение при MANUAL = TRUE |
Y_OFFSET | REAL | Смещение (offset) регулирующего воздействия |
Y_MIN | REAL | Минимальное значение регулирующего воздействия |
Y_MAX | REAL | Максимальное значение регулирующего воздействия |
MANUAL | BOOL | TRUE: ручной режим, Y не изменяется регулятором; FALSE: Y формируется регулятором |
RESET | BOOL | TRUE: устанавливает Y в значение Y_OFFSET и сбрасывает интегральную часть |
| Выходные переменные | ||
| Y | REAL | Управляющее воздействие |
Представляет ПИД-регулятор

ПИД-регулятор непрерывно вычисляет значение ошибки e(t) как разность между заданным значением (уставкой) и измеренной технологической величиной. ПИД-регулятор формирует корректирующее воздействие на основе пропорциональной, интегральной и дифференциальной составляющих (обычно обозначаемых P, I и D соответственно), что и определяет тип регулятора.
P учитывает текущее значение ошибки. Например, если ошибка велика и положительна, выход регулятора также будет большим и положительным.
I учитывает прошлые значения ошибки. Например, если текущий выход недостаточно велик, интеграл ошибки будет накапливаться со временем, и регулятор отреагирует увеличением воздействия.
D учитывает возможные будущие тенденции ошибки на основе текущей скорости её изменения.
Поскольку PID-регулятор опирается только на измеряемую технологическую величину и не требует знания модели объекта, он широко применим. Настройкой трёх параметров модели PID-регулятор можно адаптировать под требования конкретного процесса. Реакцию регулятора можно описать через скорость отклика на ошибку, степень перерегулирования относительно уставки и выраженность колебаний системы. Использование PID-алгоритма не гарантирует оптимальное управление системой или даже её устойчивость.
Y_OFFSET, Y_MIN и Y_MAX используются для преобразования регулирующего воздействия Y в заданный диапазон. MANUAL может
использоваться для переключения на ручной режим, RESET — для повторной
инициализации регулятора. В нормальном режиме работы (MANUAL = RESET = LIMITS_ACTIVE = FALSE)
регулятор вычисляет ошибку e (t) как разность SET_POINT — ACTUAL, формирует производную по
времени
и
сохраняет эти значения внутренне.
Выход, то есть управляющее воздействие Y, в отличие от PD-регулятора содержит
дополнительную интегральную составляющую и вычисляется следующим образом: 
Таким образом, помимо пропорциональной части (P), на Y влияют и текущая скорость изменения ошибки (D), и история ошибки (I). PID-регулятор можно легко преобразовать в PI-регулятор, установив TV = 0. Из-за наличия интегральной части при некорректной параметризации возможно переполнение, если интеграл ошибки становится слишком большим. Для обеспечения безопасности предусмотрен логический выход OVERFLOW, который в этом случае принимает значение TRUE. Обычно это происходит, если система управления неустойчива из-за неверной параметризации. При этом регулятор будет остановлен и сможет быть активирован снова только после повторной инициализации.
Пример:
VAR
fbPID: PID;
actual: REAL := 45.0; // текущее значение
setPoint: REAL := 50.0; // уставка
yOut: REAL; // выход регулятора
limits: BOOL; // признак ограничения выхода
overflow: BOOL; // признак переполнения интегральной части
END_VAR
fbPID(
ACTUAL := actual,
SET_POINT := setPoint,
KP := 2.0,
TN := 10.0,
TV := 1.0,
Y_OFFSET := 0.0,
Y_MIN := 0.0,
Y_MAX := 100.0,
MANUAL := FALSE,
RESET := FALSE
);
yOut := fbPID.Y;
limits := fbPID.LIMITS_ACTIVE;
overflow := fbPID.OVERFLOW; |
PID_FIXCYCLE
Функциональный блок PID_FIXCYCLE — ПИД-регулятор, для которого время цикла можно задавать вручную.
| Имя переменной | Тип данных | Описание |
|---|---|---|
| Входные переменные | ||
| ACTUAL | REAL | Фактическое значение, измеренная величина |
SET_POINT | REAL | Заданное значение, уставка |
KP | REAL | Коэффициент пропорциональности P |
| TN | REAL | Время интегрирования I [сек]. TN > 0, иначе регулятор не вычисляется |
TV | REAL | Постоянная времени дифференцирования D [сек]. Если задана как 0, то работает как P-регулятор |
Y_MANUAL | REAL | Y устанавливается в это значение при MANUAL = TRUE |
Y_OFFSET | REAL | Смещение (offset) регулирующего воздействия |
Y_MIN | REAL | Минимальное значение регулирующего воздействия |
Y_MAX | REAL | Максимальное значение регулирующего воздействия |
MANUAL | BOOL | TRUE: ручной режим, Y не изменяется регулятором; FALSE: Y формируется регулятором |
RESET | BOOL | TRUE: устанавливает Y в значение Y_OFFSET и сбрасывает интегральную часть |
CYCLE | REAL | Время между двумя вызовами, в секундах |
| Выходные переменные | ||
| Y | REAL | Управляющее воздействие |
Представляет PID-регулятор, для которого время цикла можно задавать вручную.
PID-регулятор непрерывно вычисляет значение ошибки e(t) как разность между заданным значением (уставкой) и измеренной технологической величиной. PID-регулятор формирует корректирующее воздействие на основе пропорциональной, интегральной и дифференциальной составляющих (обычно обозначаемых P, I и D соответственно), что и определяет тип регулятора.
Для получения дополнительной информации см. PID.
Пример:
VAR
fbPID: PID_FIXCYCLE;
actual: REAL := 45.0; // текущее значение
setPoint: REAL := 50.0; // уставка
cycle: REAL := 0.01; // время цикла, с (например, 10 мс)
yOut: REAL; // выход регулятора
limits: BOOL; // признак ограничения выхода
overflow: BOOL; // признак переполнения интегральной части
END_VAR
fbPID(
ACTUAL := actual,
SET_POINT := setPoint,
KP := 2.0,
TN := 10.0,
TV := 1.0,
Y_OFFSET := 0.0,
Y_MIN := 0.0,
Y_MAX := 100.0,
MANUAL := FALSE,
RESET := FALSE,
CYCLE := cycle
);
yOut := fbPID.Y;
limits := fbPID.LIMITS_ACTIVE;
overflow := fbPID.OVERFLOW; |
Типы данных
POINT
Пользовательский тип данных POINT - это структура с двумя полями.
| Имя | Тип |
|---|---|
| X | DINT |
| Y | DINT |
POINT предназначен для хранения пары координат/значений X и Y, например, “точка” на плоскости, точка графика/характеристики и т.д.
Пример:
VAR
p: POINT; // переменная типа POINT (структура с полями X и Y)
END_VAR
p.X := 1; // записать значение в поле X
p.Y := 2; // записать значение в поле Y |
GEN_MODE
Пользовательский тип данных GEN_MODE — перечисление GEN_MODE задаёт режим (тип) генерируемого сигнала.
| Имя | Начальное значение |
|---|---|
TRIANGLE | 0 |
TRIANGLE_POS | 1 |
SAWTOOTH_RISE | 2 |
SAWTOOTH_FALL | 3 |
RECTANGLE | 4 |
| SINUS | 5 |
COSINUS | 6 |
SINE | 7 |
COSINE | 8 |
Пример:
см. GEN
Манипуляторы функций
CHARCURVE
Функциональный блок CHARCURVE — преобразование входного сигнала по характеристической кривой.
| Имя переменной | Тип данных | Описание |
|---|---|---|
| Входные переменные | ||
| IN | INT | Входной сигнал |
| N | BYTE | Количество точек, задающих характеристическую кривую: 2 <= N<= 11 |
| Входные/выходные переменные | ||
| P | ARRAY[0..10] OF POINT | Массив точек для описания характеристической кривой |
| Выходные переменные | ||
| OUT | INT | Выходная переменная, содержит преобразованное значение |
| ERR | BYTE | 0: нет ошибки; 1: ошибка в P: неверная последовательность (полностью протестировано только если IN равно наибольшему значению X в P); 2: IN вне пределов P; 4: неверное N, количество точек вне допустимого диапазона 2..11 |

Характеристическая кривая задаётся массивом POINT-ов, который содержит набор значений X и соответствующих им значений Y.
Пример:
VAR
CHARACTERISTIC_LINE: CHARCURVE;
KL: ARRAY[0..10] OF POINT := [
(X := 0, Y := 0),
(X := 250, Y := 50),
(X := 500, Y := 150),
(X := 750, Y := 400),
7((X := 1000, Y := 1000))];
COUNTER: INT;
END_VAR
COUNTER := COUNTER+10; //подает на CHARCURVE, например, постоянно растущий сигнал
CHARACTERISTIC_LINE(IN := COUNTER, N := 5, P := KL); |
RAMP_INT
Функциональный блок RAMP_INT — ограничение скорости изменения значения до заданного уровня.
| Имя переменной | Тип данных | Описание |
|---|---|---|
| Входные переменные | ||
| IN | INT | Входное значение |
ASCEND | INT | Ограничение нарастания: максимальное увеличение за интервал TIMEBASE. Пример: ASCEND := 25 и TIMEBASE := T#1s => максимальное увеличение на 25 единиц в секунду |
| DESCEND | INT | Ограничение спада: максимальное уменьшение за интервал TIMEBASE (DESCEND > 0). Пример: DESCEND := 20 и TIMEBASE := T#500ms => максимальное уменьшение на 20 единиц за 500 мс |
TIMEBASE | TIME | Опорный интервал для ASCEND/DESCEND. Если TIMEBASE = T#0s: ASCEND/DESCEND задаются на один вызов; иначе: ASCEND/DESCEND задаются на указанный интервал времени. Если TIMEBASE = T#0s, то в этом случае TIMEBASE равна времени цикла задачи. Обычно это точно соответствует одному вызову функционального блока RAMP_INT. Если TIMEBASE меньше времени цикла
задачи, это приведёт к нарушению теоремы отсчётов и может привести
к потере информации в выходном сигнале |
RESET | BOOL | Сброс функционального блока. TRUE: останавливает внутренние вычисления и повторно инициализирует функциональный блок; последнее вычисленное значение OUT сохраняется, чтобы продолжить вычисления с него при следующем запуске. FALSE: выдаёт сглаженный входной сигнал на выход OUT |
| Выходные переменные | ||
| OUT | INT | Значение с ограниченной “рампой”. Значение сохраняется внутренне и используется для расчёта нарастания и спада входного сигнала |
Ограничение скорости изменения задаётся максимальным нарастанием ASCEND и максимальным спадом DESCEND, а также временем TIMEBASE, определяющим интервал времени, к которому относятся значения ASCEND и DESCEND.

Пример:
VAR
Ramp: RAMP_INT;
InValue: INT; // входной сигнал (ступенька 0/100)
OutValue: INT; // выход RAMP_INT
Toggle: BOOL; // переключение входа
END_VAR
// Пример входного сигнала: переключение между 0 и 100
IF Toggle THEN
InValue := 100;
ELSE
InValue := 0;
END_IF;
Ramp(IN := InValue, ASCEND := 25, DESCEND := 20, TIMEBASE := T#1s, RESET := FALSE);
OutValue := Ramp.OUT; |
RAMP_REAL
Функциональный блок RAMP_REAL — ограничивает скорость изменения значения до заданного уровня.
| Имя переменной | Тип данных | Описание |
|---|---|---|
| Входные переменные | ||
| IN | REAL | Входное значение |
ASCEND | REAL | Максимальная положительная скорость изменения |
| DESCEND | REAL | Максимальная отрицательная скорость изменения. Значение не должно быть отрицательным |
TIMEBASE | TIME | Опорный интервал для ASCEND/DESCEND. Если TIMEBASE = T#0s: ASCEND/DESCEND задаются на один вызов; иначе: ASCEND/DESCEND задаются на указанный интервал времени |
RESET | BOOL | Сброс функционального блока |
| Выходные переменные | ||
| OUT | REAL | Значение с ограниченной скоростью изменения |
Функциональный блок аналогичен RAMP_INT, с той разницей, что входы IN, ASCEND, DESCEND и выход OUT имеют тип REAL. RAMP_REAL требует больше вычислительного времени, но выполняет расчёт точнее, чем RAMP_INT.
Пример:
VAR
Ramp: RAMP_REAL;
InValue: REAL; // входной сигнал (ступенька 0/100)
OutValue: REAL; // выход RAMP_REAL
Toggle: BOOL; // переключение входа
END_VAR
// Пример входного сигнала: переключение между 0 и 100
IF Toggle THEN
InValue := 100;
ELSE
InValue := 0;
END_IF;
Ramp(IN := InValue, ASCEND := 25.5, DESCEND := 20.5, TIMEBASE := T#1s,
RESET := FALSE);
OutValue := Ramp.OUT; |
Математические функции
DERIVATIVE
Функциональный блок HYSTERESIS — аппроксимация производной заданного значения по времени.
| Имя переменной | Тип данных | Описание |
|---|---|---|
| Входные переменные | ||
| IN | REAL | Входное значение |
| TM | DWORD | Время с последнего вызова, в мс |
| RESET | BOOL | TRUE: OUT устанавливается в 0, а сохранённые значения устанавливаются в текущее входное значение IN |
| Выходные переменные | ||
| OUT | REAL | Производная |
Для расчёта записываются четыре последовательных значения, чтобы итоговая производная была максимально точной.
Пример:
VAR
fbDerivative: DERIVATIVE;
rInput: REAL := 0.0; // входной сигнал
dwTime: DWORD := 100; // время между вызовами, мс (пример: 100 мс)
xReset: BOOL := FALSE; // сброс
rOut: REAL; // производная (выход)
END_VAR
// Пример изменения входного значения
rInput := rInput+ 1.0;
fbDerivative(IN := rInput, TM := dwTime, RESET := xReset);
rOut := fbDerivative.OUT; |
INTEGRAL
Функциональный блок INTEGRAL — приближённо вычисляет интеграл по времени.
| Имя переменной | Тип данных | Описание |
|---|---|---|
| Входные переменные | ||
| IN | REAL | Входное значение |
| TM | DWORD | Время с последнего вызова, в мс |
| RESET | BOOL | TRUE: OUT устанавливается в 0, а OVERFLOW — в FALSE |
| Выходные переменные | ||
| OUT | REAL | Значение интеграла. Вычисляется суммированием частичных интегралов IN * TM |
OVERFLOW | BOOL | TRUE: значение OUT вышло за диапазон переменных типа REAL; функциональный блок заблокирован до повторной инициализации входом RESET |
Для расчёта записываются четыре последовательных значения, чтобы итоговая производная была максимально точной.
Пример:
VAR
integral_inst: INTEGRAL;
rInput: REAL := 1.0; // входное значение (например, постоянный сигнал)
dwTime: DWORD := 100; // время между вызовами, мс (пример: 100 мс)
xReset: BOOL := FALSE; // сброс интегратора
rOut: REAL; // значение интеграла
xOverflow: BOOL; // признак переполнения
END_VAR
integral_inst(IN := rInput, TM := dwTime, RESET := xReset);
rOut := integral_inst.OUT;
xOverflow := integral_inst.OVERFLOW; |
LIN_TRAFO
Функциональный блок LIN_TRAFO — выполняет линейное преобразование.
| Имя переменной | Тип данных | Описание |
|---|---|---|
| Входные переменные | ||
| IN | REAL | Входное значение |
| IN_MIN | REAL | Минимальное входное значение |
| IN_MAX | REAL | Максимальное входное значение |
| OUT_MIN | REAL | Соответствующее минимальное выходное значение |
| OUT_MAX | REAL | Соответствующее максимальное выходное значение |
| Выходные переменные | ||
| OUT | REAL | Выходное значение |
ERROR | BOOL | TRUE: IN_MIN = IN_MAX или IN вне диапазона входных значений |
Преобразование выполняется с использованием минимального и максимального значений входа для линейной аппроксимации выходного значения.
Пример применения: Датчик температуры выдаёт значения напряжения унифицированного сигнала 0...10 В (вход IN). Эти значения необходимо преобразовать в температуру в градусах Цельсия (выход OUT). Диапазон входных значений (В) задаётся пределами IN_MIN = 0 и IN_MAX = 10. Диапазон выходных значений (°C) задаётся пределами OUT_MIN = -20 и OUT_MAX = 40. Таким образом, при входном значении 5 В на выходе получится температура 10 °C.
Пример:
VAR
fbLinTrafo: LIN_TRAFO;
rVolt: REAL := 5.0; // Напряжение с датчика (В)
rTemp: REAL; // Температура (°C)
xError: BOOL; // признак ошибки
END_VAR
fbLinTrafo(IN := rVolt, IN_MIN := 0.0, IN_MAX := 10.0, OUT_MIN := -20.0,
OUT_MAX := 40.0);
rTemp := fbLinTrafo.OUT;
xError := fbLinTrafo.ERROR; |
STATISTICS_INT
Функциональный блок STATISTICS_INT — вычисляет минимальное, максимальное и среднее значение входного сигнала типа данных INT.
| Имя переменной | Тип данных | Описание |
|---|---|---|
| Входные переменные | ||
| IN | INT | Входное значение |
| RESET | BOOL | TRUE: AVG устанавливается в 0, MN и MX - в минимально и максимально возможные значения типа INT |
| Выходные переменные | ||
| MN | INT | Минимальное значение |
MX | INT | Максимальное значение |
| AVG | INT | Среднее значение |
Расчёт выполняется во времени и может быть сброшен, чтобы начать новое вычисление/статистику.
Пример:
VAR
fbStat: STATISTICS_INT;
iValue: INT := 0; // входное значение
xReset: BOOL := FALSE; // сброс статистики
iMin: INT; // минимум
iMax: INT; // максимум
iAvg: INT; // среднее
END_VAR
fbStat(IN := iValue, RESET := xReset);
iMin := fbStat.MN
iMax := fbStat.MX
iAvg := fbStat.AVG |
STATISTICS_REAL
Функциональный блок STATISTICS_REAL — вычисляет минимальное, максимальное и среднее значение входного сигнала типа данных REAL.
| Имя переменной | Тип данных | Описание |
|---|---|---|
| Входные переменные | ||
| IN | REAL | Входное значение |
| RESET | BOOL | TRUE: AVG устанавливается в 0, MN и MX - в минимально и максимально возможные значения типа REAL |
| Выходные переменные | ||
| MN | REAL | Минимальное значение |
MX | REAL | Максимальное значение |
| AVG | REAL | Среднее значение |
Расчёт выполняется во времени и может быть сброшен, чтобы начать новое вычисление/статистику.
Пример:
VAR
fbStat: STATISTICS_REAL;
iValue: REAL := 0; // входное значение
xReset: BOOL := FALSE; // сброс статистики
iMin: REAL; // минимум
iMax: REAL; // максимум
iAvg: REAL; // среднее
END_VAR
fbStat(IN := iValue, RESET := xReset);
iMin := fbStat.MN
iMax := fbStat.MX
iAvg := fbStat.AVG |
VARIANCE
Функциональный блок VARIANCE — вычисляет математическую дисперсию переменной во времени.*
| Имя переменной | Тип данных | Описание |
|---|---|---|
| Входные переменные | ||
| IN | REAL | Входное значение |
| RESET | BOOL | Сброс |
| Выходные переменные | ||
| MN | OUT | Дисперсия |
*Под «во времени» здесь понимается, что при каждом вызове функционального блока значение дисперсии дополняется (накапливается) до тех пор, пока не будет выполнен сброс.
Пример:
VAR
fbVariance: VARIANCE;
rValue: REAL := 10.0; // входное значение
xReset: BOOL := FALSE; // сброс расчета
rVar: REAL; // дисперсия
END_VAR
fbVariance(IN := rValue, RESET := xReset);
rVar := fbVariance.OUT;
|
Сигналы
BLINK
Функциональный блок BLINK — генерирует "мигающий" сигнал (включение и выключение с заданной длительностью).
| Имя переменной | Тип данных | Описание |
|---|---|---|
| Входные переменные | ||
ENABLE | BOOL | TRUE: начать мигание FALSE: остановить мигание, при этом OUT сохраняет своё значение |
TIMELOW | TIME | Время, в течение которого OUT = FALSE |
TIMEHIGH | TIME | Время, в течение которого OUT = TRUE |
| Выходные переменные | ||
| OUT | BOOL | Выходной сигнал, начинается с FALSE и переключается между TRUE и FALSE с заданной периодичностью. |
Пример:
VAR
fbBlink: BLINK;
xEnable: BOOL := TRUE; // разрешить переключение
tLow: TIME := T#500ms; // время OUT = FALSE
tHigh: TIME := T#500ms; // время OUT = TRUE
xOut: BOOL; // входной сигнал
END_VAR
fbBlink(ENABLE := xEnable, TIMELOW := tLow, TIMEHIGH := tHigh);
xOut := fbBlink.OUT;
|
FREQ_MEASURE
Функциональный блок FREQ_MEASURE — измерение частоты сигнала.
| Имя переменной | Тип данных | Описание |
|---|---|---|
| Входные переменные | ||
IN | BOOL | Входной сигнал |
PERIODS | INT (1..10) | Период - это время между двумя нарастающими фронтами входного сигнала. OUT равен средней частоте за заданное число периодов PERIODS (количество периодов: минимум 1, максимум 10). Функциональный блок работает только если значение находится в диапазоне 1..10 |
RESET | BOOL | Сброс измерения |
| Выходные переменные | ||
| OUT | REAL | Частота [Гц] |
VALID | BOOL | FALSE: пока не завершено первое измерение; или если временной интервал между двумя фронтами > 3 * OUT (указывает на некорректный входной сигнал) |
Пример:
VAR
fbFreq: FREQ_MEASURE;
xDI: BOOL; // дискретный вход (например, датчик импульсов)
iPeriods: INT := 5; // усреднение по 5 периодам (1..10)
xReset: BOOL := FALSE; // сброс измерения
rFreqHz: REAL; // измеренная частота, Гц
xValid: BOOL; // признак валидности измерения
END_VAR
fbFreq(IN := xDI, PERIODS := iPeriods, RESET := xReset);
rFreqHz := fbFreq.OUT;
xValid := fbFreq.VALID; |
GEN
Функциональный блок GEN — генерирует периодические функции заданных типов.
| Имя переменной | Тип данных | Описание |
|---|---|---|
| Входные переменные | ||
MODE | GEN_MODE | Доступные типы:
|
BASE | BOOL | FALSE: период задаётся по количеству вызовов (CYCLES); TRUE: период задаётся по времени (PERIOD) |
PERIOD | TIME | Время периода; используется только при BASE = TRUE |
CYCLES | INT | Количество вызовов на период; используется только при BASE = TRUE |
AMPLITUDE | INT | Амплитуда генерируемой функции |
RESET | BOOL | TRUE: устанавливает OUT в 0 |
| Выходные переменные | ||
| OUT | INT | Сгенерированное значение функции |
Генерация может выполняться относительно заданной временной базы или относительно количества вызовов (BASE). Пример доступных типов периодических функций приведён на изображении.

Пример:
Генерация прямоугольного сигнала заданной частоты и амплитуды
VAR
fbGen: GEN;
rFreqHz: REAL := 2.0; // требуемая частота, Гц
tPeriod: TIME; // период сигнала
iAmplitude: INT := 100; // амплитуда (выход будет -100/+100)
iOut: INT; // сгенерированное значение
END_VAR
// Период = 1/частота
tPeriod := REAL_TO_TIME(1.0 / rFreqHz * 1000.0); // мс
// Прямоугольный сигнал по временной базе
fbGen(MODE := RECTANGLE, BASE := TRUE, PERIOD := tPeriod, CYCLES := 0,
AMPLITUDE := iAmplitude, RESET := FALSE);
iOut := fbGen.OUT;
|
Версия библиотеки Util
Version_Util
Функция Version_Util позволяет в программе просмотреть версию библиотеки Util.
Пример:
VAR
wVersion: WORD;
END_VAR
wVersion := Version_Util();
|