В общем случае возможно четыре варианта расположения байт
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);
Захват-1.png