一. 了解 Modbus

1. 按键与灯的操作
- 按键是只读的,只能输入,不能输出。
- 灯则是可读可写,数据和灯一样只有一位。

扩展一下,就是这个意思。

2. 寄存器分类及操作
- Modbus 抽象为四类寄存器。
- 操作流程包括:
- 选择寄存器类别
- 指定寄存器地址
- 执行读取或写入操作
- 写入时需提供 value,读取时需获得返回值。

3. Modbus 结构与设备访问
- Modbus 是一主多从结构。
- 必须明确要访问的设备,因此数据中需包含设备地址。

4. 数据包结构总结
发送的数据包含:
- Dev(设备地址)
- 寄存器类别
- reg_addr(寄存器地址)
- r/w(读写标志)
- value(根据寄存器类别决定是1bit还是16bit)

5. Modbus 协议解析
- 设备地址用于识别目标设备。
- 功能代码决定操作类型(读/写,寄存器类别)。
- 数据包中包含寄存器地址 rdg_addr 和数据本身。
- 校验码用于数据完整性校验。
- 主机发送数据,从机解析并回应自身地址。

6. 数字域与寄存器状态
- 数字域字节数为5,表示有5字节。
- 示例:数据1是 0x53,二进制 0101 0011,最末尾的1表示起始寄存器的值。

- 假设要读取 0x13(十进制19)寄存器的值,即第19个寄存器。

- 返回字节中,第一个数据的 bit0 就是第19个寄存器的状态,后续依次为第20、21等。
- 读取多少个寄存器,就会返回多少位数据。
二. libmodbus


1. 源码与核心机制
- 这就是我们源码和其分析,也是 modbus 的核心机制。

2. RTU 与 TCP 实现
- RTU 使用串口实现 modbus。
- TCP 使用网络实现 modbus。

3. 底层程序与统一接口
- 有两个底层程序,希望通过统一接口选择串口或网络方式。
- data.c 为辅助函数,不在应用程序中,可用于设置数据。

4. modbus.c 函数解析

- 部分寄存器为只读。

- 写寄存器:bit 是写单个寄存器,bits 是写多个寄存器。
- 这些函数用于读单个位的寄存器。

- 还可读取多个位的寄存器。

- 写寄存器操作同样适用。

5. 消息发送与结构体 backend
- 发送消息时涉及一个重要结构体:backend。

- backend 是 modbus 的后端结构体。

- 发送消息前需做准备工作。

- 根据串口或网络方式分别发送消息。

- 读取串口或网络数据。

- 涉及硬件操作时,将其抽象为结构体,这是面向对象编程方法。

- 网络发送与接收操作。

6. 系统支持
- 支持 Windows 和 Linux。
- Linux 使用 write 函数发送数据,Windows 使用 write file 发送数据。