RTU/AGENTS.md

130 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 交叉编译 |
| `make -C release` | 在 release 目录执行 make |
| `./test/RTU` | 运行编译产物 |
## 📐 代码规范
### 风格
- **缩进**: 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) |
## ⚠️ 注意事项
1. **交叉编译依赖**: `release/linux.mk` 引用了本地交叉工具链路径(`GCCLIB_PATH`),不同主机可能需要调整
2. **Web 资源打包**: 构建流程中的 `pack_web.sh` 会打包 web 资源到可执行文件中,不可跳过
3. **代码风格严格**: 修改代码时必须遵循上述规范Tab/Allman/Yoda否则可能导致审查问题
4. **多线程安全**: 大量使用多线程9 个应用线程),修改时需注意竞态条件
5. **C 风格内存管理**: 使用 `malloc`/`free`,需注意空指针检查和释放时机
6. **第三方依赖**: mongoose、cJSON、mosquitto、tinyxml2、libiec61850 是关键依赖
## 🔄 工作流程规则
以下规则是每次交互必须遵守的工作流程,优先级高于其他指令。
### 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/` — 技能文档
后续新增文档按此规则归类存放,不随意创建新的根级目录。