合信论坛

快捷导航
查看: 3256|回复: 0

CODESYS的Float,DINT,DWORD数据大小端转换(SP18)

[复制链接]

14

主题

14

帖子

963

积分

高级会员

Rank: 3Rank: 3

积分
963
发表于 2024-3-18 16:02:13 | 显示全部楼层 |阅读模式
在和西门子或Modbus设备通讯时容易遇到大小端问题,一个32位的数据会拆分成4个byte,如果发送方是ABCD,则接收端可能是CDAB,这就是大小端问题。 大小端有很多种解法,例如创建数组关联每一位、创建联合体等,在这里提出一个较简单的写法,1、DINT类型的交换大小端,如图:
SWAP.png


FUNCTION SWAP : DWORD
VAR_INPUT
        INWORD;
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转换的方式交换大小端以后,在转换为小数如图:
Float.png DUT.png

TYPE DUT :
UNION
        float:REAL;
        diDintINT;
        dwDwordWORD;
END_UNION
END_TYPE


FUNCTION 浮点数转换 : REAL
VAR_INPUT
        IN:REAL;
END_VAR
VAR_OUTPUT
END_VAR
VAR
        indutut;
        outdutut;        
        outDwordWORD;        
        tempDwordWORD;        
END_VAR


indut.float:=IN;
tempDword:=indut.dwDword;
outDword:=SHL(tempDword,16) OR SHR(tempDword,16);
outdut.dwDword:=outDword;
浮点数转换:=outdut.float;


3、效果如图所示:
显示.png



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

客服热线
400-700-4858 周一至周五:09:00 - 18:00
深圳市南山区打石一路深圳国际创新谷6栋A座9层

深圳市合信自动化技术有限公司(简称“合信技术”)成立于2003年,高新技术企业,专注于工业自动化产品的研发、生产、销售和技术服务,依靠高质量、高性能的自动化控制产品与方案为客户创造最大价值,立志于成为全球领先的工业自动化解决方案供应商。

Archiver|手机版|小黑屋|COTRUST Inc. ( 粤ICP备13051915号 )

GMT+8, 2025-4-11 21:26 , Processed in 0.168249 second(s), 34 queries .

快速回复 返回顶部 返回列表