Modbus开源软件移植

分类: MODBUS

在嵌入式开发中,Modbus 开源软件的移植主要取决于你的硬件平台(如 STM32、ESP32 或嵌入式 Linux)以及你需要的角色(主站 Master 或从站 Slave)。

以下是目前主流的 Modbus 开源库及其移植的核心流程。


1. 常用 Modbus 开源库对比

软件库名称 适用场景 特点
FreeModbus MCU (单片机) 从站 工业级稳定性,专门为单片机优化,广泛用于 STM32。
libmodbus Linux / 高性能单片机 功能最全,支持 RTU/TCP,适合在具备操作系统的环境(如树莓派、Arm-Linux)运行。
nanoMODBUS 资源受限的微控制器 极其紧凑(仅两个文件),无需动态内存分配,适合极小 Flash 的 MCU。
Agile Modbus 跨平台 (单片机/Linux) 国产开源,接口高度解耦,移植非常方便,支持主从模式。

2. 以 FreeModbus 移植到 STM32 为例的流程

移植过程本质上是将协议栈的逻辑代码与硬件的驱动代码(串口、定时器)进行对接

第一步:准备文件

从官网或 GitHub 下载源码,主要包含:

  • 协议栈核心mb.c, mbrtu.c, mbframe.h 等。
  • 移植接口文件夹demo/BARE 下的 portserial.c(串口)和 porttimer.c(定时器)。

第二步:硬件底层对接 (Porting)

  1. 串口接口 (portserial.c): - vMBPortSerialEnable():控制 RS485 的收发使能引脚。 - xMBPortSerialInit():初始化单片机串口(波特率、校验位等)。 - xMBPortSerialPutByte()xMBPortSerialGetByte():单字节的发送与接收。
  2. 定时器接口 (porttimer.c): - Modbus RTU 依赖 3.5 字符时间来判断一帧结束。你需要配置一个硬件定时器,在接收到字节时重置,在超时时触发中断,调用 pxMBPortCBTimerExpired()

第三步:数据回调函数

你需要实现四个关键的回调函数,将协议栈获取到的数据存入你的业务变量中:

  • eMBRegHoldingCB():保持寄存器(最常用,可读写)。
  • eMBRegInputCB():输入寄存器(只读)。
  • eMBRegCoilsCB():线圈(位操作)。
  • eMBRegDiscreteCB():离散输入。

3. 移植中的常见坑点

  • 字节序 (Endianness):Modbus 规定是大端模式(高字节在前)。在小端的单片机(如 ARM Cortex-M)上,协议栈通常会自动处理,但如果你手写解析逻辑,务必注意。
  • 中断优先级:定时器和串口的中断优先级必须配置合理,确保 3.5 字符时间的定时准确,否则会出现“分帧”或“超时”错误。
  • RS485 收发切换:如果你使用 RS485,在发送完最后一字节后,必须等待硬件发送完成标志(TC 标志)后再拉低使能引脚,否则最后一字节会被截断。

4. 调试建议

移植完成后,推荐使用以下工具进行压力测试:

  1. Modbus Poll / Modbus Slave:最经典的上位机测试软件。
  2. Wireshark:配合逻辑分析仪或串口转网络工具,查看底层原始报文。