CODESYS的Float,DINT,DWORD数据大小端转换
在和西门子或Modbus设备通讯时容易遇到大小端问题,一个32位的数据会拆分成4个byte,如果发送方是ABCD,则接收端可能是CDAB,这就是大小端问题。 大小端有很多种解法,例如创建数组关联每一位、创建联合体等,在这里提出一个较简单的写法,1、DINT类型的交换大小端,如图:FUNCTION SWAP : DWORD
VAR_INPUT
IN: DWORD;
END_VAR
VAR
END_VAR
SWAP:=SHL(IN,16) OR SHR(IN,16);
该方法只适用于DWORD,如果您使用的变量是DINT或REAL,则外部还需要转换,例如:
aa := DWORD_TO_DINT(SWAP(bb));
cc := SWAP(DINT_TO_DWORD(dd));
2、Float类型的交换大小端,需要先转换为16进制,然后使用DINT转换的方式交换大小端以后,在转换为小数如图:
TYPE DUT :
UNION
float:REAL;
diDint: DINT;
dwDword: DWORD;
END_UNION
END_TYPE
FUNCTION 浮点数转换 : REAL
VAR_INPUT
IN:REAL;
END_VAR
VAR_OUTPUT
END_VAR
VAR
indut: Dut;
outdut: Dut;
outDword: DWORD;
tempDword: DWORD;
END_VAR
indut.float:=IN;
tempDword:=indut.dwDword;
outDword:=SHL(tempDword,16) OR SHR(tempDword,16);
outdut.dwDword:=outDword;
浮点数转换:=outdut.float;
3、效果如图所示:
页:
[1]