Я использую pymodbus для создания сервера Modbus RTU.Pymodbus RTU Server - запросы на управление
Я создал сервер в очень простой форме из примеров в документации.
store = ModbusSlaveContext(
di = ModbusSequentialDataBlock(0, [0x0]*10000),
co = ModbusSequentialDataBlock(0, [0x0]*10000),
hr = ModbusSequentialDataBlock(0, [0x0]*10000),
ir = ModbusSequentialDataBlock(0, [0x0]*10000))
context = ModbusServerContext(slaves=store, single=True)
StartSerialServer(context, port='/dev/ttyUSB0', framer=ModbusRtuFramer)
Мой клиент связывает соответствие. Сервер распечатывает шестнадцатеричные значения запроса.
Теперь я хочу обрабатывать различные запросы.
Пример: Если клиент хочет прочитать регистр 4128 из регистров хранения, я хотел бы отправить значение обратно в ответ.
я не могу найти какие-либо полезные примеры в документации (или, может быть, я просто не понимаю?)
Я уже пытался подкласс ModbusSequentialDataBlock
и переопределить get/setValue
методы без успеха.
Это код моего хранилища данных. Это очень просто, и я ожидаю увидеть отпечатки в своих методах get/setValues
. Но я ничего не вижу.
class MyData(ModbusSequentialDataBlock):
def __init__(self, address, values):
self.address = address
self.values = values
def validate(self, address, count=1):
print "validate"
def getValues(self, address, count=1):
print "getValues"
print address
def setValues(self, address, count=1):
print "setValues"
print address
как ди, Co, и т.д. Я использовал MyData(...)
вместо ModbusSequentialDataBlock в ModbusSlaveContext
.
EDIT
Оказалось, что это была ошибка в pymodbus. При использовании асинхронного сервера вы не можете использовать RTU Framer. я открыл ошибку и это, кажется, исправлено: https://github.com/bashwork/pymodbus/issues/70#event-213935076
Благодарим Вас за Tipps. См. Мое редактирование. Это была ошибка при использовании RTU и асинхронного сервера. – 0xAffe