【Codesys】单精度浮点数转十六进制的方法-CODESYS资源下载区-酷德网 - CoDeSys软件教程下载,CoDeSys工控资讯门户 

酷德网

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

【Codesys】单精度浮点数转十六进制的方法

[复制链接]

该用户从未签到

发表于 2024-11-6 20:00:45 | 显示全部楼层 |阅读模式
最近采用给Modebus从站设备发数据遇到了单精度浮点数转十六进制发送的问题
需要将类似于  1.5 等小数  -6400等数 转成16进制发送给从站
原理比较复杂  :
关于16进制浮点数
对于大小为32-bit的浮点数(32-bit为单精度,64-bit浮点数为双精度,80-bit为扩展精度浮点数),
1、其第31 bit为符号位,为0则表示正数,反之为复数,其读数值用s表示;
2、第30~23 bit为幂数,其读数值用e表示;
3、第22~0 bit共23 bit作为系数,视为二进制纯小数,假定该小数的十进制值为x;
则按照规定,该浮点数的值用十进制表示为:
= (-1)^s * (1 + x) * 2^(e - 127)
需要先将浮点数转二进制,再算指数和取位计算,得出二进制再转十六进制。
而Codesys有更加优雅的解决方案:
创建联合体(Union)
如下
TYPE DUT :
UNION
     float: REAL;
     diDint: DINT;
     dwDWORD: DWORD;
END_UNION
END_TYPE

【Codesys】单精度浮点数转十六进制的方法-1.png


【Codesys】单精度浮点数转十六进制的方法-2.png


即可得到 浮点数1.5的十六进制值。再写一个方法把Dword分解成4个byte,就可以发送给从站设备了。
同理联合体也可以完成64位双精度浮点数的计算转换,即从LREAL转LWORD。
+10
不赞一个?
打赏鼓励一下!
回复

使用道具 举报

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

本版积分规则


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

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

GMT+8, 2026-11-8 11:51 , Processed in 0.132656 second(s), 50 queries .

酷德网

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

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