157 lines
7.9 KiB
Markdown
157 lines
7.9 KiB
Markdown
# Mimo RTU Project — AI Agent Instructions
|
||
|
||
## 📋 项目概览
|
||
|
||
**RTU (Remote Terminal Unit)** — 基于 IEC 61850 的智能通信网关,用于电力系统自动化。核心协议为 IEC 61850 MMS,同时支持 IEC 101/104 (ICP67)、Modbus、MQTT、WebSocket。
|
||
|
||
- **技术栈**: C/C++ (GCC/Linux ARM 交叉编译)
|
||
- **编译**: `./release/build.sh` (x86) 或 `./release/build.sh arm` (ARM 交叉编译)
|
||
- **运行**: `./test/RTU`
|
||
|
||
## 🏗 模块架构
|
||
|
||
```
|
||
src/
|
||
├── system/RTU/ # 主程序入口、CLI、自点表配置
|
||
├── system/libdatacenter/ # 数据中心(信号注册/变更检测/SBO控制/事件队列)
|
||
├── system/libcom_channel/ # 通信通道管理(TCP服务端/客户端、串口)
|
||
├── system/libweb_server/ # HTTP/WebSocket 服务器
|
||
├── system/libiec61850s/ # IEC 61850 MMS 服务端
|
||
├── system/libiec61850m/ # IEC 61850 MMS 客户端
|
||
├── system/libself_ptl/ # 自点表/自协议模块
|
||
├── system/libiec/ # IEC 基础协议库
|
||
├── system/libcom_decode/ # 通信解码库
|
||
├── system/libmodbus_m/ # Modbus 主站
|
||
├── system/libmodbus_s/ # Modbus 从站
|
||
├── protocol/libmms_s/ # MMS 服务端协议层
|
||
├── protocol/libmms_m/ # MMS 客户端协议层
|
||
├── protocol/libicp67/ # ICP67 协议(IEC 101/104 帧编解码)
|
||
├── protocol/libmongoose/ # Mongoose 嵌入式 Web 服务器
|
||
├── protocol/lib60870/ # IEC 60870 协议
|
||
├── protocol/libmodbus/ # Modbus 协议
|
||
├── public/libcomm/ # 统一通信抽象层(TCP/UART/UDP)
|
||
├── public/libtask/ # 任务/定时器调度库
|
||
├── public/libcmd/ # CLI 命令解析
|
||
├── public/libmy_mosquitto/ # MQTT 客户端
|
||
├── public/libcJSON/ # JSON 解析
|
||
├── public/libfunc/ # 工具函数库
|
||
└── public/libxml/ # XML 解析 (tinyxml2)
|
||
```
|
||
|
||
## 🔨 构建命令
|
||
|
||
| 命令 | 说明 |
|
||
|------|------|
|
||
| `./release/build.sh` | 本地 x86 编译 |
|
||
| `./release/build.sh arm` | ARM 交叉编译 → `release/arm/exe/RTU` |
|
||
| `make -C release` | 在 release 目录执行 make |
|
||
| `./test/RTU` | 运行 x86 编译产物 |
|
||
| VS Code Task `build-arm` | Ctrl+Shift+B 中选择 ARM 交叉编译 |
|
||
| VS Code Task `deploy-to-rk` | 编译+部署到 RK3568 `/mnt/RTU/` |
|
||
| VS Code F5 "ARM 编译+部署+调试" | 一键编译→部署→gdbserver→远程调试 |
|
||
|
||
## 📐 代码规范
|
||
|
||
### 风格
|
||
- **缩进**: Tab 字符(显示宽度 4)
|
||
- **括号**: Allman 风格 — 大括号独占一行
|
||
- **关键字括号间无空格**: `if(`, `for(`, `while(`, `switch(`
|
||
- **函数名后无空格**: `func(args)`
|
||
- **指针声明**: `type *name`(`*` 前有空格)
|
||
- **Yoda 条件**: `if(NULL == ptr)` 而非 `if(ptr == NULL)`
|
||
- **函数间空行**: 两行
|
||
|
||
### 命名
|
||
- 全局变量: `g_` 前缀
|
||
- 结构体: `stru_` 前缀
|
||
- 枚举: `enum_` 前缀 / `ENUM_` 值前缀
|
||
- 局部静态: `LOCAL` 宏(等价于 `static`)
|
||
|
||
### 错误处理
|
||
- 整数返回码: `0` 成功,`-1` 或非 0 表示失败
|
||
- 错误时记录 `LOG_E` 并返回错误码
|
||
|
||
### 日志
|
||
- `LOG_I()` / `LOG_E()` 宏(定义见 `release/inc/myLog.h`)
|
||
- `MY_LOG_*` 宏(定义见 `release/inc/myBase.h`)
|
||
|
||
## 📚 参考文档
|
||
|
||
| 文档 | 位置 |
|
||
|------|------|
|
||
| 项目记忆(架构/规则/决策) | [mimo/MEMORY.md](mimo/MEMORY.md) |
|
||
| 全局记忆(用户偏好) | [mimo/global-MEMORY.md](mimo/global-MEMORY.md) |
|
||
| 问题处理记录 | [mimo/问题处理文档.md](mimo/问题处理文档.md) |
|
||
| 模块分析文档 | [mimo/工程/](mimo/工程/) |
|
||
| 设计方案文档 | [mimo/plan/](mimo/plan/) |
|
||
| 中间修复文档 | [mimo/中间文档/](mimo/中间文档/) |
|
||
| IEC 61850 服务端手册 | [libiec61850/libiec61850手册/libiec61850_服务端开发手册.md](libiec61850/libiec61850手册/libiec61850_服务端开发手册.md) |
|
||
| IEC 61850 客户端手册 | [libiec61850/libiec61850手册/libiec61850_客户端开发手册.md](libiec61850/libiec61850手册/libiec61850_客户端开发手册.md) |
|
||
| 构建配置 | [release/linux.mk](release/linux.mk) |
|
||
| 公共头文件目录 | [release/inc/](release/inc/) |
|
||
| 模块分析文档生成技能 | [mimo/skills/模块分析文档生成/SKILL.md](mimo/skills/模块分析文档生成/SKILL.md) |
|
||
| RK3568 MCP 服务 | [../rk-mcp/src/index.ts](../rk-mcp/src/index.ts) |
|
||
| VS Code 调试配置 | [.vscode/launch.json](.vscode/launch.json) / [.vscode/tasks.json](.vscode/tasks.json) |
|
||
| Gitea Git 服务记忆 | [/memories/repo/gitea-config.md](/memories/repo/gitea-config.md) |
|
||
|
||
## ⚙️ 开发环境
|
||
|
||
- **环境类型**: WSL 2 (Ubuntu 24.04),与 Windows 共享固定 IP `198.120.10.240`
|
||
- **Gitea Git 服务**: `http://127.0.0.1:3000` | 局域网 `http://192.168.1.54:3000` | 管理员 `admin`/`admin123`
|
||
- **交叉编译器**: `/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu-*` (GCC 10.3.0, Buildroot 2018.02)
|
||
- **RK3568 目标机**: `root@198.120.0.100` (密码 `root`),目标路径 `/mnt/RTU/`
|
||
|
||
### RK3568 远程调试 (MCP 服务)
|
||
|
||
| 项目 | 值 |
|
||
|---|---|
|
||
| MCP 服务路径 | `/home/ypc/RTU/rk-mcp/dist/index.js` (Node.js) |
|
||
| MCP 配置 | `.vscode/mcp.json` → `rk-mcp` 服务 |
|
||
| 可用工具 | `rk_check` `rk_deploy` `rk_gdbserver_start` `rk_gdbserver_stop` `rk_shell` |
|
||
| SSH 包装 | `~/.ssh/rk_ssh` `~/.ssh/rk_scp` (sshpass 封装) |
|
||
|
||
**调试流程**: `./release/build.sh arm` → F5 选 "ARM 编译+部署+调试 (RK3568)" → 自动 scp → gdbserver :2345 → GDB 连接
|
||
|
||
**launch.json 提供 4 个调试配置**: 本地 x86(编译/不编译)、ARM 远程(编译+部署/纯调试)
|
||
|
||
## ⚠️ 注意事项
|
||
|
||
1. **交叉编译依赖**: `release/linux.mk` 引用 `/opt/atk-dlrk356x-toolchain/bin`,需保证工具链存在
|
||
2. **Web 资源打包**: 构建流程中的 `pack_web.sh` 会打包 web 资源到可执行文件中,不可跳过
|
||
3. **代码风格严格**: 修改代码时必须遵循上述规范(Tab/Allman/Yoda),否则可能导致审查问题
|
||
4. **多线程安全**: 大量使用多线程(9 个应用线程),修改时需注意竞态条件
|
||
5. **C 风格内存管理**: 使用 `malloc`/`free`,需注意空指针检查和释放时机
|
||
6. **第三方依赖**: mongoose、cJSON、mosquitto、tinyxml2、libiec61850 是关键依赖
|
||
7. **RK3568 使用 dropbear SSH**,不支持 OpenSSH 密钥认证;使用 `sshpass -p 'root' ssh` 连接
|
||
|
||
## 🔄 工作流程规则
|
||
|
||
以下规则是每次交互必须遵守的工作流程,优先级高于其他指令。
|
||
|
||
### 1. 语言
|
||
全部对话、思考过程(`thinking`)、输出内容均使用中文显示。代码本身(变量名、函数名、关键字)保持英文。
|
||
|
||
### 2. 问题处理 → 记录文档
|
||
每次解决 Bug 或问题后,将**问题现象、原因分析、解决方案**追加到 `mimo/问题处理文档.md`,保留原有内容不覆盖。
|
||
|
||
### 3. Plan 计划 → 形成文档
|
||
制定并执行 Plan 解决问题后,将 Plan 内容整理为文档存入 `mimo/plan/` 或 `mimo/中间文档/` 目录。文件命名需体现内容主题。
|
||
|
||
### 4. 模块分析 → 形成文档
|
||
每次深入读取/分析某个模块后,将分析结果整理为文档存入 `mimo/工程/` 目录。文档应包含模块职责、核心接口、关键逻辑、数据流等。
|
||
|
||
### 5. C/C++ 代码调整 → 编译确认
|
||
修改 C/C++ 代码后,必须执行 `./release/build.sh`(x86)进行编译验证,确认无编译错误。如果编译失败,应立即修复。
|
||
|
||
### 6. 前端代码调整 → 浏览器验证
|
||
修改 Web 前端代码(`web_root/` 目录下的 HTML/CSS/JS)后,应使用浏览器打开查看效果,确认界面显示正确。
|
||
|
||
### 7. 文档目录继承
|
||
严格遵守现有的文档目录结构:
|
||
- `mimo/问题处理文档.md` — 问题处理记录
|
||
- `mimo/工程/` — 模块分析文档
|
||
- `mimo/plan/` — 设计方案文档
|
||
- `mimo/中间文档/` — 中间修复文档
|
||
- `mimo/skills/` — 技能文档
|
||
后续新增文档按此规则归类存放,不随意创建新的根级目录。
|