You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Modbus/TCP获取LReal数据,求转为double或int的方法

Modbus/TCP LReal转Double/Int的实现方法

核心背景

Modbus中的LReal就是64位双精度浮点数,和标准double类型完全对应,问题核心是处理寄存器数据的**字节序(端序)**与拼接逻辑。

步骤拆解

你拿到的四个16位寄存器值:[80]16400、[81]-2098、[82]-9962、[83]-30933,需按以下流程转换为目标类型:

  1. 将有符号寄存器值转无符号十六进制
    负数以补码存储,转换公式为65536 - 绝对值:

    • 16400 → 0x4010
    • -2098 → 65536-2098=63438 → 0xF80E
    • -9962 → 65536-9962=55574 → 0xD916
    • -30933 → 65536-30933=34603 → 0x872B
  2. 按Modbus端序拼接字节
    绝大多数设备的Modbus LReal采用大端字节序(Big-Endian):

    • 寄存器顺序:从高地址到低地址(即80→81→82→83)
    • 每个寄存器内部:高字节在前,低字节在后
      拼接后的8字节流:0x40 0x10 0xF8 0x0E 0xD9 0x16 0x87 0x2B
  3. 解析为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
    

    若结果不符,尝试小端模式(把代码中的>替换为<),部分设备可能采用小端字节序。

  4. 转换为Int类型
    直接对double值取整即可:

    result_int = int(result_double)  # 截断取整,得到4
    # 或四舍五入
    result_int_round = round(result_double)  # 得到4
    

内容的提问来源于stack exchange,提问作者jacklee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 08:10:32