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

使用Pymodbus读取保持寄存器时触发IllegalValue异常求助

解决Pymodbus RTU IllegalValue异常的方法

核心问题分析

你遇到的Pymodbus :: RTU :: Exception Response(131, 3, IllegalValue)错误,本质是读保持寄存器的参数传递冲突:

  • 在read_holding_registers方法中,slave和unit是同一参数的别名(均用于指定从站ID),同时传入slave=1和unit=0会导致从站ID参数混乱,设备无法识别合法请求,返回非法值异常。
  • 需额外确认寄存器地址规则:部分设备使用1-based地址(如MODscan显示的3020),而Pymodbus默认采用0-based地址,若MODscan能直接读取3020,要确认设备是否需要地址偏移。

修正后的代码

from pymodbus.client import ModbusSerialClient

# 初始化客户端,参数与MODscan完全对齐
client = ModbusSerialClient(
    port='COM3',
    method='rtu',
    baudrate=19200,
    bytesize=8,
    parity="N",
    stopbits=1,
    timeout=0.3
)

connect = client.connect()

if connect:
    print('Connected')
    # 移除冲突的unit参数,仅保留正确的从站ID slave=1
    # 若MODscan中3020是1-based地址,此处需改为address=3019(转0-based),否则保持3020
    response = client.read_holding_registers(address=3020, count=5, slave=1)
    
    # 增加响应校验,避免直接打印异常对象
    if not response.isError():
        print("寄存器数据:", response.registers)
    else:
        print("错误响应:", response)

额外排查步骤

  • 确认RS485-USB转换器的A/B线与设备对应端口正确连接,不要接反。
  • 核对MODscan使用的所有参数(波特率、奇偶校验、从站ID、地址)与代码完全一致,重点确认从站ID和地址编号规则。
  • 若修正参数后仍报错,可尝试调大timeout值(如改为1.0),避免因超时导致的异常。

内容的提问来源于stack exchange,提问作者Rohit Chaudhari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 16:13:28