使用Python pymodbus实现Modbus RTU over TCP读写时遇无响应错误
解决pymodbus TCP客户端读取保持寄存器无响应的问题
你的代码有两个核心问题导致设备无响应:
错误使用Modbus RTU帧格式
Modbus TCP和RTU的通讯帧结构完全不同,TCP协议默认适配ModbusSocketFramer,你强行指定ModbusRtuFramer会让发送的请求帧格式不被设备识别,自然收不到响应。寄存器地址偏移不匹配
像ModbusPoll这类工具里的保持寄存器编号是1偏移的(比如40001对应第一个寄存器),但pymodbus的address参数是0偏移的。比如你在ModbusPoll里测试的是40001,那pymodbus里要写address=0;如果是40005,就写address=4。你写的address=4000对应ModbusPoll里的44001,大概率设备没有这么高地址的寄存器,也会导致无响应。
修正后的代码如下:
from pymodbus.client.sync import ModbusTcpClient # TCP客户端默认用适配的帧格式,无需手动指定framer client = ModbusTcpClient("192.168.0.7", port=502) success = client.connect() if success: # 示例:读取ModbusPoll中40001对应的寄存器(address=0),读取1个寄存器 read_result = client.read_holding_registers(address=0, count=1) if not read_result.isError(): print(read_result.registers) else: print(f"读取失败: {read_result}") client.close() else: print("连接失败,请检查设备IP和端口是否正确")
额外注意:
- 先判断连接是否成功,避免后续无效操作
- 读取后一定要检查
isError(),如果请求出错,直接访问registers会引发新的异常 - 客户端使用完毕后记得关闭连接,避免资源占用
内容的提问来源于stack exchange,提问作者maja95
相关产品推荐
相关产品推荐

