Freemodbus
简介
Freemodbus 是一款开源的 Modbus 协议栈,由armink大神移植。同时支持主机和从机的功能。
FreeModbus 主机源码是开源的,这使得在嵌入式产品中实现Modbus主机功能变得简单。
特性
- 新增加的主机源码与原有从机的风格及接口保持一致
- 支持主机与从机在同一协议栈运行
- 支持实时操作系统及裸机移植
- 为应用提供多种请求模式,可以选择阻塞还是非阻塞模式
- 支持所有常用的Modbus方法
文件结构
| 源文件 | 描述 |
|---|---|
| FreeModbus/modbus/mb.c | Modbus从机设置及轮询接口 |
| FreeModbus/modbus/mb_m.c | Modbus主机设置及轮询接口 |
| FreeModbus/modbus/rtu/mbrtu.c | 从机RTU模式设置 |
| FreeModbus/modbus/rtu/mbrtu_m.c | 主机RTU模式设置 |
| FreeModbus/port/portserial.c | 从机串口移植 |
| FreeModbus/port/portserial_m.c | 主机串口移植 |
| FreeModbus/port/user_mb_app.c | 从机数据缓冲区 |
| FreeModbus/port/user_mb_app_m.c | 主机数据缓冲区 |
数据缓冲区
数据缓冲区定义在 user_mb_app_m.c 文件中,共4种数据类型:
- 线圈(Coils)
- 离散输入(Discrete Inputs)
- 保持寄存器(Holding Registers)
- 输入寄存器(Input Registers)
API详解
写单个保持寄存器
eMBMasterReqWriteHoldingRegister(
UCHAR ucSndAddr,
USHORT usRegAddr,
USHORT usRegData,
LONG lTimeOut
);
读多个保持寄存器
eMBMasterReqReadHoldingRegister(
UCHAR ucSndAddr,
USHORT usRegAddr,
USHORT usNRegs,
LONG lTimeOut
);
读输入寄存器
eMBMasterReqReadInputRegister(
UCHAR ucSndAddr,
USHORT usRegAddr,
USHORT usNRegs,
LONG lTimeOut
);
返回值说明
| 返回值 | 描述 |
|---|---|
| MB_MRE_NO_ERR | 正常 |
| MB_MRE_NO_REG | 寄存器地址出错 |
| MB_MRE_TIMEDOUT | 响应超时 |
| MB_MASTER_BUSY | 主机忙 |