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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:44:59