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

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

0 голосов
/ 23 января 2019

Я работаю над автоматическим тестовым примером для системы и мне требуется автоматическое устройство ввода 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' б '\ x00 \ x02 \ xe6f \ x1e \ x03 \ x00 \ т \ x00 \ x01Vg \ x1e \ x10 \ x00 \ x10 \ x00 \ x01 \ x02 \ x01, (\ XBD \ x1e \ x03 \ x00 \ п' b '\ x00 \ x02 \ xe6f \ x1e \ x03 \ x00 \ t \ x00 \ x01Vg \ x1e \ x10 \ x00 \ x11 \ x00 \ x01 \ x02 \ x03 (\ t \ x1e \ x03 \ x00 \ n' Ь '\ x00 \ x02 \ xe6f \ x1e \ x03 \ x00 \ т \ x00 \ x01Vg \ x1e \ x10 \ x00 \ x12 \ x00 \ x01 \ x02 \ x01,) _ \ x1e \ x03 \ x00 \ п' Ь '\ x00 \ x02 \ xe6f \ x1e \ x03 \ x00 \ т \ x00 \ x01Vg \ x1e \ x03 \ x00 \ п' Ь '\ x00 \ x02 \ xe6f \ x1e \ x03 \ x00 \ т \ x00 \ x01Vg \ x1e \ x03 \ x00 \ п'

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

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

1 Ответ

0 голосов
/ 25 января 2019

В библиотеке 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')

...