Files
STM32F4-Base/docs/任务规划/故障录波.md
T
wandering1 d64bbdc57f feat(wave): 故障录波数据面、接线与单通道回放页(软件闭环交付)
数据面(App/algo,纯逻辑,双端编译)
- wave_ring:8 路 × 320 点列优先环(1 kHz,预触发 160 + 后触发 160),adcTask
  唯一写者;触发/冻结/封存/冷却四态,冻结持续到落盘回执才解冻,滞留 2 s 自弃
  兜底——下一次真故障无波可录比丢一段更贵
- wave_store:段头编解码 + 拉模式打包游标 + 自带无表位运算 CRC-16/MODBUS(带
  锚点自检)+ 段名与整段长度等式;格式不依赖平台类型宽度
- 段头只存原始码值与封存瞬间生效系数,工程量只当单位标签、不进任何算式
- 三套主机单测(环 113 / 编解码 170 / 触发状态机 110),全部无桩、生产源原样
  纳入;新文件补 stddef 是 ARMCC 与主机差异,主机侧照不出这条分叉
- test/host/wave_read.py 是按 §6.2 的独立第二实现(dump/fft/shape/plot),92 条
  自洽断言;三份合成段互读双校验全过、哈希钉死,格式面双向闭合
- 三套新单测不加专属钩子,由覆盖率总闸全量真跑(沿用既有裁定)

接线(任务层)
- adc_cal:新增生效系数的 32 位定点原值入口(与既有浮点入口共用生效视图),
  段头按最低有效位精确记账,不经浮点回算
- adcTask:每拍压 8 路语义原始码值并推进状态机,封存那一拍同拍交棒封存瞬间事实;
  台架定周期自抓走双层编译门,产品镜像里零存在;串口新增一条 wave: 周期行
- defaultTask:卷空闲后一次心跳整段搬完(try 锁 + 256 字节分片 + 一次完整开档到
  关档),成败都回执;失败先删半成品再计错,段号只在成功时推进;持锁超 50 ms
  补一条告警并记历史峰值(喂狗余量可核)
- Lead 复核补第四道并发陷阱:采集任务优先级高于落盘道,搬段中途它可能正好把滞留
  超时的本段自弃、甚至封出下一段——数据区校验和是对「实际读到的字节」算的,
  半新半旧的段照样自洽,故关档后复检环侧身份判废:删文件、不补账、段号不推进
- Lead 复核抓到触发挂号不是原子操作(旧实现分三个字节写,消费者可在窗口里读到
  上一段的触发源与元件号):已把载荷压进一个字节,越界当场拒且不记任何计数;
  段文件字节布局零改动,三份合成段哈希逐字节不变
- protectTask:保护启动上升沿同点请求录波,一拍一次、元件号取最低位;判据本体
  零改动

人机(160×160 单色屏)
- 菜单树节点 26「手动录波」绑页面 + 记录查询组末新增「录波回放」叶,重跑生成器
  得 43 节点 / 34 叶 / 30 已绑,页面映射 28 → 30
- 回放页一屏一路、触发点前后各一周波共 40 点、每点 3 像素阶梯线(只用水平与
  垂直两种线段——单色屏斜线会被阈值裁掉);零点虚线、触发光标、窗口峰值、
  单位徽标与形状受限徽标;空态与坏段各一句显式文案,绝不用半截波形冒充数据
- ui_data 新增录波注入通道(六件操作表、三态返回);执行侧胶水带段头缓存、
  手动请求后连缓存一起作废、逐点走全仓唯一的码值换算入口
- 模拟器接真实环与编解码合成两段(含坏段与空态旗标),6 张新黄金参考,既有
  60 张逐字节零漂移未用更新模式;字库 218 → 224 字 / 319 字形
- 两份图形配置里图表组件仍为关;零堆分配;页面池水位不变
- 回放读路径的 uiTask 阻塞上界按实码写清:一次渲染 = 段表刷新 + 未缓存段头最坏
  22 次小读;已验段只剩一次开窗读 + 40 点解码;无实测数不编,实测归台架、
  仪器用已在跑的单轮工作耗时探针,不新加埋点

台账与文档
- 内存台账:录波环与落盘/回放静态逐条入册,三档对照 81,536 → 88,296 → 89,936
  字节(62.2% → 68.6%),累计 +8,400;预估 5.9 KB 与实测 +6,760 的差额点名;
  散列文件头注释同步;任务栈表核对后无需抬栈;体积趋势行与同码凭证由权威构建
  重打(0 错误 0 警告,四项体积与上一轮相同——本轮改动只有注释与声明位置)
- 设计说明:§5 补第四条并发陷阱;§6.3 定字段口径(两份独立实现的共同依据);
  §7 回填实测;§9 周期行写实;§10 台架判据改两段式且不比绝对相位;§12 补读路径
  风险行;抬头状态改成「代码面已交付、未做完的只有板级那一轮」
- 卡片:软件闭环一栏列证据;台架三条按用户裁定保持未完成,不做虚假销项
- 口径同步:数据可信、UI 补齐、页面补齐规划、产品需求、采集短板评测、任务规划
  索引与两份 README;陈旧现状句清扫 16 处(带日期戳的历史取数行一律不动)
- 门禁说明:nested-comment 记仓库根探测必须兼容 linked worktree 的 gitdir 文件
  形态(修前该钩子在任务树里恒报环境错、静默不可用);coding-standard 记
  「函数头注释超过 24 行就把函数功能挤出回看窗口」这条机制与本次现场
- 覆盖率基线登记两个新覆盖模块(套件 41 → 44 套);环单测重打后该文件有效行
  227 → 226、覆盖行 226 → 225,比率仍 99.6%,是分母变小不是覆盖率回退

为什么是单一提交:文档链接、双端注册、生成器幂等(菜单与字库)、内存数字与
体积事实源、编号门禁这五道整仓门禁要求代码、页面、菜单树、字库、文档与台账
同处一个提交才自洽,按数据面/接线/人机/台账拆成四笔必然红其中至少四道

编号门禁新增行 14 处命中已按语义改写:魔数常量按字符命名、段名样例改由格式串
生成、频谱表头改 f / 2x / 5x 并加一行图例;改写后自洽断言 92 条仍全过
2026-10-29 19:23:15 +08:00

82 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 故障录波(立项 · 卡片登记簿)
> **本文管排期与判据**:卡片表、顺序、资源占用、边界。**设计与口径的属主是 `docs/子系统设计/故障录波设计说明.md`**——为什么存原始码值、为什么先做 1 kHz、段文件格式、回放页画什么,都写在那份里,本文不重抄。
> **本文的待办只认下面的卡片表**;设计层面的开放项去设计文档找。
---
## 1. 现状一句话
**数据面与接线已在仓内,板级判据一轮未跑**(诚实口径,2026-10-29 更新):录波环与段格式编解码在 `App/algo/wave_ring.c` 与 `App/algo/wave_store.c`,压环与落盘与保护启动接线、以及两条 UI 页的代码侧判据已过(三套主机单测 100 / 170 / 110 全 rc=0、双端编译 0 错误 0 警告、板端编码器与 PC 解码器两份独立实现字节级互验通过;「手动录波」第 26 叶与「录波回放」两叶均已绑页,`UI_PAGE_MAP_COUNT` = 30,内容页黄金参考 60 → 66 张含录波 6 态)。**没做完的是板级那一轮**:注 1 V / 50 Hz、FTP 拉回、与 `meas:` 行和 104 浮点 YC 对表、CRC 不符必须拒收的实测、真机上看回放页放一段真波;产品需求把「录波文件存储」「文件传输(录波)」两行的更新排在台架轮次之后。旧口径把录波挂在「工程量口径实测闭环之后」,本波用**原始码值**解掉了这个依赖(`docs/子系统设计/故障录波设计说明.md` §3.2)。
三条已裁定口径(用户裁定 2026-10-29,理由见`docs/子系统设计/故障录波设计说明.md` §1.2 与 §2):
1. **采样率 1 kHz(每周波 20 点)**——复用现有 TIM3 节拍,与产品需求「80 点/周波」的偏离已在`docs/子系统设计/故障录波设计说明.md` §2 显式登记;
2. **8 路电气量全录**,含 V0.1 下必削顶的 STM32 五路,数据不筛选、用位图标记可信性;
3. **一屏只画一路、8 路可切换**——160×160 单色屏画不出多路,且跨转换器本就没有同一时刻性。
---
## 2. 卡片表
资源图例:**🔴 标准源**(需送检机构/0.05 级标准表)· **🟡 台架可做**(信号发生器、注入、FTP、串口)· **🟢 纯软件**(主机单测、构建、模拟器)。
| 卡 | 内容 | 退出判据 | 资源 | 依赖 |
|---|---|---|---|---|
| **录波数据面最小闭环**〔代码侧完成 / 板级待台架〕 | 新增专用录波环与段格式编解码(`docs/子系统设计/故障录波设计说明.md` §5 到 §7);bench 构建定周期自抓;FTP 拉回;仓内新增一个纯标准库 PC 脚本读段、画图、重算全周傅氏 | **代码侧判据已完成**:三套主机单测 100 / 170 / 110 全 rc=0(环 100、段格式 170、触发状态机 110)、双端编译 0 错误 0 警告、板端编码器与 PC 侧解码器两份独立实现**字节级互验通过**(同一份字节两边同解)。**下列判据要板子与台架,一轮未跑**:注入 1 V / 50 Hz 正弦 → 拉回段文件 → PC 脚本量出周波数、幅值、极性与注入一致(**绝对相位不可比**,段内相位以点 0 为参考、触发瞬间在段内点 159,与发生器无相位锁定关系,可核对的是相对相位与极性——见 docs/子系统设计/故障录波设计说明.md §4.2 与 §10);钉轨路数与头里 `clip_mask` 的合格判据是「头位图 ⊇ 实测钉轨路数,且差异必须能由注入条件解释」(`clip_mask` 按来源派生、非本段实测,V0.2 后该位恒 0、这条退化为只查实测);**强观察项**:V0.1 下这五路做交流注入时反而没钉轨 → 先查接线或该路未驱动,属告警面不属失败面;**PC 重算的基波有效值与板上 `meas:` 行、104 浮点 YC 逐个对表通过**;段文件 CRC 不符时脚本必须拒绝而不是画出东西 | 🟡+🟢(需信号发生器与板,不需标准源) | 无(可与固件其他道并行;独占构建锁) |
| **手动触发与保护启动接线**〔代码侧完成 / 板级待台架〕 | 触发状态机接两路真实来路:UI「手动录波」操作页(第 26 叶绑页,形态沿用已规划好的操作页确认模式)+ 保护启动的元件 picked 上升沿(落点 `App/task/protect_task.c` 的 `s_log_record_edge()`,不是判据核本身) | **代码侧已完成**:保护启动来路与并发语义(同拍多请求只录一段、冷却期内二次触发只加 `ovf`、冻结窗口只丢录波样本不丢采集)已在主机单测里钉住,双端编译 0 错误 0 警告。**下列属板级未完成**(第 26 叶已于 2026-10-29 绑页,模拟器侧手动触发路径已有黄金用例;剩下的必须在真机面板上按):面板按一次出一段;造一次过流,段号与该时刻 `/log/start.log` 事件能对齐;冷却期内二次触发只加 `ovf` 计数、不重录(**同时看 `armed` 与那一刻 `/log/start.log` 的时刻,不要只盯 `ovf` 数字**:这两个计数是跨上下文自增、并发拒绝时可能少计一次,容差见 docs/子系统设计/故障录波设计说明.md §9);冻结窗口内 104 上送与保护判据不受影响(**这条是"丢录波样本不丢采集"的验收**) | 🟡+🟢+UI 道(菜单树与字库是整文件生成物,须单写者) | 上一张卡 |
| **现场单通道回放页**〔代码侧完成 / 板级待台架〕 | 新增「录波回放」叶子与内容页:单通道 2 周波 40 点、阶梯线、0 线与峰值标注、单位徽标、削顶标记、空态文案(`docs/子系统设计/故障录波设计说明.md` §8) | **代码侧判据已完成**:两叶绑页(`UI_PAGE_MAP_COUNT` = 30)、`ui-golden` 内容页黄金参考 60 → 66 张(录波 6 态:手动录波 3 态 + 录波回放 3 态),任务树重建模拟器后同一批 66 张连跑三次逐字节一致(页面池水位 5,448 B)、菜单侧 8 状态连跑三次一致(5,368 B),`generated-fresh` 退出码 0(菜单树与中文字库生成物与源一致),双端编译 0 错误 0 警告。**下列判据要板子与台架,一轮未跑**:真机上放一段真波(不是模拟器合成节拍)、远端看图能拍到此页(只作留证,不当波形通路)、**空态与 CRC 失败态绝不允许画成一条直线**要在真机上用坏段复现一次 | 🟢+🟡+UI 道(模拟器与黄金参考) | 上一张卡 |
| 二期(不在本波) | 4 kHz 全速与 80 点/周波、突变量启动、COMTRADE、104 文件传输、分段与参考机形态(录波 65 通道、多类型多段) | 不在本波验收面内;重开条件见 §4 | 🔴/独立立项 | — |
**落盘道的失败留痕名(单板上一律一行 `[WAVE] seg drop: <原因> (idx=… written=…)`,统一打印点 `App/task/default_task.c:816`)**:`crc selftest FAIL` / `mkdir /wave` / `opendir /wave` / `readdir /wave` / `seg_path` / `pack_start` / `f_open` / `pack_next` / `f_write short` / `pack stall` / `f_close` / `len mismatch` / **`ring abandoned`**。最后一条是 docs/子系统设计/故障录波设计说明.md §5.2 第四条陷阱的处置留痕(写完关档后复检环侧身份不过 → 判废本段、`err` 加一、段号不推进),**代码与主机单测面已有、板级未测**;另有一条非失败的慢段留痕 `[WAVE][WARN] seg held <毫秒> ms (idx=…)`(`App/task/default_task.c:831`)——搬得慢不是错,真失败才走 `seg drop`。
**为什么录波排在信号发生器动态验证之前**(用户裁定):动态验证真正缺的不是信号源,是**样本出口**——录波段文件一旦有了,动态验证就从「比对几个派生标量」升级成「PC 独立重算 vs 板上读数」的对表,同一套台架接线两次都用得上,不必再造一条串口通路。`docs/子系统设计/故障录波设计说明.md` §11 记了因此而变的三处口径。
---
## 3. 顺序与并行度
```mermaid
flowchart TD
DSG[设计定稿: 设计文档 + 本卡片表] --> RING[专用录波环与段格式编解码]
RING --> PC[PC 侧读段脚本与对表]
PC --> BENCH{bench 台架对表通过?}
BENCH -- 否: 回头改环或格式 --> RING
BENCH -- 是 --> TRIG[两路真实触发来路: 手动 + 保护启动]
TRIG --> COOL{冻结窗口内采集与上送无恙?}
COOL -- 否 --> TRIG
COOL -- 是 --> PAGE[单通道回放页与叶子上线]
PAGE --> DONE[录波本波收口: 台账回填 + 文档现状化]
PAGE -. 二期另立项 .-> NEXT[4 kHz 全速 / 突变量启动 / COMTRADE / 104 文件传输];
```
图内不写步骤号,卡名与 §2 卡片表逐字对应。并行度规则见 `docs/环境与部署/并行任务工作树方案.md` §7.3;**UI 道是单写者**——菜单树与中文字库都是整文件生成物,动叶子的那张卡不许与别的改 UI 的道并行。
---
## 4. 落地时的硬前置(每张卡收尾都要过)
| 前置 | 为什么 |
|---|---|
| 跑 `scripts/ram_report.py` 与 `scripts/stack_report.py` 前后各一次,回填 `scripts/ram_baseline.py --update` | 录波环与落盘缓冲约 5.9 KB 静态增量,**大于 4 KB 触发 R6 规则**(`docs/内存管理/内存内容分配策略.md` §6 台账与 R6);CCM 只剩七千余字节 → 落位必须进 SRAM1(`docs/子系统设计/故障录波设计说明.md` §7) |
| 新 .c 双端注册 | `new-source-file`:`MDK-ARM/STM32F407-Demo.uvprojx` 与 `simulator/CMakeLists.txt` 都是显式文件列表 |
| `@build` 0 错误 0 警告 | 任何代码改动后的固定动作 |
| 主机侧单测新增三套并挂总闸 | 环、段格式、触发状态机都是纯逻辑,能被 `test-coverage` 真跑;别把该测的部分留给台架 |
| 菜单与字库生成物重跑 | 新增叶子改叶数 → 同步 `docs/UI设计/页面补齐规划.md` 与 `docs/任务规划/UI补齐.md` 的口径闭合,重跑 `tools/menu_gen/gen_menu.py` 与中文字库链,过 `generated-fresh` 与 `font-charset` |
| 台账回填与文档现状化 | `docs/任务规划/README.md` 登记簿销项时同步清理引用;`docs/子系统设计/故障录波设计说明.md` §11 的三处口径要回写 `docs/任务规划/数据可信.md` |
**一期不做**(重开条件):4 kHz 全速要等采集节拍改造与算法层抽取结构一并评审(结构约束已写进`docs/子系统设计/故障录波设计说明.md` §2.1,二期只加不改);突变量启动跟 `docs/算法/继电保护功能复现规划.md` 的「故障启动(波形启动)」行;COMTRADE 与 104 文件传输等送检或第三方交接需求。
---
## 5. 与其它文档的关系
| 文档 | 关系 |
|---|---|
| `docs/子系统设计/故障录波设计说明.md` | **设计与口径属主**;本文只登记卡片与判据 |
| `docs/任务规划/数据可信.md` | 上游信度口径;动态波形验证卡因录波而改排在其后,读数出口升级见`docs/子系统设计/故障录波设计说明.md` §11 |
| `docs/任务规划/登记簿.md` | 原「故障录波与 104 文件传输」暂缓行已随本波立项销项(104 文件传输仍留二期) |
| `docs/任务规划/UI补齐.md`、`docs/UI设计/页面补齐规划.md` | 「手动录波」叶子旧状态是「不做(录波模块不存在)」,重开条件正是本波;上线后两处的叶数闭合要一起改 |
| `docs/问题记录/采集与数据处理短板评测.md` | 记录链缺口的登记处;本波落地后该行改指设计文档 |
| `docs/产品需求/产品需求设计文档.md` | 「录波采样率」行是本波偏离的对照基准;「立项未排」行与「文件传输(录波)」行按本波状态更新 |