diff --git a/.gitignore b/.gitignore index 0732768..b4d03ea 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ *.pdb *.idb *.gch +RTU # 编译临时目录 obj/ @@ -28,5 +29,8 @@ release/inc/ # AI 工具 CLAUDE.md -# docs/ + +# 自动生成文件 +config/SYSTEM/datacenter_out.xml +docs/ libiec61850/libiec61850手册/ \ No newline at end of file diff --git a/COMPLETION.md b/COMPLETION.md index c36bccf..5561914 100644 --- a/COMPLETION.md +++ b/COMPLETION.md @@ -1,6 +1,6 @@ # RTU_ALL_AI 开发完成事项清单 -> 日期: 2026-07-10 +> 日期: 2026-07-13 --- @@ -70,6 +70,15 @@ | EV_STOP 补全 | `self_ptl` + `com_router` + `modbus_m`(3模块) | ✅ | | libiec 模块文档 | `docs/system/libiec/`(待补) | ⬜ | +## 阶段 2:v3.2 WSL 本地测试准备(2026-07-13) + +| 任务 | 模块 | 状态 | +|------|------|:----:| +| 新增 tcp_client 通道解析 | `com_router` — JSON 解析 + 默认配置支持 COMM_TYPE_TCP_CLIENT | ✅ | +| 新增 FTU 网口通道配置 | `config/CHANNEL/channel_cfg.json` — tcp_ftu (127.0.0.1:54321 TCP 客户端) | ✅ | +| 编译脚本增强 | `release/build.sh` — 编译前删除旧 RTU, 编译后拷贝到 config 同级目录 | ✅ | +| x86 编译验证 | 全量编译通过, RTU 可正常启动到 RTU> 提示符 | ✅ | + ## 阶段 3:系统集成 ## 阶段 3:系统集成 diff --git a/PLAN.md b/PLAN.md index 905a750..fe93324 100644 --- a/PLAN.md +++ b/PLAN.md @@ -294,7 +294,7 @@ int my_module_do_something(uint32_t id, const char *data); | 4.3 | IEC 61850 MMS 从站 | `libmms_s` + `libiec61850s` | ⬜ | | 4.4 | 嵌入式 HTTP 服务 | `libmongoose` | ✅ | | 4.5 | MQTT 客户端 | `libmy_mosquitto` | ⬜ | -| 4.6 | PLC 逻辑引擎 | `libplc` | ⬜ | +| 4.6 | PLC 逻辑引擎 | `libplc` | ✅ | | 4.7 | 内部自定义协议 | `libself_ptl` | ✅ | --- diff --git a/docs/system/libweb_server/FEATURE_INVENTORY.md b/docs/system/libweb_server/FEATURE_INVENTORY.md new file mode 100644 index 0000000..f602a58 --- /dev/null +++ b/docs/system/libweb_server/FEATURE_INVENTORY.md @@ -0,0 +1,630 @@ +# RTU Web 前端功能详细清单 + +> 基于原工程 packed_fs.c 完整分析 +> 分析日期: 2026-07-10 +> 重构目标: 海外项目级工业品质 Web 管理界面 + +--- + +## 一、架构总览 + +| 项目 | 原实现 | 重构方案 | +|------|--------|---------| +| 类型 | Hash-based SPA | 同架构 (零依赖, 纯 HTML+CSS+JS) | +| 路由 | `window.location.hash` | 同 | +| 通信 | WebSocket (ws://0.0.0.0:8080/ws) | 同 | +| 图标 | Emoji | → SVG 图标 (Lucide Icons) | +| 样式 | 自定义 CSS | → 暗色工业主题 + CSS 变量系统 | +| 静态服务 | Mongoose packed_fs | → `mg_http_serve_dir` 从磁盘服务 | +| 文件数 | 8 个嵌入文件 | → 单文件 SPA (index.html 内嵌全部 CSS+JS) | + +--- + +## 二、页面清单 (12 页) + +### 2.1 登录页 (`#login`) +- 账号/密码输入框 +- 登录按钮 → 设置 `localStorage.rtu_logged_in` +- 所有非登录页须先验证登录状态 +- 已登录时访问 login → 自动跳转 dashboard + +### 2.2 仪表盘 (`#dashboard`) +- **信号导航卡片**: 5 张卡片 (out / in / yk / ao / param), 显示每种信号已注册数量 +- **批量 XML 导入/导出**: + - 导出: 将所有信号导出为一个 XML 文件 (按 type 分组) + - 导入: 选择 XML 文件, 按 type 批量执行 add 请求 +- **实时连接状态**: WebSocket 连接指示器 (绿色/红色圆点) + +### 2.3 开出信号 (`#out`) +- 信号注册表 (表格): saddr / desc / type / value +- **添加**: 弹出表单 (saddr, desc, data_type 下拉选择) +- **编辑**: 行内修改按钮 → 弹出 +- **删除**: 单选 + 批量勾选删除 +- 实时值刷新 (来自 WebSocket 推送) + +### 2.4 开入信号 (`#in`) +- 链接信号表: saddr / desc / link_saddr / type / value +- **添加**: saddr, desc, link_saddr (链接目标) +- **删除**: 单选 + 批量 +- 只读显示 (值来自链接的 out 信号) + +### 2.5 遥控 (`#yk`) +- 遥控信号表: saddr / desc / type / ctrl_type / value +- **添加**: saddr, desc, type, ctrl_type (直控=0 / 选控=1) +- **控制操作**: set 按钮 → 输入值 → 发送 set 命令 +- **删除**: 单选 + 批量 + +### 2.6 参数 (`#ao`) +- 参数信号表: saddr / desc / type / ctrl_type / value / min / max / step / unit +- **添加**: 含元数据字段 (min/max/step/unit) +- **修改**: set 按钮 +- 支持下拉选择值 (val 数组) +- **删除**: 单选 + 批量 + +### 2.7 定值 (`#param`) +- 定值信号表: saddr / desc / type / ctrl_type +- **展开行**: 点击展开, 显示多定值区子表 +- 每区: 区号 / 值 / 修改按钮 +- **添加**: 含 ctrl_type + +### 2.8 数据中心 (`#datacenter`) +- 信号类型标签栏切换 (out/in/yk/ao/param) +- 表格: saddr / desc / type / value / 操作 +- 所有信号类型的统一浏览视图 +- 支持 set 操作 + +### 2.9 PLC 调试 (`#plc_debug`) +- 显示所有 out 信号 +- saddr / desc / value 表 +- 实时刷新 (来自 WebSocket 推送) +- 用于调试 PLC 逻辑输出 + +### 2.10 PLC 逻辑配置 (`#plc_config`) +- **Canvas 图形编辑器** (原工程最复杂功能): + - 拖拽节点 (Gate/Input/Output) + - 连线编辑 + - 双击节点编辑属性 + - XML 保存/加载 +- 重构方案: 保留功能, 重构 UI + +### 2.11 实时监控 (`#monitor`) +- WebSocket 消息实时环形缓冲区 +- 15 分钟 TTL / 500 条上限 +- 消息方向: ↑ (发送) / ↓ (接收) +- 实时滚动显示 +- JSON 格式化预览 + +### 2.12 命令终端 (`#terminal`) +- 仿真终端样式 (黑底绿字) +- 命令输入框 +- stdout 实时输出 (WebSocket Binary 帧) +- 命令列表标签 (get_cmds) +- 历史命令支持 + +--- + +## 三、WebSocket 协议 + +### 客户端 → 服务端 + +| 消息类型 | JSON | 说明 | +|---------|------|------| +| 信号 CRUD | `{saddr, signal_type, curd, signal_data, setting_zone}` | add/del/set | +| 命令执行 | `{type:"cmd", data:"command args"}` | 远程命令 | +| 获取命令列表 | `{type:"get_cmds"}` | 用于终端 Tab 补全 | + +### 服务端 → 客户端 + +| 消息类型 | JSON | 说明 | +|---------|------|------| +| 信号推送 | `{out:[...], in:[...], yk:[...], ao:[...], param:[...]}` | 增量 (仅变化) | +| 命令输出 | Binary frame (stdout) | 命令 stdout | +| 命令列表 | `{type:"cmd_list", cmds:[{name,desc},...]}` | 命令补全数据 | +| 异步输出 | `{type:"async_output", module, data, success, msg}` | 异步命令结果 | + +### 推送消息结构 + +```json +{ + "out": [{"saddr":"x", "desc":"x", "type":"int", "val":"123"}], + "in": [{"saddr":"x", "desc":"x", "type":"float", "val":"3.14"}], + "yk": [{"saddr":"x", "desc":"x", "type":"int", "val":"0", "ctrl_type":1}], + "ao": [{"saddr":"x", "desc":"x", "type":"float", "val":"5.0", "ctrl_type":0}], + "param": [{"saddr":"x", "desc":"x", "type":"int", "ctrl_type":0, + "setting_zone_list":[{"id":"0","val":"100"}, ...]}] +} +``` + +--- + +## 四、导航结构 + +``` +┌──────────┐ +│ Logo │ RTU Web Manager +│ Status │ ● Connected / ○ Disconnected +├──────────┤ +│ 📊 Dashboard │ +│ 📡 Out 信号 │ +│ 🔗 In 信号 │ +│ ⚡ YK 遥控 │ +│ 🎚️ AO 参数 │ +│ ⚙️ Param 定值 │ +│ 📋 Datacenter │ +│ 🔌 PLC Debug │ +│ 🧩 PLC Config │ +│ 📈 Monitor │ +│ 💻 Terminal │ +└──────────┘ +``` + +左侧固定导航栏 (220px), 右侧主内容区 +响应式: 移动端隐藏侧栏 + +--- + +## 五、重构设计参数 + +| 参数 | 选择 | +|------|------| +| 风格 | 暗色工业主题 (Dark Industrial Dashboard) | +| 主色调 | Cyan/Teal accent (#00E5FF / #1DE9B6) | +| 背景 | #0F1923 (deep navy) / #1A2332 (card bg) | +| 字体 | Inter (标题) + JetBrains Mono (数据/终端) | +| 图标 | Lucide SVG inline (通过 CDN) | +| 圆角 | 8px (卡片), 6px (按钮), 4px (输入框) | +| 间距 | 8px 基础网格 | +| 动画 | 150-300ms ease-out transitions | +| 图表 | Canvas 手写轻量图表 (实时监控页) | + +--- + +## 六、文件结构 (重构后) + +``` +src/system/libweb_server/ +├── inc/ +│ └── web_server.h # 头文件 (无需修改) +└── src/ + ├── web_server.cpp # +static file serving (mg_http_serve_dir) + └── ws_method.cpp # 已有, 无需修改 + +web/ # 新建: 前端静态文件目录 +└── index.html # 单文件 SPA (全部 CSS+JS 内嵌) + ├── + ├── +``` + +--- + +## 七、实现优先级 + +| 优先级 | 页面 | 理由 | +|--------|------|------| +| P0 | index.html 壳 + 登录 + 仪表盘 + 导航 | 基础框架 | +| P0 | WsClient + SignalStore | 通信基础 | +| P1 | Out / In 信号管理 | 核心 CRUD | +| P1 | YK / AO / Param 管理 | 完整信号类型 | +| P2 | Datacenter 统一浏览 | 数据汇总 | +| P2 | Monitor 实时监控 | 调试利器 | +| P2 | Terminal 命令终端 | 远程管理 | +| P3 | PLC Debug / PLC Config | 高级功能, Canvas 编辑器较复杂 | + + +--- + +## 八、重构实现 vs 原规格详细对比分析 + +> 分析日期: 2026-07-10 +> 对比维度: 架构 / 页面 / 功能 / 样式 / 协议 / 后端对齐 + +--- + +### 8.1 架构对比 + +```mermaid +graph TB + subgraph 原规格FEATURE_INVENTORY + A1["单文件 SPA
index.html 内嵌全部 CSS+JS"] + A2["CDN 加载 Lucide Icons"] + A3["单文件内分模块
WsClient/MonitorRing/App/SignalStore/Pages.*/UI.*"] + end + subgraph 当前实现web/ + B1["多文件 SPA
index.html + 15 JS + 1 CSS"] + B2["内联 SVG Icons
Icon._map 18个Lucide图标"] + B3["独立文件模块
ws-client/signal-store/router/ui/i18n
+ 8个pages/*.js"] + end + A1 -->|"❌ 不一致"| B1 + A2 -->|"⚠️ 变体实现"| B2 + A3 -->|"✅ 架构对齐"| B3 +``` + +| 维度 | 原规格 (FEATURE_INVENTORY) | 当前实现 (web/) | 状态 | +|------|--------------------------|-----------------|:---:| +| **文件架构** | 单文件 SPA (index.html 内嵌) | 多文件 (1 HTML + 1 CSS + 13 JS) | ❌ 偏离 | +| **图标方案** | CDN 加载 Lucide Icons | 内联 SVG 字符串 (ui.js `Icon._map`) | ⚠️ 变体 | +| **路由方案** | `App` 对象管理路由 | `Router` 全局对象 (router.js) | ✅ 对齐 | +| **通信层** | `WsClient` 对象 | `WsClient` 全局对象 (ws-client.js) | ✅ 对齐 | +| **数据层** | `SignalStore` 对象 | `SignalStore` 全局对象 (signal-store.js) | ✅ 对齐 | +| **样式方案** | 单文件内嵌 `