来自 Pymodbus 文档。
数据存储仅响应它们初始化的地址。因此,如果您将 DataBlock 初始化为 0x00 到 0xFF 的地址,则对 0x100 的请求将响应无效地址异常。这是因为许多设备都表现出这种行为(但不是全部)::
block = ModbusSequentialDataBlock(0x00, [0]*0xff)
在ModbusSequentialDataBlock
初始化address
和value
.
address – The starting address
values – List of values to initialise each address with.
数据块的总大小取决于len(values)
.
所以看上面的例子,我们试图创建一个大小的顺序数据块,0xFF
每个地址都用 value 初始化0
。同样,在您的情况下,如果您要将值 152 存储到“输入寄存器 (ir)”地址 30001,并将值 276 存储到地址 30002,那么您必须执行以下操作。
存储 = ModbusSlaveContext(
di=ModbusSequentialDataBlock(0, [17]*100),
co=ModbusSequentialDataBlock(0, [17]*100),
hr=ModbusSequentialDataBlock(0, [17]*100),
ir=ModbusSequentialDataBlock(0, [152, 276]), zero_mode=True)
context = ModbusServerContext(slaves=store, single=True)
请注意,如果不使用 kwarg zero_mode=True
,read_input_registers
针对偏移量 0 的请求将返回 276 而不是 152,这是因为不使用zero_mode=True
pymodbus 会尝试根据规范的第 4.4 节存储值,因此 address(0-7) 将映射到(1-8)。如果您不想使用zero_mode
,则将数据块初始化为ir=ModbusSequentialDataBlock(1, [152, 276])
.