Pymodbus: перехватить пакет и выполнить операцию на основе функцииPython

Программы на Python
Ответить
Anonymous
 Pymodbus: перехватить пакет и выполнить операцию на основе функции

Сообщение Anonymous »

Я реализую сервер Modbus на Python, используя библиотеку Pymodbus (v3.0.2). Пока сервер работает, у меня есть параллельный поток, который обновляет некоторые из его регистров, чтобы имитировать изменение данных, используя метод setValues ​​ModbusSlaveContext. Эти данные запрашиваются второй машиной через последовательный протокол RTU/485 с использованием функции modbus 03. С этой второй машины я также могу запросить данные для записи, отправив команды Modbus 06.05.15.16 на мой сервер. Когда я получаю эти команды, я хочу сохранить пары адрес/значение в файле. Я попробовал следующее:
  • Реализовать собственный блок данных (полученный из ModbusSequentialDatablock), переопределив функцию setValues, но это перехватывает как 06.05.15.16, так и команды и вызовы setValues ​​в потоке обновления, поскольку я не могу распознать, какая функция Modbus была получена.
  • Реализовать собственный фреймворк (полученный из ModbusRtuFramer), но в этом случае я часто получаю неполные кадры:
class MyFramer(ModbusRtuFramer):

def processIncomingPacket(self, data, callback, unit, **kwargs):
res = super().processIncomingPacket(data, callback, unit, **kwargs)

# the device address is in the first byte of the raw data
device = int(data[0])

# the function code is in the second byte of the raw data
function = int(data[1])

# the address is always in the same position: for single register the
# meaning is absolute address, for multiple registers the meaning is
# starting address
address = (int(data[2]) * 256) + int(data[3]) #

Подробнее здесь: https://stackoverflow.com/questions/792 ... n-function
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»