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
相关产品推荐
相关产品推荐

