Из документов 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
, и каждый адрес инициализируется значением 0
. так же
В вашем случае, если вы хотите сохранить значение 152 для адреса 30001 «Входной регистр (и)» и значение 276 для адреса 30002. Вот что вам нужно сделать.
store = 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 спецификация, поэтому адрес (0-7) будет соответствовать (1-8). Если вы не хотите использовать zero_mode
, инициализируйте блок данных как ir=ModbusSequentialDataBlock(1, [152, 276])
.