libmodbus 软件库
libmodbus 是一个优秀的跨平台 Modbus 开源软件库,遵循 LGPL-2.1 许可证。该库用 C 编写,支持 RTU(串行)和 TCP(以太网)通信模式,可根据 Modbus 协议发送和接收数据。
- 项目网址:https://libmodbus.org
- GitHub 仓库:https://github.com/stephane/libmodbus
软件框架
libmodbus 的目录结构如下图所示。其中,核心代码位于 src 目录,测试代码位于 tests 目录。另外,doc 目录存放 API 说明文档,m4 目录存放 GNU m4 文件。
src 目录的内容及说明如下:
├── Makefile.am # AutoTool 配置文件,用于生成 Makefile
├── modbus.c # 实现 Modbus 协议层,定义消息发送和接收函数、各功能码对应的函数
├── modbus-data.c # 实现数据处理的通用函数,如大小端、位交换等函数
├── modbus.h # libmodbus 对外暴露的 API 头文件
├── modbus-private.h # 内部使用的数据结构和函数定义
├── modbus-rtu.c # 通信层实现,RTU 模式相关的函数定义(串口设置、连接、发送、接收等)
├── modbus-rtu.h # RTU 模式对外提供的各 API 头文件
├── modbus-rtu-private.h # RTU 模式的私有定义
├── modbus-tcp.c # 通信层实现,TCP 模式相关的函数定义(网络设置、连接、发送、接收等)
├── modbus-tcp.h # TCP 模式对外提供的各 API 头文件
├── modbus-tcp-private.h # TCP 模式的私有定义
├── modbus-version.h.in # 版本定义文件
└── win32 # 定义了在 Windows 下使用 Visual Studio 编译时的项目文件
类型与数据结构
常量定义
在 modbus.h 文件中,通过宏定义了 libmodbus 库目前支持的所有 Modbus 公共功能码。
/* Modbus function codes */
#define MODBUS_FC_READ_COILS 0x01
#define MODBUS_FC_READ_DISCRETE_INPUTS 0x02
#define MODBUS_FC_READ_HOLDING_REGISTERS 0x03
#define MODBUS_FC_READ_INPUT_REGISTERS 0x04
#define MODBUS_FC_WRITE_SINGLE_COIL 0x05
#define MODBUS_FC_WRITE_SINGLE_REGISTER 0x06
#define MODBUS_FC_READ_EXCEPTION_STATUS 0x07
#define MODBUS_FC_WRITE_MULTIPLE_COILS 0x0F
#define MODBUS_FC_WRITE_MULTIPLE_REGISTERS 0x10
#define MODBUS_FC_REPORT_SLAVE_ID 0x11
#define MODBUS_FC_MASK_WRITE_REGISTER 0x16
#define MODBUS_FC_WRITE_AND_READ_REGISTERS 0x17
#define MODBUS_BROADCAST_ADDRESS 0
除此之外,modbus.h 文件中还定义了各种常量。例如 Modbus 广播地址、最大可读/可写线圈数量、最大可读/可写寄存器数量,以及各种异常码。
/* Protocol exceptions */
enum {
MODBUS_EXCEPTION_ILLEGAL_FUNCTION = 0x01, /* 非法的功能码 */
MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS, /* 非法的数据地址 */
MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE, /* 非法的数据值 */
MODBUS_EXCEPTION_SLAVE_OR_SERVER_FAILURE, /* 从站设备故障 */
MODBUS_EXCEPTION_ACKNOWLEDGE, /* ACK 异常 */
MODBUS_EXCEPTION_SLAVE_OR_SERVER_BUSY, /* 从站设备忙 */
MODBUS_EXCEPTION_NEGATIVE_ACKNOWLEDGE, /* 否定应答 */
MODBUS_EXCEPTION_MEMORY_PARITY, /* 内存奇偶校验错误 */
MODBUS_EXCEPTION_NOT_DEFINED, /* 未定义 */
MODBUS_EXCEPTION_GATEWAY_PATH, /* 网关路径不可用 */
MODBUS_EXCEPTION_GATEWAY_TARGET, /* 目标设备未能回应 */
MODBUS_EXCEPTION_MAX
};