38 lines
2.0 KiB
Markdown
38 lines
2.0 KiB
Markdown
|
|
# Modbus RTU 协议模块(`modbusrtu`)
|
|||
|
|
|
|||
|
|
本目录实现 **Modbus RTU** 的成帧、编解码与解析插件,供守护进程静态编译与 `plugins/protocols/modbus_rtu` 动态库(`.so`)共用同一套源码。
|
|||
|
|
|
|||
|
|
## 目录结构
|
|||
|
|
|
|||
|
|
| 子目录 | 职责 |
|
|||
|
|
|--------|------|
|
|||
|
|
| `types/` | PDU 数据模型:`ModbusRtuPdu` 及各类请求/响应结构体,供编解码与 `ProtocolEnvelope` 使用。 |
|
|||
|
|
| `codec/` | ADU 与 `ModbusRtuPdu` 的互转:`decodeModbusRtu` / `encodeModbusRtu`(依赖 `types` 与 `framer` 中的 CRC 等工具函数)。 |
|
|||
|
|
| `framer/` | 字节流成帧:`ModbusRtuFraming`(长度预测、CRC)、`ModbusRtuFramerPlugin`(Stage1 插件会话)。 |
|
|||
|
|
| `parser/` | Stage2 协议插件:`ModbusRtuProtocolPlugin`,将完整帧解析为 `ProtocolEnvelope` / 兼容 JSON。 |
|
|||
|
|
|
|||
|
|
## 依赖方向(建议遵守)
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
types (无本模块内依赖)
|
|||
|
|
↑
|
|||
|
|
codec、framer (可依赖 types;codec 使用 framer 中的 crc16/crcOk)
|
|||
|
|
↑
|
|||
|
|
parser (依赖 codec、types;不反向依赖 framer 插件类)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
成帧与解析在流水线中分属不同阶段;**解析侧只应处理 `CompleteFrame`**,与 `PipelineContext::frameKind` 约定一致。
|
|||
|
|
|
|||
|
|
## 与动态库的关系
|
|||
|
|
|
|||
|
|
- 动态库入口:`plugins/protocols/modbus_rtu/plugin_stub.cpp`,导出 `softbus_create_protocol_plugin` / `softbus_create_framer_plugin` 等符号。
|
|||
|
|
- 主工程 `CMakeLists.txt` 同样列出本目录下源文件,用于无 `.so` 时的内置链接;路径与 include 均以 `plugins/protocols/modbusrtu/...` 为准。
|
|||
|
|
|
|||
|
|
## 配置提示
|
|||
|
|
|
|||
|
|
在 `daemon_config.json` 的 `plugins.framers` 中配置 `libmodbus_rtu.so` 路径即可加载成帧插件;解析插件加载方式与 `PluginHost` / 工程内注册逻辑一致。
|
|||
|
|
|
|||
|
|
## 扩展其它协议时的参考
|
|||
|
|
|
|||
|
|
新增协议(如 Modbus TCP、CANopen)时,建议沿用类似分层:**types → codec/framer → parser**,并在各自 `plugin_stub` 中导出统一 ABI 工厂函数,由 `PluginHost` 注册到 `PluginManager`。
|