Python RTU Modbus 从站脚本
Python script for RTU Modbus Slave
我正在为一个系统开发自动化测试用例,需要一个自动化的 modbus 输入设备。
我在这里的用例是实现一个基于 Raspberry pi 的 RTU modbus 从站并连接到一个 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'
Pymodbus 库有几个 server/slave/responder(通常设备是 server/slave)和 master/client/requester 的例子。 Modbus 协议的流程是 server/slave 必须从 master/client 方发出请求,然后响应它。
这是一个 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 Asynchronous Server 示例。
- 这是一个 Pymodbus Synchronous Server 示例。
我正在为一个系统开发自动化测试用例,需要一个自动化的 modbus 输入设备。
我在这里的用例是实现一个基于 Raspberry pi 的 RTU modbus 从站并连接到一个 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'
Pymodbus 库有几个 server/slave/responder(通常设备是 server/slave)和 master/client/requester 的例子。 Modbus 协议的流程是 server/slave 必须从 master/client 方发出请求,然后响应它。
这是一个 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 Asynchronous Server 示例。
- 这是一个 Pymodbus Synchronous Server 示例。