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

AttributeError:'ModbusIOException'对象无'bits'属性问题求助

解决pymodbus中AttributeError: 'ModbusIOException' object has no attribute 'bits'问题

这个报错的核心原因是read_coils请求失败,返回的不是正常的响应对象,而是ModbusIOException异常实例,所以没有bits属性。你怀疑的版本差异确实是关键因素——pymodbus 2.x和3.x的错误处理逻辑有明显区别。

处理方案

根据你安装的pymodbus版本,选择对应的修改方式:

情况1:pymodbus 2.x及更早版本

旧版本中请求失败不会直接抛出异常,而是返回ModbusIOException对象,需要先判断返回结果是否为异常:

from pymodbus.client import ModbusTcpClient
from pymodbus.exceptions import ModbusIOException

PLC_IP = '192.168.0.200'
PLC_PORT = 502
client = ModbusTcpClient(PLC_IP, PLC_PORT)
status = client.connect()
print(status)

result = client.read_coils(1,5)
# 先检查请求是否失败
if isinstance(result, ModbusIOException):
    print(f"请求失败:{result}")
elif result.bits[0]:
    print("Hello world")

client.close()

也可以用内置的isError()方法判断:

# 替代上面的判断逻辑
if not result.isError():
    if result.bits[0]:
        print("Hello world")
else:
    print(f"请求错误:{result}")

情况2:pymodbus 3.x及以上版本

新版本中请求失败会直接抛出异常,需要用try-except块捕获:

from pymodbus.client import ModbusTcpClient
from pymodbus.exceptions import ModbusIOException

PLC_IP = '192.168.0.200'
PLC_PORT = 502
client = ModbusTcpClient(PLC_IP, PLC_PORT)
status = client.connect()
print(status)

try:
    result = client.read_coils(1,5)
    # 请求成功后再访问bits属性
    if result.bits[0]:
        print("Hello world")
except ModbusIOException as e:
    print(f"请求失败:{e}")
finally:
    client.close()

额外排查建议

  • 先确认当前pymodbus版本:执行pip show pymodbus查看版本号
  • 检查PLC连接有效性:确认IP、端口正确,PLC处于运行状态,本地防火墙未拦截502端口
  • 如果需要保持版本兼容,建议统一使用3.x的try-except模式,逻辑更严谨

内容的提问来源于stack exchange,提问作者Lee Kang Ki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:10:30