PDA

Просмотр полной версии : Прочитать по RS-485 число типа Double



Карбофос
23.11.2019, 22:01
Здравствуйте!

Нужно опросить устройство по модбасу, имеющее регистр типа DOUBLE. Напрямую это, насколько мне известно, невозможно. Но может быть можно считать 4 WORD'а или 2 DWORD'а, пошаманить с битами и слепить из них как-нибудь значение типа REAL, хотя бы с потерей точности? ПЛК110.

melky
24.11.2019, 07:14
Считать вордамм 4 регистра, потом LReal, в 110-м вроде должен быть этот тип

Карбофос
24.11.2019, 11:09
Считать вордамм 4 регистра, потом LReal, в 110-м вроде должен быть этот тип

Нету(. Или его можно библиотеками добавить?

45780

petera
24.11.2019, 15:01
Если уже получены 4 регистра с данными, то просто взять и вычислить значения в формате REAL в соответствии с представлением чисел с плавающей точкой в стандарте IEEE 754
Делается на раз-два.

По стандарту IEEE 754
представление числа с плавающей точкой
https://www.softelectro.ru/ieee754_1.gif

Для числа двойной точности (double-precision) 64 бита
https://www.softelectro.ru/ieee754_3.gif


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=04504905005104605205305 4*)
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);

Графическое представление "нового" формата, с потерей точности
https://owen.ru/forum/attachment.php?attachmentid=45783&d=1574610120 формула 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_double.html?decimal=04504905005104605205305 4
45781

melky
25.11.2019, 08:54
в CodeSys надо зайти в настройки конфигурации ПЛК, насколько помню по умолчанию выключено. Просто в ПЛК100 этого формата отродясь нет. а в ПЛК110 вроде должен быть. Ну и как его там использовать не в курсе.
Хотя в руках ПЛК110 не держал, может и в нем нет.

Карбофос
25.11.2019, 09:48
Очень круто, спасибо!

vlad_t
20.12.2019, 11:21
Здравствуйте!

Может подскажете еще, как из Double слепить DWORD с округлением до целого?