CODESYS的Float,DINT,DWORD数据大小端转换-CODESYS资源下载区-酷德网 - CoDeSys软件教程下载,CoDeSys工控资讯门户 

酷德网

HSC6490-cn中国制造,中国芯~
查看: 1451|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    2017-11-20 22:07
  • 签到天数: 2 天

    [LV.1]初来乍到

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


    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转换的方式交换大小端以后,在转换为小数如图:
    155616qbnw5eubuen5qz5n.png 160056gx9drv4ul4lixc77.png

    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、效果如图所示:
    155616clsheh3sssf3kkrk.png
    +10
    不赞一个?
    打赏鼓励一下!
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

    本版积分规则

    
    顶部qrcode底部
    关注酷德网订阅号,获取更多资讯!

    QQ|Archiver|手机版|小黑屋|酷德论坛 ( 苏ICP备16065247号-1 )|网站地图

    GMT+8, 2026-11-9 03:46 , Processed in 0.283860 second(s), 50 queries .

    酷德网

    © 2001-2013 Hicodesys. 技术支持 by 酷德网

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