7.9 KiB
7.9 KiB
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/global-MEMORY.md |
| 问题处理记录 | mimo/问题处理文档.md |
| 模块分析文档 | mimo/工程/ |
| 设计方案文档 | mimo/plan/ |
| 中间修复文档 | mimo/中间文档/ |
| IEC 61850 服务端手册 | libiec61850/libiec61850手册/libiec61850_服务端开发手册.md |
| IEC 61850 客户端手册 | libiec61850/libiec61850手册/libiec61850_客户端开发手册.md |
| 构建配置 | release/linux.mk |
| 公共头文件目录 | release/inc/ |
| 模块分析文档生成技能 | mimo/skills/模块分析文档生成/SKILL.md |
| RK3568 MCP 服务 | ../rk-mcp/src/index.ts |
| VS Code 调试配置 | .vscode/launch.json / .vscode/tasks.json |
| Gitea Git 服务记忆 | /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 远程(编译+部署/纯调试)
⚠️ 注意事项
- 交叉编译依赖:
release/linux.mk引用/opt/atk-dlrk356x-toolchain/bin,需保证工具链存在 - Web 资源打包: 构建流程中的
pack_web.sh会打包 web 资源到可执行文件中,不可跳过 - 代码风格严格: 修改代码时必须遵循上述规范(Tab/Allman/Yoda),否则可能导致审查问题
- 多线程安全: 大量使用多线程(9 个应用线程),修改时需注意竞态条件
- C 风格内存管理: 使用
malloc/free,需注意空指针检查和释放时机 - 第三方依赖: mongoose、cJSON、mosquitto、tinyxml2、libiec61850 是关键依赖
- 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/— 技能文档 后续新增文档按此规则归类存放,不随意创建新的根级目录。