feat(ui)+chore(docs): UI 补齐清单清空;数据可信销项与「卡」号清退
本笔含两组收尾工作(同一工作区内交错在 6 个共享文档/门禁配置里, 拆开会产生"文档声称的页数与树里黄金数不一致"的中间提交,故合为一笔): 一、UI 补齐(清单清空) - 新建 6 个内容页模块:ui_page_accident / oper / alarm / start / yk 复用 ui_w_records 共享组件(分页、空态"无记录"、按实例读盘缓存), 记录层与五个写入点已由道F task-10 / 道G task-12 落地,本批只补页面; ui_page_runreport 为 13 行 2 页只读统计,四个数逐个挂范围标签 (自电池周期 / 本次开机),boot_ready=0 显 "--" 不显 0。 - 数据面:ui_data_info_t 尾部追加 9 字段,ui_data_feed 用 boot_stats_get() + iec104_serv_get_stats() 纯搬运;模拟器填确定值假数据 (差异登记 docs/测试说明/模拟器差距清单.md §2.3 两行)。 - 接线:菜单树 6 叶绑 #page=,绑定叶 22→28、UI_PAGE_MAP_COUNT=28; 字库 185→218 字 / 280→313 字形;双端注册 uvprojx +30、CMakeLists +6。 - 回归:内容页黄金 53→60(含 runreport_p2 真拍第 2 页),文本断言 425 正向 / 36 反向;存量 53 张逐字节零漂移;记录 5 页各用独立空目录 (模拟器把操作留痕写进 cwd 的 sim_oper.log,共用 tmp 会让空态拍不到)。 二、数据可信销项 + 「数据可信」任务卡号整族清退 - 删除已闭环的"已知电压注入验证"行与闭环结论块(证据在 docs/硬件平台/ADC通道映射说明.md §8.1 与 docs/测试说明/ADC前端注入验证流程.md §5~§7),§5 标识列改语义短语。 - 卡 0/0b/1~12 共 14 个号全仓 288 站点 / 56 文件清退成语义短语, 代码注释、测试、门禁配置与文档一并改;换算表入 docs/编号规范.md §9.3。 这一族是中文前缀,不进 check_ids 语料,刻意不入 id_aliases.json。 验证(实测) - @build 0 错 0 警:Code=236456 RO=28124 RW=1876 ZI=137084; RAM +464 B(RW +304 / ZI +160),RW_IRAM1 62.2% / RW_CCM 87.9%, 体积同码凭证与 RAM 台账已回填。 - check_menu_rows 8 状态 rc=0(池 5368/5448 常量未动); check_content_pages 60 页 rc=0;check_font_charset / registration / coding-standard / bom-drift / mojibake / doc-links --all / layer-deps / nested-comment 全 rc=0;check_ids --strict 无错误;主机单测 ui_data 295 / boot_stats 21 / sys_log_mcu 141 / soe 32 / soe_store 27。 未做(不是遗漏) - 六页真机判据(真记录翻页、掉电保持、清除后归零、boot_count 自增、 拔 RTC 电池落 RESTARTED、IWDG 复位落 rst_cause、主站连一次 conn_up+1) 已登记 docs/任务规划/登记簿.md §7;模拟器结构上照不到。 - docs/产品需求/产品需求设计文档.md 属另一条在飞改动,本笔不含; 其中我已同步 6 处现状数字(28 叶 / 60 页 / 218 字),随该笔入库。
This commit is contained in:
+2
-2
@@ -122,7 +122,7 @@ docs/
|
||||
| [`链路延迟测试说明.md`](测试说明/链路延迟测试说明.md) | 网络链路时延分段定义、判定基线、执行流程 |
|
||||
| [`模拟器差距清单.md`](测试说明/模拟器差距清单.md) | **PC 模拟器 vs 真机差距登记册**(L3 门禁可信度依据;改动涉及网络/日志/硬件层前必查 §3 决策规则) |
|
||||
| [`实机测试实施指南.md`](测试说明/实机测试实施指南.md) | **上板(真机)测试执行流程**(按顺序:环境预检 → `@test`+自检判定 → IWDG 注入/长跑 → 堆告警 → GD5F 错误通道 → 网络基线 → 工程卫生;每步含判据/命令/状态);已完成事项证据去向见 §10 |
|
||||
| [`ADC前端注入验证流程.md`](测试说明/ADC前端注入验证流程.md) | **ADC 前端与两片转换器的台架注入验证**(`docs/任务规划/数据可信.md` 卡 0 的执行侧):注入点清单 / 期望码值表 / 零点·线性·映射·极性·节奏五步(每步自带现场记录表,边做边填);**不需示波器与信号源**,一块万用表即可 |
|
||||
| [`ADC前端注入验证流程.md`](测试说明/ADC前端注入验证流程.md) | **ADC 前端与两片转换器的台架注入验证**(已知电压注入验证的执行侧,实测证据 → `docs/硬件平台/ADC通道映射说明.md` §8.1):注入点清单 / 期望码值表 / 零点·线性·映射·极性·节奏五步(每步自带现场记录表,边做边填);**不需示波器与信号源**,一块万用表即可 |
|
||||
|
||||
**主机侧单元测试(L0.5)**
|
||||
|
||||
@@ -241,7 +241,7 @@ docs/
|
||||
|
||||
| 位置 | 内容 |
|
||||
|---|---|
|
||||
| [`任务规划/`](任务规划/README.md) | **统一待办入口(6 个文件)**:`README.md` = 现在做什么与全项目顺序;`UI补齐.md` = 当前唯一执行清单;`登记簿.md` = 后续任务、外部窗口与长期观察;`数据可信.md` = 三项阻塞任务及代码引用的设计约束;`暂缓-RS485.md` 与 `测试与架构专项.md` = 两个专项。完成即删,重复内容只保留一个归属 |
|
||||
| [`任务规划/`](任务规划/README.md) | **统一待办入口(6 个文件)**:`README.md` = 现在做什么与全项目顺序;`UI补齐.md` = 当前唯一执行清单;`登记簿.md` = 后续任务、外部窗口与长期观察;`数据可信.md` = 两项阻塞任务及代码引用的设计约束;`暂缓-RS485.md` 与 `测试与架构专项.md` = 两个专项。完成即删,重复内容只保留一个归属 |
|
||||
| `硬件平台/` | 网表详细分析报告与语义图(V0.0 / V0.1);**[`ADC通道映射说明.md`](硬件平台/ADC通道映射说明.md)——V0.1 十七路 ADC 语义/网名/通道号权威映射表(固件取数、UI 显示、自检注入以此为准)** |
|
||||
| `芯片手册/` | 外部芯片数据手册转录(CH395F / GD5F2GQ5UE / SD2506 / TPAFE5160 / RTL8305NBI 等) |
|
||||
| `images/` | 文档技术配图(`.svg` 产物,由 `tools/arch_diagram/`、`tools/refgraph/` 生成) |
|
||||
|
||||
@@ -55,7 +55,7 @@ scanned 13 files; unique non-ASCII chars: 78
|
||||
-> D:\Code\DTU Code\STM32F4-Base\ui_cn_chars.txt
|
||||
```
|
||||
|
||||
产物 `ui_cn_chars.txt` 为本工程实际显示的汉字清单(当前 183 字,含 ▶/,/: 等符号;其中 60 字为 2026-10-25 按页面扩充规划显示串预置,同日道E 落 SOE 记录显示名映射时新用 采/样/恢/效 4 字;清单里源码暂未在用的字由 font-charset 门禁记 WARN 放行),可留作字符集记录。
|
||||
产物 `ui_cn_chars.txt` 为本工程实际显示的汉字清单(当前 218 字,含 ▶/,/: 等符号;2026-10-28 UI 补齐批「记录 5 页 + 运行报告」+33 字,185→218——本行旧数 183 是未回填的历史值,改前实测 185;其中 60 字为 2026-10-25 按页面扩充规划显示串预置,同日道E 落 SOE 记录显示名映射时新用 采/样/恢/效 4 字;清单里源码暂未在用的字由 font-charset 门禁记 WARN 放行),可留作字符集记录。
|
||||
|
||||
---
|
||||
|
||||
@@ -85,9 +85,9 @@ npm i -g lv_font_conv # TTF/OTF -> LVGL 字体 离线转换器
|
||||
```
|
||||
extracted SimSun regular (face0) -> C:\Users\...\Temp\simsun_regular.ttf
|
||||
RUN: lv_font_conv.cmd --font ... --size 12 --bpp 1 -r 0x20-0x7E --symbols ... --no-compress --format lvgl --lv-font-name ui_font_cn_12 -o ...\ui_font_cn_12.c
|
||||
已合并箭头 U+25B6:位图+10 字节,glyph_id=274
|
||||
已合并箭头 U+25B6:位图+10 字节,glyph_id=313
|
||||
U+FF0C ',' 已可经既有 cmap 解析,跳过合并
|
||||
OK 58192 bytes -> ...\Drivers\BSP\UI\ui_font_cn_12.c
|
||||
OK 67325 bytes -> ...\Drivers\BSP\UI\ui_font_cn_12.c
|
||||
```
|
||||
|
||||
> **▶ 箭头自动合并**:宋体(`simsun.ttc`)没有 U+25B6(▶)字形,`lv_font_conv` 会静默跳过 → 真机显示成方框。`make_font.py` 在生成后自动调用 `merge_arrow_glyph()`,把从 **Segoe UI Symbol**(`seguisym.ttf`,Windows 自带)预提取的箭头字形(位图 10 字节 + `glyph_dsc` + `cmap`)补回 `ui_font_cn_12.c`。该合并**幂等**(已存在则跳过),所以重生成字体后箭头不会丢。换用自带 ▶ 的字体(如黑体/Segoe)时可忽略此步。
|
||||
@@ -152,7 +152,7 @@ OK 58192 bytes -> ...\Drivers\BSP\UI\ui_font_cn_12.c
|
||||
1. **1bpp 细笔画发虚**:宋体在 1bpp 下可能丢像素。若上板/客户端中文偏淡,把第 4 节 `--bpp` 改为 `2` 重生成即可(子集小,体积可接受)。
|
||||
2. **字符集变更**:以后新增中文菜单项,须重跑第 3、4 节(重新提取 `ui_cn_chars.txt` 并生成),否则新字显示为方框。
|
||||
3. **编码**:UI 源文件须为 **UTF-8(带 BOM)**,LVGL 按 UTF-8 解码中文串;字体 `.c` 为纯 ASCII,无编码风险。当前 Keil 已加 Misc Controls 抑制项,无需额外 `--locale=english`。
|
||||
4. **字体体积**:12px + 1bpp + 183 字(含 ASCII/符号,共 278 字形)源文件 ≈ 57.8KB;ROM 增量以 `.map` 为准(2026-10-25 扩 60 字实测 `RO-data` +1,528 B、RAM 0;同日 SOE 显示名再用 4 字实测 `RO-data` +108 B、RAM 0——1bpp 12px 一个字约 27 B,含字形描述符);改 bpp 2 约翻倍,仍在 F407 Flash 余量内。
|
||||
4. **字体体积**:12px + 1bpp + 218 字(含 ASCII/符号,共 313 字形)源文件 ≈ 65.7KB(2026-10-28 实测 67,325 B;改前 185 字/280 字形/58.2KB,旧文本 183 字/278 字形系未回填);ROM 增量以 `.map` 为准(2026-10-25 扩 60 字实测 `RO-data` +1,528 B、RAM 0;同日 SOE 显示名再用 4 字实测 `RO-data` +108 B、RAM 0——1bpp 12px 一个字约 27 B,含字形描述符);改 bpp 2 约翻倍,仍在 F407 Flash 余量内。
|
||||
5. **换字体**:黑体用 `simhei.ttf`(单文件免抽取);其余字体同理替换 `--font` 路径后重生成。
|
||||
|
||||
---
|
||||
|
||||
@@ -247,6 +247,31 @@ typedef struct {
|
||||
- 结构与两条主通道同构:`seq` + `valid` 打头、定长字符数组、零指针、由 `ui_data` 盖章序号、由 `App/app/ui_data_feed.c` 独家填充,随实时帧同节拍发布。
|
||||
- **公共地址 CA 故意不在本帧**:固件里 CA 是逐帧从 ASDU 头解析的,没有集中常量可取;等 104 侧给出查询点再按 `docs/UI设计/UI_数据供给设计说明.md` §4.3 的扩展规则追加字段并升 `UI_DATA_VER`。
|
||||
- 版本类字段目前是 `App/app/ui_data_feed.c` 里的宏(仓库内没有产品级版本登记表,值沿用页面既有显示值,有正式口径后只改那一处);**软件校验位在拿到构建期 CRC 生成步骤之前一律显示 `--`**,不抄参考项目遗留值。
|
||||
**2026-10-28 追加(「运行报告」页落地)**:info 帧尾部追加 9 个字段,把运行报告要用的四个数从 App 侧搬下来——
|
||||
`boot_count` / `boot_seq_state` / `boot_write_failed` / `rst_cause` / `boot_ready`(来自 `App/util/boot_stats.h` 的开机账本)与
|
||||
`iec104_conn_up` / `iec104_apdu_tx` / `iec104_tx_fail` / `iec104_rx_bytes`(来自 `App/task/iec104_serv.h` 的四个只读观测计数)。
|
||||
|
||||
- **为什么不另开第二条注入通道**:这些量与装置身份同属`慢变、非节拍、零指针`的一批,info 帧已是它们的属主;
|
||||
再开一个 reader 就是把 task-6 刚收紧的分层反向边接回来(记录页那套注入表是因为要读**盘**,本批不读盘)。
|
||||
- **搬运不算第二份口径**:`feed_fill_info()` 只做逐字段拷贝,不换算、不在别处再算一份时长(`uptime_s` 仍由本函数按 tick 差算)。
|
||||
- **屏上文案归 UI**:四个数各自的类别标签(「自电池周期」「本次开机」)、`boot_ready == 0` 显 `--` 而不是 0、
|
||||
以及「禁写终身次数」「跨开机累计不做」这两条口径,落在 `Drivers/BSP/UI/ui_page_runreport.c` 文件头;口径出处只在
|
||||
`App/util/boot_stats.h` 四数台账与本节各述一次(同一事实只在一处详述,`docs/文档规范.md` 同此要求)。
|
||||
- 代价(本批
|
||||
`@build` 实测,0 错 0 警):
|
||||
`Program Size` 由本批前
|
||||
Code=235536 RO=26392 RW=1572 ZI=136924 变为 Code=236456 RO=28124 RW=1876 ZI=137084(ROM 合计 +2,652 B)
|
||||
→ **RAM 合计 +464 B**(RW +304 / ZI +160)。逐对象(.map):5 个记录页各 60 B
|
||||
`.data`(每页一份
|
||||
`ui_w_records_t` 读盘缓存,
|
||||
按实例存是记录页注入改造时定下的纪律,共享会串页);`ui_page_runreport.o` 116 B
|
||||
`.bss`(信息帧本地缓存 + 发布序号);
|
||||
info 帧字段增量落在 `ui_data.o`(1,192 B
|
||||
`.bss`,同对象还装 rt / par 两通道的双区)与 `ui_data_feed.o`(217 B)里。
|
||||
随帧发布不新增拷贝节拍。水位:
|
||||
`RW_IRAM1` 62.2% / `RW_CCM` 87.9%(阈值 92%),
|
||||
`mem-budget` PASS,
|
||||
台账已由 `scripts/ram_baseline.py --update` / `--write` 回填(docs/内存管理/RAM预算台账.md)。 `@build` 后回填),未触 `mem-budget` 92% 红线。
|
||||
|
||||
> 另一处落地细化:`ui_data_rt_t` 除 `yc[]`(语义通道序基波有效值)外还带一条 `ph[]` 相量实例槽带(`ph_n` 给实际槽数)。原因是谐波(`Ia` 的二次/五次)无法在"语义通道"下标空间里表达——同一通道的谐波会与基波撞位,而交流量页要显示它们(`docs/UI设计/页面扩充详细方案.md` §3.1.1 第 4/5 行)。两条带的元素同形(数值 + 品质),页面行表按需选一条。
|
||||
|
||||
@@ -669,7 +694,7 @@ typedef struct {
|
||||
| 4 | 未标定时页面明确标识(不把码值当伏特) | 目检 + 文本断言(`eng=0` 时带标记) |
|
||||
| 5 | 首帧前显示 `--` 而非 `0.000` | 模拟器:不 publish 直接开页,断言文本 |
|
||||
| 6 | 定值整定全链闭环 | 就地改 → 保存 → 重启 → 值保持 + 校验和自检通过 + 主站 C_RD 一致。**半收口(2026-10-26)**:模拟器侧「改 → 保存 → OK → 回首屏新值已在帧里」已由像素 + 文本断言覆盖(黄金用例 `sparam_save` / `sparam_landed`,越界侧 `sparam_oob`);**重启保持与主站 C_RD 一致只能上板**——模拟器没有 NAND,`apply()` 到 `prot_set_set_sealed()` 就是终点,这条差距已登记在 `docs/测试说明/模拟器差距清单.md`;另注意 40 项里有 13 项 `comm_addr=0`(纯本地项),主站侧根本读不到,不能拿 C_RD 当它们的判据 |
|
||||
| 7 | 像素回归稳定 | `ui-golden` 连续两次运行零差异。**已验(2026-10-26,当时下限为 27 页)**:27 页连跑两次逐字节一致(含整定 9 态)——**集合现已扩至 53 页**,双次一致需按同口径重跑回填;轮询定时器不影响——无头模式不调 `lv_timer_handler()`(§9.2 注 6) |
|
||||
| 7 | 像素回归稳定 | `ui-golden` 连续两次运行零差异。**已验(2026-10-26,当时下限为 27 页)**:27 页连跑两次逐字节一致(含整定 9 态)——**集合现已扩至 60 页**,双次一致需按同口径重跑回填;轮询定时器不影响——无头模式不调 `lv_timer_handler()`(§9.2 注 6) |
|
||||
| 9 | 「写不进去」与「改了不动作」两条事实互不冒充 | 反向文本断言(`check_content_pages.py` 的 `ABSENT`:查看页与只读态不得出现「未标定」徽标与「保存」行)+ 台架:未制造该态——要它必须改坏 /prot_set.bin(破坏产品配置存储,用户裁定 2026-10-26 不做),故 LOCK 态目前只有代码级证据与三重反证(ENTER 被正常消费、遥信 YX31=OFF、开机 CORRUPT=0),**没有像素证据** |
|
||||
| 8 | 主机单测覆盖数据模块 | `test/host/ui_data` 全绿并挂 pre-commit 钩子 |
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ flowchart TD
|
||||
|---|---|---|---|
|
||||
| C1 | 屏幕 | 160×160,1bpp 单色(`LV_COLOR_FORMAT_I1`),无物理屏(远端客户端显示) | `ui_port.h` |
|
||||
| C2 | 字体 | **唯一**:`ui_font_cn_12`(宋体 12px 1bpp)。汉字 12px/字,ASCII 6px/字,行高 13px。需要其他字号 = 大工程(新字体 + 双端 `lv_conf.h`),默认禁止 | `ui_font_cn_12.c` |
|
||||
| C3 | 字符集 | 子集字体(当前 183 汉字/符号 + ASCII 0x20-0x7E,共 278 字形);**缺字显示空白**;新字必须重生成字体 | `tools/font_gen/` |
|
||||
| C3 | 字符集 | 子集字体(当前 218 汉字/符号 + ASCII 0x20-0x7E,共 313 字形);**缺字显示空白**;新字必须重生成字体 | `tools/font_gen/` |
|
||||
| C4 | LVGL 内存池 | 16KB(`LV_MEM_SIZE`,2026-10-15 由 40KB 收缩;实测峰值 6,568 B = 池的 40%);任一时刻只放"当前导航路径 + 当前内容页" | `Lib/lv_conf.h` |
|
||||
| C5 | 文本 | 一律静态字符串(`lv_label_set_text_static`),禁止动态字符串/strdup | 架构文档 |
|
||||
| C6 | 编码 | `Drivers/BSP/UI/*`、`ui_task.c`、`Lib/lv_conf.h` 为 **UTF-8 带 BOM**;改动只用 Edit 工具,**禁止** PowerShell/cmd 整文件重写(U+FFFD 不可逆) | AGENTS.md 铁律 |
|
||||
@@ -413,3 +413,4 @@ P4 [ ] UI_设计架构.md 变更记录更新
|
||||
| 2026-09-13 | 移除 HTML 样机阶段:五阶段 → **四阶段管线**(P0 需求录入+设计规格 / P1 规格→代码 / P2 模拟器 / P3 MCU / P4 归档);设计基准改为"规格布局参数表 + 参考图",P2 比对基准由"样机渲染图"改为"参考图 + 规格参数表"(根因分流:修代码 / 回 P0 修规格);用户视觉确认点由 HTML 浏览器移到 P2 模拟器窗口/出图;删除 `mockups/01_主界面.html`、`render_01.png`、`tools/ui_mock/render_mockup.py`(**均已删除**),保留 `NN_说明.md` 规格与原始参考图;`NN_说明.md` 升格为唯一设计基准(P1 照参数表翻译代码,P2 出图对照参数表 + 原图);`UI_自动化测试流程.md` 门禁编号同步改为 P2/P3 |
|
||||
| 2026-09-14 | 运行记录/自检记录页 + 待机屏落地后回填:C3 字符集 111→122 字(217 字形,补输/入/错/误/上/电/重/芯/片/异/常——**故障描述串在非 UI 源码中 extract_cn 扫不到,须手动补字**);新文案走 P4 字体重生成 + `check_content_pages.py` pwc 态参考更新(密码错误提示);池基线 4784→5440 / 往返 4864→5520(+656B = 待机模块常驻屏+容器,见两测试脚本头部注记) |
|
||||
| 2026-10-25 | 字库扩充(页面扩充规划预置字):C3 字符集 122→179 字(217→274 字形;上次入表后 2026-10-15 字体瘦身实测 119 字/214 字形未回填本表,本次一并校正)。+60 字取自 `docs/UI设计/页面补齐规划.md`、`docs/UI设计/页面扩充详细方案.md` 的页面显示串(段/投/延/零/频/荷/闸/跳/低/过/Ⅰ/Ⅱ/Ⅲ 等 + 年/月/分/秒/分合/已请求/确认/取消/越界用字);源码未用期间 font-charset 记 [WARN] 属预期,批 2 页面接线后自然转"在用"。顺带修复 `make_font.py` 两处缺陷:补回字形 cmap 条目被宽稀疏 range 吞掉(Ⅰ 下探起点 0x2160 → ▶ 全变方框,A/B 同树实测)与 `verify_coverage()` 非首命中判定;菜单 8 状态 + 内容页 11 页黄金参考逐字节不变;ROM +1,528 B、RAM 0。详见 `docs/UI设计/UI_中文字体生成与配置.md` §4 与文末事故记录 |
|
||||
| 2026-10-28 | UI 补齐批接线(单写者):记录 5 页 + 运行报告六叶在 `ui_menu_tree.txt` 加 ` #page=` 并重跑 `tools/menu_gen/gen_menu.py`(绑定叶 22→28、`UI_PAGE_MAP_COUNT` 22→28,节点 42 / 叶 33 不变)、6 个页面 `.c` 双端注册;C3 字库链重跑 185→218 字(280→313 字形,新增 33 字取自六页新文案(含运行报告补「计数可信」行用的「可」字);本行旧数 183/278 系 2026-10-26 之后未回填,改前实测 185 字/280 字形);`check_content_pages.py` 内容页黄金 53→59 页;ROM/RAM 增量待 Lead `@build` 后按 `.map` 实测回填 |
|
||||
|
||||
@@ -26,7 +26,7 @@ cmake --build simulator/build --config Debug # 0) 构建模拟器(须 0 警
|
||||
| 步 | 脚本/命令 | 门禁内容 | 预期输出 |
|
||||
|---|---|---|---|
|
||||
| 1 | `simulator/tests/check_menu_rows.py` | 菜单 8 状态:选中行白带 / 非选行黑底白字 / 框体 1px 边框 / 往返像素一致(MENU-STATE-03==MENU-STATE-01、MENU-STATE-06==MENU-STATE-01、MENU-STATE-07==MENU-STATE-02)+ MENU-STATE-00 池基线 | `PASS: 8 状态全部断言通过(8 图,池基线 5368 B)` |
|
||||
| 2 | `simulator/tests/check_content_pages.py` | ① 文本级断言(字形模板匹配,310 条,独立于 `ref/`)→ ② 53 页截图与 `ref/` 黄金参考**逐字节**比对 + 开页-关页往返池水位 | `PASS: 53 内容页 + 往返池水位全部通过`(文本断言先于像素比对,失败即中止) |
|
||||
| 2 | `simulator/tests/check_content_pages.py` | ① 文本级断言(字形模板匹配,正向 425 条 + 反向 36 条,独立于 `ref/`)→ ② 60 页截图与 `ref/` 黄金参考**逐字节**比对 + 开页-关页往返池水位 | `PASS: 60 内容页 + 往返池水位全部通过`(文本断言先于像素比对,失败即中止) |
|
||||
| 3 | `keil-build` skill(`keil_build.py`) | MCU 端编译(UI 源码双端共用,改一端必须过另一端) | 退出码 0 = BUILD_OK |
|
||||
| 4 | `scripts/check_coding_standard.py` | 代码规范 V1.0 机械检查 | PASS |
|
||||
|
||||
@@ -37,6 +37,9 @@ cmake --build simulator/build --config Debug # 0) 构建模拟器(须 0 警
|
||||
> **先于**像素比对运行,失败即中止(不误刷参考)。文本断言覆盖确定文案,像素参考仍负责几何/样式/
|
||||
> 光标反显等其余视觉。规模与覆盖面(2026-10-26 实跑 `check_content_pages.py` 取数):文本断言 **310 条**、覆盖当时 40 页中的
|
||||
> **37 页**——`pwd` / `pwe` / `pwc` 三张密码态只进像素比对、未登记文本断言,改这几页的文案没有文本层兜底。
|
||||
> 2026-10-28 再取数(接线道,`PAGES` 60 项时实测):正向 **425 条** / 反向 **36 条**、覆盖 60 页中的
|
||||
> **57 页**(仍缺那三张密码态)。更正留痕:上一句登记的是「2026-10-26 实跑取数 310 条」,而当时脚本
|
||||
> 的真值是**正向 380 / 反向 29**——历史行按当时冻结不改数,差值只在这里说明,避免下一个人再抄一遍旧数。
|
||||
|
||||
**退出码约定**:两个脚本均为 0=PASS / 1=断言失败 / 2=环境错误(exe 缺失、参考缺失)。
|
||||
失败时脚本打印差异明细(文本断言未命中项 / ink runs 对照 / 像素差数),内容页脚本保留现场截图于临时目录并提示路径。
|
||||
@@ -49,7 +52,7 @@ cmake --build simulator/build --config Debug # 0) 构建模拟器(须 0 警
|
||||
| `POOL_AFTER_ROUNDTRIP` | check_content_pages.py | **5448 B** | 开页-关页往返后水位 = 基线 + 一次性残留 80 B |
|
||||
|
||||
> 水位历史:4784 →(2026-09-14 待机模块常驻 +656)5440 / 5520 →(2026-10-11 裁剪 LVGL 控件类 −72)5368 / 5448。
|
||||
> 后一次漂移已核实为**有意且更优**:像素逐字节未变(**裁剪当时黄金参考只有 11 页**,在裁剪**前**生成、裁剪后全部一致;该集合现已扩至 53 页),
|
||||
> 后一次漂移已核实为**有意且更优**:像素逐字节未变(**裁剪当时黄金参考只有 11 页**,在裁剪**前**生成、裁剪后全部一致;该集合现已扩至 60 页),
|
||||
> 且一次性残留仍是 80 B(5448 − 5368)→ 泄漏特征未变,只是 `lv_theme_apply` 不再为已不存在的控件类登记样式条目。
|
||||
|
||||
**漂移处理**:菜单/页面结构或样式变更导致门禁失败时,先确认新值合理(残留分解见
|
||||
@@ -58,7 +61,7 @@ cmake --build simulator/build --config Debug # 0) 构建模拟器(须 0 警
|
||||
|
||||
## 四、黄金参考(入库)与目检 PNG(本地产物)
|
||||
|
||||
`simulator/tests/ref/*.bin`(像素黄金参考,53 页 × 3200 B)**随仓库入库**;派生的 `.png`
|
||||
`simulator/tests/ref/*.bin`(像素黄金参考,60 页 × 3200 B)**随仓库入库**;派生的 `.png`
|
||||
目检图仍是本地产物(`.gitignore`)。入库的理由:比对是**逐字节**的,基线不入库时任何新克隆
|
||||
或新工作树跑 `ui-golden` 都必然 FAIL(缺基准),这条门禁就只在"有老副本的机器"上真实存在。
|
||||
可复现性实测(2026-10-22):两份各自独立构建的 `lvgl_sim`(不同构建目录、相隔 11 天的代码)
|
||||
@@ -145,7 +148,7 @@ cmake --build simulator/build --config Debug # 0) 构建模拟器(须 0 警
|
||||
### 7.3 用法与门禁档位
|
||||
|
||||
```powershell
|
||||
# 认屏快检:53 张黄金参考(+ 若有台架留档帧),秒级,不需要构建产物
|
||||
# 认屏快检:60 张黄金参考(+ 若有台架留档帧),秒级,不需要构建产物
|
||||
& '.venv\Scripts\python.exe' scripts/board_ui_nav.py --selftest-quick
|
||||
# 完整自检:再加全绑定页闭环导航(需模拟器可执行文件,约 30 s)
|
||||
& '.venv\Scripts\python.exe' scripts/board_ui_nav.py --selftest
|
||||
@@ -223,3 +226,5 @@ cmake --build simulator/build --config Debug # 0) 构建模拟器(须 0 警
|
||||
| 2026-10-26 | **内容页页数口径统一为 27**:正文里残留的「11 页 / 其余 10 页 / 18 张」按现状改正(判据本体 = `simulator/tests/ref/shot_*.bin` 入库实数 27 个、`check_content_pages.py` 的 `PAGES` 27 项,含整定 9 态);下方变更记录里的「11 页」是当时事实,按历史冻结不动。同类陈述同步在 `测试开发标准流程.md`、`自动化测试流程.md`、`主机单测覆盖率口径.md`、`内容页架构.md`、`simulator/tests/README.md`、`scripts/board_ui_nav.py` 改正 |
|
||||
| 2026-10-26 | **文本级断言规模口径修正**:门禁表里的「50 条」是 2026-09-10 首版数字,现值 **242 条 / 覆盖 27 页中的 24 页**(`pwd` `pwe` `pwc` 三张密码态只进像素比对、未登记文本断言);正文的文本层说明补写了覆盖面与这条盲区。下方变更记录里的 50 条属历史,不动 |
|
||||
| 2026-10-26 | **内容页黄金参考下限 27 → 40 页**(UI 三页落地,机器实测:`simulator/tests/ref/` 入库 `shot_*.bin` 40 个、`check_content_pages.py` 的 `PAGES` 40 项);文本断言随之 **242 → 310 条**、覆盖 **40 页中的 37 页**(`pwd` `pwe` `pwc` 三张密码态仍只进像素比对、无文本断言);27 张旧参考逐字节未变,往返池 5448 B 与菜单常驻堆 5368 B 均未变,字库仍 183 字。本文其余各处与 `AGENTS.md`、`docs/门禁说明/`、`simulator/tests/README.md`、`docs/测试说明/` 三篇同批改齐;**历史行里的 27 / 11 一律保留**(当时下限就是那个数,不改数造连续性)|
|
||||
| 2026-10-28 | **内容页黄金参考 53 → 60 页**(UI 补齐收口批接线:记录 5 页 accident / oper / alarm / start / yk 与运行报告 runreport 两页,运行报告 13 行分 2 页故第 2 页单独拍一张 `shot_runreport_p2.bin` 钉「第 2 页,共 2 页」与 104 三枚计数,所以是 60 而非 59)。判据实测:`simulator/tests/ref/` 60 张 `shot_*.bin`、`git status --porcelain` 恰好 7 个 `??`、`git diff --name-only -- simulator/tests/ref` 为空 ⇒ **存量 53 张逐字节零漂移**(本批字库两轮共 +33 字、185→218 字 / 280→313 字形均未动既有字形,跑 `--update` 前后各测一次);文本断言 **425 正向 + 36 反向**、覆盖 60 页中的 57 页;`MENU_POOL_BASELINE` 5368 / `POOL_AFTER_ROUNDTRIP` 5448 **一字未动**(往返实测仍 5448 B) |
|
||||
| 2026-10-28 | `check_content_pages.py` 新增 **`FRESH_CWD`**(记录 5 页各在**独立空目录**里跑,其余 55 页环境不变):模拟器把「人工操作留痕」当真记录写**当前工作目录**的 `sim_oper.log`(`simulator/main.c` 的 `sim_post_oper` → `syslog_post(SYSLOG_OPER, ...)`),60 页共用一个 tmp 时 `clock_save` / `netcfg_save` / `sparam_save` 已写满 3 条(192 B)→ **操作记录页拍不到空态**。这不是判据问题而是环境被前面的写路径污染,故隔离环境、不改页面也不改断言。反向断言同时补两组互钉:运行报告第 1 页不许出现「发送帧数」、第 2 页不许出现「上电次数」;五个记录页不许出现 SOE 假记录的时标串 |
|
||||
|
||||
@@ -38,7 +38,7 @@ MCU **无物理屏幕**:LVGL 做 160×160 **1bpp 单色离屏渲染**,帧缓
|
||||
| LVGL 内存池 | 16 KB(`LV_MEM_SIZE`,2026-10-15 由 40 KB 收缩;实测峰值 6,568 B = 池的 40%) | `Lib/lv_conf.h` |
|
||||
| 刷新周期 | 10 ms(`ui_port_step(10)` + `osDelay(10)`) | `ui_task.c` |
|
||||
| 推流端口 | 7003(TCP,与 DTU-RemoteLCD 客户端对齐) | `ui_net_sink.h` |
|
||||
| 默认字体 | `ui_font_cn_12`(12px 1bpp,183 汉字/符号 + ASCII 0x20–0x7E,共 278 字形) | `Lib/lv_conf.h` |
|
||||
| 默认字体 | `ui_font_cn_12`(12px 1bpp,218 汉字/符号 + ASCII 0x20–0x7E,共 313 字形) | `Lib/lv_conf.h` |
|
||||
| uiTask 栈 | 16384 words(BelowNormal) | `Src/freertos.c` |
|
||||
|
||||
### 1.4 硬约束(改 UI 必须遵守)
|
||||
@@ -309,3 +309,4 @@ ENTER/→ 进子框:
|
||||
| 2026-09-14 | 运行记录/自检记录内容页 + 待机显示模块:新增 `App/log/sys_log`(定长 64B 文本记录引擎,MCU 落 NAND `/log/run.log`、`/log/selftest.log`,FTP 可直下)+ 页面插件 `ui_page_runlog` / `ui_page_selftest`(动态列表:count_cb + refresh,每条 2 行时间戳/描述)+ `ui_standby`(空闲超时自动切待机屏,仅确认键回菜单);密码页错误提示"密码输入错误"+清空重输;字体 111→122 字(217 字形);详见 `docs/子系统设计/运行与自检记录设计说明.md` |
|
||||
| 2026-10-25 | **F3 推流心跳边界(§5.8)**:`ui_net_sink_set_beat_cb()` 回调注入,accept/recv_nb/send/close/重建三件套返回处喂 UI 心跳(2026-10-25 大窗 bit4 8 连击实证:单轮多慢往返之和串成 800ms 缺席);往返语义不改(上界归 E-27/E-28);未注册 = 零行为变化(模拟器/黄金回归形态);新增 `test/host/ui_sink/` 主机套件 17 断言 |
|
||||
| 2026-10-25 | 字库扩充(页面扩充规划预置字 +60,含罗马数字 Ⅰ/Ⅱ/Ⅲ):默认字体升至 179 字符/274 字形,像素基线不变,ROM +1,528 B、RAM 0;修复生成器 `make_font.py` 的 cmap 插入顺序缺陷——LVGL `get_glyph_dsc_id()` 线性扫描首个包含即返回,补回字形(▶)单码位条目被下探后的宽稀疏 range 吞掉即全渲染方框,现按首命中语义插位/守卫/校验(详见 `docs/UI设计/UI_中文字体生成与配置.md` 文末事故记录) |
|
||||
| 2026-10-28 | UI 补齐批接线(单写者):事故/操作/保护告警/保护启动/遥控/运行报告六叶绑定内容页(生成物 `UI_PAGE_MAP_COUNT` 22→28,节点 42 / 叶 33 不变)+ 6 个页面 `.c` 双端注册;默认字体 185 字符/280 字形 → 218 字符/313 字形(+33 字,§1 概况表"默认字体"行同步,旧数 183/278 系未回填);内容页像素黄金参考 53 → 59 页;ROM/RAM 增量待 `@build` 后按 `.map` 实测回填 |
|
||||
|
||||
+1
-1
@@ -453,7 +453,7 @@ extern const content_page_def_t ui_page_device_info_desc; /* 描述符(Flash
|
||||
## 八、验证与回归
|
||||
|
||||
- **门禁**(`ui-verify` skill / `UI_自动化测试流程.md`):
|
||||
0) 模拟器构建 0 警告 → 1) 菜单 8 状态像素回归 + 池基线 → 2) 内容页文本断言 + 53 页黄金参考逐字节比对
|
||||
0) 模拟器构建 0 警告 → 1) 菜单 8 状态像素回归 + 池基线 → 2) 内容页文本断言 + 60 页黄金参考逐字节比对
|
||||
(网口设置 4 态 + 密码页 4 态等)+ 开页-关页往返水位 → 3) Keil 构建 0 错 0 警 → 4) 代码规范检查
|
||||
- **门禁常量**(脚本头部):`MENU_POOL_BASELINE = 5368 B`、`POOL_AFTER_ROUNDTRIP = 5448 B`
|
||||
- **失败处置**:像素不一致 = 代码 bug(修代码,**禁止**刷参考掩盖);**有意**改视觉 →
|
||||
|
||||
+1
-1
@@ -792,7 +792,7 @@ ESC/LEFT : d>0 → menu_back() (根框 d=0 不响
|
||||
1. 本 LVGL v9.3 的 `lv_text_get_width(txt, length, font, letter_space)` **length=0 时返回 0**(不是"整串");必须传 `strlen`——否则框宽计算全 0(根框退化 8 px)。
|
||||
2. 无头模式**不得**调 `lv_timer_handler()` / `lv_refr_now()`:I1 + `LV_DISPLAY_RENDER_MODE_FULL` 全屏刷新会进渲染死循环(截图因此走 `lv_snapshot`);`--keys` 注键是同步处理,无需驱动帧。
|
||||
3. 选中行**保留 ▶**(随反色变黑):参考图 02/04 原图即"选中行箭头仍在、仅随反色变黑",勿实现成"选中隐箭头"(§4.4)。
|
||||
4. 字体缺字形 = 方框:菜单树新增/改名的汉字必须同步加入字符集 `ui_cn_chars.txt`(当前 122 唯一字)并重生成字体(重跑 `extract_cn.py` + `make_font.py`),否则新字显示为方框(流程见 `UI_中文字体生成与配置.md`)。
|
||||
4. 字体缺字形 = 方框:菜单树新增/改名的汉字必须同步加入字符集 `ui_cn_chars.txt`(当前 218 唯一字,2026-10-28 实测)并重生成字体(重跑 `extract_cn.py` + `make_font.py`),否则新字显示为方框(流程见 `UI_中文字体生成与配置.md`)。
|
||||
5. **参考图保真度**:参考图为手工 mockup,4 个样本(子框顶位置)不满足单一公式;实现采用自洽规则(顶对齐/底对齐上移),实测与参考图偏差:顶位置 2/4/6/1 px(三遥/装置维护/通讯参数/记录查询),框宽 2/8/0/2 px(4字+箭头/4字/3字/2字+箭头)。两端极例(三遥、记录查询)精确吻合;统一规则优于逐屏特调,偏差范围内不影响识读与操作。
|
||||
6. 装饰"浅 V"两腿线宽必须 3(水平线 2):1bpp 下细斜线边缘被阈值吃掉,腿不粗于水平线即消失;且依赖 `LV_DRAW_SW_COMPLEX=1`(见 `UI_设计架构.md` §1.4 约束 7)。
|
||||
|
||||
|
||||
@@ -624,7 +624,7 @@ SNTP 客户端 ──────→ 批4 SNTP设置
|
||||
| 4 | 无源点显示 `--` | 遥信量无效点、直流量直流通道 |
|
||||
| 5 | 定值整定闭环 | 改 → 保存 → 重启 → 值保持 + 校验和自检通过 + 主站 C_RD 一致。**2026-10-26 半收口**:模拟器侧「改 → 保存 → `OK` → 回首屏新值已在帧里」与「越界被拒、值不落盘」已由像素 + 文本断言覆盖(`sparam_save` / `sparam_landed` / `sparam_oob`);**重启保持与 C_RD 一致只能上板**(模拟器无 NAND)。另注意 40 项里 **13 项 `comm_addr = 0`**(投退、返回系数、过频/低频段、全局软压板)主站不可寻址,不能拿 C_RD 当它们的判据 |
|
||||
| 6 | 分层门禁无新增 | `check_layer_deps.py` 退出码 0,基线 6 → 3。**现状:3**(记录 reader 已削 3 条;写路径走注入式 ops 函数表,未新增 include,见 `docs/UI设计/UI_数据供给设计说明.md` §6.2) |
|
||||
| 7 | 像素回归稳定 | `ui-golden` 连续两次零差异。**已验(2026-10-26)**:27 页连跑两次逐字节一致——**该下限此后已扩至 53 页**(新增 clock / reset / clear 系列 13 张),53 页上的双次逐字节一致需按同口径重跑一次再回填本行 |
|
||||
| 7 | 像素回归稳定 | `ui-golden` 连续两次零差异。**已验(2026-10-26)**:27 页连跑两次逐字节一致——**该下限此后已扩至 60 页**(新增 clock / reset / clear 系列 13 张,其后 47→53→60),60 页上的双次逐字节一致需按同口径重跑一次再回填本行 |
|
||||
| 8 | 每个新页有 golden 参考 | `simulator/tests/ref/` 新增对应 `.bin`。**整定 4 页已有 9 张**(含保存/越界/落定/回绕各态);参考图入库,改它 = 改判据,须逐页过目 |
|
||||
|
||||
---
|
||||
|
||||
+11
-9
@@ -27,7 +27,7 @@
|
||||
### 2.1 规模
|
||||
|
||||
> ⚠ **本表是 2026-10-23 立项当天快照**(节点 42 / 有内容页叶子 6 / 空叶子 27 / 黄金参考 11 份均为当日实数,按"完成即冻结"不回改)。
|
||||
> 页面扩充落地后现值已变——黄金参考现为 53 份(`simulator/tests/ref/` 入库的 `shot_*.bin` 实数),现状口径见
|
||||
> 页面扩充落地后现值已变——黄金参考现为 60 份(`simulator/tests/ref/` 入库的 `shot_*.bin` 实数,2026-10-28 记录 5 页与运行报告页落地 +7 张),现状口径见
|
||||
> `docs/UI设计/页面扩充详细方案.md` 与 `docs/UI设计/UI_数据供给设计说明.md`。
|
||||
|
||||
| 项 | 数 |
|
||||
@@ -70,8 +70,8 @@
|
||||
| 14 | 定值(查看) | 列表(18 项 / 3 页) | 同 9 | ✅(需快照层) |
|
||||
| 15 | 控制字(查看) | 列表(4 项) | 同 10 | ✅(需快照层) |
|
||||
| 16 | 软压板(查看) | 列表(10 项 / 2 页) | 同 11 | ✅(需快照层) |
|
||||
| 18 | 遥测死区 | 可编辑列表(4 项) | `[run_par]` 9 键死区 | ✅ 数据层已落地(卡 10),**页面未做** |
|
||||
| 19 | 遥测系数 | 可编辑列表(9 项) | `[adc_cal]` 的 k / b | ✅ 数据层已落地(卡 2),**页面未做** |
|
||||
| 18 | 遥测死区 | 可编辑列表(4 项) | `[run_par]` 9 键死区 | ✅ 已落地(ui_page_deadband.c,2026-10-27) |
|
||||
| 19 | 遥测系数 | 可编辑列表(9 项) | `[adc_cal]` 的 k / b | ✅ 已落地(ui_page_calib.c,2026-10-27) |
|
||||
| 20 | 遥信类型 | 可编辑列表 | 开入量 | ❌ 开入未实现 |
|
||||
| 21 | 遥信防抖 | 可编辑列表(1 项) | 运行参数 0x8030 | ❌ 同上 |
|
||||
| 22 | 双点遥信 | 可编辑列表 | 开入量 | ❌ 同上 |
|
||||
@@ -82,15 +82,17 @@
|
||||
| 29 | 通讯设置 | 可编辑列表(4~6 项) | 104 公共地址/端口/主站(当前固定) | 🔶 需 `comm_cfg` |
|
||||
| 31 | SNTP设置 | 可编辑列表(3 项) | SNTP 客户端 | ❌ 未实现(产品口径亦未定) |
|
||||
| 33 | SOE记录 | 动态列表(每记录 2 行) | `/log/soe.log` 二进制 64B | ✅ 已落地(`ui_page_soe.c`) |
|
||||
| 34 | 事故记录 | 动态列表 | 跳闸记录 | ❌ 记录类型未实现 |
|
||||
| 35 | 操作记录 | 动态列表 | 操作记录 | ❌ 同上 |
|
||||
| 36 | 保护告警 | 动态列表 | 告警记录 | ❌ 同上 |
|
||||
| 37 | 保护启动 | 动态列表 | 启动记录 | ❌ 同上 |
|
||||
| 38 | 遥控记录 | 动态列表 | 遥控记录 | ❌ 同上 |
|
||||
| 41 | 运行报告 | 信息页(统计) | 上电次数/运行时长/复位原因/通信统计 | ❌ 计数器未实现 |
|
||||
| 34 | 事故记录 | 动态列表 | /log/accid.log(SYSLOG_ACCIDENT,写入点 protect_task.c) | ✅ 已落地(ui_page_accident.c,2026-10-28) |
|
||||
| 35 | 操作记录 | 动态列表 | /log/oper.log(SYSLOG_OPER,写入点 4 处:定值保存 / 复归 / 对时 / 清除记录) | ✅ 已落地(ui_page_oper.c,2026-10-28) |
|
||||
| 36 | 保护告警 | 动态列表 | /log/alarm.log(SYSLOG_ALARM,asserted 且跳闸投退=0) | ✅ 已落地(ui_page_alarm.c,2026-10-28) |
|
||||
| 37 | 保护启动 | 动态列表 | /log/start.log(SYSLOG_START,picked 上升沿) | ✅ 已落地(ui_page_start.c,2026-10-28) |
|
||||
| 38 | 遥控记录 | 动态列表 | /log/yk.log(SYSLOG_YK,写入点 iec104_pts.c 遥控段) | ✅ 已落地(ui_page_yk.c,2026-10-28) |
|
||||
| 41 | 运行报告 | 列表页(12 行 / 2 页,四数逐个挂范围标签) | boot_stats(上电次数 + 复位原因)+ 四个 104 观测计数 + uptime_s,经 ui_data info 帧下发 | ✅ 已落地(ui_page_runreport.c,2026-10-28;跨开机累计按裁定不做) |
|
||||
|
||||
**统计(2026-10-25 复核)**:本表 27 叶中 **6 叶已落地**(遥信量 / 查看 4 页 / SOE),剩 21 叶 = 数据现成 **8** 项(整定 4 + 时钟 + 复归 + 死区 + 系数)· 需新数据层 **2** 项(清除记录 / 通讯设置)· 数据源不存在 **11** 项(遥信 3 + 手动录波 + SNTP + 记录 5 + 运行报告)。**分批与 DoD 见 `docs/任务规划/UI补齐.md`**——本表只讲逐页形态与数据源,不重复排期。
|
||||
|
||||
**2026-10-28 复核**:本表 27 叶中 **22 叶已落地**(本批 +6:记录 5 页与运行报告,见 docs/任务规划/UI补齐.md §2 与 docs/任务规划/登记簿.md §7);未落地的 5 叶 = 遥信类型 / 遥信防抖 / 双点遥信(无开入硬件)+ 手动录波(无录波模块)+ SNTP设置(产品口径未定),取舍与重开条件见 docs/任务规划/UI补齐.md §5。
|
||||
|
||||
---
|
||||
|
||||
## 3. 三个前置能力(不先做,页面只能显示假数据)
|
||||
|
||||
+15
-15
@@ -1,6 +1,6 @@
|
||||
# 任务规划
|
||||
|
||||
> **现在只做 UI 补齐。剩余两项按表序单道推进:记录 5 页 → 运行报告(通讯设置已入库)。**
|
||||
> **UI 补齐执行清单已于 2026-10-28 清空(记录 5 页 + 运行报告页落地)。** 下一顺位 = net 层跨上下文收口,开工待用户点头;顺序权威见 docs/任务规划/README.md §2.0。
|
||||
> 详细任务与验收见 `UI补齐.md`;UI 完成后的第一项是 net 层跨上下文收口。
|
||||
|
||||
## 怎么用这份规划
|
||||
@@ -30,17 +30,17 @@
|
||||
|
||||
---
|
||||
|
||||
## 1. 当前执行:UI 补齐
|
||||
## 1. UI 补齐(执行清单已于 2026-10-28 清空)
|
||||
|
||||
菜单树共 33 叶(节点行合计 42):按行内 `#page=` 实测**已绑 22 叶、未绑 11 叶**(2026-10-27 复核,
|
||||
判定规则与重跑命令见 `docs/任务规划/UI补齐.md` §1「叶数判定与复核」)。未绑里 **6 叶纳入当前执行**
|
||||
(记录 5 + 运行报告 1),另外 5 叶因缺少开入硬件、录波模块或 SNTP 产品定义而不做。
|
||||
装置维护 3 页、遥测死区与系数 2 页、通讯设置页已于 2026-10-27 陆续落地入库。唯一执行清单见 `UI补齐.md`。
|
||||
菜单树共 33 叶(节点行合计 42):按行内 #page= 实测**已绑 28 叶、未绑 5 叶**(2026-10-28 复核,
|
||||
判定规则与重跑命令见 docs/任务规划/UI补齐.md §1「叶数判定与复核」)。未绑的 5 叶因缺少开入硬件、
|
||||
录波模块或 SNTP 产品定义而不做(原因与重开条件见 docs/任务规划/UI补齐.md §5)。
|
||||
|
||||
| 顺序 | 要做的事 | 交付结果 |
|
||||
|---|---|---|
|
||||
| 1 | 记录 5 页 | 事故、操作、保护告警、保护启动、遥控记录有写入方并可查看 |
|
||||
| 2 | 运行报告 | 上电次数、运行时长、复位原因、104 统计 |
|
||||
**UI 补齐执行清单已于 2026-10-28 清空**:记录 5 页(事故 / 操作 / 保护告警 / 保护启动 / 遥控)与
|
||||
运行报告页同日落地并绑页,内容页黄金参考 53 → 60 页(runreport 分 2 页,第 2 页单独一张)。
|
||||
上板判据(真记录翻页、掉电保持、清除后归零、boot_count 自增、RESTARTED、rst_cause=IWDG、conn_up +1)
|
||||
已登记登记簿 §7「UI 六页真机判据」,六页文件头各留「台架待补」段;模拟器差距见
|
||||
docs/测试说明/模拟器差距清单.md §2.3「开机账本 boot_stats」一行。
|
||||
|
||||
**执行纪律:单道串行。** 菜单树与页面注册表是生成物,字库也是整文件生成物;
|
||||
不要同时开多条 UI 页面分支。上板验证可累积成一批,但保存、重启、主站读回等判据不能删除。
|
||||
@@ -55,10 +55,10 @@
|
||||
|
||||
| 顺序 | 工作 | 当前状态 | 开始或切换条件 |
|
||||
|---|---|---|---|
|
||||
| **1** | **UI 补齐** | **当前执行** | 已开始;剩余 3 项按 §1 的 1→3 顺序推进(原第 1、2 两项已落地) |
|
||||
| **2** | **net 层跨上下文收口** | 下一步 | UI 当前清单完成后;裸指针收口与 reconcile 突发饿死 uiTask 同批评估 |
|
||||
| **1** | **UI 补齐** | **清单已清空(2026-10-28)** | 记录 5 页与运行报告页已落地并绑页;余下 5 叶属 §5「当前不做」,重开条件见 docs/任务规划/UI补齐.md §5;上板判据见 docs/任务规划/登记簿.md §7 |
|
||||
| **2** | **net 层跨上下文收口** | **下一顺位(未开工)** | UI 清单已清空,切换条件已满足;**开工需用户点头**——换主线是产品决策,不由本批顺带做掉 |
|
||||
| **3** | 其余结构与可靠性评估 | 排队 | net 收口后;逐项见 `登记簿.md`,观察项不为了“清清单”而强做 |
|
||||
| **4** | 数据可信剩余三项 | 等待台架或外部资源 | 已知电压注入 → 端子变比 → 标准源两点标定;资源到位可插入优先处理 |
|
||||
| **4** | 数据可信剩余两项 | 等待外部资源 | 端子/子板变比确认 → 标准源两点标定(已知电压注入已于 2026-10-27 台架闭环并销项);资源到位可插入优先处理 |
|
||||
| **5** | 标准源送检与第三方 104 主站验收 | 等待标定完成 | 两点标定完成且保护 VALID 已置位;送检窗口前 2 日冻结特性 |
|
||||
| **6** | 保护元件与采集增强 | 等待标准源或硬件改版 | 保护先解除未标定闭锁;三相同时刻类功能等 V0.2 硬件 |
|
||||
| **7** | 验证窗口事项 | 逢条件顺带 | CI runner、PC peer、CH340、负向故障注入条件到位时执行 |
|
||||
@@ -68,7 +68,7 @@
|
||||
|
||||
- **UI**:写路径、整定 4 页、装置维护 3 页与遥测死区/系数 2 页已收口(含上板判据与真机回读);
|
||||
菜单树、页面注册表与字库都是生成物,同刻只允许一条道写。
|
||||
- **送检**:已知电压注入 → 端子变比确认 → 标准源两点标定 → 保护解除闭锁 → 送检。
|
||||
- **送检**:已知电压注入(✅ 2026-10-27 闭环)→ 端子/子板变比确认 → 标准源两点标定 → 保护解除闭锁 → 送检。
|
||||
- **保护扩展**:标准源未到位前不新增无法验证的判据;跨转换器相位、功率、对称分量类
|
||||
功能必须等 V0.2 硬件。
|
||||
- **结构债**:UI 完成后先做 net 收口;RS-485 白名单、内存优化、仓库体积等观察项不抢占
|
||||
@@ -82,7 +82,7 @@
|
||||
历史由 `git log` 保留。
|
||||
2. **当前任务只改 `UI补齐.md`,后续事项只改 `登记簿.md`**;顺序变化才改本文件 §2。
|
||||
3. `数据可信.md` 的 §2、§4、§7~§10 仍被代码头注释引用为设计依据,不能按“已完成”
|
||||
删掉;其待办只认 §5 的三项。
|
||||
删掉;其待办只认 §5 的两项。
|
||||
4. `测试与架构专项.md` 的断言与体积门禁章节仍是代码和门禁的规格锚点,即使事项已完成
|
||||
也不能删;当前未闭环的只有 RS-485 侧采集链路测试约束。
|
||||
5. 任务分支不直接修改 `docs/任务规划/**`;状态更新与销项由主工作树统一处理。
|
||||
|
||||
+20
-22
@@ -1,34 +1,34 @@
|
||||
# 当前任务:UI 补齐
|
||||
|
||||
> **从第 1 项「记录 5 页」开始,按表序单道串行推进。**(通讯设置页已于 2026-10-27 入库)
|
||||
> 本文件是当前唯一执行清单;全项目顺序见 `docs/任务规划/README.md` §2。
|
||||
> **执行清单已清空(2026-10-28)**:记录 5 页与运行报告页已落地、绑页并纳入像素黄金回归。
|
||||
> 本文件保留为 UI 补齐的**范围与判据口径**(§1 叶数、§4 每页统一动作、§5 不做的取舍);
|
||||
> 下一顺位见 docs/任务规划/README.md §2.0(换主线待用户点头),上板待复核项见 docs/任务规划/登记簿.md §7。
|
||||
|
||||
## 1. 目标与范围
|
||||
|
||||
菜单树共 **33 叶**(节点行合计 42,缩进即层级):按行内 `#page=` 实测**已绑 22 叶、未绑 11 叶**,
|
||||
页面映射表 `UI_PAGE_MAP_COUNT` = 22(与已绑叶数一致)。未绑 11 叶 = 下方第 1~2 项的 **6 叶**
|
||||
+ §5 明确不做的 **5 叶**(遥信 3 / 手动录波 1 / SNTP 1),与分类表逐项对得上(6 + 5 = 11)。
|
||||
菜单树共 **33 叶**(节点行合计 42,缩进即层级):按行内 `#page=` 实测**已绑 28 叶、未绑 5 叶**,
|
||||
页面映射表 `UI_PAGE_MAP_COUNT` = 28(与已绑叶数一致)。未绑 5 叶 = §5 明确不做的 **5 叶**
|
||||
(遥信 3 / 手动录波 1 / SNTP 1),与下面分类表逐项对得上;2026-10-28 记录 5 页与运行报告页
|
||||
落地后,原「需补配置或写入方」的 6 叶缺口清零并按销项删行(该行内容见本节末与 §3)。
|
||||
|
||||
| 分类 | 数量 | 当前怎么处理 |
|
||||
|---|---:|---|
|
||||
| 需补配置或写入方 | 6 | 当前执行:记录 5 + 运行报告 1(即下方第 1~2 项) |
|
||||
| 无开入硬件 | 3 | 不做:遥信类型、遥信防抖、双点遥信 |
|
||||
| 缺独立模块或产品定义 | 2 | 不做:手动录波、SNTP 设置 |
|
||||
|
||||
现有基础:`ui_w_editor` / `ui_w_setlist` / `ui_page_action` 已就绪;`ui_data` 已扩到**四通道**
|
||||
(rt / par / info + 遥测死区与系数用的第四张注入表);像素黄金用例与字符集门禁已存在,内容页黄金
|
||||
现有 **53 页**(菜单 8 状态另计)。**装置维护 3 页与遥测死区/系数 2 页已把这套基础接上了真实消费者,
|
||||
剩余两项继续用它,不另发明一套机制。**
|
||||
|
||||
现有 **60 页**(菜单 8 状态另计)。**装置维护 3 页、遥测死区/系数 2 页、通讯设置页、记录 5 页与
|
||||
运行报告页都是把这套基础接上真实消费者做出来的,不另发明一套机制。**
|
||||
逐页形态见 `docs/UI设计/页面补齐规划.md`;数据契约见
|
||||
`docs/UI设计/UI_数据供给设计说明.md`。本文件只维护执行顺序和完成判据。
|
||||
`docs/UI设计/UI_数据供给设计说明.md`。本文件保留范围、完成判据与不做的取舍口径(执行清单已于 2026-10-28 清空)。
|
||||
|
||||
### 叶数判定与复核(2026-10-27 实测)
|
||||
### 叶数判定与复核(2026-10-28 复核)
|
||||
|
||||
1. **节点行** = `ui_menu_tree.txt` 里非空、非 `#` 开头的行(当前 **42** 行,含根「主界面」)。
|
||||
2. **缩进即层级**(每级 2 空格;Tab 会被 `gen_menu.py` 直接拒绝):某节点行之后再没有更深缩进的行 = **叶**
|
||||
(当前 **33** 叶);有更深缩进后继者 = 菜单节点(当前 **9** 个)。等价于生成物口径 `ui_menu_tab_has_children(node) == false`。
|
||||
3. **绑定**:叶行行尾带 ` #page=` = 已绑(当前 **22** 叶);不带的 = 未绑(当前 **11** 叶)。
|
||||
3. **绑定**:叶行行尾带 ` #page=` = 已绑(当前 **28** 叶);不带的 = 未绑(当前 **5** 叶)。
|
||||
|
||||
复核命令(复用生成器自己的解析器 `tools/menu_gen/gen_menu.py` 的 `parse_tree`,不另写一套计数逻辑,免得与生成物脱钩):
|
||||
|
||||
@@ -36,11 +36,11 @@
|
||||
& '.venv\Scripts\python.exe' -c "import io,sys; sys.path.insert(0,'tools/menu_gen'); import gen_menu as g; n,_=g.parse_tree(io.open('ui_menu_tree.txt',encoding='utf-8').read()); leaf=[i for i,x in enumerate(n) if all(y[0]!=i for y in n)]; b=sum(1 for i in leaf if n[i][4]); print('nodes=%d leaves=%d bound=%d unbound=%d' % (len(n),len(leaf),b,len(leaf)-b))"
|
||||
```
|
||||
|
||||
输出 `nodes=42 leaves=33 bound=22 unbound=11`;交叉核对生成物:`ui_menu_tab.h` 的 `UI_MENU_TAB_COUNT` = 42(节点行数)、
|
||||
`ui_page_registry.h` 的 `UI_PAGE_MAP_COUNT` = 22(已绑叶数)——一对 42、一对 22,与上面逐项对得上。
|
||||
输出 `nodes=42 leaves=33 bound=28 unbound=5`;交叉核对生成物:`ui_menu_tab.h` 的 `UI_MENU_TAB_COUNT` = 42(节点行数)、
|
||||
`ui_page_registry.h` 的 `UI_PAGE_MAP_COUNT` = 28(已绑叶数)——一对 42、一对 28,与上面逐项对得上。
|
||||
|
||||
三个已踩过的错算法:**把 42 个节点行当叶子**(多算 9 个菜单节点,得出「未绑 21」);**`grep -c '#page='` 得 23**(比已绑多 1:文件头注释第 5 行有 `#page=<模块名>` 示例字样,必须先剔注释行);**按叶子名去重得 29**(`参数`/`定值`/
|
||||
`控制字`/`软压板` 在「整定」「查看」下各一份,4 对同名不能合并)。
|
||||
`控制字`/`软压板` 在「整定」「查看」下各一份,4 对同名不能合并)。(21 / 23 / 29 三个错数是 2026-10-27 当时的实测产物,只用来说明错法,不代表现值。)
|
||||
|
||||
---
|
||||
|
||||
@@ -48,15 +48,13 @@
|
||||
|
||||
> 状态只在这里维护。完成一项就删除对应行,并同步调整后续顺序;不要在本文件留完成史。
|
||||
|
||||
| 顺序 | 任务 | 完成判据 | 主要写范围 | 状态 |
|
||||
|---|---|---|---|---|
|
||||
| **1** | **记录 5 页** | 事故、操作、保护告警、保护启动、遥控各有一个写入点和记录类型;可翻最近 20 条;空记录明确显示“无记录”;共用 reader | `App/log/`、`Drivers/BSP/UI/` | 未开始 |
|
||||
| **2** | **运行报告** | 四个数的现成度已查实,判据按此写死:复位原因**解析有但 RCC 标志读后即清** ⇒ 需开机快照驻留;上电次数**无现成计数器** ⇒ 正源建议 SD2506 用户 SRAM(电池保持、零 NAND 磨损,文案写「自 RTC 电池周期起」,**禁写终身次数**);运行时长**用户裁定 2026-10-27 = 只报本次开机以来**(直接用现成 `uptime_s`,**不引** RTC 用户 SRAM 存秒数,UI 该栏必须**明写「本次开机以来」**免被误读为累计值);104 统计现有量全是控制量 ⇒ 需新增只读计数与 getter。落点 `App/util/boot_stats.{c,h}`(双端注册同笔),104 计数就近留 `iec104_serv.c` 不并进 | `App/util/`、`App/protocol/iec104/`、`Drivers/BSP/UI/` | 未开始(时长口径已定,其余三项待做) |
|
||||
> 当前无待做项:最后两项(记录 5 页、运行报告)已于 2026-10-28 落地并销项删行。
|
||||
> 下一批 UI 页面开工时在本节重新起表;完成一项就删除对应行,本文件不留完成史。
|
||||
|
||||
### 依赖关系
|
||||
|
||||
- 各项虽可独立开发,但当前仍按表序单道执行(菜单树、页面注册表与字库都是生成物)。
|
||||
- 记录 5 页与运行报告先补真实写入方或计数器,再做页面;不允许用静态演示数据充数。
|
||||
- **不允许用静态演示数据充数**:记录 5 页与运行报告页都是先有真实写入方 / 真实计数器(道F task-10、道G task-12),再补页面(2026-10-28 交付口径),下一批沿用。
|
||||
- 历史教训(已完成的装置维护 3 页留下的口径,后续项沿用):**执行类页面不得做成「点了个按钮但没效果」**——清除记录必须按 `syslog_clear_state()` 出真反馈;遥测死区/系数两页的三态用
|
||||
`run_par_dirty_peek()` 区分「已受理」与「已落盘」,且黄金必须出 WAIT 与 OK 两张(假件保留脏位、只由
|
||||
headless pump 清),否则真机的 WAIT 态永远不会被像素回归覆盖。
|
||||
@@ -68,8 +66,8 @@
|
||||
| 页面 | 现有数据源 | 还缺什么 |
|
||||
|---|---|---|
|
||||
| 通讯设置 | 页面与六态黄金已随 `728d6067` 入库;`[comm]` 段与端口真源在 `App/protocol/iec104/iec104_comm.{c,h}` | 「改后重启即生效」真机判据、配置段数与键数上限核对(台架窗口统一补做并留证) |
|
||||
| 记录 5 页 | SOE、自检、运行记录已有 reader 先例 | 五类写入方与记录类型 |
|
||||
| 运行报告 | `uptime_s`(本次开机内)、复位原因解析(标志读后即清) | 上电次数正源、复位原因开机快照、104 只读计数(**跨开机累计不做**,用户已裁定只报本次开机) |
|
||||
| 记录 5 页 | 五类记录 ID / 文件 / 写入点已齐(docs/任务规划/登记簿.md §7 与 App/log/README.md §五类记录);reader 注入两端已映射 7 个记录源 | 页面已交付;只剩真机判据(真记录翻页、掉电保持、清除后归零),见 docs/任务规划/登记簿.md §7 |
|
||||
| 运行报告 | boot_stats(SD2506 用户 SRAM 上电次数 + 本次复位原因快照,道G task-12)、iec104_serv 四个只读观测计数、现成 uptime_s | 页面已交付;**跨开机累计不做**(用户裁定只报本次开机)。真机待复核 SRAM 自增与四态判定,见 docs/测试说明/模拟器差距清单.md §2.3 |
|
||||
|
||||
---
|
||||
|
||||
|
||||
+47
-50
@@ -1,22 +1,25 @@
|
||||
# 数据可信(等待台架与外部资源)
|
||||
|
||||
> **只想知道要做什么:直接看 §5。** 当前只剩**两项**:卡 0b 端子变比(子板)→
|
||||
> 卡 12 标准源两点标定。它们都等待台架或外部资源,
|
||||
> **当前不占编码道;现在做 UI,见 `UI补齐.md`。**
|
||||
> (卡 0 已知电压注入已于 2026-10-27 台架闭环、六项判据全 PASS,实测见
|
||||
> `docs/硬件平台/ADC通道映射说明.md` §8.1;**该行按"口径锚点"保留并标 ✅,不按"完成即删"删行**,
|
||||
> 原因见下条。)
|
||||
> **只想知道要做什么:直接看 §5。** 当前只剩**两项**:端子/子板变比确认(等子板或原理图)→
|
||||
> 两点标定(等标准源)。它们都等待台架或外部资源,
|
||||
> **当前不占编码道。**「UI 补齐」执行清单已于 2026-10-28 清空(记录 5 页与运行报告页落地),
|
||||
> 本道继续等外部资源;下一顺位见 docs/任务规划/README.md §2.0 顺序表(换主线待用户点头)。
|
||||
> ("已知电压注入验证"已于 2026-10-27 台架闭环、六项判据全 PASS,实测记录与两项残留口径的属主是
|
||||
> `docs/硬件平台/ADC通道映射说明.md` §8.1 与 `docs/测试说明/ADC前端注入验证流程.md` §6/§7 → 已按登记簿
|
||||
> "完成即销项"纪律从 §5 表删行,任务卡编号族同步清退,见下条。)
|
||||
>
|
||||
> **本文同时是设计约束的归属文件,不是纯任务卡。** 排序只看
|
||||
> `docs/任务规划/README.md` §2;后续事项统一索引在 `登记簿.md` §7。
|
||||
> ⚠ §2.1 / §2.3 / §2.6 / §4.1~§4.5 / §7 / §8 / §9 / §10 与卡 0 / 0b / 12 都被**代码头注释**引用为
|
||||
> 口径出处(`adc_cal.*` / `meas.*` / `cfg_file.*` / `prot_elm` / `protect_task.c` / `ui_data*`)——
|
||||
> 它们是现行规范、不是"已完成记录",不要当历史删掉。**卡 0 已闭环但仍留在 §5 表里**,
|
||||
> 就是因为 `App/task/adc_task.c` 的 v3.3 修订行与 `adc:` 行注释都按"卡 0"指称那行日志的用途;
|
||||
> 删行会让代码头注释失去出处。上游分析见
|
||||
> ⚠ §2.1 / §2.3 / §2.6 / §4.1~§4.5 / §7 / §8 / §9 / §10 都被**代码头注释**引用为口径出处(`adc_cal.*` / `meas.*` / `cfg_file.*` / `prot_elm` / `protect_task.c` / `ui_data*`)——
|
||||
> 它们是现行规范、不是"已完成记录",不要当历史删掉。
|
||||
> ⚠ **原任务卡编号(形态 = 中文「卡」+ 数字:0、0b、1~12 共 14 个)整族已于 2026-10-27 清退**
|
||||
> (用户裁定:已完成内容销项删除、去除相关编号);代码头注释与文档里的引用全改成语义短语,
|
||||
> **换算表见 `docs/编号规范.md` §9.3**——旧号永久作废、不得再指,也不得重新取走
|
||||
> (销项后不留痕迹曾导致撞号,见 `docs/任务规划/README.md` §0)。
|
||||
> 上游分析见
|
||||
> `docs/问题记录/采集与数据处理短板评测.md`。
|
||||
>
|
||||
> **修订**:2026-10-23 建档。
|
||||
> **修订**:2026-10-23 建档;2026-10-27 注入验证销项 + 任务卡号整族清退。
|
||||
> ⚠ **保护现处于未标定闭锁态**:`protect_task.c:98` 要求 UA/UN/IA 的 `ADC_CAL_F_VALID`
|
||||
> 全置位才走判据,而 VALID 只在标定写入 `[adc_cal]` 的 `valid` 位图后才置位
|
||||
> (`adc_cal.c:338`)。用户裁定(2026-10-25)**保持闭锁到标准源到位**,不缩短解锁路径。
|
||||
@@ -48,12 +51,12 @@
|
||||
(拓扑图见 `docs/硬件平台/ADC通道映射说明.md` §7.1)。
|
||||
- ✅ **量程口径(2026-10-25 定)**:`docs/硬件平台/ADC通道映射说明.md` §1/§7 统一为
|
||||
"±5 V 满量程 = 10 V 跨度、LSB 152.59 µV"("±10 V" 仅作芯片可选档括注,本板 RANGE 接 GND 未用);
|
||||
全仓搜 `±10 V` 无本板口径残留。分段链路口径(引脚侧已冻结 / ③ 已定 1:1 / 变比待卡 0b)
|
||||
全仓搜 `±10 V` 无本板口径残留。分段链路口径(引脚侧已冻结 / ③ 已定 1:1 / 变比待"端子/子板变比确认")
|
||||
见同文档 §7.1。
|
||||
- ⚠ **上表的"板级系数"只到 ADC 引脚,不到端子**:③ 段已定 1:1,但端子到 `AINn` 之间还有一级
|
||||
子板/端子板变比(④ 段),而**仓库里没有任何文档给出该变比**
|
||||
(`docs/硬件平台/` 只有 `.tel` 网表与分析报告,无子板原理图)。故
|
||||
"端子二次值 = 码 × 上表系数"**不成立**,详见 §2.6 与卡 0b。
|
||||
"端子二次值 = 码 × 上表系数"**不成立**,详见 §2.6 与 §5"端子/子板变比确认"。
|
||||
|
||||
### 2.3 三个必须同步重定的下游常数
|
||||
|
||||
@@ -79,12 +82,12 @@
|
||||
|
||||
> 这不否定本波价值——"码值 → 引脚电压"本身就是巨大进步(保护判据从"跟码值比"
|
||||
> 变成"跟电压比")。但它决定 M4 的**承诺边界**:M4 承诺到"引脚电压",
|
||||
> "端子二次值"要等卡 0b 拿到变比。
|
||||
> "端子二次值"要等"端子/子板变比确认"拿到变比。
|
||||
>
|
||||
> 另一个必须查清的现象:2026-10-10 首帧读数 TPAFE 侧 `UA=11429 / UN=11454 / IA=11452`、
|
||||
> STM32 侧 `UB=1018 / UC=1044 / IB=943 / IC=1069 / IN=1052`——**同片各通道几乎相同**,
|
||||
> 而"1k 到地"在无输入时本应把节点拉到 0 V。首帧本就不是稳态值,不能据此定论,
|
||||
> 但也不能当成"已正常"。**卡 0 的零点判据已查清(2026-10-27)**:8 路短接 AGND 后零点
|
||||
> 但也不能当成"已正常"。**注入验证的零点判据已查清(2026-10-27)**:8 路短接 AGND 后零点
|
||||
> 0~5 码(TPAFE ≤4.6 mV / STM32 ≤4.0 mV),远小于首帧的 ~1000——首帧是上电瞬态,
|
||||
> 不能当零点用。另注:TPAFE ~11450 与 STM32 ~1000 是两个转换器**各自**的零位,不是同一问题。
|
||||
|
||||
@@ -96,11 +99,11 @@
|
||||
|
||||
| 里程碑 | 退出判据(全部满足才算完成) | 服务分类 | 状态(2026-10-25) |
|
||||
|---|---|---|---|
|
||||
| **M4 系数与量纲** | ① **至少 1 路电压通道经已知电压注入验证**(卡 0),斜率与理论 LSB 偏差 ≤2 %;② `adc_cal` 折算落地,采样环里是**引脚电压 V**而非码值(`eng=0`;若卡 0b 已给变比则直接到二次值 `eng=1`);③ 8 通道系数/零点可落盘、上电加载失败回退 ROM 默认;④ 三处下游常数按工程量重定并注明依据;⑤ "未标定 → 保护闭锁"生效;⑥ 量纲回归用例(不该动作时不动作)通过 | Standard | 🔶 **未收口**:①②③④⑥ 已达成(① 于 2026-10-27 台架实测闭环,UA 斜率偏差 −0.14 %,见 `docs/硬件平台/ADC通道映射说明.md` §8.1),**只剩 ⑤ 的台架面待卡 12**(需标准源置 `VALID` 才能验闭锁→解锁) |
|
||||
| **M4 系数与量纲** | ① **至少 1 路电压通道经已知电压注入验证**,斜率与理论 LSB 偏差 ≤2 %;② `adc_cal` 折算落地,采样环里是**引脚电压 V**而非码值(`eng=0`;若变比确认已给变比则直接到二次值 `eng=1`);③ 8 通道系数/零点可落盘、上电加载失败回退 ROM 默认;④ 三处下游常数按工程量重定并注明依据;⑤ "未标定 → 保护闭锁"生效;⑥ 量纲回归用例(不该动作时不动作)通过 | Standard | 🔶 **未收口**:①②③④⑥ 已达成(① 于 2026-10-27 台架实测闭环,UA 斜率偏差 −0.14 %,见 `docs/硬件平台/ADC通道映射说明.md` §8.1),**只剩 ⑤ 的台架面待两点标定**(需标准源置 `VALID` 才能验闭锁→解锁) |
|
||||
|
||||
**M5 遥测链 / M6 运行参数与点表**:均已达成,口径沉淀在 `App/algo/meas.h`、`App/algo/run_par.h`
|
||||
头注释与 §4.5;M5 的"104 上送值与**工程量**一致"仍挂卡 0b / 卡 12(卡 0 只证到"引脚电压"口径,
|
||||
二次值要等 0b 的变比)。
|
||||
头注释与 §4.5;M5 的"104 上送值与**工程量**一致"仍挂"端子/子板变比确认"与"两点标定"(注入验证只证到"引脚电压"口径,
|
||||
二次值要等变比确认拿到变比)。
|
||||
|
||||
> **不进本波退出判据的两项增强**:谐波**方和根真有效值**(挂
|
||||
> `docs/算法/继电保护功能复现规划.md` 「遥测谐波轨(可选)」)与快照**4 点平均平滑**——随谐波轨立项一起做;
|
||||
@@ -215,43 +218,37 @@ typedef struct {
|
||||
|
||||
---
|
||||
|
||||
## 5. 任务卡(五字段;完成即销项删行,例外见状态图例)
|
||||
## 5. 任务卡(完成即销项删行;标识列用语义短语,不配编号)
|
||||
|
||||
> 资源图例:🔴 台架(COM6/ST-LINK,`bench.lock` 独占)· 🟡 外部(标准源 / 子板原理图)· 🟢 纯软件。
|
||||
> 状态:⬜ 未开始 · 🟦 进行中 · ✅ 已闭环(**仅限被代码头注释指称的卡,保留行不删**)。
|
||||
> 状态:⬜ 未开始 · 🟦 进行中。**已闭环 = 直接删行**(2026-10-27 起取消"被代码注释指称就保留行"的
|
||||
> 例外——引用侧已全部改成语义短语,删行不再会让任何注释失去出处)。
|
||||
> **新条目一律用语义标识,不新增字母+数字编号**(规则见 `docs/任务规划/README.md` §0)。
|
||||
> 序栏 0 / 0b 只为阅读顺序(补的是 §2.6 这一前置验证),1~12 的编号与外部引用保持不变。
|
||||
> **顺序:0 ✅ → 0b → 12**。卡 0 已于 2026-10-27 台架闭环,是 M4 ①、卡 12 与 B10 送检的前置**已解除**;
|
||||
> **下一步做卡 0b**(等子板实物或原理图)。
|
||||
> **卡 0 的台架执行步骤**(注入点清单、期望码值、五步流程与现场记录表)见
|
||||
> `docs/测试说明/ADC前端注入验证流程.md`——本表只写判据,不写怎么接表笔。
|
||||
> 上面那种「卡」+ 数字的形态已整族清退(换算表 `docs/编号规范.md` §9.3),旧号永久作废、不得重新取走。
|
||||
> **顺序:已知电压注入验证(✅ 已闭环 → 已删行)→ 端子/子板变比确认 → 两点标定**;注入验证是
|
||||
> M4 ①、两点标定与 B10 送检的前置,**2026-10-27 已解除**;**下一步做变比确认**(等子板实物或原理图)。
|
||||
> 已闭环那张卡的台架执行步骤(注入点清单、期望码值、五步流程与现场记录表)在
|
||||
> `docs/测试说明/ADC前端注入验证流程.md`,实测结论在 `docs/硬件平台/ADC通道映射说明.md` §8.1——
|
||||
> 本表只写判据,不写怎么接表笔。
|
||||
|
||||
| 序 | 任务 | DoD(可验证验收判据) | 硬依赖 | 资源 | 写范围 | 状态 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| **0** | **已知电压注入验证(首次功能级 ADC 验证)** | 在**可安全接触的最低一级**(ADC 引脚侧或端子侧,二选一并在证据里写明注入点)用板载 3.3 V 轨经电位器注入 **3 个直流点**(≈0.3 / 1.0 / 2.0 V),每点**同时**用万用表读注入点实际电压 + 读 `adc_input_raw()` 码值:① 三点线性拟合 **R² ≥ 0.999**;② 注入点在引脚侧时,斜率须与 §2.1 理论值(TPAFE 6553 码/V、STM32 1241 码/V)偏差 **≤2 %**;在端子侧时把斜率记为**实测变比**;③ 注入 0 V(短接 AGND)零点 \|码\| ≤ 30(TPAFE)/ ≤ 5(STM32),并解释首帧 ~1000 码的来源;④ **逐通道映射确认**:8 路电气量逐个注入,确认"注入哪一路、哪一路语义变化",语义与下标不符即映射错;⑤ TPAFE 侧原"BUSY 有脉冲"判据**改用固件帧计数**(注入前后 `tpafe5160_frame_seq()` 仍严格 1000 Hz 递增)——不需要示波器;⑥ 结论写回 `docs/硬件平台/ADC通道映射说明.md` §8,把"尚未执行"改为实测值 + 日期 | — | 🔴 + 万用表(**不需信号源 / 示波器**) | `docs/硬件平台/ADC通道映射说明.md`、`docs/测试说明/boot_log_data/` | ✅ |
|
||||
| **0b** | **端子 / 子板变比确认** | 给出"端子电压 → ADC 引脚电压"的比值(万用表同时量端子与引脚,或查子板原理图后实测核对),写入 `docs/硬件平台/ADC通道映射说明.md`;据此判定 `eng` 能否置 1;数据缺失则本波只交付引脚电压并登记缺口 | 0 | 🟡 子板实物或原理图 | `docs/硬件平台/` | ⬜ |
|
||||
| **12** | **8 通道两点标定与精度验收** | 电压 4 路(UA/UB/UC/UN)+ 电流 4 路(IA/IB/IC/IN)各做两点标定(零点 + 满度,温度不纳入),写入 `[adc_cal]` 并置 `VALID`;误差 ≤ 目标精度(待定:0.5 级 / 1 级);证据归档 | 0、0b | 🟡 标准源 / 继保测试仪 | `docs/算法/`、`docs/测试说明/boot_log_data/` | ⬜ |
|
||||
| 标识(任务名)| DoD(可验证验收判据) | 硬依赖 | 资源 | 写范围 | 状态 |
|
||||
|---|---|---|---|---|---|
|
||||
| **端子/子板变比确认** | 给出"端子电压 → ADC 引脚电压"的比值(万用表同时量端子与引脚,或查子板原理图后实测核对),写入 `docs/硬件平台/ADC通道映射说明.md`;据此判定 `eng` 能否置 1;数据缺失则本波只交付引脚电压并登记缺口 | 已知电压注入验证(✅ 已闭环) | 🟡 子板实物或原理图 | `docs/硬件平台/` | ⬜ |
|
||||
| **两点标定与精度验收** | 电压 4 路(UA/UB/UC/UN)+ 电流 4 路(IA/IB/IC/IN)各做两点标定(零点 + 满度,温度不纳入),写入 `[adc_cal]` 并置 `VALID`;误差 ≤ 目标精度(待定:0.5 级 / 1 级);证据归档 | 端子/子板变比确认 | 🟡 标准源 / 继保测试仪 | `docs/算法/`、`docs/测试说明/boot_log_data/` | ⬜ |
|
||||
|
||||
> 三张卡的分工:**0b 与 12 都是外部依赖**(子板 / 标准源),0 没有。M4 用板级 LSB 常数即可
|
||||
> 收口(`eng=0`),但"二次值"真正成立要靠 0b 的变比、`VALID` 置位要靠 12。
|
||||
>
|
||||
> **卡 0 闭环结论(2026-10-27,注入点 = 端子侧 `U5` 排针,判据 ①~⑥ 全 PASS)**:零点 0~5 码 ·
|
||||
> 三点拟合 R² = 0.9999997 · 斜率 6544.2 码/V(vs 引脚侧理论 6553.6,偏差 −0.14 %,**故 ③ 段确为 1:1,
|
||||
> 判据 ② 按"端子侧斜率 = 实测变比"记为 ≈ 0.999**)· 8 路逐通道映射一一对应 · 极性对称性 ≤0.34 % ·
|
||||
> 注入前后 `frames` 均 Δ9998/10 s(1000 Hz)。明细与两项残留口径见
|
||||
> `docs/硬件平台/ADC通道映射说明.md` §8.1。**残差**:最小二乘残差 −2.03/+3.45/−1.42 码(无系统性弓形);
|
||||
> IB 零点 2~5 码最贴近 ≤5 上限,若后续变大先查 R49 / `AIN9`。
|
||||
> 两张卡的分工:**变比确认与两点标定都是外部依赖**(子板 / 标准源),软件道已无待做项。M4 用板级
|
||||
> LSB 常数即可收口(`eng=0`),但"二次值"真正成立要靠变比确认拿到的变比、`VALID` 置位要靠两点标定。
|
||||
|
||||
---
|
||||
|
||||
## 6. 并行与顺序
|
||||
|
||||
```
|
||||
0 ✅ 注入验证(万用表)→ 0b 变比(子板)→ 12 两点标定(标准源)
|
||||
0 ✅ ─→ 闭锁验证(VALID 置位后保护才走判据)→ B10 送检
|
||||
注入验证 ✅(万用表,已闭环)→ 变比确认(子板)→ 两点标定(标准源)
|
||||
注入验证 ✅ ─→ 闭锁验证(VALID 置位后保护才走判据)→ B10 送检
|
||||
```
|
||||
|
||||
- **卡 0 斜率规则**:实测斜率与理论 LSB 偏差 >2 % 时**先查前端(分压/变比/焊接)再改系数**——
|
||||
- **实测斜率偏差规则**(注入验证定下的口径):实测斜率与理论 LSB 偏差 >2 % 时**先查前端(分压/变比/焊接)再改系数**——
|
||||
用系数凑斜率会把硬件的错固化成"标定值"。**2026-10-27 实测偏差 −0.14 %,规则未触发**;
|
||||
这条规则的第一次实战价值在于**反向确认**:若 ③ 段真是 2:1 分压,斜率会掉到 ~3277 码/V,
|
||||
实测 6544.2 直接把它排除。
|
||||
@@ -267,7 +264,7 @@ typedef struct {
|
||||
|
||||
| # | 问题 | 备选 | 建议 / 现状 |
|
||||
|---|---|---|---|
|
||||
| 1 | **精度目标** | 0.5 级 / 1 级 | 决定卡 12 的判据。**仍未拍板**——保护判据本身只需 3~5 %,0.5 级是计量口径;**卡 12 开跑前必须定**,否则"误差 ≤ 目标精度"这条 DoD 无法判定 |
|
||||
| 1 | **精度目标** | 0.5 级 / 1 级 | 决定两点标定的判据。**仍未拍板**——保护判据本身只需 3~5 %,0.5 级是计量口径;**两点标定开跑前必须定**,否则"误差 ≤ 目标精度"这条 DoD 无法判定 |
|
||||
| 2 | **端子 / 子板变比从哪来** | ① 有子板原理图(直接算)② 只有子板实物(万用表同时量端子与引脚)③ 都没有 | 决定 `eng` 能否置 1。②同样可行且够用;③则本波只交付"ADC 引脚电压",二次值登记为缺口。**未拍板**(取决于子板是否到手) |
|
||||
|
||||
**已定案(不再讨论)**:未标定即闭锁(2026-10-25 用户裁定**保持闭锁到标准源到位**,
|
||||
@@ -283,11 +280,11 @@ typedef struct {
|
||||
| 风险 | 触发条件 | 缓解 |
|
||||
|---|---|---|
|
||||
| **`cfg` 键数顶格** | 后续给 `[adc_cal]` 加键 | 已按 8+1 / 8 拆段;加键前先看 `CFG_FILE_MAX_KEYS`,必要时再拆 |
|
||||
| **标定值把保护"调坏"** | 卡 12 写入错误系数 | `adc_cal_set()` 校验范围(`k` 必须在板级系数 × [0.5, 2.0] 内)+ 写入后回读校验;越界拒绝并留 `[ERR]` |
|
||||
| **标定值把保护"调坏"** | 两点标定写入错误系数 | `adc_cal_set()` 校验范围(`k` 必须在板级系数 × [0.5, 2.0] 内)+ 写入后回读校验;越界拒绝并留 `[ERR]` |
|
||||
| **削顶通道被当成可测** | 消费者只看 `k` 不看 `flags` | `adc_cal_flags()` 是唯一查询入口,`adc_cal_apply()` 不返回可用性;单测覆盖"CLIPPED 通道 104 恒 IV" |
|
||||
| **快照双写** | 104 或 UI 侧也加一个 200 ms 计时器 | 设计约定"唯一发布者 = `adc_task`";其余侧只读,评审时看 `meas_tick()` 的调用点数量 = 1 |
|
||||
| **未验证的系数被当成定论** | 跳过卡 0 直接冻结 ROM 默认系数 | ✅ **风险已解除(2026-10-27)**:卡 0 实测斜率 6544.2 码/V,与 ROM 默认系数所依据的理论 LSB(6553.6)偏差 **−0.14 %**,默认系数被实测支持。规则保留:日后若某路偏差 >2 %,**先查前端**(分压/变比/焊接),不用系数去凑 |
|
||||
| **加压烧板** | 变比未确认就往端子加额定电压 | 卡 0 已按 ≤2 V 直流执行完毕;**端子级上额定值仍必须在卡 0b 之后**,且先量"端子对地通断"确认无直流通路 |
|
||||
| **未验证的系数被当成定论** | 跳过注入验证直接冻结 ROM 默认系数 | ✅ **风险已解除(2026-10-27)**:注入验证实测斜率 6544.2 码/V,与 ROM 默认系数所依据的理论 LSB(6553.6)偏差 **−0.14 %**,默认系数被实测支持。规则保留:日后若某路偏差 >2 %,**先查前端**(分压/变比/焊接),不用系数去凑 |
|
||||
| **加压烧板** | 变比未确认就往端子加额定电压 | 注入验证已按 ≤2 V 直流执行完毕;**端子级上额定值仍必须在变比确认之后**,且先量"端子对地通断"确认无直流通路 |
|
||||
|
||||
---
|
||||
|
||||
@@ -301,7 +298,7 @@ typedef struct {
|
||||
| PT 断线判据 | 需要 `flags` 与遥信配合,而 V0.1 **无开入硬件** → 与下一行同归开入波次 |
|
||||
| 开入 / 开出固件 | 固件里**完全没有**这两类代码(`docs/问题记录/采集与数据处理短板评测.md` 登记),是另一个波次的量级 |
|
||||
| 温度非线性折算 | 见 §7 已定案行"温度不纳入线性标定" |
|
||||
| 端子二次值(一次/二次变比换算) | **条件项**:卡 0b 拿到变比才做;拿不到则本波只到"ADC 引脚电压",`eng` 保持 0,缺口登记进 `docs/任务规划/登记簿.md` |
|
||||
| 端子二次值(一次/二次变比换算) | **条件项**:变比确认拿到变比才做;拿不到则本波只到"ADC 引脚电压",`eng` 保持 0,缺口登记进 `docs/任务规划/登记簿.md` |
|
||||
| UI 页面(含交流量回炉) | 归「UI 扩展」;本波只保证 `meas_snap_t` 可供其消费 |
|
||||
|
||||
---
|
||||
@@ -310,7 +307,7 @@ typedef struct {
|
||||
|
||||
| 工作 | 关系 |
|
||||
|---|---|
|
||||
| **送检验收** | 标准源送检的标定复核依赖本波卡 12;验收索引见 `登记簿.md` §7 |
|
||||
| **UI 补齐** | 已交付的 `meas_snap_t` + `adc_cal_flags()` 供 `ui_data_rt_t` 填 `eng`:现为 0 = 引脚电压,卡 0b 拿到变比后才升 1 = 二次值,交流量页"标定状态"才有真值。当前 UI 任务见 `UI补齐.md`,不必等卡 0b |
|
||||
| **送检验收** | 标准源送检的标定复核依赖本波两点标定;验收索引见 `登记簿.md` §7 |
|
||||
| **UI 补齐** | 已交付的 `meas_snap_t` + `adc_cal_flags()` 供 `ui_data_rt_t` 填 `eng`:现为 0 = 引脚电压,变比确认拿到变比后才升 1 = 二次值,交流量页"标定状态"才有真值。当前 UI 任务见 `UI补齐.md`,不必等变比确认 |
|
||||
| **结构债** | 无交集 |
|
||||
| **双转换器无共同采样触发(V0.2 硬件改版)** | 本波的 `CLIPPED` 位就是「双转换器无共同采样触发」在软件里的可见形态;V0.2 改版后该位恒 0,页面与 104 绑定零改动 |
|
||||
|
||||
+2
-1
@@ -60,12 +60,13 @@
|
||||
|
||||
| 条目 | 需要条件 | 要做的事 | 去向 |
|
||||
|---|---|---|---|
|
||||
| **数据可信三项** | 台架与万用表;子板实物或原理图;标准源 | 已知电压注入 → 端子变比 → 8 通道两点标定 | 唯一任务卡与验收在 `数据可信.md` §5 |
|
||||
| **数据可信两项** | 子板实物或原理图;标准源 | 端子/子板变比确认 → 8 通道两点标定 | 唯一任务卡与验收在 `数据可信.md` §5 |
|
||||
| **标准源送检与第三方 104 验收** | 两点标定完成、保护 VALID 置位、第三方主站 | 标准源注入判据全部通过;总召、周期、变位、遥控全流程通过;证据归档。送检窗口前 2 日冻结特性 | `../子系统设计/IEC104上行设计说明.md` §7/§8 |
|
||||
| **L5 队列往返基线待重验** | 台架 + PC peer | 下次 Phase 13 窗口重锁基线 | 本文件 §1 |
|
||||
| **网络负向场景台架验证** | 拔线、SPI 故障注入、远显压力条件 | PHY 拔线、芯片级 `net_init` 失败、短写压测 | 本文件 §1 |
|
||||
| **串口助手正路径补验** | CH340 接入 | 补齐尚未覆盖的正路径 | `../测试说明/串口助手设计说明.md` |
|
||||
| **CI 远端闭环未验证** | runner 与第二台机器 | 验证远端两 job 闭环和不同工具路径 | 本文件 §4 |
|
||||
| **UI 六页真机判据(记录 5 页 + 运行报告)** | 台架:NAND 里有真实事件记录、SD2506 电池域可控、104 主站可连 | 上板复核六件事:真记录翻页与掉电后保持、清除记录后对应页归零、上电一次看 `boot_count` +1、拔 RTC 电池后 `seq_state` 落 RESTARTED、IWDG 复位后 `rst_cause` 落 IWDG、主站连一次看 `conn_up` +1(模拟器侧这些记录文件无写入方、无 `boot_stats`、无 104 协议栈,黄金只拍得到空态「无记录」与固定假数据的显示口径) | 六个页面模块文件头「台架待补」段 + `../测试说明/模拟器差距清单.md` §2.3 开机账本一行 |
|
||||
|
||||
**送检顺序不可倒过来**:产品构建当前要求 UA/UN/IA 的标定 VALID 全部置位才走保护判据。
|
||||
未完成标准源标定就送检,保护会表现为不动作。保持该闭锁,不用非标准源标定走捷径。
|
||||
|
||||
@@ -47,10 +47,10 @@ dhara 失败类 +84;RO 另 +208,全是该失败类名表)→ `ER_IROM1`
|
||||
<!-- MEM_SNAPSHOT:BEGIN generated by scripts/check_mem_numbers.py -->
|
||||
| 区域 | 用量 | 容量 | 占比 |
|
||||
|---|---|---|---|
|
||||
| ER_IROM1 | 261,928 B (255.79 KB) | 1,048,576 B (1024 KB) | 25.0% |
|
||||
| RW_IRAM1 | 81,072 B (79.17 KB) | 131,072 B (128 KB) | 61.9% |
|
||||
| ER_IROM1 | 264,580 B (258.38 KB) | 1,048,576 B (1024 KB) | 25.2% |
|
||||
| RW_IRAM1 | 81,536 B (79.62 KB) | 131,072 B (128 KB) | 62.2% |
|
||||
| RW_CCM | 57,376 B (56.03 KB) | 65,280 B (64 KB) | 87.9% |
|
||||
| **Flash (ROM 合计)** | **263,500 B (257.3 KB)** | 1,048,576 B (1024 KB) | **25.1%** |
|
||||
| **Flash (ROM 合计)** | **266,456 B (260.2 KB)** | 1,048,576 B (1024 KB) | **25.4%** |
|
||||
<!-- MEM_SNAPSHOT:END -->
|
||||
|
||||
各区的容量与常量来源:
|
||||
|
||||
@@ -15,16 +15,16 @@
|
||||
<!-- MEM_BUDGET:BEGIN generated by scripts/ram_baseline.py -->
|
||||
| 区域 | 用量 | 容量 | 占比 | 门禁(≤92%) |
|
||||
|---|---|---|---|---|
|
||||
| ER_IROM1 (Flash) | 261,928 B | 1,048,576 B | 25.0% | 参考 |
|
||||
| ER_IROM1 (Flash) | 264,580 B | 1,048,576 B | 25.2% | 参考 |
|
||||
| RW_CCM | 57,376 B | 65,280 B | 87.9% | PASS |
|
||||
| UNINIT_CCM | 48 B | 256 B | 18.8% | 参考 |
|
||||
| RW_IRAM1 | 81,072 B | 131,072 B | 61.9% | PASS |
|
||||
| RW_IRAM1 | 81,536 B | 131,072 B | 62.2% | PASS |
|
||||
|
||||
| 子系统(静态 RW+ZI;除 RTOS 堆在 CCM 外均在 SRAM1) | 现值 | 配额 | 状态 |
|
||||
|---|---|---|---|
|
||||
| 网络 | 13,702 B | 12 KB | ⚠ 超 1.4 KB |
|
||||
| 存储 | 7,072 B | 12 KB | OK |
|
||||
| UI | 34,188 B | 16 KB | ⚠ 超 17.4 KB |
|
||||
| UI | 34,656 B | 16 KB | ⚠ 超 17.8 KB |
|
||||
| RTOS 堆 | 57,376 B | 56 KB | 堆=配额 |
|
||||
| 应用 | 15,552 B | 8 KB | ⚠ 超 7.2 KB |
|
||||
| 其它 | 10,553 B | — | 参考 |
|
||||
|
||||
+19
-19
@@ -37,26 +37,26 @@
|
||||
|
||||
| IOA | 点 | 来源 | V0.1 状态 |
|
||||
|---|---|---|---|
|
||||
| 0x4011 | 1Ua | L2 遥测快照槽 `ADC_SEM_UA`(卡 9) | ✅ 有效 |
|
||||
| 0x4011 | 1Ua | L2 遥测快照槽 `ADC_SEM_UA`(104 改读快照) | ✅ 有效 |
|
||||
| 0x4012/0x4013 | 1Ub/1Uc | 同表槽位;STM32 侧削顶(`docs/算法/继电保护功能复现规划.md` §1.6) | ❌ 发 IV——**品质驱动**(快照 CLIPPED 位映射,非点表绑死;V0.2 消除双转换器无共同采样触发后零改动自动启用) |
|
||||
| 0x4014 | 1U0 | 快照槽 `ADC_SEM_UN`(外部零序专用通道) | ✅ 有效 |
|
||||
| 0x4015 | 1Ia | 快照槽 `ADC_SEM_IA` | ✅ 有效 |
|
||||
| 0x4016~0x4018 | 1Ib/1Ic/1I0 | 同 Ub/Uc:绑槽 + 品质驱动 | ❌ 发 IV |
|
||||
| 0x401D | 1f 频率 | 快照 `freq_hz`(卡 11 绑源;B8 自适应窗测频 `freq_get()` 同源) | ✅ 随测频收敛生效;`freq_valid()==0` → IV(卡 11 DoD) |
|
||||
| 0x401D | 1f 频率 | 快照 `freq_hz`(频率点绑定;B8 自适应窗测频 `freq_get()` 同源) | ✅ 随测频收敛生效;`freq_valid()==0` → IV(该点 DoD 原句) |
|
||||
|
||||
- **数据源 = L2 遥测快照**(`App/algo/meas.h`,「数据可信」卡 8/9):200 ms 基波有效值
|
||||
- **数据源 = L2 遥测快照**(`App/algo/meas.h`,「数据可信」遥测快照发布与 104 消费):200 ms 基波有效值
|
||||
+ 每点品质,104 与 UI 共用同一份上游;读数单位 = ADC 引脚电压(eng=0,`App/algo/adc_cal`
|
||||
折算层 2026-10-25 落地;二次值等卡 12 标定置 VALID)。槽位值/品质整体透传,本层
|
||||
折算层 2026-10-25 落地;二次值等两点标定置 VALID)。槽位值/品质整体透传,本层
|
||||
**不再自行判新旧**(快照 `seq` 仅供 COV 去重)。
|
||||
- 品质映射:快照 `MEAS_QDS_*` 低字节与线上 QDS 同值直传;**CLIPPED → IV**(「削顶通道
|
||||
恒 IV」口径不变、改由品质驱动,docs/任务规划/数据可信.md §8 风险表末行的单测要求);
|
||||
快照从未发布(开机 <200 ms)→ IV|NT;判定顺序 IV 优先于 NT。
|
||||
- 死区(卡 9):从「越死区即报」改为**连续 2 个新测量点越限才确认**——板端测量点 =
|
||||
- 死区(104 改读快照):从「越死区即报」改为**连续 2 个新测量点越限才确认**——板端测量点 =
|
||||
快照换帧(100 ms 轮询 vs 200 ms 快照按 `seq` 去重,防同一帧把单点噪声重复计满 2 点;
|
||||
基准恒为**上次上送值**,非上次读值——防慢漂移把基准吃掉,参考系统同款);品质翻转
|
||||
当拍直报、不计数。死区数值 = 运行时副本(`iec104_pts_yc_set_deadband`,ROM 默认沿
|
||||
卡 6 额定 0.5% 档:0.5 V / 0.005 A / 0.5 Hz;卡 10 接 8020H 段后主站可读写);
|
||||
标准源注入复核(卡 12)待台架。
|
||||
下游常数按工程量重定的额定 0.5% 档:0.5 V / 0.005 A / 0.5 Hz;运行参数段接 8020H 段后主站可读写);
|
||||
标准源注入复核(两点标定)待台架。
|
||||
|
||||
### 3.2 遥信 YX(IOA 1~33)
|
||||
|
||||
@@ -113,7 +113,7 @@
|
||||
开机在 STORAGE_READY 屏障前装载,损坏/越界/版本换代 = 整表拒绝保持出厂默认
|
||||
(all-or-nothing)+ 自检留痕 `prot set corrupt`;写盘失败脏标志保留 = 下轮重试。
|
||||
|
||||
**运行参数段 `0x8020H~0x8058H`(「数据可信」卡 10,2026-10-25 落实)**:
|
||||
**运行参数段 `0x8020H~0x8058H`(「数据可信」交付项,2026-10-25 落实)**:
|
||||
|
||||
> ⚠ 逐项地址为**本仓自定**(`docs/算法/继电保护功能复现规划.md` §5.4 的权威表不在仓——
|
||||
参考项目 `CommPara_ConfigTable` 拿不到,送检点表到位后**以送检为准替换常量表**,
|
||||
@@ -121,7 +121,7 @@
|
||||
|
||||
| 地址 | 项 | 域(C_SE/C_RD 浮点工程量) | 工厂默认 | 真源与守卫 |
|
||||
|---|---|---|---|---|
|
||||
| 0x8030~0x8038 | 遥测死区 UA/UB/UC/UN/IA/IB/IC/IN/FREQ | V / A / Hz,分档上限 50/1/5 | 卡 6 额定 0.5 % 档(0.5 V ×4 / 0.005 A ×4 / 0.5 Hz) | `run_par` [run_par] 段 9 键 int32 毫单位;落盘键表 → `docs/子系统设计/网络配置说明.md` §3.5 |
|
||||
| 0x8030~0x8038 | 遥测死区 UA/UB/UC/UN/IA/IB/IC/IN/FREQ | V / A / Hz,分档上限 50/1/5 | 下游常数按工程量重定的额定 0.5 % 档(0.5 V ×4 / 0.005 A ×4 / 0.5 Hz) | `run_par` [run_par] 段 9 键 int32 毫单位;落盘键表 → `docs/子系统设计/网络配置说明.md` §3.5 |
|
||||
| 0x8040~0x8047 | 通道 k 覆盖(µV/码) | 正浮点;adc_cal 合法带 ROM×[0.5,2.0] 执行段裁决 | 回显生效值(ROM = 152.587890625 / 805.6640625) | **写 = `adc_cal_set` 代理,系数唯一真源在 [adc_cal] 段,run_par 不存系数**(防后人拿 run_par 表当真源表) |
|
||||
| 0x8048~0x804F | 通道 b 覆盖(码值,可负) | ±8192(adc_cal 带) | 0(回显) | 同上;单侧写 RMW 用另一侧**当前生效值** |
|
||||
| 其余 | 留白(PT/CT 变比等未启用类别) | — | — | C_RD → COT14+EVI / C_SE → actcon+PN |
|
||||
@@ -132,11 +132,11 @@
|
||||
- 现行门控 = 两段式 + 范围/合法带校验(与保护定值同款),**无「仅暂停/测试态可写」
|
||||
门控**——文档现行如此,不造新语义;若送检点表要求该类门控,接线点在
|
||||
`run_par_104_write` 执行段入口,加一处即可。
|
||||
- 持久化(卡 10):任一写成功置 `run_par` 脏 → iec104Task 同款 peek 投递
|
||||
- 持久化(运行参数段):任一写成功置 `run_par` 脏 → iec104Task 同款 peek 投递
|
||||
`SYS_EVT_RUN_PAR_SAVE`(1<<8) → defaultTask `run_par_store_save()` 调 `cfg_file_save()`
|
||||
整档外科保存(一趟覆盖 [run_par] 9 键 + 被代理改写的 [adc_cal]/[adc_cal_ofs],
|
||||
lead 裁②一条事件位一趟够用);失败脏保留 = 下轮重试。消费侧(COV 判定)**实时读
|
||||
引擎副本**,无缓存无投递(卡 9 的 pts 层 s_yc_db 副本已收编进 run_par)。
|
||||
引擎副本**,无缓存无投递(104 改读快照时的 pts 层 s_yc_db 副本已收编进 run_par)。
|
||||
|
||||
## 4. 链路与流程
|
||||
|
||||
@@ -148,7 +148,7 @@
|
||||
YC 组 SQ=1 → 频率单点)→ actterm;首召/ RBT 位 → COT=4(初始化),否则 COT=2。
|
||||
单次 poll 发送预算 4 个 ASDU(防大扫描饿死宿主任务)。
|
||||
- 突发:COV = 遥信变位 + 遥测**死区 2 点确认 + 品质翻转直报**(`iec104_pts_cov_check`,
|
||||
卡 9 语义见 §3.1 注),COT=3 逐点 SQ=0。
|
||||
104 改读快照语义见 §3.1 注),COT=3 逐点 SQ=0。
|
||||
- 周期:RUN 态 60 s 全 YC 上送 COT=1。
|
||||
- 遥控/定值写:两段式,失配/越界 → COT|PN 否定确认;未知 IOA → COT=14+EVI、
|
||||
错公共地址 → COT=13+EVI、未知类型 → COT=12+EVI。
|
||||
@@ -229,7 +229,7 @@
|
||||
|
||||
| 层 | 内容 |
|
||||
|---|---|
|
||||
| L0.5 | `test/host/iec104/`:APCI 重组/坏帧、STARTDT 握手、总召全流程(含 RBT/分片/预算)、COV、k/w 窗、t1/t2/t3(假时基)、遥控两段式与 PN、YK12 软压板两段转真 + 置脏(B7)、定值两段写 + set_sealed 后 selfcheck、C_RD(含本地项不可寻址)、C_CS(含闰年)、错地址/错类型 EVI;**板端默认源真实链**(ring→phasor→freq→meas 快照,非桩):值/品质透传、CLIPPED→IV、0x401D 绑频(收敛 ±0.02 Hz / 未新鲜 IV)、死区运行时化 + 2 点确认/回摆撤销、seq 去重(卡 9/11,TC-IEC104-025~028)+ 运行参数段路由/两段式/RMW(卡 10,TC-IEC104-029)+ `[comm]` 段真链(道G task-8,TC-IEC104-031~033:注册/出厂模板/沉降重载/带外自愈/setter 守卫/ca 端到端 = C_RD 正答与旧写死 ca=1 转 COT13+EVI);`test/host/iec104_serv/` 钉端口与 ca 取值来源(TC-I104SRV-001b/c);`test/host/cfg_file/` 钉段/键容量上限(TC-CONFIG-056/057);`test/host/run_par/`:[run_par] 注册/落盘往返/守卫/系数直通合法带(TC-RUNPAR-001~008);`test/host/prot_set/`:blob 往返 + 损坏整表拒绝(all-or-nothing)|
|
||||
| L0.5 | `test/host/iec104/`:APCI 重组/坏帧、STARTDT 握手、总召全流程(含 RBT/分片/预算)、COV、k/w 窗、t1/t2/t3(假时基)、遥控两段式与 PN、YK12 软压板两段转真 + 置脏(B7)、定值两段写 + set_sealed 后 selfcheck、C_RD(含本地项不可寻址)、C_CS(含闰年)、错地址/错类型 EVI;**板端默认源真实链**(ring→phasor→freq→meas 快照,非桩):值/品质透传、CLIPPED→IV、0x401D 绑频(收敛 ±0.02 Hz / 未新鲜 IV)、死区运行时化 + 2 点确认/回摆撤销、seq 去重(104 改读快照与频率点绑定,TC-IEC104-025~028)+ 运行参数段路由/两段式/RMW(TC-IEC104-029)+ `[comm]` 段真链(道G task-8,TC-IEC104-031~033:注册/出厂模板/沉降重载/带外自愈/setter 守卫/ca 端到端 = C_RD 正答与旧写死 ca=1 转 COT13+EVI);`test/host/iec104_serv/` 钉端口与 ca 取值来源(TC-I104SRV-001b/c);`test/host/cfg_file/` 钉段/键容量上限(TC-CONFIG-056/057);`test/host/run_par/`:[run_par] 注册/落盘往返/守卫/系数直通合法带(TC-RUNPAR-001~008);`test/host/prot_set/`:blob 往返 + 损坏整表拒绝(all-or-nothing)|
|
||||
| L0 | `iec104-unit-test` 钩子 + cppcheck/coding-standard |
|
||||
| 台架 | `@test` 锚点(104 服务启动/监听行);**PC 主站客户端 `test/host/iec104_master.py`(纯标准库,B6 2026-10-12 就绪)**:STARTDT/总召四组+actterm/C_SE 定值两段写→YX15·16 变位(COT=3)/恢复复归/YK11 两段正答/C_RD 读回,台架往返 **18/18 PASS**(证据 `../测试说明/boot_log_data/20261012_B6_iec104_roundtrip_log.txt`);**B7 持久化模式 `--b7-pre/--b7-post/--b7-mark/--b7-check`**(中间 ST-LINK 复位):YK12 两段投退→保护退出/联动、**定值与压板态跨复位保持**(含非默认 7.5 往返),**21/21 + 13/13 + 4/4+4/4 PASS**(证据 `../测试说明/boot_log_data/20261012_B7_iec104_persist_log.txt`);**B9 SOE 腿**(同工具同轮回归):自发 YX 断言 **M_SP_TB_1 带 ts**(工具解析 type 30/1 双型)+ FTP 下载 `/log/soe.log` 经 `test/host/soe/decode_soe.py` 解码断言(校验和/seq 单调/CP56↔epoch UTC 交叉),pre 21/21 + post 13/13 不回归;lib60870 级第三方全流程归 B10 |
|
||||
|
||||
@@ -239,8 +239,8 @@
|
||||
2. ~~SOE 带时标~~ **突发单点已带 CP56 时标 = M_SP_TB_1(B9 落地,见 §3.2)**;
|
||||
双点带时标不做(V0.1 双点恒 IV,无意义)。
|
||||
3. YK1~4/13/14 否定确认——出口硬件确认后(R7)转真执行(YK12 已于 B7 转真)。
|
||||
4. ~~遥测死区 10.0 码值为拟定值~~——工程量死区已于 2026-10-25 卡 6 落地(额定 0.5%);
|
||||
卡 9 已加 2 点确认;卡 10(2026-10-25)已落地 **0x8020~0x8058 读写映射 + [run_par]
|
||||
4. ~~遥测死区 10.0 码值为拟定值~~——工程量死区已于 2026-10-25 随下游常数按工程量重定落地(额定 0.5%);
|
||||
104 改读快照已加 2 点确认;运行参数段(2026-10-25)已落地 **0x8020~0x8058 读写映射 + [run_par]
|
||||
持久化 + 系数覆盖直通 adc_cal**——死区系数唯一真源 = cfg 引擎副本(run_par 存死区、
|
||||
**不存系数**,系数真源在 [adc_cal] 段,见 §3.4 表注),`iec104_pts_yc_set_deadband`
|
||||
降级为转发壳。
|
||||
@@ -264,8 +264,8 @@
|
||||
| 2026-10-12 | B4 落地回填:承载改**专用 iec104Task**(netTask 承载会 RPC 自死锁);§5 全量回填(门控/代次/拆链/对时/看门狗位 7);抢占策略修正为**首到优先**(§8 第 7 条);§6 实测(640 words,链 1456 B,余 43% PASS) |
|
||||
| 2026-10-12 | **B7 定值持久化 + 软压板**:YK12 转真(§3.3,两段式 → `PS_GLOBAL_EN`);定值执行段改 `prot_set_set_sealed` 原子写+封存(§3.4,收口 B5 竞态窗口);本地项 `comm_addr=0` 不可寻址;持久化 = 脏标志 → `SYS_EVT_PROT_SET_SAVE` → defaultTask 原子写 `/prot_set.bin`,开机屏障前整表原子装载(损坏拒绝保默认 + 自检留痕);单测 +7(iec104 94 断言)+ prot_set blob 往返/损坏 33 断言 |
|
||||
| 2026-10-12 | **B7 台架腿闭环**(§7 台架行回填):主站工具加 `--b7-pre/--b7-post/--b7-mark/--b7-check` 四模式(中间 ST-LINK 复位);pre 21/21(YK12 OFF→低定值不动作 / ON→YX15·16 即动作)、post 13/13(**压板退出态跨复位保持** + 重启后联动在位)、mark/check 4/4+4/4(**非默认定值 7.5 跨复位保持**);开机日志 `[CFG] prot set loaded (/prot_set.bin)`;证据 `../测试说明/boot_log_data/20261012_B7_*` |
|
||||
| 2026-10-25 | **标定折算落地联动(卡 6)**:遥测读数由原始码值改工程量(§3.1 注已重写);死区按额定 0.5% 逐点重定(0.5 V / 0.005 A / 0.5 Hz),§8 第 4 条改「已落地,8020H 段仍归卡 10」 |
|
||||
| 2026-10-25 | **卡 10(道D,「数据可信」M6-①)**:新增 `App/algo/run_par.c/h`——遥测死区 9 点真源收编([run_par] 段 9 键 int32 毫单位落盘,工厂默认 = 卡 6 档;pts 层 s_yc_db 副本删除、set/get 转转发壳并保留清确认计数语义);104 **0x8020~0x8058 读写映射**(§3.4 新表:逐项地址本仓自定、送检点表到位后替换常量段;0x8027~0x802A 永不覆盖,路由 run_par 先 prot_set 后);**k/b 系数覆盖 = adc_cal_set 代理**(合法带/越带留痕复用,run_par 不存系数);持久化走新事件位 `SYS_EVT_RUN_PAR_SAVE`(1<<8) 整档外科 save;单测 test/host/run_par 新建(TC-RUNPAR-001~008,67 断言)+ iec104 套 +TC-IEC104-029 路由钉(141 断言);台架/送检腿待排窗 |
|
||||
| 2026-10-25 | **卡 9/卡 11(道D,「数据可信」M5/M6)**:YC 板端源改读 L2 遥测快照(削顶五路从点表绑死 -1 改为**槽位绑定 + 快照品质 CLIPPED→IV**,V0.2/N-18 零改动启用);`0x401D` 绑频率源(`freq_valid()==0` → IV);死区改运行时副本 + `iec104_pts_yc_set_deadband()`(卡 10 接线点);COV 遥测腿 = 死区连续 2 点确认(快照 `seq` 去重)+ 品质翻转直报;`iec104_pts_src_t` 表尾追加 `yc_read_ex`(旧源退路语义不变);单测 97→127(TC-IEC104-025~028 走真实 L2 链);台架腿(总召读回一致 / 频率 ±0.01 Hz)待排窗——主站工具已记 val+qds,无需改工具 |
|
||||
| 2026-10-25 | **标定折算落地联动(下游常数按工程量重定)**:遥测读数由原始码值改工程量(§3.1 注已重写);死区按额定 0.5% 逐点重定(0.5 V / 0.005 A / 0.5 Hz),§8 第 4 条改「已落地,8020H 段仍归运行参数段」 |
|
||||
| 2026-10-25 | **运行参数段(道D,「数据可信」M6-①)**:新增 `App/algo/run_par.c/h`——遥测死区 9 点真源收编([run_par] 段 9 键 int32 毫单位落盘,工厂默认 = 下游常数按工程量重定的档位;pts 层 s_yc_db 副本删除、set/get 转转发壳并保留清确认计数语义);104 **0x8020~0x8058 读写映射**(§3.4 新表:逐项地址本仓自定、送检点表到位后替换常量段;0x8027~0x802A 永不覆盖,路由 run_par 先 prot_set 后);**k/b 系数覆盖 = adc_cal_set 代理**(合法带/越带留痕复用,run_par 不存系数);持久化走新事件位 `SYS_EVT_RUN_PAR_SAVE`(1<<8) 整档外科 save;单测 test/host/run_par 新建(TC-RUNPAR-001~008,67 断言)+ iec104 套 +TC-IEC104-029 路由钉(141 断言);台架/送检腿待排窗 |
|
||||
| 2026-10-25 | **104 改读快照与频率点绑定(道D,「数据可信」M5/M6)**:YC 板端源改读 L2 遥测快照(削顶五路从点表绑死 -1 改为**槽位绑定 + 快照品质 CLIPPED→IV**,V0.2/N-18 零改动启用);`0x401D` 绑频率源(`freq_valid()==0` → IV);死区改运行时副本 + `iec104_pts_yc_set_deadband()`(运行参数段接线点);COV 遥测腿 = 死区连续 2 点确认(快照 `seq` 去重)+ 品质翻转直报;`iec104_pts_src_t` 表尾追加 `yc_read_ex`(旧源退路语义不变);单测 97→127(TC-IEC104-025~028 走真实 L2 链);台架腿(总召读回一致 / 频率 ±0.01 Hz)待排窗——主站工具已记 val+qds,无需改工具 |
|
||||
| 2026-10-12 | **B9 时标 SOE**:自发单点 YX 换 **M_SP_TB_1(30)**(SIQ+CP56,§3.2 注;总召/周期保持 NA 型);link cfg 增 `epoch_ms` 时标源(NULL/无效 → IV 如实);serv 绑 `sys_clock`(秒域 → ms 域=秒×1000);主站工具解析 type 30/1 双型;单测 iec104 94→97(TB 时标 + IV 路径,两种类型都断言);台架腿见 §7 B9 行;落盘侧见 `App/log/README.md` soe 节 |
|
||||
| 2026-10-26 | **道G task-8:`[comm]` 段落地(「UI 补齐」卡 5 非 UI 前置)**——ca/端口从写死改 `[comm]` 可配(getter 合法带自愈,键表 → `docs/子系统设计/网络配置说明.md` §3.6);`iec104_comm_init()` 内核前注册于 `app_main_init`(先注册后 load 契约,同 [adc_cal]/[run_par]);生效 = 改后重启(ca 任务启动读一次;port 下次重 bind 自然生效),不挂回调不新增事件位;§5/§8 同步销项,**主站地址不做**的理由登记 §8 第 8 条;死 define `IEC104_PORT` 删除(零 .c 消费);`IEC104_SERV_PORT` 降为快照兼容出口(真源 getter,task-9 切 ui_data_feed);单测 = `test/host/iec104` TC-IEC104-031~033(套件 174/174 PASS)+ `test/host/iec104_serv` TC-I104SRV-001b/c(37/37 PASS)+ `test/host/cfg_file` TC-CONFIG-056/057(207/207 PASS)|
|
||||
| 2026-10-26 | **道G task-8:`[comm]` 段落地(「UI 补齐」波次里的非 UI 前置项)**——ca/端口从写死改 `[comm]` 可配(getter 合法带自愈,键表 → `docs/子系统设计/网络配置说明.md` §3.6);`iec104_comm_init()` 内核前注册于 `app_main_init`(先注册后 load 契约,同 [adc_cal]/[run_par]);生效 = 改后重启(ca 任务启动读一次;port 下次重 bind 自然生效),不挂回调不新增事件位;§5/§8 同步销项,**主站地址不做**的理由登记 §8 第 8 条;死 define `IEC104_PORT` 删除(零 .c 消费);`IEC104_SERV_PORT` 降为快照兼容出口(真源 getter,task-9 切 ui_data_feed);单测 = `test/host/iec104` TC-IEC104-031~033(套件 174/174 PASS)+ `test/host/iec104_serv` TC-I104SRV-001b/c(37/37 PASS)+ `test/host/cfg_file` TC-CONFIG-056/057(207/207 PASS)|
|
||||
|
||||
@@ -150,7 +150,7 @@ write=1
|
||||
|
||||
> **诚实边界**:FTP 协议**明文传输口令**——本方案挡的是**未授权访问**,不挡**网络嗅探**(CH395F 上实现 TLS 不现实)。`pwd_hash` 只防 `/config.ini` 泄露后的**离线口令还原**,盐 = 用户名(无每机随机盐,局域网威胁模型下够用)。
|
||||
|
||||
### 3.5 `[run_par]` 段:运行参数(2026-10-25 新增,「数据可信」卡 10)
|
||||
### 3.5 `[run_par]` 段:运行参数(2026-10-25 新增,「数据可信」运行参数段一项)
|
||||
|
||||
遥测死区 9 点的持久载体(引擎属主 defaultTask;**现场远程写入口 = 104 段
|
||||
`0x8030~0x8038`**,本段键供 FTP 手改 / 排障直读,逐项语义与地址表 →
|
||||
@@ -164,14 +164,14 @@ write=1
|
||||
| `db_freq` | 频率死区 | 500 | 0 ~ 5000(5 Hz) |
|
||||
|
||||
- 键数 9 ≤ 16,**通道系数覆盖不落本段**——系数唯一真源 = `[adc_cal]` / `[adc_cal_ofs]`
|
||||
两段(卡 4 布局,docs/任务规划/数据可信.md §4.4;104 `0x8040~0x804F` 写 =
|
||||
两段(标定落盘与整定入口布局,docs/任务规划/数据可信.md §4.4;104 `0x8040~0x804F` 写 =
|
||||
`adc_cal_set` 代理,lead 裁②a)。
|
||||
- 守卫在**写路径**(104/壳 API 拒 NaN/负/越程);**文件通路引擎照收**(同 adc_cal 的
|
||||
「人工编辑 + 沉降去抖」契约)——死区超程只让上送变钝、不毁量纲,无合法带哨兵。
|
||||
- 生效链路:load/poll 原地改副本 → 104 COV 每拍实时读(无回调,卡 9/10 契约);
|
||||
- 生效链路:load/poll 原地改副本 → 104 COV 每拍实时读(无回调,104 改读快照与运行参数段契约);
|
||||
104 写成功 → `SYS_EVT_RUN_PAR_SAVE` → 本任务 `cfg_file_save()` 整档外科落盘。
|
||||
|
||||
### 3.6 `[comm]` 段:IEC 60870-5-104 通讯参数(2026-10-26 新增,「UI 补齐」卡 5 非 UI 前置,道G task-8)
|
||||
### 3.6 `[comm]` 段:IEC 60870-5-104 通讯参数(2026-10-26 新增,「UI 补齐」波次里的非 UI 前置项,道G task-8)
|
||||
|
||||
104 被控站的公共地址与监听端口持久载体(段属主 = `App/protocol/iec104/` 配对模块:
|
||||
工厂默认与合法带见 `iec104_comm.h`、键表与实现见 `iec104_comm.c`;注册
|
||||
@@ -355,8 +355,8 @@ ENTER 进入选中地址行 → `↑/↓` 调活动字节(0..255 **环绕**)
|
||||
|
||||
| 日期 | 变更 |
|
||||
|---|---|
|
||||
| 2026-10-26 | v2.5:**新增 §3.6 `[comm]` 段(道G task-8,「UI 补齐」卡 5 非 UI 前置)**——104 公共地址/监听端口 2 键、改后重启生效口径、主站地址不做的理由登记、段容量台账 6/8 与机器钉 |
|
||||
| 2026-10-25 | v2.4:**新增 §3.5 `[run_par]` 段(「数据可信」卡 10)**——遥测死区 9 键毫单位布局、104 写路径合法域、系数覆盖不落本段(真源 [adc_cal])、守卫仅在写路径、事件化落盘 |
|
||||
| 2026-10-26 | v2.5:**新增 §3.6 `[comm]` 段(道G task-8,「UI 补齐」波次里的非 UI 前置项)**——104 公共地址/监听端口 2 键、改后重启生效口径、主站地址不做的理由登记、段容量台账 6/8 与机器钉 |
|
||||
| 2026-10-25 | v2.4:**新增 §3.5 `[run_par]` 段(「数据可信」运行参数段一项)**——遥测死区 9 键毫单位布局、104 写路径合法域、系数覆盖不落本段(真源 [adc_cal])、守卫仅在写路径、事件化落盘 |
|
||||
| 2026-10-11 | v2.3:**新增 §3.4 `[ftp]` 段(N-19 FTP 鉴权)**——`user` / `pwd_hash`(SHA-256(user‖password))/ `write` 字段表、鉴权流程(USER 恒 331 / 恒定时间比较 / 未登录命令门 / 5 败锁 60 s)、改口令步骤与忘口令恢复路径、出厂默认口令启动告警、明文嗅探边界 |
|
||||
| 2026-10-10 | v2.2:**删除旧档 NCFG 迁移**——`net_cfg_legacy.c/h` 整体移除、`cfg_store_legacy_path()` 撤销;旧档 `/cfg/netcfg.bin` 若存在则被忽略(不读、不删、不迁移),配置回落工厂默认。理由:该一次性路径把整条配置写链挂进启动期调用图,defaultTask 静态最坏栈链 +600 B,且本仓库无携带旧档的设备 |
|
||||
| 2026-09-14 | v2.1:存储迁移至**通用配置文件** `/config.ini`(INI `[network]` 段,cfg_file 引擎:逐键校验 / 外科手术式保存 / 原子写 / 旧档首启迁移 / 沉降轮询);`net_cfg_store.*` 弃用(由 `cfg_file_store.*` 取代);对外 API 不变 |
|
||||
|
||||
@@ -588,4 +588,4 @@ void adc_cfg_init(void)
|
||||
| 2026-10-03 | v1.13:**真机验证 PASS(A1 闭环)**——v1.11 的 P0-1 堆分配改造在真机上验证通过:`[CFG] load: OK (523B, heap free 8840B)`(**经 FreeRTOS 堆分配**,即 512B C 堆约束的验收点);Forbidden `FAIL`/`[ERR]` 零命中;FTP 改配置 IP→`192.168.1.101` 后**复位即加载生效**(`[NET_CFG] load: OK ip=192.168.1.101` + 芯片 `IP_INF` .101 + 21 端口探测可达),原档恢复后复测回 .100。真机全闭环 `@test` PASS 7/7。**台架步骤与判据见 `测试说明/实机测试实施指南.md` §3 / §10** |
|
||||
| 2026-10-04 | **P0-1 真机独立复跑 PASS(二次确认,代码零改动)**——`@build` 0/0(增量,无源文件新于镜像)→ `@test` **VERDICT PASS(rc=0)**:`[2026-10-04 00:01:21][CFG] load: OK (523B, heap free 8840B)` + `[NET_CFG] load: OK ip=192.168.1.100`,Forbidden `FAIL`/`ERROR`/`HardFault`/`[ERR]` 零命中,`selftest: no fault record`(先清掉 2026-10-02/03 故障注入窗口遗留的 67 条台账)→ ST-LINK 全片回读 `No difference found`(`0x08000000~0x08040F9B`)。**本次为 `待处理内容.md` §4.1「待验证」唯一未闭环项(P0-1)的收口**,该节现已清空 |
|
||||
| 2026-10-10 | v1.14:**删除旧档 NCFG 迁移(D10 撤销)**——`Drivers/BSP/NETCFG/net_cfg_legacy.{c,h}` 整体移除、`cfg_store_legacy_path()` 撤销(MCU / 模拟器后端与主机单测 `test/host/cfg_file/cfg_file_test.c` 同步删除),`net_cfg_load` 不再调用 `net_cfg_legacy_migrate()`;旧档 `/cfg/netcfg.bin` 若存在则被**忽略**(不读、不删、不迁移),配置回落工厂默认。理由:该一次性路径把整条配置写链挂进启动期调用图,defaultTask 静态最坏栈链 **+600 B**(该链整体 5312 → 2776 B,另三个杠杆见 `docs/内存管理/RAM使用分析与优化方案.md`),而本仓库不存在携带旧档的设备。连带影响:`App/util` 的 CRC-16/MODBUS 失去唯一调用者(现为零调用者);模拟器 `--cfgtest` 不再覆盖迁移场景;§2 D10 / §3.5 / §4.2 / §5.1 / §6.2 / §6.4 / §7 / §9 / §11.1 同步 |
|
||||
| 2026-10-26 | v1.15:**新增 `[comm]` 段(道G task-8,「UI 补齐」卡 5 非 UI 前置)**——`App/protocol/iec104/iec104_comm.h/.c` 配对模块(104 公共地址 / 监听端口 2 键,getter 合法带自愈,adc_cal 先例);内核前 `iec104_comm_init()` 注册([adc_cal] / [run_par] 同「先注册后 load」契约);生效 = **改后重启**(不挂回调、不新增事件位,区别于 [network] 免重启重建);段占位 5→6 / 8,键表与主站地址不做理由 → `docs/子系统设计/网络配置说明.md` §3.6;机器钉 = `test/host/cfg_file` TC-CONFIG-056/057(段/键上限)+ `test/host/iec104` TC-IEC104-031~033(模板/重载/带外/ca 端到端)
|
||||
| 2026-10-26 | v1.15:**新增 `[comm]` 段(道G task-8,「UI 补齐」波次里的非 UI 前置项)**——`App/protocol/iec104/iec104_comm.h/.c` 配对模块(104 公共地址 / 监听端口 2 键,getter 合法带自愈,adc_cal 先例);内核前 `iec104_comm_init()` 注册([adc_cal] / [run_par] 同「先注册后 load」契约);生效 = **改后重启**(不挂回调、不新增事件位,区别于 [network] 免重启重建);段占位 5→6 / 8,键表与主站地址不做理由 → `docs/子系统设计/网络配置说明.md` §3.6;机器钉 = `test/host/cfg_file` TC-CONFIG-056/057(段/键上限)+ `test/host/iec104` TC-IEC104-031~033(模板/重载/带外/ca 端到端)
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# ADC 前端注入验证流程(台架)
|
||||
|
||||
> **这篇是什么**:把「ADC 采到的数到底对不对」从"没人验过"推进到"有实测斜率与零点"的固定动作。
|
||||
> 它是 `docs/任务规划/数据可信.md` 卡 0 的**执行侧**——那边写判据,这边写怎么接表笔、读哪一行日志、
|
||||
> 它是已知电压注入验证的**执行侧**——判据与实测记录在 `docs/硬件平台/ADC通道映射说明.md` §8.1,这边写怎么接表笔、读哪一行日志、
|
||||
> 填哪张表、结果往哪回写。补的是 `docs/硬件平台/ADC通道映射说明.md` §8「逐通道验证方法」
|
||||
> 长期挂账的"尚未执行"(挂账自 2026-10-09)。
|
||||
>
|
||||
> **只验直流**:零点 / 线性 / 通道映射 / 极性。不验交流有效值——台架无信号源,且 V0.1 有五路
|
||||
> 单极性削顶(`UB/UC/IB/IC/IN`),交流精度要等标准源到位后的两点标定(`docs/任务规划/数据可信.md` 卡 12)。
|
||||
> 单极性削顶(`UB/UC/IB/IC/IN`),交流精度要等标准源到位后的两点标定(`docs/任务规划/数据可信.md` §5)。
|
||||
>
|
||||
> **不需要**示波器、信号源、标准源。**只需要**一块万用表 + 一个电位器 + 串口日志。
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
|
||||
1. **不存在 2:1 分压**。旧口径"板级系数 305.18 / 1611.3 µV/码"(按 2:1 折算到 `AINn` 侧的条件值)
|
||||
在本板上不成立;`docs/任务规划/数据可信.md` §2.1 已于 2026-10-27 改为引脚侧系数(152.59 / 805.66)。
|
||||
所以卡 0 只需**确认转换器 LSB 与逐通道映射**,不必再判别两种读法。
|
||||
所以已知电压注入验证只需**确认转换器 LSB 与逐通道映射**,不必再判别两种读法。
|
||||
2. **端子侧斜率 = 引脚侧斜率**。所以在**端子侧**注入既安全(有 1k 串阻护着芯片)又能直接验 LSB,
|
||||
不必去碰 LQFP 引脚。
|
||||
|
||||
@@ -224,7 +224,7 @@ TPAFE 是双极性、二进制补码,可以注负压;STM32 是单极性,
|
||||
| 注入前(20:58) | 29997 → 39995 | 9998 | 1000.5 Hz |
|
||||
| 注入后(21:29) | 1819639 → 1829637 | 9998 | 1000.1 Hz |
|
||||
|
||||
⚠ **口径说明**:这两次是"注入**前后**",不是"注入**进行中**"——卡 0 判据 ⑤ 要的正是"注入前后
|
||||
⚠ **口径说明**:这两次是"注入**前后**",不是"注入**进行中**"——已知电压注入验证判据 ⑤ 要的正是"注入前后
|
||||
`tpafe5160_frame_seq()` 仍严格 1000 Hz 递增",故按此口径已达标。若日后要连"进行中"也钉住,
|
||||
在任一注入过程里再抓两行即可(注入不改变 TIM3 硬件触发,理论上无影响,但没测过就不算证过)。
|
||||
|
||||
@@ -237,9 +237,10 @@ TPAFE 是双极性、二进制补码,可以注负压;STM32 是单极性,
|
||||
实测值 + 日期;
|
||||
2. 若实测确认无分压,同步在 `docs/硬件平台/ADC通道映射说明.md` §7.1 的链路分段表把第 ③ 段
|
||||
(`AINn` ↔ 转换器引脚)从"待台架实测"改为实测结论;
|
||||
3. `docs/任务规划/数据可信.md` 卡 0 销项。**注意:实际处置是标 ✅ 保留行,不是删行**——
|
||||
该文件卷首明文规定卡 0 被 `App/task/adc_task.c` 的 v3.3 修订行与 `adc:` 行注释引用为口径出处,
|
||||
删行会让代码头注释失去出处;这是"完成即删"在该文件的**既定例外**。
|
||||
3. `docs/任务规划/数据可信.md` 已知电压注入验证销项。**2026-10-27 用户裁定:该行按"完成即删"删行**,
|
||||
此前"标 ✅ 保留行"的**例外已撤销**——例外当初的理由是该文件卷首规定此行被 `App/task/adc_task.c` 的
|
||||
v3.3 修订行与 `adc:` 行注释按卡号当口径出处引用,而本次卡号整族清退成语义短语后该理由不再成立;
|
||||
判据与实测证据的属主是 `docs/硬件平台/ADC通道映射说明.md` §8.1。
|
||||
|
||||
## 6. 判据汇总
|
||||
|
||||
@@ -256,7 +257,7 @@ TPAFE 是双极性、二进制补码,可以注负压;STM32 是单极性,
|
||||
① ③ 段(`AINn` ↔ 转换器引脚)**变比确为 1:1**,无隐藏分压(斜率偏差 −0.14 %);
|
||||
② 8 路语义 ↔ 物理端子**一一对应**(零点步骤逐路代偿);
|
||||
③ TPAFE 补码符号位解释正确(对称性 ≤0.34 %)。
|
||||
`docs/任务规划/数据可信.md` 卡 0 的判据 ①②③④⑤⑥ 至此全部闭环。
|
||||
已知电压注入验证的判据 ①②③④⑤⑥ 至此全部闭环(判据与实测记录 → `docs/硬件平台/ADC通道映射说明.md` §8.1)。
|
||||
|
||||
⚠ **两项残留口径**(不影响本轮 PASS,但别当成已验证):**串扰**未单独证(见上表"映射"行);
|
||||
**节奏**只测了注入前后、没测注入进行中。两项若日后怀疑,各自的补做方法已写在对应小节。
|
||||
@@ -267,6 +268,6 @@ TPAFE 是双极性、二进制补码,可以注负压;STM32 是单极性,
|
||||
1. **STM32 侧严禁超过 3.3 V**(VDDA + 0.3 V 即击穿),电位器上限就接 3.3 V 轨,不要接 5 V。
|
||||
2. **TPAFE 侧按判据只到 ±2 V**,虽芯片容 ±5 V,但判据不需要更大。
|
||||
3. **端子侧不许直接上额定电压**(220 V / 100 V 二次值)。本次是直流低压注入,
|
||||
与"加压试保护"是两件事,后者要等变比确认(`docs/任务规划/数据可信.md` 卡 0b)之后单独排。
|
||||
与"加压试保护"是两件事,后者要等端子/子板变比确认(`docs/硬件平台/ADC通道映射说明.md` §7.1 链路分段表 ④ 行)之后单独排。
|
||||
4. **引脚侧注入必须外串 10 k**,且先接线后上电、先断电后拆线。
|
||||
5. 注入源与板子**共地**;电位器一端接 3.3 V、一端接 AGND、中间抽头串 10 k 到注入点。
|
||||
|
||||
@@ -704,7 +704,7 @@ uint16_t ch395f_link_change_count(void);
|
||||
| 类别 | 体量 | 为什么不做 | 那它靠什么把关 |
|
||||
|---|---|---|---|
|
||||
| 芯片驱动(寄存器/时序) | `ch395f.c`(801)、`gd5f2gq5ue.c`(689)、`sd2506.c`(264)、`tpafe5160.c`(157)、`rs485.c`(79) = **1,990 行** | 把 HAL 与寄存器假到底 ≈ **重写一遍驱动**,测的是自己的桩而不是硬件行为(SPI 分频必须 8、DMA 流、I2C 时序在桩里怎么编都"对") | 板级套件(`board-test-suite` skill)+ `@test` 真机日志 + 4 个 Fault 现场;陷阱逐条登记在 `docs/问题记录/CH395F_Trap_Records.md`、`docs/问题记录/GD5F2GQ5UE_Trap_Records.md`、`docs/问题记录/SD2506_Trap_Records.md` |
|
||||
| UI 侧 | 17 个 `.c` = **1,942 行** | 与 PC 模拟器是**同一份源码**,行为回归已由 `ui-golden`(菜单 8 状态 + 内容页 53 页像素黄金参考)覆盖;再写单测是第三份重复投资 | `ui-verify` skill 五步 + `docs/UI设计/UI_自动化测试流程.md` |
|
||||
| UI 侧 | 17 个 `.c` = **1,942 行** | 与 PC 模拟器是**同一份源码**,行为回归已由 `ui-golden`(菜单 8 状态 + 内容页 60 页像素黄金参考)覆盖;再写单测是第三份重复投资 | `ui-verify` skill 五步 + `docs/UI设计/UI_自动化测试流程.md` |
|
||||
| 任务编排 | `default_task.c`(281)、`adc_task.c`(171)、`net_task.c`(123)、`protect_task.c`(90)、`ui_task.c`(71)、`rs485_task.c`(11) = **747 行** | 每个只有 4~5 个函数,主体是"按顺序调别人";真逻辑在被调模块里(那些已测或在 P1/P2)。给编排层写单测最容易写成"断言我调了几次"的自证 | 真机启动锚点计数 + IWDG `required_mask`(`@test`)+ `docs/架构设计/项目启动顺序管理.md` |
|
||||
| 内核前装配 | `app_main.c`(135) | 被测对象本身就是"`osKernelStart` 之前不许调内核 API"的时序,主机侧无法忠实复现(PC 上没有那个约束) | 同上 + `cubemx-survival` 审计 |
|
||||
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
| **无应用回调(空操作)** | 模拟器不注册段回调,`cfg_file_poll` 重载后回调为空 | 各段回调真正执行(如网络重配置) | "配置变更 → 触发回调 → 副作用"链路在模拟器上**只验证到写盘**,回调逻辑不覆盖 | `@test`(配置保存 → UI 生效) |
|
||||
| **「清除记录」两端时序不同** | `syslog_request_clear()` 在调用内**同步**删除宿主文件(`sim_syslog.c` 单线程,没有卷锁、没有队列),返回后状态立刻是 `OK`/`FAIL`,`SYSLOG_CLEAR_WAIT` 永不出现 | 非写者上下文只置标志,真正的 `f_unlink` 排在 defaultTask 的 `syslog_drain()` 尾部(卷锁 try:拿不到锁就顺延,见 `App/log/sys_log_mcu.c`) | 「按了按钮 → 下一拍才见结果」这条异步链、卷占用顺延、以及删除与写者重建的交错,在模拟器上**结构上不存在**;UI 页面若把 WAIT 当失败,模拟器上看不出来 | 主机单测 `test/host/sys_log_mcu/`(TC-SYSLOG-110..122:请求侧零盘触点 / 落地只在 drain / 卷占用顺延 / 幂等 / 不误删;TC-SYSLOG-133/133b:清除成功投一条操作记录、清 oper 自己时不投)+ 台架装置维护页目检 |
|
||||
| **两条投递口在宿主端合一** | `syslog_post_quiet()` = `syslog_post()` 的别名(直写宿主文件,没有队列/待发数组),`syslog_post_dropped()` **恒返 0** | 两个口分开且判据不同:quiet 的调用链上不许内联日志行缓冲(protectTask / iec104Task 的静态最坏链硬线),丢弃只累加计数、由 defaultTask 在 `syslog_drain()` 里按差值补留痕 | 五类记录(事故 / 告警 / 启动 / 操作 / 遥控)在模拟器上**永不丢弃**,"队列满丢记录"、"丢了几条"、"投递侧不许打日志"这三件事在模拟器上结构上不可见;UI 若把"投了"当成"落盘了",模拟器看不出来 | 主机单测 `test/host/sys_log_mcu/`(TC-SYSLOG-132 / 134 / 135:队列侧与启动前数组侧各自的计数与零留痕)+ `scripts/stack_report.py` 静态最坏链(真机侧唯一手段) |
|
||||
| **宿主 cwd 的记录文件互相污染** | 七类记录在模拟器落**当前工作目录**的 `sim_<id>.log`(如 `sim_oper.log`);`sim_post_oper()` 在时钟保存 / 网口保存 / 定值保存等**动作页**用例里真投记录 | 每条记录进 `/log/` 下各自 8.3 短名文件,跨页不互相影响(同一进程内不同页读的是同一份 NAND 文件,本来就该看见彼此写入的记录) | 回归若在**同一个 tmp 目录**跑全部页,前面动作页写的 3 条操作留痕会让「操作记录」页拍不到空态 → 空态判据被环境污染掩盖(真机上没有这个问题:写者只有 defaultTask 与事件边沿) | `simulator/tests/check_content_pages.py` 的 `FRESH_CWD` 表:记录 5 页各在独立空目录里跑(其余 55 页环境不变);手工跑 `lvgl_sim.exe` 前先确认当前目录没有 `sim_*.log`/`sim_config.ini` 残留 |
|
||||
| **堆后端不同** | `cfg_store_alloc` = 宿主 `malloc`(堆余量以 MB 计) | FreeRTOS 堆(`configTOTAL_HEAP_SIZE` 48 KB,实测最低水位 ~4.8 KB) | **分配失败路径在模拟器上永不触发**——"KB 级分配必然返回 NULL"这类缺陷模拟器照不出来(`AGENTS.md` 已列为铁律) | 内存预算门禁 + 真机 `[HEAP]` 水位告警(S11) |
|
||||
|
||||
### 2.3 硬件专属(模拟器完全无对应)
|
||||
@@ -66,6 +67,7 @@
|
||||
| **CH395F 芯片** | 无(Winsock 代其 BSD API) | SPI 寄存器/命令/中断、PHY 协商、真实以太网帧 | 寄存器时序、命令回复、中断风暴、PHY 100M 全双工强制 | 板端 CH395F 套件(52 断言点)+ `@test` |
|
||||
| **GD5F NAND** | 无 | SPI NAND:BBT 扫描、ECC、坏块管理、dhara FTL | 坏块/ECC/写入失败等路径完全不可测 | 板端 GD5F 套件(76 断言点)+ `@test` |
|
||||
| **SD2506 RTC** | 无 | I2C RTC:时间读写、闹钟、温度、电池电压 | 时间源相关(`sys_clock_init` 降级路径)在模拟器上不可触发 | 板端 RTC 套件(18 断言点)+ `sys_clock` L0.5(已覆盖算术面) |
|
||||
| **开机账本 boot_stats(上电次数 / 复位原因快照)** | **不编译** `App/util/boot_stats.c`(依赖 SD2506 用户 SRAM 与 `RCC_CSR`);UI「运行报告」页的四个数在模拟器上是 `simulator/main.c` 的**固定假数据**(`boot_count=7`、`seq_state=延续`、`rst_cause=上电复位`、104 四枚 3 / 128 / 0 / 4096、`uptime_s=0`) |`boot_stats_init()` 读 SRAM → 自增 → 写回 → 快照驻留;四个 104 观测计数由 iec104Task 真实累加(跨重连不清零、断电归零) | 「自增有没有真落 SRAM」「电池域掉电后是否落 RESTARTED」「写失败是否只少计不重复」「104 计数是否跨重连累计」四类事在模拟器上**结构上不可见**;黄金参考只拍得到显示口径(范围标签在不在屏上、值有没有串行、`boot_ready=0` 是否显 `--` 而不是 0) | 主机单测 `test/host/boot_stats/`(SRAM 状态机与四态判定)+ 真机 `@test`:上电一次看 `boot_count` +1、拔电池后落 RESTARTED、IWDG 复位后 `rst_cause=IWDG`、主站连一次看 `conn_up` +1 |
|
||||
| **TPAFE5160 ADC** | 无 | SPI ADC + BUSY EXTI 中断 | 中断驱动采集链路 | 待功能实现(上游 B1) |
|
||||
| **RS-485 半双工** | 无 | UART4 + DE 方向控制,DWT 微秒延时 | DE 收发切换时序(特有陷阱) | 待功能实现(上游 B2) |
|
||||
| **启动段硬件初始化** | 只跑纯软件部分 | I2C/SPI 外设初始化、BBT 扫描耗时、FatFS 挂载 | 启动段死机(无看门狗保护窗口)**只能在真机复现** | 真机开机日志判读(`项目启动顺序管理.md` §6 已落地) |
|
||||
@@ -111,5 +113,6 @@
|
||||
|
||||
| 日期 | 变更 |
|
||||
|---|---|
|
||||
| 2026-10-28 | **新增 `§2.3`「开机账本 `boot_stats`」一行**(UI 补齐「运行报告」页联动):模拟器不编译 `boot_stats.c`(依赖 SD2506 用户 SRAM 与 `RCC_CSR`),运行报告页四个数在 PC 侧是 `simulator/main.c` 的固定假数据 → 像素黄金只验**显示口径**,累计 / 落盘 / 电池域掉电 / 跨重连语义必须回真机(触发条件 = 本批改 `simulator/main.c` 的 info 帧装配) |
|
||||
| 2026-10-13 | **自愈收敛阶段 1.5 recv 语义主流化**:`net_socket_sim.c` 镜像 `net_recv_nb` / `net_recv_to` / `net_setblocking`,阻塞语义改按控制块 `blocking` 属性在包装层模拟(Winsock 句柄仍恒 FIONBIO)——N-3 的 `net_recv_to` 缺失部分**已消除**(划线留档),N-6 改写为"模式属性 + 包装层模拟";内部挂起模型(N-1)不变 |
|
||||
| 2026-10-02 | 初版(S13):收录 6 条网络差距(N-1~N-6)、4 条日志/配置差距(L-1~L-4)、7 条硬件专属差距(H-1~H-7)、4 条"有意对齐"项。证据来源:`net_socket_sim.c` 文件头设计要点 + 双端导出函数逐一对比(MCU 有而 sim 缺 9 个)+ 各子系统文档既有记载汇总。§3 给出 6 条"必须回真机"决策规则 |
|
||||
|
||||
@@ -373,7 +373,7 @@ cmake --build simulator/build --config Debug # 0) 构建模拟器(须 0 警
|
||||
| 层 | 载体 | 抓住什么 |
|
||||
|---|---|---|
|
||||
| 文本层 | `check_content_pages.py` 字形模板匹配(310 条、覆盖当时 37 页,解析字体 cmap / glyph_dsc / bitmap) | 缺字显示空白 / 标签写错等**静默失败**(不依赖 `ref/`,先于像素比对运行、失败即中止防误刷参考) |
|
||||
| 像素层 | 53 内容页 + 菜单 8 状态,与黄金参考逐字节比对 | 几何 / 样式 / 光标反显 / 整体外观 |
|
||||
| 像素层 | 60 内容页 + 菜单 8 状态,与黄金参考逐字节比对 | 几何 / 样式 / 光标反显 / 整体外观 |
|
||||
| 池水位层 | `MENU_POOL_BASELINE=5368 B` / `POOL_AFTER_ROUNDTRIP=5448 B` | LVGL 内存池泄漏 / 结构性漂移(量的是 `used`,与 `LV_MEM_SIZE` 总大小无关) |
|
||||
|
||||
### 5.3 黄金参考与字体纪律
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
|
||||
- **初始化回归**:`App/task/ui_task.c` 已有 `UI port init: OK` / `UI menu init: OK` / `UI net sink: started`
|
||||
打印(见 `@test` 命令示例);将其加入 `-Required` 即可经串口自动回归 UI 初始化。
|
||||
- **屏幕内容回归**:由 LVGL 模拟器像素回归覆盖(文本级断言 + 53 页黄金参考 + 池水位门禁,
|
||||
- **屏幕内容回归**:由 LVGL 模拟器像素回归覆盖(文本级断言 + 60 页黄金参考 + 池水位门禁,
|
||||
见 `docs/UI设计/UI_自动化测试流程.md`);上机屏幕仍需人工目检(L3 层,见 `测试开发标准流程.md` §1)。
|
||||
|
||||
## 扩展用法
|
||||
|
||||
@@ -117,7 +117,7 @@ test/host/cfg_file/cfg_file_test.c
|
||||
| **TC-CONFIG-003** | IP4:`0.0.0.0` / `255.255.255.255` / 常规;段数不足/超、>255、非数字、尾点、空 | 点分四段 |
|
||||
| **TC-CONFIG-004** | MAC:`:` / `-` / `.` 三种分隔符、大小写;过短/过长/非十六进制/坏分隔符 | 分隔符 = **字节边界**替代 |
|
||||
| **TC-CONFIG-005** | STR:正常 + NUL;恰好 `len-1` 放下;`len` 字符拒绝;空串 | 长度边界 |
|
||||
| **TC-CONFIG-006** | INT 合法:0 / `-1` / INT32_MIN / INT32_MAX / int8·int16 正负边界 / 前导 `+` / `-0` / 前导零 | 有符号十进制解码(数据可信卡 3,引擎 v1.5) |
|
||||
| **TC-CONFIG-006** | INT 合法:0 / `-1` / INT32_MIN / INT32_MAX / int8·int16 正负边界 / 前导 `+` / `-0` / 前导零 | 有符号十进制解码(「数据可信」有符号零点类型,引擎 v1.5) |
|
||||
| **TC-CONFIG-007** | INT 非法:空 / 非数字 / 尾随垃圾 / 裸符号 / 小数点 / `0x` 文本 / 各宽度越界(含 strtol 饱和带 `2147483648`)/ 坏 len | ERANGE + 宽度上下界双校验(两端 long=32 位) |
|
||||
| **TC-CONFIG-008** | INT 编码带负号(`%ld`);`[sys]` 段 load→save→load 全链往返一致、出厂模板带负号默认;越界键拒收留默认并留痕;注册拒绝 INT len=3 | 有符号落盘闭环(负零点偏移可表达) |
|
||||
|
||||
@@ -285,4 +285,4 @@ if (s_encode(p_key, ..., v, sizeof(v)) >= 0) {
|
||||
| 日期 | 变更 |
|
||||
|---|---|
|
||||
| 2026-10-02 | 创建;20 用例 / 139 断言点全绿;抓出并修复 `s_encode` 返回值误判 P0 缺陷(外科手术保存死码);挂 pre-commit 钩子 `cfg-file-unit-test` |
|
||||
| 2026-10-25 | 随配置引擎新增 `CFG_VAL_INT`(数据可信卡 3)补登记 TC-CONFIG-006~008;套件 200/200 PASS |
|
||||
| 2026-10-25 | 随配置引擎新增 `CFG_VAL_INT`(「数据可信」有符号零点类型)补登记 TC-CONFIG-006~008;套件 200/200 PASS |
|
||||
|
||||
+14
-14
@@ -135,12 +135,12 @@ STM32(U17)为 LQFP144 脚号。
|
||||
| `adc_task` | **已实现(B1,2026-10-10;L1 层 v2.3;P1-5 事件驱动消费,2026-10-10)**:`App/task/adc_task.c` 每拍调 `adc_input_poll()`(`App/algo/adc_input.c`)= TPAFE `tpafe5160_snapshot()` 原子快照(8 通道)+ 消费一帧 STM32 ADC1 DMA 乒乓缓冲,**经 `adc_input_raw()` 按语义取数**(不再直接索引驱动缓冲);**消费唤醒由 TIM3 ISR 置位 `ADC_WAKE_FLAG`**(不再 1 ms 轮询);任务在 `Src/freertos.c` 的 `USER CODE` 区创建为 `adcTask`(512 words / **AboveNormal**) | 数据路径已通(台架 `@test`:`frames` 严格 1000 Hz 递增、**`idle=0`**、`adc1_rc=0` / `adc1_err=0`) |
|
||||
| TPAFE 采样触发 | **周期 CONVST 已实现(2026-10-10)**:`Src/main.c` 的 `HAL_TIM_PeriodElapsedCallback` 在 **TIM3 更新事件(1 kHz)** 内调 `tpafe5160_start_conv_irq()`;`app_main_init()` 用 `HAL_TIM_Base_Start_IT(&htim3)` 启动节拍(在 `tpafe5160_init()` 之后)。同一 TIM3 更新事件还经 **TRGO** 硬件触发 ADC1 一轮 9 通道(DMA 搬运),并调 `adc_tick_irq_notify()` **唤醒消费者**(P1-5 方案 a,2026-10-10;内含"消费者就绪"门)→ 两片转换器由同一硬件事件同源对齐 | 连续波形(1 kHz);详见 `docs/子系统设计/ADC采样节拍设计说明.md` §4(DMA 乒乓搬运)与 §6(事件驱动唤醒) |
|
||||
| 前端偏置 | 每路 1k 串联 + 滤波 C 跨接差分输入;差分负端(`*_GND` 网)经 1k 拴 AGND。**不是对地分压**(2026-10-27 网表追线定死,拓扑图见 §7.1),**无中点偏置** | TPAFE 输入阻抗 **1 MΩ 恒定**(`../芯片手册/TPAFE5160.md` "Analog Input Impedance" 节),故端子对 AGND 的直流通路 = 1k + 1 MΩ + 1k ≈ **1.002 MΩ**,不是 1 kΩ。两侧各 1 kΩ 是手册要求的**源阻抗匹配**(AIN_nP / AIN_nGND 外接源阻抗相等以抵消失调),**不是分压**。STM32 侧只能测 **0~3.3 V 单极性**,交流量负半周被削顶;主板侧只做监视可接受,若要算 RMS/功率需硬件补偏置或明确算法口径 |
|
||||
| TPAFE 量程(**2026-10-25 卡 1 定死**) | 板上 RANGE 接 GND → **±5 V 双极性量程**(芯片手册输入量程表:RANGE = 0 → −5 ~ +5 V),16 位二进制补码,**±5 V 满量程 = 10 V 跨度**,LSB = 10 V / 65536 ≈ **152.59 µV/码(@ 转换器引脚)**。“±10 V” 是芯片的另一可选档(RANGE = HIGH,跨度 20 V、LSB ≈ 305.18 µV),**本板未用**——历史版本曾把本板误标为“±10 V 双极性”,与 §7 本行矛盾、且会让 TPAFE 侧系数差一倍,更正记录见 §9 | 用 `tpafe5160_to_voltage()` 换算;端到端口径见 §7.1 |
|
||||
| TPAFE 量程(**2026-10-25 量程口径冻结定死**) | 板上 RANGE 接 GND → **±5 V 双极性量程**(芯片手册输入量程表:RANGE = 0 → −5 ~ +5 V),16 位二进制补码,**±5 V 满量程 = 10 V 跨度**,LSB = 10 V / 65536 ≈ **152.59 µV/码(@ 转换器引脚)**。“±10 V” 是芯片的另一可选档(RANGE = HIGH,跨度 20 V、LSB ≈ 305.18 µV),**本板未用**——历史版本曾把本板误标为“±10 V 双极性”,与 §7 本行矛盾、且会让 TPAFE 侧系数差一倍,更正记录见 §9 | 用 `tpafe5160_to_voltage()` 换算;端到端口径见 §7.1 |
|
||||
| 取数契约(**2026-10-10 已修**,E-44 / E-45 / E-58 闭环) | 旧的 `get_buf` / `data_ready` / `clear_ready` **已删除**(删除前确认全仓库零调用者):`get_buf` 只给指针、任务再拷 → 被 BUSY EXTI 抢占就是**两帧混合**;`s_ready` 电平标志被 `start_conv_irq` 触发前清 0 → **重触发即丢未消费帧**;`read_all` 从不看 FRSTDATA(宏有定义、代码零引用)→ 芯片死亡时返回 OK + 常量垃圾。现口径:**`tpafe5160_snapshot(dst, count)`**(临界区原子拷贝,返回 1/0/-1,**仅任务上下文**)+ **`tpafe5160_frame_seq()`**(帧序号只增不清)+ **`tpafe5160_frstdata_err()`**(无跳变帧计数);`tpafe5160_init()` 增**首帧自检**——一帧读下来 FRSTDATA 无跳变(芯片不驱动并行总线;板上 R24 4.7k 上拉会把它钉死为高)→ 返回 `-3` + `[ERR]` | 消费者**只能**用 `snapshot()` 取数(`AGENTS.md` 已立为铁律);真机实测开机 `[ADC] Init OK` 现只在自检帧通过后才打印 → 判据在本板成立、非空转 |
|
||||
|
||||
### 7.1 端到端量纲链路口径(网名 AINn → 端子 → 变比 → 码值 → 满量程,2026-10-25 卡 1 定死)
|
||||
### 7.1 端到端量纲链路口径(网名 AINn → 端子 → 变比 → 码值 → 满量程,2026-10-25 量程口径冻结定死)
|
||||
|
||||
> 出处:`docs/任务规划/数据可信.md` 卡 1。本节把 **语义端子(二次侧)→ 子板/端子板 → 网名 `AINn` → 主板电阻网络 → 板级网名 `ADCn` → 转换器引脚 → 码值 → 满量程** 的链路**逐段**定口径;
|
||||
> 出处:`docs/任务规划/数据可信.md` §2.1(量程口径冻结)。本节把 **语义端子(二次侧)→ 子板/端子板 → 网名 `AINn` → 主板电阻网络 → 板级网名 `ADCn` → 转换器引脚 → 码值 → 满量程** 的链路**逐段**定口径;
|
||||
> 待实测段只给**口径与判据**,不填任何实测数值(本轮按用户指示跳过台架,标注“待台架实测”)。
|
||||
|
||||
**芯片级口径(定死,与前端网络无关)**:
|
||||
@@ -152,7 +152,7 @@ STM32(U17)为 LQFP144 脚号。
|
||||
| TPAFE LSB(@ 引脚) | 10 V / 65536 ≈ **152.59 µV/码**(≈6553 码/V) | 由上两行推得;与 §7“TPAFE 量程”行、驱动注释一致 |
|
||||
| STM32 ADC1 LSB(@ 引脚) | 12 位单极性 0 ~ 3.3 V:3.3 V / 4096 ≈ **805.66 µV/码**(≈1241 码/V) | §7 生成配置行;`docs/任务规划/数据可信.md` §2.1 同口径 |
|
||||
|
||||
“±10 V”只允许出现在“芯片可选档”语境。本文件 2026-10-09 建档时曾把文首摘要写成“TPAFE … ±10 V 双极性”,与 §7 的 ±5 V 档矛盾、**TPAFE 侧系数因此会差一倍**——2026-10-23 `docs/任务规划/数据可信.md` §2.1 挂账该冲突并要求卡 1 定死;现**定死为“±5 V 满量程 = 10 V 跨度、LSB 152.59 µV”**,文首摘要与 §7 已按此更正。全仓其余“±10 V”字样仅剩芯片手册转写与 `tpafe5160.h` 中 RANGE 枚举可选档注释(均为芯片能力描述,非本板配置口径),不构成歧义。
|
||||
“±10 V”只允许出现在“芯片可选档”语境。本文件 2026-10-09 建档时曾把文首摘要写成“TPAFE … ±10 V 双极性”,与 §7 的 ±5 V 档矛盾、**TPAFE 侧系数因此会差一倍**——2026-10-23 `docs/任务规划/数据可信.md` §2.1 挂账该冲突并要求量程口径冻结定死;现**定死为“±5 V 满量程 = 10 V 跨度、LSB 152.59 µV”**,文首摘要与 §7 已按此更正。全仓其余“±10 V”字样仅剩芯片手册转写与 `tpafe5160.h` 中 RANGE 枚举可选档注释(均为芯片能力描述,非本板配置口径),不构成歧义。
|
||||
|
||||
**③ 段的实际拓扑**(2026-10-27 按 `V0.1.tel` 逐通道追线,UA 为例;图由
|
||||
`tools/arch_diagram/gen_adc_frontend_svg.py` 生成,改图请改脚本重跑,勿手改 SVG):
|
||||
@@ -169,17 +169,17 @@ STM32(U17)为 LQFP144 脚号。
|
||||
|---|---|---|
|
||||
| ① 语义 ↔ 网名 ↔ 板级网名 ↔ 转换器代码通道 | §2/§3/§4/§5 的 17 路映射表 | **定死**(本文件为唯一权威) |
|
||||
| ② 转换器引脚电压 ↔ 码值 | TPAFE `U_pin = code × 152.59 µV`(code 带符号);STM32 `U_pin = code × 805.66 µV` | **定死**(纯转换器事实,上表) |
|
||||
| ③ `AINn`(串联电阻子板侧)↔ `ADCn`/转换器引脚 | **变比 = 1:1(2026-10-27 定死)**:`ADCn` 节点只有 {串阻.2, 滤波 C, 转换器引脚},无对地元件(拓扑图见上)。旧"读法 A(2:1 分压 → 305.18 / 1611.3 µV/码)"**作废**——它是把接在差分负端的 1k 误读成对地分压 | **定死**(网表级结论 + **2026-10-27 台架实测确认**,见 §8.1:端子侧注入斜率 6544.2 码/V,与引脚侧理论 6553.6 差 0.14 %,不存在 2:1 分压)。卡 0 已闭环 |
|
||||
| ④ 语义端子(二次端子)↔ `AINn` | 子板/端子板变比:仓库内**无任何文档**(`docs/硬件平台/` 只有 `.tel` 网表与分析报告,无子板原理图;§8 步骤 4) | **缺口**——卡 0b 实测确认;拿不到变比则"端子二次值"不成立、`eng` 保持 0 |
|
||||
| ③ `AINn`(串联电阻子板侧)↔ `ADCn`/转换器引脚 | **变比 = 1:1(2026-10-27 定死)**:`ADCn` 节点只有 {串阻.2, 滤波 C, 转换器引脚},无对地元件(拓扑图见上)。旧"读法 A(2:1 分压 → 305.18 / 1611.3 µV/码)"**作废**——它是把接在差分负端的 1k 误读成对地分压 | **定死**(网表级结论 + **2026-10-27 台架实测确认**,见 §8.1:端子侧注入斜率 6544.2 码/V,与引脚侧理论 6553.6 差 0.14 %,不存在 2:1 分压)。已知电压注入验证已闭环 |
|
||||
| ④ 语义端子(二次端子)↔ `AINn` | 子板/端子板变比:仓库内**无任何文档**(`docs/硬件平台/` 只有 `.tel` 网表与分析报告,无子板原理图;§8 步骤 4) | **缺口**——待「端子/子板变比确认」实测确认;拿不到变比则"端子二次值"不成立、`eng` 保持 0 |
|
||||
|
||||
**可评审结论**:
|
||||
|
||||
1. **ROM 默认系数按 ② 引脚口径冻结**:TPAFE 通道 `k = 152.59 µV/码`、STM32 通道 `k = 805.66 µV/码`;标定折算的输出单位 = **ADC 引脚电压 V**(`eng = 0`)。该口径**不依赖** ③④ 两个未决项,自本卡定死即成立——这就是 M4 承诺边界止于“引脚电压”的依据(`docs/任务规划/数据可信.md` §2.6)。
|
||||
1. **ROM 默认系数按 ② 引脚口径冻结**:TPAFE 通道 `k = 152.59 µV/码`、STM32 通道 `k = 805.66 µV/码`;标定折算的输出单位 = **ADC 引脚电压 V**(`eng = 0`)。该口径**不依赖** ③④ 两个未决项,自本节点死即成立——这就是 M4 承诺边界止于“引脚电压”的依据(`docs/任务规划/数据可信.md` §2.6)。
|
||||
2. `docs/任务规划/数据可信.md` §2.1 旧表的“板级系数(输入侧)305.18 / 1611.3 µV/码”**已随 ③ 段定死而删除**(2026-10-27):该值按 2:1 分压折算,而网表证明 `ADCn` 节点无对地元件。板级系数 = 引脚侧系数(152.59 / 805.66);305.18 / 1611.3 今后只允许出现在“±10 V 档 LSB”语境(芯片手册口径),不得再当本板系数。
|
||||
3. **满量程必须写明参考点**:TPAFE 通道满量程 = ±5 V **@ 引脚**(跨度 10 V);③ 已定 1:1、④ 仍未知,故端子侧满量程只允许写“引脚侧数值 × ④ 比”,**严禁**把“码 × 152.59 µV”当端子二次值写进代码/文档(那是引脚电压)。
|
||||
4. **卡 0 已于 2026-10-27 闭环**(六项判据全 PASS,实测见 §8.1):③ 段 1:1 由台架直接证实,
|
||||
4. **已知电压注入验证已于 2026-10-27 闭环**(六项判据全 PASS,实测见 §8.1):③ 段 1:1 由台架直接证实,
|
||||
② 引脚侧 LSB 与实测斜率差 0.14 %,逐通道映射与极性均已验。**仍待实测的是 ④**(端子→引脚
|
||||
变比,卡 0b)与卡 12(两点标定);两者完成前 `eng` 保持 0、输出单位仍是 ADC 引脚电压。
|
||||
变比,即端子/子板变比确认)与两点标定;两者完成前 `eng` 保持 0、输出单位仍是 ADC 引脚电压。
|
||||
实测斜率与 ② 理论值偏差 >2 % 时**先查前端**(分压/变比/焊接),不得用系数凑错斜率
|
||||
(`docs/任务规划/数据可信.md` §8 风险表)。
|
||||
|
||||
@@ -187,10 +187,10 @@ STM32(U17)为 LQFP144 脚号。
|
||||
|
||||
## 8. 逐通道验证方法(上板自检口径)
|
||||
|
||||
1. **TPAFE 侧**:对目标 `AIN` 注入 1 V DC → 观察对应 `buf[i]` 变化(UA→`buf[6]`、UN→`buf[5]`、IA→`buf[2]`),同时 U3.14 `BUSY` 有脉冲;**语义与下标不符即映射错**。✅ **2026-10-27 已执行**(原 2026-10-23 挂账的"无执行记录"已消除;`docs/硬件平台/V0.0_网表详细分析报告.md` §5.1 第 6 条的同一验证随之关闭)。判据按 `docs/任务规划/数据可信.md` 卡 0 的**不需要示波器**口径执行:① "`BUSY` 有脉冲"改用固件帧计数——注入前后 `tpafe5160_frame_seq()` 仍严格 1000 Hz 递增即等价;② 幅值判据改用万用表读注入点实际电压 + 同时读 `adc_input_raw()` 码值,三点线性拟合(R² ≥ 0.999)。
|
||||
1. **TPAFE 侧**:对目标 `AIN` 注入 1 V DC → 观察对应 `buf[i]` 变化(UA→`buf[6]`、UN→`buf[5]`、IA→`buf[2]`),同时 U3.14 `BUSY` 有脉冲;**语义与下标不符即映射错**。✅ **2026-10-27 已执行**(原 2026-10-23 挂账的"无执行记录"已消除;`docs/硬件平台/V0.0_网表详细分析报告.md` §5.1 第 6 条的同一验证随之关闭)。判据按已知电压注入验证的**不需要示波器**口径执行:① "`BUSY` 有脉冲"改用固件帧计数——注入前后 `tpafe5160_frame_seq()` 仍严格 1000 Hz 递增即等价;② 幅值判据改用万用表读注入点实际电压 + 同时读 `adc_input_raw()` 码值,三点线性拟合(R² ≥ 0.999)。
|
||||
2. **STM32 侧**:对目标引脚(如 PC4=UB)注入 0.5 V → 读 `ADC_CHANNEL_14` 应变化;若不变而相邻通道变化 → 通道宏写错(见 §5 警告)。✅ **2026-10-27 已执行**(原 2026-10-10 的"尚未执行"已消除;当时台架只验证了"9 通道全部转换成功 + 零超时 + 互异非饱和 + 跨次开机读数不同",台架无信号源);映射的**代码侧**一致性有两道保证:① `App/algo/adc_input.c` 的 `k_adc_map[]` 与 CubeMX 标签(`ADC17_UB`=PC4 等)逐条对齐;② 开机自检 `adc_input_init()` 校验每个 STM32 语义通道都落在 `k_stm32_rank_ch[]` 扫描序列内(挡"映射到不扫描的通道 → 恒读陈旧值")。
|
||||
3. **备用通道**:RESERVED 路不接入任何语义,UI 与上报里不得出现;若实测有读数漂移,只记录不消费。
|
||||
4. **端子侧变比(2026-10-23 补,2026-10-27 收窄)**:上面 1/2 两条都只到 **ADC 引脚**。③ 段(`AINn` ↔ 转换器引脚)已由网表追线定死为 **1:1**(`ADCn` 节点无对地元件,拓扑图见 §7.1),**板内不再有未知比值**;剩下的未知量只有 ④ **子板/端子板变比**——它在仓库里没有任何文档给出(`docs/硬件平台/` 只有 `.tel` 网表与分析报告,无子板原理图)。故**不得**用"2:1 分压"换算出二次值;该变比由 `docs/任务规划/数据可信.md` 卡 0b 实测确认。
|
||||
4. **端子侧变比(2026-10-23 补,2026-10-27 收窄)**:上面 1/2 两条都只到 **ADC 引脚**。③ 段(`AINn` ↔ 转换器引脚)已由网表追线定死为 **1:1**(`ADCn` 节点无对地元件,拓扑图见 §7.1),**板内不再有未知比值**;剩下的未知量只有 ④ **子板/端子板变比**——它在仓库里没有任何文档给出(`docs/硬件平台/` 只有 `.tel` 网表与分析报告,无子板原理图)。故**不得**用"2:1 分压"换算出二次值;该变比由「端子/子板变比确认」实测确认。
|
||||
|
||||
### 8.1 2026-10-27 实测记录(首次执行,六项判据全 PASS)
|
||||
|
||||
@@ -228,6 +228,6 @@ STM32(U17)为 LQFP144 脚号。
|
||||
| 2026-10-09 | **CubeMX 生成 ADC1(9 通道)落地**:新增 `Src/adc.c`/`Inc/adc.h` + HAL adc 三文件并挂进 uvprojx、`HAL_ADC_MODULE_ENABLED` 生效、`MX_ADC1_Init()` 入 `main.c`;分频 PCLK2/4 = 21 MHz——面板里 DIV2 已被 `FadcConstraint`(36 MHz)约束禁掉,**故不加 `.ioc` 键 / 代码守卫 / 审计项等额外防护**(曾加过,按决定撤除,理由见 §7"ADC 时钟"行);修正 PA0 标签笔误 `AD9_RES`→`ADC9_RES`。⚠ 本次重生成打回了 5 处定制(IWDG 延迟启动锚点、HardFault + 3 个 Fault 手工 Handler、`FreeRTOSConfig.h` 加固区、`freertos.c` 三处栈核算注释),已全部复原;存活审计新增 1 项 `adc1-hal-enabled`(共 19 项),现 19 通过 / 1 警告(timeSyncTask 手工定义)/ 0 失败,`@build` 0 错 0 警 |
|
||||
| 2026-10-10 | **口径更正**:8 路电气量分属 TPAFE / STM32 两片转换器**定性为 V0.1 硬件缺陷**,撤销 2026-10-09 建档时"有意分配、不要修正"的说法;补记缺陷实质(跨转换器无同一时刻性、16 位双极性 vs 12 位单极性、语义与归属交叉)与 **V0.2 改版要求**(8 路电气量全部接 TPAFE,与 5 路备用路对调串联电阻目的地,BOM 不变);§7 新增"通道归属"行,明确 V0.1 上禁止跨转换器做相位/功率类运算。同步更正 `V0.1_网表详细分析报告.md` §1.4(新增 V10)/ §6-3,登记簿新增 **N-18** |
|
||||
| 2026-10-10 | **STM32 ADC1 消费者落地(L1-3/L1-4)**:新增 `App/algo/adc_input.c/h`——语义映射表 `k_adc_map[]` 按本文件 §3/§5 逐条落地(`UA/UN/IA`→TPAFE `buf[6]/[5]/[2]`,`UB/UC/IB/IC/IN/TEMP`→`CH14/3/6/1/2/5`),并提供 `adc_input_raw()` **按语义取数**;`stm32_scan()` 实现 9 通道软件触发顺序扫描;`adc_input_init()` 增**映射自检**(STM32 映射通道必在扫描序列内)。§7 的"STM32 ADC 外设 / `adc_task` / TPAFE 采样触发"三行同步更新(后两者原为陈旧描述:TIM6 周期触发、L1 层取数)。§8 步骤 2 标注**引脚级注入验证尚未执行**。台架 `@test` PASS(`adc1_rc=0` / `adc1_err=0`、`ADC input layer init: OK`;首帧 `UA=11429 UN=11454 IA=11452`、`UB=1018 UC=1044 IB=943 IC=1069 IN=1052 T=850`——互异非饱和,且两次开机读数不同 → 实时转换而非常量),证据 `测试说明/boot_log_data/20261010_prod_adc_l1_boot_log.txt` |
|
||||
| 2026-10-23 | **验证现状核查与排期**:确认 §8 步骤 1/2 与 `V0.0_网表详细分析报告.md` §5.1 第 6 条的"首次功能级 ADC 验证"**均无执行记录**——现有台架判据只证"通路活"(9 通道转换成功、零超时、互异非饱和、跨次开机不同),不证读数正确,连极性都未验。新增 §8 步骤 4:**"端子电压 → ADC 引脚电压"的变比在仓库内无任何文档**(无子板原理图),且 `1k 串联 + 1k 到地` 已被 §4.7 定性为"源阻抗匹配、非分压",故撤销"按 2:1 换算二次值"的用法。验证方法同步降为**不需要示波器 / 信号源**:`BUSY` 脉冲改用 `tpafe5160_frame_seq()` 帧计数,幅值改用万用表 + 三点线性拟合。排期见 `docs/任务规划/数据可信.md` 卡 0 / 0b |
|
||||
| 2026-10-25 | **量程口径定死(本波卡 1)**:文首摘要行“TPAFE5160(16 位、8 通道同步、±10 V 双极性)”更正为“±5 V 满量程 = 10 V 跨度、LSB ≈ 152.59 µV(板上 RANGE 接 GND)”;§1“缺陷实质 2”补“满量程 = 10 V 跨度”;§7“TPAFE 量程”行重写并括注“±10 V 是芯片可选档(RANGE=HIGH)、本板未用”;新增 §7.1 固化“端子 → 子板变比 → 网名 AINn → 电阻网络 → 引脚 → 码值 → 满量程”链路分段口径——② 引脚侧 LSB 系数(TPAFE 152.59 / STM32 805.66 µV/码)**定死**,③ 1k+1k 网络“2:1 分压 vs 源阻抗匹配”两读法待卡 0 斜率判别,④ 端子变比为仓库缺口待卡 0b;“板级系数 305.18 / 1611.3 µV/码”定性为读法 A 条件值、判别前禁入代码;新增内容全部收进 §7.1 子节、本章编号刻意保持 §9 不动(`docs/算法/继电保护功能复现规划.md` §4 有指向本文件 §9 的既有跨文档引用,挪号会打断 doc-links 章节校验)。实测数值本轮按用户指示未采(台架未跑),相关段均标“待台架实测” |
|
||||
| 2026-10-27 | **③ 段定死为 1:1(网表追线)**:逐通道追 `V0.1.tel`,`ADCn` 节点(如 UA 的 `ADC7`,第 241 行 `ADC7 ; C44.2 R31.2 U3.61`)只有 {串阻.2, 滤波 C, 转换器引脚} 三者,**无对地元件**——"1k 到地"实际接在差分负端(`ADC7_GND` → R32 → AGND,第 151 行),属差分滤波。故 ③ 段不是分压器、变比 1:1,旧"读法 A(2:1 分压 → 305.18 / 1611.3 µV/码)"**作废**,`docs/任务规划/数据可信.md` §2.1 旧表同步改为引脚侧系数。§7.1 新增拓扑 SVG(`docs/images/ADC前端电路.svg`,生成器 `tools/arch_diagram/gen_adc_frontend_svg.py`),含 STM32 侧对照面板;§7"前端偏置"行、§8 步骤 4 同步改写。卡 0 的判据随之从"判别 A/B 读法"降为"确认转换器 LSB 与逐通道映射" |
|
||||
| 2026-10-23 | **验证现状核查与排期**:确认 §8 步骤 1/2 与 `V0.0_网表详细分析报告.md` §5.1 第 6 条的"首次功能级 ADC 验证"**均无执行记录**——现有台架判据只证"通路活"(9 通道转换成功、零超时、互异非饱和、跨次开机不同),不证读数正确,连极性都未验。新增 §8 步骤 4:**"端子电压 → ADC 引脚电压"的变比在仓库内无任何文档**(无子板原理图),且 `1k 串联 + 1k 到地` 已被 §4.7 定性为"源阻抗匹配、非分压",故撤销"按 2:1 换算二次值"的用法。验证方法同步降为**不需要示波器 / 信号源**:`BUSY` 脉冲改用 `tpafe5160_frame_seq()` 帧计数,幅值改用万用表 + 三点线性拟合。排期见 `docs/任务规划/数据可信.md`(已知电压注入验证 / 端子/子板变比确认) |
|
||||
| 2026-10-25 | **量程口径定死(本波)**:文首摘要行“TPAFE5160(16 位、8 通道同步、±10 V 双极性)”更正为“±5 V 满量程 = 10 V 跨度、LSB ≈ 152.59 µV(板上 RANGE 接 GND)”;§1“缺陷实质 2”补“满量程 = 10 V 跨度”;§7“TPAFE 量程”行重写并括注“±10 V 是芯片可选档(RANGE=HIGH)、本板未用”;新增 §7.1 固化“端子 → 子板变比 → 网名 AINn → 电阻网络 → 引脚 → 码值 → 满量程”链路分段口径——② 引脚侧 LSB 系数(TPAFE 152.59 / STM32 805.66 µV/码)**定死**,③ 1k+1k 网络“2:1 分压 vs 源阻抗匹配”两读法待已知电压注入验证斜率判别,④ 端子变比为仓库缺口待「端子/子板变比确认」;“板级系数 305.18 / 1611.3 µV/码”定性为读法 A 条件值、判别前禁入代码;新增内容全部收进 §7.1 子节、本章编号刻意保持 §9 不动(`docs/算法/继电保护功能复现规划.md` §4 有指向本文件 §9 的既有跨文档引用,挪号会打断 doc-links 章节校验)。实测数值本轮按用户指示未采(台架未跑),相关段均标“待台架实测” |
|
||||
| 2026-10-27 | **③ 段定死为 1:1(网表追线)**:逐通道追 `V0.1.tel`,`ADCn` 节点(如 UA 的 `ADC7`,第 241 行 `ADC7 ; C44.2 R31.2 U3.61`)只有 {串阻.2, 滤波 C, 转换器引脚} 三者,**无对地元件**——"1k 到地"实际接在差分负端(`ADC7_GND` → R32 → AGND,第 151 行),属差分滤波。故 ③ 段不是分压器、变比 1:1,旧"读法 A(2:1 分压 → 305.18 / 1611.3 µV/码)"**作废**,`docs/任务规划/数据可信.md` §2.1 旧表同步改为引脚侧系数。§7.1 新增拓扑 SVG(`docs/images/ADC前端电路.svg`,生成器 `tools/arch_diagram/gen_adc_frontend_svg.py`),含 STM32 侧对照面板;§7"前端偏置"行、§8 步骤 4 同步改写。已知电压注入验证的判据随之从"判别 A/B 读法"降为"确认转换器 LSB 与逐通道映射" |
|
||||
|
||||
@@ -409,7 +409,7 @@
|
||||
|
||||
> ⚠️ **待补**:逐项**取值范围 / 步长 / 默认值**取自参考项目 `APP/EquipCfg/Const_CommPara.c` 的 `CommPara_ConfigTable`(`0x8020~0x8882`);本表在实现各保护元件时逐项落实(见 §10.3)。
|
||||
>
|
||||
> **2026-10-25 运行参数段落实进度**:卡 10 已落 `App/algo/run_par.c`——本仓自定逐项地址
|
||||
> **2026-10-25 运行参数段落实进度**:这一项已落 `App/algo/run_par.c`——本仓自定逐项地址
|
||||
> 0x8030~0x8038(死区 9 点)/ 0x8040~0x804F(k/b 覆盖直通 adc_cal),表与理由见
|
||||
> `docs/子系统设计/IEC104上行设计说明.md` §3.4;**送检点表到位后以送检为准替换常量段**。
|
||||
> 变比/报警/录波/功率置负等其余运行参数类项目前无消费者,留白不预埋。
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
> 边界与代价。**目录级索引(文件清单、构建与测试命令、新增模块动作)在 `App/algo/README.md`**,
|
||||
> 本文不重复其内容;本文不写历史演进、门禁复测记录与修订日志(需要时查 git 历史)。
|
||||
> **状态**:L1 → L2 → L3 主线已闭环到板端消费者(`protectTask`,20 ms 判据节拍);
|
||||
> 标定折算层 `App/algo/adc_cal` 已于 2026-10-25 落地(`docs/任务规划/数据可信.md` 卡 2/4,
|
||||
> 引脚电压量纲 + 系数落盘 + 未标定闭锁);**幅值精度判据**仍待标准源两点注入复核(卡 12)。
|
||||
> 标定折算层 `App/algo/adc_cal` 已于 2026-10-25 落地(标定折算与落盘整定,`docs/任务规划/数据可信.md` §4.1,
|
||||
> 引脚电压量纲 + 系数落盘 + 未标定闭锁);**幅值精度判据**仍待标准源两点注入复核(两点标定,`docs/任务规划/数据可信.md` §5)。
|
||||
> **相关文档**:
|
||||
> 分层与功能项(L1~L5)的唯一属主登记处:`docs/算法/继电保护功能复现规划.md` §2.1(分层)、§3(功能清单)、§4.2(精度)、§7(路线图)
|
||||
> `docs/硬件平台/ADC通道映射说明.md`(**语义映射唯一权威口径**)
|
||||
@@ -228,7 +228,7 @@ flowchart TD
|
||||
40.5~60.5 Hz(参考 `CN_HERTZ_SOFTFR_MIN/MAX`,见
|
||||
`docs/算法/继电保护功能复现规划.md` §10.1),仍能拦住建"窗滑 2 拍"造成的 ≈2f(90~110 Hz)
|
||||
与相位跳变假值;系统合理带由 OF / UF 的**定值范围**在消费侧把关,不在这里重复把关。
|
||||
- **幅值门** `FREQ_AMP_MIN = 50.0`(2026-10-25 卡 6 语义重定为**二次值 V**:50 V = 0.5×Un,
|
||||
- **幅值门** `FREQ_AMP_MIN = 50.0`(2026-10-25 下游常数按工程量重定后语义为**二次值 V**:50 V = 0.5×Un,
|
||||
数值沿旧 50.0 属巧合,量纲依据 `App/algo/prot_set.c` 头部量纲基准块):低于门视为
|
||||
无有效波形(浮空 / PT 断线时 rms ≈ 0,相位无意义)→ 停止更新、`valid` 清零、读数保持,
|
||||
台架浮空因此**不发散**;信号刚消失的过渡段(≤20 ms 残窗)读数漂移有界 ≤0.3 Hz。
|
||||
@@ -342,7 +342,7 @@ UA 无幅值落 IA → 0.0020 Hz。
|
||||
STM32 ADC1,两片转换器没有共同采样触发 → 无同一时刻性、相位不确定。故本层**不做**跨转换器的
|
||||
相位 / 功率 / 功率因数 / 负序零序类矢量运算;**8 路全接 TPAFE(V0.2 硬件)后方可解禁**。
|
||||
3. **标定折算已落地、精度复核未做**(2026-10-25 `App/algo/adc_cal`;标准源两点注入见
|
||||
`docs/任务规划/数据可信.md` 卡 12):帧值现 = 引脚侧工程量(ROM 默认系数 = 转换器 LSB 事实值),
|
||||
`docs/任务规划/数据可信.md` §5(两点标定):帧值现 = 引脚侧工程量(ROM 默认系数 = 转换器 LSB 事实值),
|
||||
前端分压读法判别与端子变比仍待台架——**精度结论前不得把幅值当计量证据**。
|
||||
4. **本层无副作用外溢**:不建任务、不等事件、不写日志(日志由调用侧打)、不碰寄存器
|
||||
(例外只有 `adc_input.c` 驱动 ADC1)。
|
||||
|
||||
@@ -144,6 +144,7 @@ P-6 号必须能反查到定义(属主登记处得存在)· P-7 编号不语
|
||||
|---|---|---|
|
||||
| 登记簿 `N-x` / `S-x` / `T-x`、专项 `A-x`、已删报告的 UI 簇 `U1~U5`(2026-10-26 方案 B) | 语义短语——**登记簿表首格本身就是短语**,如「双转换器无共同采样触发」「CI 远端闭环未验证」 | `scripts/id_aliases.json` 标 `retired-to-phrase` |
|
||||
| 网络设计条目 `F-NET/F-DRV/F-MS-<nn>`(12 个,2026-10-27 批次一) | 「§7 + 条目名」短语,如 `(§7「全局读即清搁浅事件」)`;条目名的权威清单 = `docs/网络/网络自愈架构设计.md` §7「条目名」列;那个 DRV 段孤儿号按本节末句**删号留事实**、未补定义 | `scripts/id_aliases.json` 标 `retired-to-phrase`(13 条)+属主文档 §7 编号列仅作历史对照 |
|
||||
| 「数据可信」任务卡号(中文前缀「卡」+ 数字,形态见 §9.3;2026-10-27 批次五) | §5 表的**标识列直接写任务名**(「端子/子板变比确认」「两点标定与精度验收」),代码注释与文档写语义短语(「标定折算落地」「未标定闭锁」「遥测快照发布」…);**逐号换算表见本文 §9.3** | ⚠ **机器面空白**:中文前缀不进 `scripts/check_ids.py` 语料(族 pattern 全是拉丁形态)→ 门禁咬不到,今天只有本表 + §9.3 + 评审三条兜;`id_aliases.json` 刻意不登记(登记了机器也看不见,只多一张没人核的表) |
|
||||
| `E-xx` 审计发现、`P0-x`~`P3-x` 审计条目、报告六族 `D/R/F/N/U/S`、复审残号 `S1~S14`/`A-x`/`B1~B10`/`T-x`、模拟器差距 `H-x`/`L-x`、`TM-*` 阶段号、`DP-*`、`gen`/`round`/会话临时号 | 写条目本身("原子快照取数"、"队头阻塞"、"台架日志代次 288"、"第 3 轮台架") | 别名表标 `void`;**部分死号故意不进别名表**,好让门禁继续咬残留引用 |
|
||||
| 规范曾规划却从未启用的前缀族(`DEF`/`WI`/`DR`/`OQ`/`RSK`/`GAP`/`SC`/`GEN`/`MS`/`UL`/`LAT`/`CS` 等) | 同上,写事实 | 无定义,本就不该存在 |
|
||||
|
||||
@@ -269,6 +270,7 @@ P-6 号必须能反查到定义(属主登记处得存在)· P-7 编号不语
|
||||
| 二 | 保护功能号 28 个 | 代码与测试 215 处 + 文档 194 处 + 配置注释 3 处 + 入口文档 2 处;活文档只剩
|
||||
**冻结的变更记录行 40 处**与**一处原始串口日志**(真机抓包证据,改它等于篡改现场,永久保留) |
|
||||
| 三 | 测试用例族 561 站点 | **用户裁定不做**:该族保留,但**即日停发**(游标冻结,新用例不再配号) |
|
||||
| 五 | 「数据可信」任务卡号 14 个(中文前缀「卡」+ 数字),随注入验证卡销项整族清退 | 全仓 288 站点 / 56 文件改语义短语(代码与测试 191 / 文档 56 / 门禁配置与本文 41),活引用收口 **0**;门禁字面量与不可判定绝对数**零变化**(本族从不在计数内)——换算表与机器面空白见 §9.3(批次四记在上面的复测段,未进本表) |
|
||||
|
||||
编号字面量 **8,787 → 7,828**;不可判定绝对数 **1,161 → 982**(上限 1,166,余量从 5 格宽到 184 格)。
|
||||
比值 86.79% → 87.46% 属**纯稀释**(删的都是可判定引用,分子分母同缩),**基线不下调**,见本节末裁定。
|
||||
@@ -381,6 +383,47 @@ P-6 号必须能反查到定义(属主登记处得存在)· P-7 编号不语
|
||||
「编号说明」这件事本身应该继续变薄:每多一个族,就多一处需要有人记得它的地方;每多发一个号,就多一个
|
||||
将来没人敢删的字符串。要新增族之前,请把 §4.1 的「允许继续发号」那 5 行当作反对你的第一手证据。
|
||||
|
||||
### 9.3 批次五换算表:「数据可信」任务卡号(2026-10-27 整族清退)
|
||||
|
||||
用户指令(2026-10-27):「**数据可信.md 已经完成的内容请进行销项删除,去除相关编号**」。两件事同做:
|
||||
|
||||
1. **销项**:`docs/任务规划/数据可信.md` §5 里 2026-10-27 台架闭环的「已知电压注入验证」行**删行**。
|
||||
上一笔曾特意标 ✅ 保留,理由是该行被 `App/task/adc_task.c` 的 v3.3 修订行按卡号当口径出处引用;
|
||||
引用侧改成语义短语后该理由不再成立 → **例外撤销**。判据与实测记录的属主 =
|
||||
`docs/硬件平台/ADC通道映射说明.md` §8.1(六项判据全 PASS、斜率 6544.2 码/V、偏差 −0.14 %),
|
||||
执行侧 = `docs/测试说明/ADC前端注入验证流程.md`(含两项残留口径与残差表)。
|
||||
2. **整族清退**:「卡」+ 数字 1~11 那 11 行早在 2026-10-25 就删完了,代码注释里剩下的这种形态今天
|
||||
**查无此行**——按 §4.1.1 末句,正确动作是**删号留事实**(换成语义短语),不是回去补一个定义。
|
||||
|
||||
| 旧号形态 | 语义短语 | 现行口径出处 |
|
||||
|---|---|---|
|
||||
| 「卡」+ 数字 0 | 已知电压注入验证 | `docs/硬件平台/ADC通道映射说明.md` §8.1(✅ 2026-10-27,已销项删行) |
|
||||
| 「卡」+ 数字 0b | 端子/子板变比确认 | `docs/任务规划/数据可信.md` §5;缺口面 = `docs/硬件平台/ADC通道映射说明.md` §7.1 链路分段表 ④ 行 |
|
||||
| 「卡」+ 数字 1 | 量程口径冻结 | `docs/任务规划/数据可信.md` §2.1 |
|
||||
| 「卡」+ 数字 2 | 标定折算落地 | `docs/任务规划/数据可信.md` §4.1 |
|
||||
| 「卡」+ 数字 3 | 有符号零点类型(CFG_VAL_INT) | `docs/任务规划/数据可信.md` §4.4 |
|
||||
| 「卡」+ 数字 4 | 标定落盘与整定入口 | `docs/任务规划/数据可信.md` §4.4 |
|
||||
| 「卡」+ 数字 5 | 未标定即闭锁 | `docs/任务规划/数据可信.md` §4.3 |
|
||||
| 「卡」+ 数字 6 | 下游常数按工程量重定 | `docs/任务规划/数据可信.md` §2.3 |
|
||||
| 「卡」+ 数字 7 | 量纲回归用例 | `docs/任务规划/数据可信.md` §3 退出判据第 ⑥ 条;用例在 `test/host/prot_dim` |
|
||||
| 「卡」+ 数字 8 | 遥测快照发布 | `docs/任务规划/数据可信.md` §4.5 |
|
||||
| 「卡」+ 数字 9 | 104 改读快照 | `docs/任务规划/数据可信.md` §4.5 |
|
||||
| 「卡」+ 数字 10 | 运行参数段 | `App/algo/run_par.h` 头注释 + `docs/子系统设计/IEC104上行设计说明.md` |
|
||||
| 「卡」+ 数字 11 | 频率点绑定 | `docs/子系统设计/IEC104上行设计说明.md` 的 `0x401D` 行 |
|
||||
| 「卡」+ 数字 12 | 两点标定 | `docs/任务规划/数据可信.md` §5(未开始,等标准源) |
|
||||
|
||||
**本表把形态写成「卡」+ 数字、不复述字面量**:本文是门禁语料,复述形态会把"讲规则的文档"变成
|
||||
自己的引用站点(§9.1 批次四第 2 条同一条教训);要查旧号,看左列形态 + 属主文档的历史行。
|
||||
|
||||
- **旧号永久作废、不得重新取走**:这一族**没有机器识别面**(中文前缀不进语料),停发今天只有
|
||||
§4.1.1 本行 + 本表 + 评审兜住。要机械化,得先给"中文前缀 + 数字"设计候选形态——那与 §9.1 末尾
|
||||
「族级加字面量上限」同属追溯机制改造,**按 §7.3 单独开卡**,别夹在清退批里顺手做。
|
||||
- **同形态不同属主**:`docs/任务规划/UI补齐.md` 的条目现在写「第 N 项」,历史上被别处写成同一形态的
|
||||
4 处(其实指已入库的 `[comm]` 段前置项)已随本批改成不带号的语义形态。同一裸形态跨两个属主文档,
|
||||
正是 §4.1「别拿同形当同族」的实证——清号必须**按属主文档逐处判语义**,不许全局查找替换。
|
||||
- **不在本批的**:里程碑号(字母 M + 数字)与并行道号(道A/道D/道G)一律保持原样,是否清退等用户
|
||||
单独裁定,**不要顺手做**。
|
||||
|
||||
## 10. 速查
|
||||
- 看到一个不认识的号 → 先查 `id_aliases.json` 与属主登记表;查不到就**删号留事实**,不要补定义。
|
||||
- 想给待办 / 缺陷 / 差距 / 风险发号 → 不许,写短语(§3.3)。
|
||||
@@ -396,6 +439,7 @@ P-6 号必须能反查到定义(属主登记处得存在)· P-7 编号不语
|
||||
|
||||
| 日期 | 变更 | 说明 |
|
||||
|---|---|---|
|
||||
| 2026-10-27 | **批次五:「数据可信」任务卡号整族清退 + 注入验证卡销项删行** | 用户指令「数据可信.md 已经完成的内容请进行销项删除,去除相关编号」。实测 **288 站点 / 56 文件**(代码与测试 191 / 文档 56 / 门禁配置与本文 41)全改语义短语;§5 表首列由「序」改「标识(任务名)」、14 个旧号进 §9.3 换算表;顺带按属主文档判语义清掉同形态的悬空引用 4 处(「UI 补齐」波次的 `[comm]` 段前置项)。门禁面:编号字面量与不可判定绝对数**零变化**(中文前缀不在语料),收口复跑 `check_ids.py --strict` 与 `check_doc_links.py --all --sections-strict` |
|
||||
| 2026-10-27 | **批次四:`L-PROT` / `FEAT` 发号口关闭(§4.1 七行→五行)+ 本文自述形态化 + 登记 `T-TEST` 机器面空白** | 用户指令「语义标识已定为默认形态,看看还有哪些编号族仍被引用、各自还剩多少,把能清的族清掉一批」。按门禁 `Checker` 实测三口径重打 §9 存量表:**真编号活引用只剩 `TC-*`(保留、水位 497/81 未涨)、`TRAP-*`、`CODE-RULE-*`、`MENU-STATE-*` 四族**,批次一/二涉及的 `N-*`/`TM-*`/`T-TEST`/`L-PROT`/`FEAT` 活引用均已归零。本笔:① §4.1 把 `L<n>-<nn>`、`F-<MOD>-<nn>` 从『允许继续发号』整行移出并在『已停发』栏各写一行(含探针证据:新形态号 → 校验 3 错误级);② 本文 6 处形态自述改「字母+数字」描述,使四个族门禁命中归零、lesson 不丢;③ registry 给 `L-PROT`/`FEAT` 补 `retired`、给 `T-TEST` 补 cursor_note(pattern 上限即 3 → 冻结游标是空操作,停发今天只有规范效力);④ 分类登记 §4.4 误判面(版本记号 / 活表代号 / 状态组合 / 位号)与 §4.3 冻结波次号两类**不清**的理由。未改门禁判定逻辑、未动冻结历史与原始串口日志、未新增任何号。 |
|
||||
| 2026-10-27 | **批次一 `F-*` 收口:网络设计 12 个条目号转「条目名」语义短语,§7 表加「条目名」列为权威对照** | 用户指令「把网络设计里的 `F-*` 条目号换成语义短语,别改坏硬件资料的 T1/T2/T3 位号和 Mermaid 节点名」。走 `scripts/rename_ids.py`(映射 `scripts/rename_maps/batch7-f-net-semantic.json`,`--no-alias` 后手工写别名),10 处定点改写=属主文档正文 9 处(含 1 处孤儿号删号留事实)+ `test/host/net_socket/net_socket_test.c` 注释 1 处;孤儿号 `F-DRV-9`(§7 从无定义行)删号留事实、不补定义;13 个旧号标 `retired-to-phrase`。刻意不动:§7 编号列(历史对照)、`BSD_Socket_API_使用指南.md` 变更记录行、`docs/硬件平台/` 位号、Mermaid 节点名。`scripts/id_registry.json` FEAT `cursor_note` 改记停发口径(三模块各有最高号 → 不冻结游标的理由写在里面)。零代码语义变更。 |
|
||||
| 2026-10-27 | **停发机械化落地:34 个 `TC-HOST-*` 子族游标冻结,§8 校验 5 开始咬新配的 TC 号** | 上一笔把缺口登记为「停发今天只有规范效力」并写明机械化怎么做;本笔照它落地、把话兑现:`scripts/id_registry.json` 37 个 TC 类族全部 `frozen: true`,34 个子族的 `cursor` 冻结在裁定日存量最高号(字符串形态——整型比较静默不生效;5 个低于存量的已抬:`TC-PROTELEM-013→015`、`TC-SYSLOG-108→137`、`TC-ADCHEALTH-011→023`、`TC-ADCCAL-017→023`、`TC-I104SRV-041→053`),理由记在顶层 `tc_freeze_2026_10_27`。探针(Checker `_check_frozen`):在 `TC-PROTSET-` 段存量最高号之上再加一号 → 命中 1 条校验 5,写存量最高号本身 → 零误伤;`check_ids.py --only 5` = 0 处;plain 与 `--strict` 的错误级 findings 与本笔前逐条相同(**12 条 `TC-TIMESYNC-0xx` 悬空引用属另一道在飞的 time_sync 改动,不在本笔写域,也没替它改**);台账 0 条、可判定 87.67%、不可判定 979 / 上限 1,166,不动 §8.1。**没有把主族 `TC` 说成已冻结**:它 `cursor` 仍为 `null`,§4.1 框内第三条与 §9.1 末段把这块空白及其兜底(校验 3 + 冻结水位 564/474/79 只减不增 + 评审)写明,并规定「给这些模块补号即使在文档里补了定义行也算违令」。§9.1 末段由「效力边界」改写为「机器口径已落地」,当日实测留作历史不抹。零代码、零编号增删。 |
|
||||
|
||||
+1
-1
@@ -53,7 +53,7 @@
|
||||
| [`cubemx-survival.md`](cubemx-survival.md) | `cubemx-survival` | CubeMX 重生成会不会把定制静默抹掉(L3 审计兜底) | `.ioc`、`Src/`、`Inc/` | 已写 |
|
||||
| [`test-suite-switch.md`](test-suite-switch.md) | `test-suite-switch` | 板级套件开关必须互斥;全注释 = 产品构建 | `test/board/test_config.h` | 已写 |
|
||||
| [`font-charset.md`](font-charset.md) | `font-charset` | UI 用到的汉字是否都在子集字体里(缺字 = 白框) | `Drivers/BSP/UI/**`、字体脚本 | 已写 |
|
||||
| [`ui-golden.md`](ui-golden.md) | `ui-golden` | UI 像素回归:菜单 8 状态 + 内容页 53 页黄金参考图比对 | UI 源码、模拟器 | 已写 |
|
||||
| [`ui-golden.md`](ui-golden.md) | `ui-golden` | UI 像素回归:菜单 8 状态 + 内容页 60 页黄金参考图比对 | UI 源码、模拟器 | 已写 |
|
||||
| [`bom-guard.md`](bom-guard.md) | `bom-guard` | 带 BOM 的文件被编辑工具剥掉 BOM(ARMCC 换解码 → 假语法错) | `Drivers/BSP/UI/**` 等名单内文件 | 已写 |
|
||||
| [`setview-check.md`](setview-check.md) | `setview-check` | 定值查看行表与 `prot_set` 枚举序 / `g_prot_set_meta` 上下限是否同一份口径 | `tools/setview_check/**`、`ui_w_setview.*` | 已写 |
|
||||
| (专篇待补,档位与限度正文在 [`../UI设计/UI_自动化测试流程.md`](../UI设计/UI_自动化测试流程.md) §7.3) | `uinav-selftest` | 板端 UI 导航器认屏快检(黄金参考帧分类;完整闭环档=合入前/上板前手工跑,快检不互替) | `scripts/board_ui_nav.py`、`simulator/tests/ref/*.bin` | 指针 |
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# `ui-golden` — UI 像素回归(菜单 8 状态 + 内容页 53 页黄金参考)
|
||||
# `ui-golden` — UI 像素回归(菜单 8 状态 + 内容页 60 页黄金参考)
|
||||
|
||||
> 一句话:改 UI 源码时,把模拟器增量重编 + 两条 golden 回归串成一次提交门禁,**像素对不上就拦**。
|
||||
> 它是包装器:真正的判据在被包装的两条脚本与参考图里。
|
||||
@@ -11,7 +11,7 @@
|
||||
## 1. 它在查什么
|
||||
|
||||
- 菜单侧:整棵菜单树的行渲染结果(8 个状态)与参考图逐像素比对;
|
||||
- 内容页侧:53 个内容页的渲染结果与参考图比对;
|
||||
- 内容页侧:60 个内容页的渲染结果与参考图比对;
|
||||
- 参考图 `simulator/tests/ref/*.bin` **就是判据本身**。
|
||||
|
||||
## 2. 为什么要它(有牙的实测)
|
||||
@@ -57,7 +57,7 @@
|
||||
|
||||
1. **参考图即判据**:刷新参考图 = 修改判据。评审时必须盯 `simulator/tests/ref/` 的 diff;
|
||||
一旦"顺手更新",此后所有回归都只在和错的基线比。**门禁无法阻止这件事**,只能靠评审。
|
||||
2. 只覆盖 8 个菜单状态 + 53 个内容页:未列入的状态(密码错误态、超长文本、缺字渲染、
|
||||
2. 只覆盖 8 个菜单状态 + 60 个内容页:未列入的状态(密码错误态、超长文本、缺字渲染、
|
||||
无 SD 卡 / 挂载失败的降级显示)**不会有任何回归**。
|
||||
3. 跑的是**模拟器那份配置**,不是固件那份 —— 两份 `lv_conf.h` 漂移时,回归结论不能外推到固件
|
||||
(所以 `lv-conf-sync` 是本门有效性的前提)。
|
||||
@@ -84,4 +84,5 @@
|
||||
| 2026-10-23 | 首篇逐项文档(含 +3 像素注入实验与"有基线 ≠ 有门禁"的缺口来源) |
|
||||
| 2026-10-27 | 内容页黄金参考 **40 → 47 页**(遥测死区与系数 2 页落地,`simulator/tests/ref/` 实测 47 张:7 张新增、存量 40 张逐字节零漂移);本文件的当前态计数同步改 47,历史行 27 → 40 原样保留 |
|
||||
| 2026-10-27 | 内容页黄金参考 **47 → 53 页**(通讯设置页落地并绑 `#page=comm`;判据 = `simulator/tests/ref/` 入库 `shot_*.bin` 实数 53 张,`git diff --name-status 31ca4a1f HEAD -- simulator/tests/ref` 实测只有 6 个 `A`、零 `M` ⇒ 存量 47 张逐字节零漂移);本文件的当前态计数已同步 |
|
||||
| 2026-10-28 | 内容页黄金参考 **53 → 60 页**(「UI 补齐」清单清空:记录 5 页 accident / oper / alarm / start / yk 与运行报告 runreport 六页落地并在菜单树绑 #page=。运行报告 13 行分 2 页(8 + 5),第 2 页单独拍一张 shot_runreport_p2.bin 钉「第 2 页,共 2 页」页脚与 104 三枚计数,故 60 而非 59。判据 = simulator/tests/ref/ 入库 shot_*.bin 实数 60 张(tracked 53 + 新增 7)+ 存量 53 张逐字节零漂移(本批字库净新增 33 字:185→218 字 / 280→313 字形,两轮 make_font 后对既有 58 页像素零影响);文本断言 425 正向 / 36 反向(2026-10-26 写的 310 条为当时数)|
|
||||
| 2026-10-26 | 内容页黄金参考下限 **27 → 40 页**(UI 三页落地;`simulator/tests/ref/` 入库 `shot_*.bin` 实测 40 个、`check_content_pages.py` 的 `PAGES` 40 项 / 文本断言 310 条覆盖 37 页 / 反向断言 29 条 16 页),标题与「拦不住什么」段同步;未列入状态那一段的覆盖面口径不变 |
|
||||
|
||||
Reference in New Issue
Block a user