-
Вложений: 2
Перестановка байт
Код:
PROGRAM PLC_PRG
VAR
ptFl: POINTER TO REAL;
ptDw: POINTER TO DWORD;
height: REAL;
height_2: REAL;
SWAP_BYTE_C: DWORD;
END_VAR
ptDw:=ADR(height_tmp);
(*В зависимости от параметра Byte Sequence в UMD нужно использовать
или этот вариант*)
SWAP_BYTE_C:=(ROL(ptDw^,8) AND 16#FF00FF00) OR (ROR(ptDw^,8) AND 16#00FF00FF);
ptFl:=ADR(SWAP_BYTE_C);
height:=ptFl^;
(*Или этот вариант*)
SWAP_BYTE_C:=(ROR(ptDw^,8) AND 16#FF00FF00) OR (ROL(ptDw^,8) AND 16#00FF00FF);
ptFl:=ADR(SWAP_BYTE_C);
height_2:=ptFl^;
Тут два варианта для разных значений Byte Sequence в UMD - height и height_2
height_tmp - это именованная переменная в слейве ПЛК
Вложение 38638
Результат с Вашим значением
Вложение 38639
Можно код оформить в виде функции
-
Господа, спасибо всем, кто откликнулся на призыв о помощи.
Отдельное ОГРОМНОЕ СПАСИБО камраду petera!!!
Когда на первой странице прочитал, что нужно байты поменять местами, то малость завис. Надо искать что то подобное, может сам чего сочиню. А когда на второй странице увидел код, однозначно сам бы не осилил.
-
извиняюсь, не часто захожу.
Тип данных реал записывается как в 1 байте мантисса со знаком, в остальных экспонента.
В модбасе не определен порядок следования байт.
Для этого иногда это требуется сделать в ручную.
Обычно сначала нужно представить число в бинарном виде и будет видно, какой байт содержит мантиссу.
Подробно все уже рассказал.
Для общего ознакомления можно почитать здесь:
https://studfiles.net/preview/3368734/
-
Вложений: 1
В общем случае возможно четыре варианта расположения байт
4321 - "нормальный порядок" соответствующий представлению REAL в ПЛК
3421 - переставлены байты в словах
2143 - переставлены слова
1234 - переставлены слова и байты в словах
Код вынес в три функции
Код:
FUNCTION REAL_3412 : REAL
VAR_INPUT
in: REAL;
END_VAR
VAR
ptFl: POINTER TO REAL;
ptDw: POINTER TO DWORD;
SWAP_BYTE: DWORD;
END_VAR
(*это вариант, когда порядок байт 3412*)
ptDw:=ADR(height_tmp);
SWAP_BYTE:=(ROL(ptDw^,8) AND 16#FF00FF00) OR (ROR(ptDw^,8) AND 16#00FF00FF);
ptFl:=ADR(SWAP_BYTE);
REAL_3412:=ptFl^;
Код:
FUNCTION REAL_2143 : REAL
VAR_INPUT
in: REAL;
END_VAR
VAR
ptFl: POINTER TO REAL;
ptDw: POINTER TO DWORD;
SWAP_BYTE: DWORD;
END_VAR
(*это вариант, когда порядок байт 2143*)
ptDw:=ADR(height_tmp);
SWAP_BYTE:=ROR(ptDw^,16);
ptFl:=ADR(SWAP_BYTE);
REAL_2143:=ptFl^;
Код:
FUNCTION REAL_1234 : REAL
VAR_INPUT
in: REAL;
END_VAR
VAR
ptFl: POINTER TO REAL;
ptDw: POINTER TO DWORD;
SWAP_BYTE: DWORD;
END_VAR
(*это вариант, когда порядок байт 1234*)
ptDw:=ADR(height_tmp);
SWAP_BYTE:=(ROR(ptDw^,8) AND 16#FF00FF00) OR (ROL(ptDw^,8) AND 16#00FF00FF);
ptFl:=ADR(SWAP_BYTE);
REAL_1234:=ptFl^;
Пример использования в PLC_PRG
Код:
PROGRAM PLC_PRG
VAR
height_1: REAL; (*когда порядок 3412*)
height_2: REAL; (*когда порядок 1234*)
height_3: REAL; (*когда порядок 2134*)
END_VAR
(*height_tmp - это именованная переменная в слейве ПЛК
если нормальный порядок байт для внутреннего представления REAL
принять как 4321, то*)
(*этот вариант, когда порядок байт в height_tmp 3412*)
height_1:= REAL_3412(height_tmp);
(*этот вариант, когда порядок байт в height_tmp 1234*)
height_2:= REAL_1234(height_tmp);
(*этот вариант, когда порядок байт в height_tmp 2143*)
height_3:= REAL_2143(height_tmp);
Вложение 38641