Если уже получены 4 регистра с данными, то просто взять и вычислить значения в формате REAL в соответствии с представлением чисел с плавающей точкой в стандарте IEEE 754
Делается на раз-два.
По стандарту IEEE 754
представление числа с плавающей точкой
Для числа двойной точности (double-precision) 64 бита
Код:
PROGRAM PLC_PRG
VAR
D_VAL: ARRAY [0..3] OF WORD:= 16#C05E, 16#DD2F, 16#1A9F, 16#BE77; (* 4 регистра LREAL = -123.456
онлайн тест http://www.binaryconvert.com/result_double.html?decimal=045049050051046052053054*)
Sign: BOOL; (*Знак числа*)
_2E: REAL; (*Смещенная экспонента*)
M: DWORD;
fM: REAL; (*остаток мантиссы двоичного нормализованного числа*)
fVAL: REAL; (*РЕЗУЛЬТАТ преобразования*)
END_VAR
(*ПРЕОБРАЗОВАНИЕ ЧИСЛА ДВОЙНОЙ ТОЧНОСТИ С ПЛАВАЮЩЕЙ ТОЧКОЙ В ЧИСЛО С ОДИНАРНОЙ ТОЧНОСТЬЮ*)
(* ФОРМУЛА для числа сплавающей точкой в стандарте IEEE 754
(-1)*S * 2E * 1.f
где
S - знак числа
2E - смещенная экспонента
1.f - мантисса – вещественное число без знака;
1 – целая часть мантиссы (неявно присутствующая);
f – дробная часть мантиссы;
*)
Sign:= D_VAL[0].15;
_2E:= EXPT(2, (SHR((D_VAL[0] AND 16#7FFF),4) - 1023));
M:= D_VAL[1] * 16#10000 + D_VAL[2];
M:= SHR(M,4) OR (SHL(D_VAL[0],12) * 16#10000);
M:= M /2;
fM:=DWORD_TO_REAL(M)/16#80000000;
(*Теперь по формуле*)
fVAL:=SEL(Sign, 1, -1) * _2E * (1 + fM);
Графическое представление "нового" формата, с потерей точности
формула F = (-1)S * 2(E-1023) * (1 + M / 232)
Пришлось ограничится 3 исходными регистрами, в первом - 12 бит экспонента + бит знака, а т.к. в расчетах используются переменные DWORD, то от мантиссы останется только 2 регистра.
Проверок на выход исходного числа за диапазон REAL -3.4028E+38 - 3.4028E+38 не делал. Показал только принцип преобразования.
Результат преобразования числа -123,456 --> 0xC05EDD2F1A9FBE77 http://www.binaryconvert.com/result_...51046052053054
Захват-1.png