使用pyModbus读取Modbus保持寄存器无响应问题求助
解决pyModbus读取保持寄存器无响应/连接重置问题
1. 核对通信模式与端口参数
先确认第三方工具(Modbus-poll/QModMaster)的通信配置:
- 若工具使用RTU over TCP而非纯TCP协议,pyModbus需切换为
ModbusRtuOverTcpClient,而非默认的ModbusTcpClient - 端口号:默认502,若设备自定义了端口,代码中必须同步指定,示例:
from pymodbus.client import ModbusRtuOverTcpClient client = ModbusRtuOverTcpClient("192.168.1.100", port=5020)
2. 延长超时时间
Windows环境下网络延迟可能触发默认超时(通常1秒),读取时设置更长的超时阈值:
from pymodbus.client import ModbusTcpClient client = ModbusTcpClient("192.168.1.100", timeout=5) # 设为5秒,可根据实际调整 client.connect() response = client.read_holding_registers(address=0, count=10, unit=1) client.close()
3. 排查本地防火墙/杀毒软件拦截
Wireshark显示请求被重置,大概率是本地安全软件拦截了设备响应:
- 临时关闭Windows Defender防火墙(仅测试用,测试后需恢复或添加允许规则)
- 给Python.exe或VSCode添加防火墙入站规则,允许接收Modbus响应数据包
4. 规范连接与读取流程
确保代码先建立有效连接,再执行读取操作:
client = ModbusTcpClient("192.168.1.100") if not client.connect(): print("连接失败,请检查IP、端口和设备状态") else: response = client.read_holding_registers(0, 10, unit=1) if response.isError(): print(f"读取错误: {response}") else: print(f"寄存器值: {response.registers}") client.close()
5. 开启调试日志对比帧数据
开启pyModbus详细日志,对比第三方工具的请求帧,确认格式一致性:
import logging logging.basicConfig() log = logging.getLogger() log.setLevel(logging.DEBUG) # 执行连接和读取代码,日志会输出帧的字节细节
若发现pyModbus发送的帧与工具存在差异(如单元ID、功能码错误),针对性调整参数。
6. 确认设备实际单元ID
部分设备的单元ID并非默认1,用Modbus-poll查看设备的实际单元ID,确保代码中unit参数与工具完全一致。
内容的提问来源于stack exchange,提问作者B.Mohamadou
相关产品推荐
相关产品推荐

