Python Modbus RTU在未查询完整数据块时出现异常2(非法数据地址)

Python Modbus RTU在未查询完整数据块时出现异常2(非法数据地址),python,modbus,pymodbus,Python,Modbus,Pymodbus,我有一个通过Modbus RTU进行通信的传感器。传感器在8个寄存器中存储其编码为16位整数值的序列号: 作为ASCII码的序列号位于读取寄存器地址 30001-30008(每个地址16位) (来源:第5.2.1节) 当我使用功能代码0x04(读取输入寄存器)同时读取所有8个寄存器时,请求成功 当我使用功能代码0x04单独或作为部分组(例如:仅8个中的前7个)读取寄存器时,传感器返回异常代码2(非法数据地址) 问题 如果我没有阅读整个区块,为什么会出现这个异常 在该传感器内是否存在Modbus

我有一个通过Modbus RTU进行通信的传感器。传感器在8个寄存器中存储其编码为16位整数值的序列号:

作为ASCII码的序列号位于读取寄存器地址 30001-30008(每个地址16位)

(来源:第5.2.1节)

当我使用功能代码
0x04
(读取输入寄存器)同时读取所有8个寄存器时,请求成功

当我使用功能代码
0x04
单独或作为部分组(例如:仅8个中的前7个)读取寄存器时,传感器返回异常代码
2
非法数据地址

问题

如果我没有阅读整个区块,为什么会出现这个异常

在该传感器内是否存在Modbus RTU的不良实施?或者这是Modbus设备的标准行为


我的发现

本文中的问题似乎暗示了一个类似的问题,但答案是模糊的


完整代码示例

输入

#/usr/bin/env蟒蛇3
导入系统
导入日志记录
从集合导入namedtuple
从输入导入列表开始
从pymodbus.pdu导入Modbus响应
从pymodbus.client.sync导入ModbusSerialClient
从pymodbus.register\u read\u消息导入ReadInputRegisters响应
从pymodbus.pdu导入例外响应
log=logging.getLogger()
log.addHandler(logging.StreamHandler(sys.stdout))
log.setLevel(logging.DEBUG)
ModbusInputReg=namedtuple(“ModbusInputRegister”、[“name”、“address”、“value”])
serial_num=ModbusInputReg(“序列号”,0x0,无)
PORT=“COM6”
波特率=9600
从属地址=1
def construct_serial_num(serial_num_arr:List[int])->str:
str_uu=“”
对于串行_num_arr中的num:
如果num==0:
持续
str_+=bytes.fromhex(f“{num:x}”).decode(“utf-8”)
返回str_
modbus_客户端=modbus串行客户端(
method=“rtu”,
端口=端口,
波特率=波特率,
strict=False,#如果为True,我发现CO2传感器出现故障
)
modbus_客户端连接()
计数1=7
编码的\u sn\u 1=modbus\u客户端。读取\u输入\u寄存器(
地址=串行地址,计数=计数1,单位=从地址
)#类型:例外响应
打印(f“\nEnencoded\u sn\u 1={encoded\u sn\u 1}”)
打印(f“异常代码={encoded\u sn\u 1.exception\u code}.\n”)
计数2=8
编码的\u sn\u 2=modbus\u客户端。读取\u输入\u寄存器(
地址=串行地址,计数=计数2,单位=从地址
)#类型:ReadInputRegistersResponse
打印(f“\nEnencoded\u sn\u 2={encoded\u sn\u 2}”)
serial\u num=构造\u serial\u num(编码的\u sn\u 2.寄存器)
打印(f“解码序列号={serial_num}.”)
输出

当前事务状态-空闲
正在运行事务1
发送:0x1 0x4 0x0 0x0 0x0 0x7 0xb1 0xc8
新事务状态“正在发送”
将事务状态从“发送”更改为“等待答复”
将事务状态从“等待答复”更改为“正在处理答复”
记录:0x1 0x84 0x2 0xc2 0xc1
正在获取帧-0x84 0x2
工厂回应[132]
帧高级,正在重置标题!!
添加事务1
获取事务1
将事务状态从“处理答复”更改为“事务完成”
encoded_sn_1=异常响应(132,4,IllegaAddress)。
异常代码=2。
当前事务状态-事务\u完成
运行事务2
发送:0x1 0x4 0x0 0x0 0x0 0x8 0xf1 0xcc
将状态更改为空闲-最后一帧结束-1580942727.093152,当前时间戳-1580942727.093152
在下次发送之前等待3.5个字符-4.01毫秒
新事务状态“正在发送”
将事务状态从“发送”更改为“等待答复”
将事务状态从“等待答复”更改为“正在处理答复”
RECV:0x1 0x4 0x10 0x31 0x39 0x35 0x30 0x31 0x38 0x30 0x30 0x30 0x30 0x32 0x36 0x42 0x32 0x0 0x0 0x0 0x7b 0xd4
获取帧-0x4 0x10 0x31 0x39 0x35 0x30 0x31 0x38 0x30 0x30 0x30 0x30 0x30 0x32 0x36 0x42 0x32 0x0 0x0
工厂响应[ReadInputRegistersResponse:4]
帧高级,正在重置标题!!
添加事务1
获取事务1
将事务状态从“处理答复”更改为“事务完成”
encoded_sn_2=ReadRegisterResponse(8)。
解码序列号=195018000026B2。

设备详细信息

  • 设备:E+E Elektronik系列二氧化碳传感器
  • Modbus RTU,
    9600/8-N-1
    ,从机1
  • (第5.2节包含Modbus RTU信息)
  • 设备被插入到我运行此Python脚本的Windows计算机中
套餐

我正在Windows10上使用Python3.6

pymodbus==2.3.0


旁白:对于这个问题的冗长,我很抱歉,我只是想确保我事先排除了潜在的问题。

该错误意味着从机未配置为按块回复,但不在单个寄存器级别。