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

Python通过Modbus读取电力网络仪表数据异常求助

问题:Lumel ND25电力仪表Modbus读取UINT16数据与文档不符无法解析

我正在从Lumel ND25电力网络仪表读取Modbus数据,已通过Wireshark确认返回的是UINT16格式,但数据和手册描述不符,无法正确解析。更换过多个Python Modbus模块,问题依然存在。

测试代码

import time
from pyModbusTCP.client import ModbusClient

slave_adress = '192.168.1.10'
port = 502
unit_id = 2

modbus_clinet = ModbusClient(host=slave_adress, port=port, unit_id=unit_id, auto_open=True)

if __name__ == '__main__':
    while True:
        regs = modbus_clinet.read_holding_registers(reg_addr=0x1772, reg_nb=16)
        if regs:
            print(regs)
        else:
            print("baj van")
        time.sleep(2)

运行输出

[16640, 0, 16384, 0, 17359, 32768, 16544, 0, 16448, 0, 17096, 0, 0, 0, 16384, 0]

排查建议

  • 确认寄存器地址格式:手册中的寄存器地址可能是十进制而非十六进制,检查0x1772(十进制6002)是否对应手册中描述的目标寄存器段。部分设备会使用偏移地址,比如手册地址需要加1或减1才能匹配Modbus协议的实际地址。
  • 检查数据解析规则:ND25的寄存器可能为32位数据(如浮点数、整数),需要将两个连续的UINT16寄存器组合解析。要确认是大端(高位在前)还是小端(低位在前)字节序,再进行拼接转换。
  • 验证Unit ID匹配:确认仪表配置中的Modbus Slave ID和代码中的unit_id=2完全一致,部分设备默认ID为1,配置错误会导致返回数据异常。
  • 检查仪表Modbus配置:进入仪表设置界面,确认已启用Modbus TCP功能,且目标寄存器段的访问权限为可读,部分参数可能需要解锁或配置为对外输出。
  • 核对Wireshark抓包细节:对比抓包中的Modbus请求帧(确认寄存器起始地址、数量)和响应帧,确认返回的寄存器数据和代码输出一致,排除代码层面的地址转换错误。
  • 测试单个寄存器读取:尝试读取手册中明确的单个已知参数寄存器(比如电压、电流的单独寄存器),而非一次性读取16个,缩小问题范围,确认是否是地址段选择错误。

内容的提问来源于stack exchange,提问作者Péter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:49:59