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

如何为Pymodbus中特定设备ID不匹配场景创建异常处理?

问题与解决方案

问题场景

我使用的设备有一个识别真实ID的命令:需要向设备地址250发送消息,设备返回的报文会包含它的真实ID(本次场景中真实ID为1)。

  • 发送报文:FA | 03 | 00 66 | 00 01 | 71 93
  • 接收报文:01 | 03 | 02 | 00 01 | 79 84

实际交互符合预期,但Pymodbus会因为单元ID不匹配抛出错误,需要针对这个场景做异常处理。

解决方案代码

from pymodbus.exceptions import ModbusIOException

# 判断是否为预期的单元ID不匹配异常
def is_unit_id_mismatch_error(exc: ModbusIOException, expected_id: int, actual_id: int) -> bool:
    return (
        "Unit ID mismatch" in str(exc)
        and f"expected {expected_id}" in str(exc)
        and f"got {actual_id}" in str(exc)
    )

# 读取寄存器的异常处理逻辑
try:
    # 向地址250发送读取请求
    read_result = client.read_holding_registers(address=66, count=1, slave=250)
except ModbusIOException as exc:
    # 检查是否是预先知道的250→1的ID不匹配场景
    if is_unit_id_mismatch_error(exc, expected_id=250, actual_id=1):
        print("忽略预期的单元ID不匹配(期望250,实际1),继续执行...")
        # 可选:如果需要用真实ID重新操作,加下面这行
        # read_result = client.read_holding_registers(address=66, count=1, slave=1)
    else:
        # 其他ModbusIO异常,正常抛出不处理
        raise

逻辑说明

  1. 精准异常识别:通过is_unit_id_mismatch_error函数,解析异常信息中的关键字段,只处理我们明确预期的ID不匹配情况,不会误吞其他类型的Modbus通信异常。
  2. 灵活处理流程:捕获到目标异常后,可以选择直接跳过(如打印提示后继续),也可以补充后续逻辑——比如用设备返回的真实ID1重新发起读取请求,适配设备的特殊交互逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:03:12