无心飞扬 发表于 2024-11-5 22:23:25

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]
查看完整版本: CODESYS的Float,DINT,DWORD数据大小端转换