RTU Modbus从机的Python脚本

RTU Modbus从机的Python脚本,python,raspberry-pi,modbus,pymodbus,minimalmodbus,Python,Raspberry Pi,Modbus,Pymodbus,Minimalmodbus,我正在为一个系统开发一个自动化测试用例,需要一个自动modbus输入设备 我在这里的用例是实现一个基于Raspberry pi的RTU modbus从机并连接到modbus主机 我希望这个基于raspberry pi的从机在主机请求寄存器值时填充并向主机发送响应 我不熟悉这个协议和环境,我找不到任何有modbus从客户端的python脚本或库 我遇到了下面的串行python代码,我可以成功地解码来自主机的modbus请求 import serial import time receiver =

我正在为一个系统开发一个自动化测试用例,需要一个自动modbus输入设备

我在这里的用例是实现一个基于Raspberry pi的RTU modbus从机并连接到modbus主机

我希望这个基于raspberry pi的从机在主机请求寄存器值时填充并向主机发送响应

我不熟悉这个协议和环境,我找不到任何有modbus从客户端的python脚本或库

我遇到了下面的串行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\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,)\ux1e\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'

任何人都可以请我指出正确的方向上寻找什么或有类似的脚本实现


提前感谢。

Pymodbus库中有几个服务器/从机/响应器(通常设备是服务器/从机)和主/客户端/请求器的示例。Modbus协议中的过程是,服务器/从机必须从主/客户端发出请求,然后响应


以下是Modbus RTU客户端(主)代码片段,可通过
pymodbus
库从Modbus RTU服务器(从)或Modbus设备读取:

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')

  • 这里有一个例子
  • 这里有一个例子

Pymodbus库中有许多服务器/从机/响应器的示例(通常设备是服务器/从机)和
master/client/requester
。Modbus协议中的程序是这样的:服务器/从机必须从主/客户端发出请求,然后响应。根据此定义,您在RPi?从机或主?服务器或客户端上实现的目的是什么?Hi@BenyaminJafari,感谢您的响应。我对Modbus主设备和从设备。但据我所知,请求寄存器值的设备是主设备(客户端/请求者),响应该寄存器值的设备是服务器(从设备/响应者)。所以在我的用例中,RPi是服务器/从/响应程序。嗨,所以你需要一个异步ModbusRtuServer,我在回答中提到了。如果有问题,请告诉我。@BenyaminJafari Hi非常感谢你为我指出了正确的方向,异步ModbusRtuServer非常完美,它处理了我的用例。我对表单的库文件做了一些调整根据我的需要装点包裹。图书馆里仍然没有问题。再次感谢你的时间:P