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




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