蓝色港湾 发表于 2024-11-6 20:00:45

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

最近采用给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





即可得到 浮点数1.5的十六进制值。再写一个方法把Dword分解成4个byte,就可以发送给从站设备了。
同理联合体也可以完成64位双精度浮点数的计算转换,即从LREAL转LWORD。
页: [1]
查看完整版本: 【Codesys】单精度浮点数转十六进制的方法