Modbus协议中浮点数的格式与换算

Modbus协议中浮点数(单精度)使用的是IEEE754标准浮点数(32位)的表示方法:

IEEE754浮点数二进制格式示意图

  • 1[31] 符号位(SIGN)
  • 8[23-30] 指数位(EXPONENT) 指数偏移量 127
  • 23[0-22] 尾数位(MANTISSA)

转换为10进制的公式:

SGL = (-1)^SIGN * 1.MANTISSA * 2^(EXPONENT-127)

转换举例:

 将40800000转换为10进制数,方法如下:

Modbus浮点数转换示例

  1. 先将16进制数转成二进制数01000000100000000000000000000000
  2. 1位符号位(SIGN)=0
  3. 8位指数位(EXPONENT)=10000001=129[10进制]
  4. 23位尾数位(MANTISSA)=00000000000000000000000
  5. 1.尾数=1 .00000000000000000000000=1.0000000[10进制]
  6. 套入公式得SGL=(-1)^0*1.0000000*2^(129-127)=4

JAVA代码:

public static float toFloat(short s1, short s2) {//将输入数值short转化为无符号
        //
        int us1 = s1, us2 = s2;
        if (s1 < 0) {
            us1 += 65536;
        }
        if (s2 < 0) {
            us2 += 65536;
        }
        // sign: 符号位, exponent: 阶码, mantissa:尾数
        int sign, exponent;
        float mantissa;//计算符号位
        sign = us1 / 32768;//去掉符号位
        int emCode = us1 % 32768;//计算阶码
        exponent = emCode / 128;//计算尾数
        mantissa = (float) (emCode % 128 * 65536 + us2) / 8388608;//代入公式
        //fValue = (-1) ^ S x 2 ^ (E - 127) x (1 + M)
        return (float) Math.pow(-1, sign) * (float) Math.pow(2, exponent - 127) * (1 + mantissa);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值