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浮点数转换示例
- 先将16进制数转成二进制数01000000100000000000000000000000
- 1位符号位(SIGN)=0
- 8位指数位(EXPONENT)=10000001=129[10进制]
- 23位尾数位(MANTISSA)=00000000000000000000000
- 1.尾数=1 .00000000000000000000000=1.0000000[10进制]
- 套入公式得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);
}