В соответствии со стандартом МЭК 61131-3 числа с плавающей точкой хранятся в ПЛК в виде переменных типа REAL. Переменные типа REAL соответствуют числам одинарной точности стандарта IEEE 754 и занимают 32 бита. Они обеспечивают точность в 7-8 десятичных цифр в диапазоне от 10-39 до 1038. Для большинства задач этого оказывается достаточно, но в отдельных ситуациях может потребоваться повышенная точность вычислений. МЭК 61131-3 предусматривает тип LREAL, переменные которого занимают 64 бита и соответствуют числам двойной точности стандарта IEEE 754, но поддержка данного типа реализована не на всех ПЛК. Для подобных случаев библиотека OSCAT предоставляет тип данных REAL2, эмулирующий поддержку чисел двойной точности. REAL2 представляет собой структуру из двух переменных типа REAL, одна из которых – RX – содержит «грубую» часть значения (в нее входит целая часть и 7-8 знаков после запятой), а вторая – R1 – «точную» (содержит оставшиеся знаки после запятой). При этом каждая операция над подобной структурой может привести к потере точности. В данной главе описаны функции, которые применяются для работы с этой структурой.
R2_ABS
Функция R2_ABC возвращает модуль числа двойной точности X типа REAL2.
Пример
VAR
x : OSCAT_BASIC.REAL2; (* исходное значение REAL2 *)
x_abs : OSCAT_BASIC.REAL2; (* модуль x *)
END_VAR
(* Пример задания отрицательного значения*)
x.RX := -12.345678; (* «грубая» часть *)
x.R1 := -0.000000009876; (* «точная» часть *)
(* Вызов функции модуля *)
x_abs := OSCAT_BASIC.R2_ABS(x); (* «грубая» часть = 12.345678,
«точная» часть = 0.000000009876 *)
END_PROGRAM |
R2_ADD
Функция R2_ADD возвращает сумму числа двойной точности X типа REAL2 и значения Y типа REAL.
Пример
VAR
X : OSCAT_BASIC.REAL2; (* число двойной точности *)
Y : REAL; (* слагаемое REAL *)
S : OSCAT_BASIC.REAL2; (* результат: X + Y *)
END_VAR
(* Пример: X = 1000.123456789 *)
X.RX := 1000.123456; (* «грубая» часть *)
X.R1 := 0.000000789; (* «точная» часть *)
Y := 2.5;
S := OSCAT_BASIC.R2_ADD(X := X, Y := Y); (* Сумма X и Y = 1002.623456789 *)
END_PROGRAM |
R2_ADD2
Функция R2_ADD2 возвращает сумму чисел двойной точности X и Y типа REAL2.
Пример
VAR
X : OSCAT_BASIC.REAL2; (* первое слагаемое *)
Y : OSCAT_BASIC.REAL2; (* второе слагаемое *)
S : OSCAT_BASIC.REAL2; (* результат: X + Y *)
END_VAR
(* X = 1000.123456789 *)
X.RX := 1000.123456; (* «грубая» часть *)
X.R1 := 0.000000789; (* «точная» часть *)
(* Y = 2.500000111 *)
Y.RX := 2.5; (* «грубая» часть *)
Y.R1 := 0.000000111; (* «точная» часть *)
S := OSCAT_BASIC.R2_ADD2(X := X, Y := Y); (* Сумма X и Y = 1002.623456900 *)
END_PROGRAM |
R2_MUL
Функция R2_MUL возвращает произведение числа двойной точности X типа REAL2 и значения Y типа REAL.
Пример
VAR
X : OSCAT_BASIC.REAL2; (* первый множитель *)
Y : REAL; (* второй множитель *)
S : OSCAT_BASIC.REAL2; (* результат: X * Y *)
END_VAR
(* Пример: X = 12.345678901 *)
X.RX := 12.345678; (* «грубая» часть *)
X.R1 := 0.000000901; (* «точная» часть *)
Y := 3.0;
S := OSCAT_BASIC.R2_MUL(X := X, Y := Y); (* Произведение X и Y = 37.037036703 *)
END_PROGRAM |
R2_SET
Тип модуля: функция | Переменная | Тип | Описание |
|---|---|---|---|
Входы | X | REAL | Входное значение |
Выходы | R2_SET | Выходное значение |
Функция R2_SET присваивает значение входной переменной X типа REAL выходной переменной двойной точности R2_SET типа REAL2.
Пример
VAR
X : REAL := 123.456;
R2 : OSCAT_BASIC.REAL2; (* результат преобразования REAL -> REAL2 *)
END_VAR
(* Присвоить значение REAL переменной типа REAL2 *)
R2 := OSCAT_BASIC.R2_SET(X := X);
(* После преобразования:
R2.RX = 123.456
R2.R1 = 0.0
*)
END_PROGRAM |