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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 05:57:17