第一部分:理论模型回顾
在深入代码之前,必须理解 libmodbus 要实现的理论模型。
1. ADU 与 PDU:协议的分层
- PDU (协议数据单元):Modbus 协议的核心,与具体网络无关。包含两部分:功能码 + 数据。功能码指定操作(如读线圈),数据区提供参数(地址、数量)。
- ADU (应用数据单元):实际网络上传输的完整数据包。在 PDU 基础上根据网络类型增加包装。
- 串口 (RTU):PDU 前加从站地址,后加CRC 校验码。
- 以太网 (TCP):PDU 前加MBAP 头(含事务 ID、协议标识、长度等)。
- 软件库的任务:libmodbus 自动完成 PDU 到 ADU 的打包和解包。
2. 事务处理模型:通信的流程
- **客户端/服务器(主站/从站)**模型。
- 主站(客户端):发起请求(含地址、功能码、数据)。
- 从站(服务器):接收请求 -> 执行操作 -> 返回响应(含地址、功能码、结果数据)。
- 异常处理:若出错,从站返回异常响应(功能码最高位置 1,附带错误码)。
- 软件库的任务:封装建立连接、发送请求、接收并解析响应的流程。
第二部分:代码框架与初始化
3. 库的初始化与连接建立
modbus_new_tcp:用于网络通信,参数为 IP 地址和端口号(通常 502)。modbus_new_rtu:用于串口通信,参数为设备名、波特率、校验位、数据位、停止位。- 返回值
ctx:modbus_t类型的指针,即 Modbus 连接句柄。后续所有操作(读、写、设置)均通过此句柄进行。 - 配置参数:
modbus_set_debug(ctx, TRUE):开启调试模式,打印原始字节数据。modbus_set_slave(ctx, 1):仅 RTU 模式有效,设置目标从站地址。
- 建立连接:调用
modbus_connect(ctx)。TCP 连接目标服务器,RTU 打开串口设备。失败返回 -1。
总结:标准编程开头——创建上下文 (modbus_new_*) -> 配置参数 (modbus_set_*) -> 建立连接 (modbus_connect)。
选择后端:libmodbus 支持多种通信方式(RTU 串口、TCP 网络)。需通过分支逻辑选择。
if (use_backend == TCP) {
ctx = modbus_new_tcp("192.168.1.100", 502);
} else {
ctx = modbus_new_rtu("/dev/ttyUSB0", 115200, 'N', 8, 1);
}


