Python Minimalmodbus读取Modbus寄存器报从站非法数据地址咨询
报错含义说明
minimalmodbus.IllegalRequestError: Slave reported illegal data address 是Modbus标准异常响应的上层封装,对应Modbus异常码02。从站已经正确接收到你的请求报文,但认为报文中携带的寄存器地址不属于自身可访问的合法地址范围,因此返回异常拒绝请求。
从你提供的调试日志可以确认:你的串口通信参数(波特率、奇偶校验、从站地址)均配置正确,链路层通信正常,问题出在应用层的寄存器地址映射上。
问题根源
Modbus生态存在两种地址计数规则:
- 绝大多数设备厂商文档、上位机工具(含你使用的Labview示例)采用1-based计数规则,也就是第一个寄存器地址标注为1,第二个为2,以此类推
- minimalmodbus的
read_register方法默认采用0-based计数规则,也就是第一个寄存器的地址参数为0,第二个为1,以此类推
你当前传入的地址参数为4,minimalmodbus实际发送的报文中寄存器地址为0x0004,对应1-based的地址5,和你实际要访问的1-based地址4不匹配,因此触发从站返回地址非法异常。
解决思路
两种方案二选一即可:
- 手动偏移地址:将
read_register的第一个参数改为3,调用代码改为print(instrument.read_register(3,1,functioncode=3)),此时minimalmodbus实际发送的寄存器地址为0x0003,对应1-based的地址4,和Labview示例的访问地址一致 - 全局配置偏移:初始化仪表对象后添加配置
instrument.address_offset = -1,后续你可以直接传入文档标注的1-based地址,无需手动减1,调用代码保持print(instrument.read_register(4,1,functioncode=3))即可正常访问
修改后如果还是存在问题,可以抓取Labview正常访问时的串口报文,查看报文中的寄存器地址字段值,直接对应填入minimalmodbus的地址参数即可。
内容的提问来源于stack exchange,提问作者tht
相关产品推荐
相关产品推荐

