Пока поддержка овен молчит, я написал кое-какой код для перевода строки содержащей LREAL байты в REAL.
Если кто знает как вкинуть побитно DWORD в переменую REAL напишите. не в язике СИ, а в ST (Codesys).
DWORD у меня сформатирован как REAL (со знаком экспонентой и мантисой).
Код:
FUNCTION_BLOCK STR_d_real
VAR_INPUT
str_d:STRING;
swap:BOOL;
END_VAR
VAR_OUTPUT
d_to_f : REAL; (*преобразование дабл флоат в флоат на ПЛК100 принятых через порт *)
nnn:REAL; (*для альтернативного способа*)
END_VAR
VAR
str:POINTER TO BYTE;
b: ARRAY[1..8]OF BYTE;
mant:DWORD; (*Мантиса числа REAL *)
help1:DWORD;(*Вспомогательная переменнаяч*)
i:BYTE;(*счет для цикла*)
expon:DWORD;
FL:POINTER TO REAL;
DW:POINTER TO DWORD;
eexxpp:DWORD; (*для альтернативного способа*)
END_VAR
str:=ADR(str_d);
(*swap устанавливается в 1 или снимается в зависимости от порядка передачи другого контроллера*)
IF swap=1 THEN (*Формируем масив с определенной последовательностью байт*)
i:=8;
WHILE i<>0 DO (*если требуется начинать с большего и по убыванию *)
b[i]:=str^;
str:=str+1;
i:=i-1;
END_WHILE
ELSE (*если требуется только перестановка местами слов*)
FOR i:=2 TO 8 BY 2 DO
b[i]:=str^;
str:=str+1;
b[i-1]:=str^;
str:=str+1;
END_FOR
END_IF
mant:=0;
expon:=0;
help1:=(b[7] AND 16#0F) ; (*Определяем мантису*)
help1:=SHL(help1,19);
mant:= mant OR help1;
help1:=b[6];
help1:=SHL(help1,11);
mant:= mant OR help1;
help1:=b[5];
help1:=SHL(help1,3);
mant:= mant OR help1;
help1:=(b[4] AND 16#F0);
help1:=SHR(help1,5);
mant:= mant OR help1; (*Определили мантису*)
help1:=(b[7] AND 16#F0); (*определяем экспоненту *)
help1:=SHR(help1,4);
expon:=expon OR help1;
help1:=(b[8] AND 16#7F);
help1:=SHL(help1,4);
expon:=expon OR help1;
expon:=expon-1023;
eexxpp:=expon; (*для альтернативного способа*)
expon:=expon+127;
expon:=SHL(expon,23); (*определили экспоненту *)
help1:=(b[8] AND 16#80); (*определяем знак*)
help1:=SHL(help1,24); (*определяем знак*)
help1:= help1 OR expon OR mant ; (*Собрали все вместе. здесь находится 32 битное число. Если его побитно запихнуть в REAL то получем преобразование LREAL TO REAL*)
DW:=ADR(help1); (*здесь не могу все правильно собраные биты запихнуть в REAL *)
d_to_f :=DW^; (*здесь не могу все правильно собраные биты запихнуть в REAL *)
nnn:=(EXPT(2, eexxpp))*(mant/8388607.0+1.0); (*Альтернативный способ*)