# WebServer 修改调试计划

> 日期: 2026-07-14
> 基于: [WEBSERVER_COMPARISON.md](WEBSERVER_COMPARISON.md)

## 修改优先级

### 高优先级（必须修复 — M1, M2, M3）

#### 1. SBO 遥控流程 (M1)
**目标**: yk/ao/param 的 set 操作支持 SELECT→DIRECT 两阶段控制

**改动文件**: `src/system/libweb_server/src/ws_method.cpp`

**改动点**:
- `ws_sig_set_yk()`: 根据 `ctrl_type` 判断 `DIRECT_NORMAL` 直控或 `SBO_NORMAL` 选控
- `ws_sig_set_ao()`: 同上
- `ws_sig_set_param()`: 同上
- SBO 流程: 先 `DC_STEP_SELECT` → 再 `DC_STEP_DIRECT`

**调试方法**: 前端发送 yk/ao/param set 命令，确认 SBO 类型信号走 SELECT→DIRECT 流程

#### 2. dc_save_out_signals_xml (M2)
**目标**: datacenter out 命令执行后保存 XML

**改动文件**: `src/system/libweb_server/src/ws_method.cpp`（cmd 处理部分）

**改动点**:
- 在 `type=cmd` 处理中，当命令以 `datacenter` 开头且子命令为 `out`/`all` 时
- 调用 `dc_save_out_signals_xml()` 保存到 `config/SYSTEM/datacenter_out.xml`

**调试方法**: 前端执行 `datacenter out` 命令 → 检查 `config/SYSTEM/datacenter_out.xml` 是否生成

#### 3. ws_build_dc_data_json (M3)
**目标**: datacenter 命令执行后返回信号元数据 JSON

**改动文件**: `src/system/libweb_server/src/ws_method.cpp`

**改动点**:
- 新增函数 `ws_build_dc_data_json(types)` — 调用 `dc_get_signal_info_by_id` 遍历信号
- 在 `type=cmd` 处理中，datacenter 命令执行后调用此函数构建 JSON
- 通过 `ws_send_binary` 发送 dc_data JSON

**调试方法**: 前端执行 `datacenter all` 命令 → 检查返回的 JSON 是否包含 out/in/yk/ao/param 完整数据

### 中优先级（建议修复 — M4, M5）

#### 4. ws_send_large_text (M4)
**目标**: 大文本（>35KB）分片发送，防止 WS 帧溢出

**改动文件**: `src/system/libweb_server/src/ws_method.cpp` 和/或 `web_server.cpp`

**改动点**:
- 新增 `ws_send_large_text()` — 35KB 分片 `cmd_rsp_chunk` 消息
- `ws_cmd_exec()` 返回大字符串时使用分片发送代替二进制发送

**调试方法**: 执行产生大量输出的命令（如 datacenter all），检查前端是否收到分片

#### 5. AO/Param 元数据 (M5)
**目标**: JSON 中包含 min/max/step/unit 字段

**改动文件**: `src/system/libweb_server/src/ws_method.cpp` 的 `ws_make_sig_json`

**改动点**:
- AO 信号 JSON 增加 `min/max/step/unit` 字段
- 需要在信号结构中存储 `stru_signal_param` 或从 datacenter 查询

### 低优先级（可选 — M6）

#### 6. p_ctrl 伴随生命周期 (M6)
**改动文件**: `src/system/libweb_server/src/ws_method.cpp`

**改动点**: 信号结构体增加 `p_ctrl*`，add 时分配，del 时释放

## 测试方案

1. **启动 RTU**: `./RTU` 验证 webserver 正常启动
2. **浏览器连接**: `http://localhost:8080` → 终端页面
3. **测试命令**: 点击命令面板按钮执行各模块命令
4. **测试信号CRUD**: 通过前端数据页面添加/删除/修改信号
5. **测试SBO流程**: 通过前端修改 SBO 类型信号值
6. **测试大输出**: 执行 `datacenter all` 验证分片发送
