Законченый и провереный вариант кода для преобразования байт содержащих LREAL и полученых через порт от расходомера в REAL. Исходя из особенностей ПЛК100, 8-мь байт собираются в строку при приеме через порт. Разработчикам которые работают с расходомерами или теплосчетчиками, с большими расходами советовал бы оценить достаточно ли им разрешающей способности REAL и если нет взять другой контроллер работающий с LREAL. Сapzap спасибо за подсказки.
Код:FUNCTION StDR_to_R : REAL (*преобразование дабл флоат в флоат на ПЛК100 принятых через порт *) VAR_INPUT str_d:STRING; swap:BOOL; 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; (*для копирования DWORD в REAL *) 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:=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; IF mant>0 THEN (*чтобы при нулевой мантисе не вылизло какое-нибудь число*) expon:=expon-1023; expon:=expon+127; (*если мантиса больше 0 экспон. приймет значения *) END_IF 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*) FL:=ADR(help1); StDR_to_R :=FL^; (*здесь копирую побитно в REAL *)




Ответить с цитированием