找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1422

积分

0

好友

204

主题
发表于 6 天前 | 查看: 20| 回复: 0

在工业通信和嵌入式开发中,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. 虚拟串口配置

为了在单台计算机上模拟主从机通信,我们需要创建一对虚拟串口。

  1. 安装工具
    使用 socat 工具可以方便地创建虚拟串口对。

    sudo apt-get install socat
  2. 创建虚拟串口对
    执行以下命令:

    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。它们成对出现,一端写入的数据会从另一端读出。

  3. 配置脚本
    将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_tkpyserialPython库快速构建了一个功能完整的Modbus RTU从机模拟器。该方法不仅适用于RTU协议,modbus_tk 库同样支持TCP协议,并且也提供了主站(客户端)功能。这套方案能极大提升前期开发与测试效率,是协议工程师和嵌入式开发者的实用工具。




上一篇:BPF Linux性能优化实战指南:内核级透视与系统调优
下一篇:Python数据分析实战:部门工资与公司整体对比算法实例解析
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-24 21:11 , Processed in 0.272432 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表