使用Modbus/TCP获取LReal数据,求转为double或int的方法
Modbus/TCP LReal转Double/Int的实现方法
核心背景
Modbus中的LReal就是64位双精度浮点数,和标准double类型完全对应,问题核心是处理寄存器数据的**字节序(端序)**与拼接逻辑。
步骤拆解
你拿到的四个16位寄存器值:[80]16400、[81]-2098、[82]-9962、[83]-30933,需按以下流程转换为目标类型:
将有符号寄存器值转无符号十六进制
负数以补码存储,转换公式为65536 - 绝对值:- 16400 →
0x4010 - -2098 →
65536-2098=63438→0xF80E - -9962 →
65536-9962=55574→0xD916 - -30933 →
65536-30933=34603→0x872B
- 16400 →
按Modbus端序拼接字节
绝大多数设备的Modbus LReal采用大端字节序(Big-Endian):- 寄存器顺序:从高地址到低地址(即80→81→82→83)
- 每个寄存器内部:高字节在前,低字节在后
拼接后的8字节流:0x40 0x10 0xF8 0x0E 0xD9 0x16 0x87 0x2B
解析为Double类型
以Python代码实现为例:import struct # 寄存器的无符号十六进制值 reg_values = [0x4010, 0xF80E, 0xD916, 0x872B] # 大端模式拼接4个16位无符号整数 byte_stream = struct.pack('>4H', *reg_values) # 解析为double result_double = struct.unpack('>d', byte_stream)[0] print(result_double) # 输出接近4.232若结果不符,尝试小端模式(把代码中的
>替换为<),部分设备可能采用小端字节序。转换为Int类型
直接对double值取整即可:result_int = int(result_double) # 截断取整,得到4 # 或四舍五入 result_int_round = round(result_double) # 得到4
内容的提问来源于stack exchange,提问作者jacklee
相关产品推荐
相关产品推荐

