RTU Modbus从机的Python脚本
我正在为一个系统开发一个自动化测试用例,需要一个自动modbus输入设备 我在这里的用例是实现一个基于Raspberry pi的RTU modbus从机并连接到modbus主机 我希望这个基于raspberry pi的从机在主机请求寄存器值时填充并向主机发送响应 我不熟悉这个协议和环境,我找不到任何有modbus从客户端的python脚本或库 我遇到了下面的串行python代码,我可以成功地解码来自主机的modbus请求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 =
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')
- 这里有一个例子
- 这里有一个例子
master/client/requester
。Modbus协议中的程序是这样的:服务器/从机必须从主/客户端发出请求,然后响应。根据此定义,您在RPi?从机或主?服务器或客户端上实现的目的是什么?Hi@BenyaminJafari,感谢您的响应。我对Modbus主设备和从设备。但据我所知,请求寄存器值的设备是主设备(客户端/请求者),响应该寄存器值的设备是服务器(从设备/响应者)。所以在我的用例中,RPi是服务器/从/响应程序。嗨,所以你需要一个异步ModbusRtuServer,我在回答中提到了。如果有问题,请告诉我。@BenyaminJafari Hi非常感谢你为我指出了正确的方向,异步ModbusRtuServer非常完美,它处理了我的用例。我对表单的库文件做了一些调整根据我的需要装点包裹。图书馆里仍然没有问题。再次感谢你的时间:P