在工业通信和嵌入式开发中,Modbus协议因其简单可靠而广泛应用。通常,协议开发需要有真实的从机设备才能调试。但在项目前期或需要快速验证时,手头可能没有物理设备。此时,一个能够模拟Modbus从机的软件工具就显得尤为重要。
利用Python可以非常便捷地实现这一需求,它丰富的库生态能帮助我们快速构建各种工具和模拟程序。
1. 核心实现代码
以下是使用 modbus_tk 库实现的一个简易Modbus RTU从机服务器代码,仅需约30行:
#!/usr/bin/env python3
import modbus_tk.modbus_rtu as modbus_rtu
import serial
from modbus_tk import defines as cst
from modbus_tk import modbus_rtu
import time
MAX_REGISTERS = 10
SLAVE_ADDRRESS = 2
BAUDRATE = 9600
PORT = '/dev/pts/5' # 虚拟串口路径
def modbus_server_running():
server_port = serial.Serial(port=PORT, baudrate=BAUDRATE, bytesize=8, parity='N', stopbits=1)
server = modbus_rtu.RtuServer(server_port)
slave = server.add_slave(SLAVE_ADDRRESS)
slave.add_block('0', cst.HOLDING_REGISTERS, 0, MAX_REGISTERS) # 添加保持寄存器块
for i in range(MAX_REGISTERS):
slave.set_values('0', i, i) # 初始化寄存器值
value=slave.get_values('0', i)
print(f"reg: {i} <{value}>")
server.start()
print(f"Modbus server started on {PORT} with slave {SLAVE_ADDRRESS}")
try:
while True:
time.sleep(100)
except KeyboardInterrupt:
print("Stopping server...")
server.stop()
if __name__ == "__main__":
modbus_server_running()
运行此脚本后,一个Modbus从机(地址为2)即在指定串口上启动。主设备(如另一段Python代码、PLC或上位机软件)可连接至此串口,对其进行保持寄存器的读写操作,从而在没有物理从机的情况下完成协议开发与测试。
2. 环境搭建
以下以Linux环境为例,介绍如何搭建所需的Python运行环境:
# 确保Python版本 ≥ 3.6
sudo apt update
sudo apt install python3 python3-venv python3-pip
# 创建并进入Python虚拟环境(推荐)
python3 -m venv ~/venv/modbus
source ~/venv/modbus/bin/activate
# 安装必要的Python模块
python -m pip install -U pip
python -m pip install -U modbus_tk pyserial
安装完成后,为脚本添加执行权限即可运行:
chmod +x modbus_slave.py
3. 虚拟串口配置
为了在单台计算机上模拟主从机通信,我们需要创建一对虚拟串口。
-
安装工具:
使用 socat 工具可以方便地创建虚拟串口对。
sudo apt-get install socat
-
创建虚拟串口对:
执行以下命令:
socat -d -d pty,raw,echo=0 pty,raw,echo=0
命令输出类似:
2024/01/01 10:00:00 socat[12345] N PTY is /dev/pts/3
2024/01/01 10:00:00 socat[12345] N PTY is /dev/pts/4

这里创建了两个虚拟串口,例如 /dev/pts/3 和 /dev/pts/4。它们成对出现,一端写入的数据会从另一端读出。
-
配置脚本:
将Python脚本中的 PORT 变量设置为其中一个串口(如 /dev/pts/3)。你的Modbus主机程序(可以是另一段代码或测试工具)则连接另一个串口(如 /dev/pts/4)。这样便实现了主机与模拟从机之间的串口通信。
4. 虚拟串口测试
创建虚拟串口后,可以通过简单的命令测试其连通性:
-
在一个终端监听数据(例如监听 /dev/pts/3):
od -vtx1c /dev/pts/3 # 以十六进制和ASCII格式显示接收到的数据
# 或使用 od -w1 -tx1c /dev/pts/3 设置为每收到1字节就立即显示
-
在另一个终端发送数据(例如向 /dev/pts/4 发送):
echo -ne "\x30\x3212345678901234" > /dev/pts/4
此时,第一个监听终端将会收到并打印出发送的数据。这验证了虚拟串口对的通路是正常的。
总结
通过上述步骤,我们利用 modbus_tk 和 pyserial 等Python库快速构建了一个功能完整的Modbus RTU从机模拟器。该方法不仅适用于RTU协议,modbus_tk 库同样支持TCP协议,并且也提供了主站(客户端)功能。这套方案能极大提升前期开发与测试效率,是协议工程师和嵌入式开发者的实用工具。
|