Скрипт Python для RTU Modbus Slave

Я работаю над автоматическим тестом для системы и мне нужно автоматическое устройство ввода Modbus.

Мой пример использования здесь заключается в реализации ведомого устройства Modbus RTU на основе Raspberry pi и подключения к ведущему устройству Modbus.

Я хочу, чтобы это ведомое устройство на основе Raspberry Pi заполняло и отправляло ответ мастеру, когда мастер запрашивает значение регистра.

Я новичок в этом протоколе и среде, я не могу найти ни один скрипт или библиотеки Python, где у нас есть ведомый клиент Modbus.

Я наткнулся на этот ниже последовательный код Python, и я мог успешно декодировать запросы Modbus от мастера,

import serial
import time

receiver = serial.Serial(     
     port='/dev/ttyUSB0',        
     baudrate = 115200,
     parity=serial.PARITY_NONE,
     stopbits=serial.STOPBITS_ONE,
     bytesize=serial.EIGHTBITS,
     timeout=1
     )

while 1:
      x = receiver.readline()
      print x

Проблема, с которой я сталкиваюсь, заключается в том, что этот блок кода просто печатает серию последовательных битов, и я не уверен, как декодировать пакеты Modbus из этих...

ВЫХОД: b'\x1e\x03\x00\x19\x00\x01W\xa2\x1e\x10\x00\x0f\x00\x01\x02\x03 +\xb7\x1e\x03\x00\n' b'\x00\x02\xe6f\x1e\x03\x00\t\x00\x01Vg\x1e\x10\x00\x10\x00\x01\x02\x01,(\xbd\x1e\x03\x00\n' b'\x00\x02\xe6f\x1e\x03\x00\t\x00\x01Vg\x1e\x10\x00\x11\x00\x01\x02\x03 (\t\x1e\x03\x00\n' b'\x00\x02\xe6f\x1e\x03\x00\t\x00\x01Vg\x1e\x10\x00\x12\x00\x01\x02\x01,)_\x1e\x03\x00\n' b'\x00\x02\xe6f\x1e\x03\x00\t\x00\x01Vg\x1e\x03\x00\n' b'\x00\x02\xe6f\x1e\x03\x00\t\x00\x01Vg\x1e\x03\x00\n'

Может кто-нибудь, пожалуйста, укажите мне правильное направление на то, что искать или есть аналогичный сценарий реализован.

Заранее спасибо.

1 ответ

Решение

В библиотеке Pymodbus есть несколько примеров для сервера / ведомого устройства / ответчика (обычно устройства являются сервером / ведомым устройством) и главного устройства / клиента / запрашивающего. Процедура в протоколе Modbus такова, что сервер / ведомый должен дать запрос со стороны ведущего / клиента, а затем ответить на него.


Вот фрагмент кода клиента (главного) Modbus RTU для чтения с сервера Modbus RTU (ведомого) или устройства Modbus с помощью pymodbus библиотека:

from pymodbus.client.sync import ModbusSerialClient

client = ModbusSerialClient(
    method='rtu',
    port='/dev/ttyUSB0',
    baudrate=115200,
    timeout=3,
    parity='N',
    stopbits=1,
    bytesize=8
)

if client.connect():  # Trying for connect to Modbus Server/Slave
    '''Reading from a holding register with the below content.'''
    res = client.read_holding_registers(address=1, count=1, unit=1)

    '''Reading from a discrete register with the below content.'''
    # res = client.read_discrete_inputs(address=1, count=1, unit=1)

    if not res.isError():
        print(res.registers)
    else:
        print(res)

else:
    print('Cannot connect to the Modbus Server/Slave')

Другие вопросы по тегам