Арифметические функции
F_LIN
Тип модуля: функция | Переменная | Тип | Описание |
|---|---|---|---|
Входы | X | REAL | Аргумент |
A | REAL | Угловой коэффициент | |
B | REAL | Коэффициент сдвига | |
Выходы | F_LIN | REAL | Значение линейной функции |
Функция F_LIN возвращает для аргумента X значение линейной функции, вычисленное по формуле
F_LIN(X)=A ∙ X + B
Пример
VAR
X : REAL := 2.0; (* аргумент *)
A : REAL := 1.5; (* угловой коэффициент *)
B : REAL := -3.0; (* коэффициент сдвига *)
Y : REAL; (* результат *)
END_VAR
(* F_LIN(X) = A * X + B = 1.5 * 2.0 - 3.0 = 0.0 *)
Y := OSCAT_BASIC.F_LIN(X := X, A := A, B := B);
END_PROGRAM
|
F_LIN2
Тип модуля: функция | Переменная | Тип | Описание |
|---|---|---|---|
Входы | X | REAL | Аргумент |
X1 | REAL | Координата X для точки 1 | |
Y1 | REAL | Координата Y для точки 1 | |
X2 | REAL | Координата X для точки 2 | |
Y2 | REAL | Координата Y для точки 2 | |
Выходы | F_LIN2 | REAL | Линейно интерполированное значение Y для X |
Функция F_LIN2 возвращает для точки с координатой X результат линейной интерполяции координаты Y между узловыми точками (X1, Y1) и (X2, Y2). Если значение X не входит в диапазон (Х1...Х2), то значение Y (F_LIN2) экстраполируется.
Пример
VAR
X : REAL := 5.0; (* точка, для которой ищем Y *)
X1 : REAL := 0.0;
Y1 : REAL := 0.0;
X2 : REAL := 10.0;
Y2 : REAL := 100.0;
Y : REAL; (* результат *)
END_VAR
(* Линейная интерполяция между (0,0) и (10,100):
при X = 5 получаем Y = 50 *)
Y := OSCAT_BASIC.F_LIN2(X := X, X1 := X1, Y1 := Y1, X2 := X2, Y2 := Y2);
END_PROGRAM
|
F_POLY
Тип модуля: функция | Переменная | Тип | Описание |
|---|---|---|---|
Входы | X | REAL | Аргумент |
C | ARRAY [0..7] OF REAL | Коэффициенты полинома | |
Выходы | F_POLY | REAL | Значение полинома 7-ой степени |
Функция F_POLY возвращает значение полинома 7-ой степени с коэффициентами С (где С – массив из 8-ми значений) для аргумента X, вычисленное по формуле

Пример
VAR
X : REAL := 1.5;
C : ARRAY [0..7] OF REAL := [1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 3.0, 3.0];
Y : REAL;
END_VAR
(* Полином:
Y = C0 + C1*X + C2*X^2 + C3*X^3 + C4*X^4 + C5*X^5 + C6*X^6 + C7*X^7
При X = 1.5 и C = [1,1,1,1,2,2,3,3]:
Y = 1 + 1.5 + 2.25 + 3.375 + 2*5.0625 + 2*7.59375 + 3*11.390625 + 3*17.0859375
= 118.0078125
*)
Y := OSCAT_BASIC.F_POLY(X := X, C := C);
END_PROGRAM
|
F_POWER
Тип модуля: функция | Переменная | Тип | Описание |
|---|---|---|---|
Входы | a | REAL | Коэффициент |
X | REAL | Аргумент | |
n | REAL | Показатель степени | |
Выходы | F_POWER | REAL | Значение степенной функции |
Функция F_POWER возвращает для аргумента X значение степенной функции, вычисленное по формуле
F_POWER(X)=a ∙ X^n
Пример
VAR
a : REAL := 2.0;
x : REAL := 3.0;
n : REAL := 4.0;
y : REAL;
END_VAR
y := OSCAT_BASIC.F_POWER(a := a, X := x, n := n); (* y = 2 * 3^4 = 162 *)
END_PROGRAM
|
F_QUAD
Тип модуля: функция | Переменная | Тип | Описание |
|---|---|---|---|
Входы | X | REAL | Аргумент |
A | REAL | Коэффициент | |
B | REAL | Коэффициент | |
C | REAL | Коэффициент | |
Выходы | F_QUAD | REAL | Значение квадратичной функции |
Функция F_QUAD возвращает для аргумента X значение квадратичной функции, вычисленное по формуле
F_QUAD(X)=A ∙ X^2 + B ∙ X + С
Пример
VAR
x : REAL := 2.0;
a : REAL := 3.0;
b : REAL := -4.0;
c : REAL := 1.0;
y : REAL;
END_VAR
y := OSCAT_BASIC.F_QUAD(X := x, A := a, B := b, C := c);
(* y = 3*2^2 + (-4)*2 + 1 = 5 *)
END_PROGRAM
|
FRMP_B
Тип модуля: функция | Переменная | Тип | Описание |
|---|---|---|---|
Входы | START | BYTE | Начальное значение |
DIR | BOOL | Направление изменения выхода | |
TD | TIME | Прошедшее время | |
TR | TIME | Полное время генерации (от 0 до 255) | |
Выходы | FRMP_B | BYTE | Выход блока |
Функция FRMP_B используется для реализации генератора линейной функции. Пока функция находится в работе, значение ее выхода линейно изменяется от текущего (START) до максимального (при DIR=TRUE) или минимального (при DIR=FALSE). Минимальное и максимальное значения определяются диапазоном типа BYTE и соответственно составляют 0 и 255. Вход TR определяет полное время генерации (от 0 до 255 секунд), а вход TD – время, прошедшее с начала работы функции. Таким образом, значение входа TD должно увеличиваться во время работы функции для изменения ее выхода.
См. также генератор _RMP_B, построенный на базе данной функции.
Пример
VAR
start : BYTE := 100; (* стартовое значение *)
dirUp : BOOL := TRUE; (* TRUE: к 255, FALSE: к 0 *)
td : TIME := T#0s; (* прошедшее время *)
tr : TIME := T#10s; (* полное время генерации *)
y : BYTE;
END_VAR
(* Пример: эмуляция прошедшего времени *)
td := T#4s;
y := OSCAT_BASIC.FRMP_B(START := start, DIR := dirUp, TD := td, TR := tr);
(* При START=100, DIR=TRUE, TR=10s и TD=4s:
y ≈ 100 + (255-100)*4/10 = 162 *)
END_PROGRAM
|
FT_AVG
Тип модуля: ФБ | Переменная | Тип | Описание |
|---|---|---|---|
Входы | IN | REAL | Контролируемое значение |
E | BOOL | Сигнал управления блоком | |
N | N | Число точек усреднения сигнала (0…32) | |
RST | BOOL | Сигнал сброса блока | |
Выходы | FT_AVG | REAL | Значение скользящей средней |
Функциональный блок FT_AVG представляет собой фильтр скользящей средней. Если вход E имеет значение TRUE, то блок находится в работе, и на выход AVG подается значение входа IN, усредненное за последние N циклов ПЛК (K – номер текущего цикла ПЛК):

Если N=0, то AVG=IN. По переднему фронту на входе RST данные блока обнуляются, и усреднение начинается заново.

FT_MIN_MAX
Тип модуля: ФБ | Переменная | Тип | Описание |
|---|---|---|---|
Входы | IN | REAL | Контролируемое значение |
RST | BOOL | Сигнал сброса блока | |
Выходы | MX | REAL | Максимальное значение |
MN | REAL | Минимальное значение |
Функциональный блок FT_MIN_MAX собирает статистику о входе IN, сохраняя его максимальное и минимальное значение на выходах MX и MN. По переднему фронту на входе RST значения выходов обнуляются, после чего сбор статистики начинается заново.
FT_RMP
Тип модуля: ФБ | Переменная | Тип | Описание |
|---|---|---|---|
Входы | Rmp | BOOL | Сигнал управления блоком |
IN | REAL | Контролируемый сигнал | |
KR | REAL | Допустимая скорость нарастания, ед/с | |
KF | REAL | Допустимая скорость спада, ед/с | |
Выходы | out | REAL | Сглаженное значение сигнала |
busy | BOOL | Флаг «блок в работе» | |
UD | BOOL | Направление изменения сигнала |
Функциональный блок FT_RMP используется для сглаживания сигналов. Пока вход Rmp имеет значение TRUE блок находится в работе и значение выхода out следует за значением входа IN, при этом допустимая максимальная скорость увеличения значения на выходе (в ед./c) определяется входом KR, а допустимая максимальная скорость уменьшения – входом KF. Выход busy имеет значение TRUE, пока происходит изменение выхода out. Выход UD имеет значение TRUE, если значение выхода out увеличивается, и FALSE – если уменьшается. Величина изменения выхода out зависит от времени цикла ПЛК; см. также блоки RMP_B и RMP_W с фиксированной величиной изменения выходов.

LINEAR_INT
Тип модуля: функция | Переменная | Тип | Описание |
|---|---|---|---|
Входы | X | REAL | Аргумент |
XY | ARRAY [1..20, 0..1] OF REAL | Таблица узловых точек | |
Pts | INT | Число используемых узловых точек (3..20) | |
Выходы | LINEAR_INT | REAL | Линейно интерполированное значение Y для X |
Функция LINEAR_INT выполняет для значения X кусочно-линейную интерполяцию по зависимости, определяемой таблицей узловых точек XY. Значения X в таблице должны быть отсортированы по возрастанию. Вход Pts определяет число используемых для интерполяции узловых точек и может принимать значение в диапазоне [3…20]. Если значение X не входит в диапазон таблицы, то значение Y (LINEAR_INT) экстраполируется.
См. график в разделе POLYNOM_INT
Пример
VAR (* Таблица узловых точек: [номер_точки, 0 для X, 1 для Y] *)
XY_Table : ARRAY [1..20, 0..1] OF REAL := [
0.0, 0.0, (* Точка 1: X=0.0, Y=0.0 *)
1.0, 2.0, (* Точка 2: X=1.0, Y=2.0 *)
2.0, 4.0, (* Точка 3: X=2.0, Y=4.0 *)
3.0, 8.0, (* Точка 4: X=3.0, Y=8.0 *)
4.0, 16.0, (* Точка 5: X=4.0, Y=16.0 *)
5.0, 32.0 (* Точка 6: X=5.0, Y=32.0 *)
];
InputX : REAL := 1.5; (* Аргумент для интерполяции *)
Pts : INT := 6; (* Количество используемых точек *)
ResultY: REAL; (* Результат интерполяции *)
END_VAR
(* Вызов функции интерполяции из библиотеки OSCAT_BASIC *)
ResultY := OSCAT_BASIC.LINEAR_INT(X := InputX, XY := XY_Table, Pts := Pts);
(* После выполнения:
ResultY будет равен 3.0, так как X=1.5 находится посередине
между точками 1.0 (Y=2.0) и 2.0 (Y=4.0).
*)
END_PROGRAM
|
POLYNOM_INT
Тип модуля: функция | Переменная | Тип | Описание |
|---|---|---|---|
Входы | X | REAL | Аргумент |
XY | ARRAY [1..5, 0..1] OF REAL | Таблица узловых точек | |
Pts | INT | Число используемых узловых точек (3..5) | |
Выходы | POLYNOM_INT | REAL | Полиномиально интерполированное значение Y для X |
Функция POLYNOM_INT выполняет для значения X полиномиальную интерполяцию по зависимости, определяемой таблицей узловых точек XY. Значения X в таблице должны быть отсортированы по возрастанию. Вход Pts определяет число используемых для интерполяции узловых точек и может принимать значение в диапазоне [3…5]. Если значение X не входит в диапазон таблицы, то значение Y (POLYNOM_INT) экстраполируется.
Пример
VAR (* Таблица узловых точек: [номер_точки, 0 для X, 1 для Y] *)
XY_Table : ARRAY [1..5, 0..1] OF REAL := [
0.0, 1.0, (* Точка 1: X=0.0, Y=1.0 *)
1.0, 2.0, (* Точка 2: X=1.0, Y=2.0 *)
2.0, 5.0, (* Точка 3: X=2.0, Y=5.0 *)
3.0, 10.0, (* Точка 4: X=3.0, Y=10.0 *)
4.0, 17.0 (* Точка 5: X=4.0, Y=17.0 *)
];
InputX : REAL := 2.5; (* Аргумент для интерполяции *)
Pts : INT := 5; (* Количество используемых точек (3..5) *)
ResultY: REAL; (* Результат интерполяции *)
END_VAR
(* Вызов функции полиномиальной интерполяции *)
ResultY := OSCAT_BASIC.POLYNOM_INT(X := InputX, XY := XY_Table, Pts := Pts);
(*
Результат:
При X=2.5 и 5 точках, полиномиальная интерполяция даст значение,
которое точно проходит через все заданные точки.
Для данных точек функция соответствует полиному Y = X^2 + 1
При X=2.5: Y = 6.25 + 1 = 7.25
*)
END_PROGRAM |