Files
STM32F4-Base/docs/问题记录/采集与数据处理短板评测.md
T
wandering1 a275539c17 docs(全仓): 内容页黄金 47 → 53 的当前态同步——含钩子显示名,登记簿口径另笔
task-9 让内容页黄金从 47 涨到 53(通讯设置页六态),本笔只做**当前态陈述**的同步;真值全部本轮实测:
`simulator/tests/ref/*.bin` = **53**;`git diff 31ca4a1f..HEAD` 对该目录 = **
6 个新增、零修改** ⇒ 存量 47 张
逐字节未变(这条是关键:新增页不该让旧页重生成,否则回归基线就失去意义)。

**四类命中各走各路,这是本笔的全部难点**(分类比替换重要得多):
· 当前态 → 改,25 处页数,落在 16 只文件(AGENTS、钩子显示名、导航器 docstring、`lvgl-simulator` s
kill、
  门禁索引与 `ui-golden` 详解、UI 自动化流程、内容页架构、页面补齐规划与扩充方案、数据供给、自动化测
  试流程、覆盖率口径、测试开发标准流程、模拟器两份 README);
· 变更记录历史行 → **一条不动**,另在其下一行插入当日「47 → 53」新行 6 条(含判据与零漂移证据);
· **同数不同义 → 不动**:覆盖率口径里的「47 个 .c」「47 = 13+5+29」、ram_report 的表行号 47、`#47-D`
  诊断号、LSI 47kHz、47,360 栈字数、像素哈希 3476/3474 —— 一并替换就会毁掉六个不相干的事实;
· 带日期戳 / 自declare 冻结的快照 → 不臆改(数据供给篇那句上一笔已加「当时」,页面补齐规划里那张
  「2026-10-25 复核…剩 21 叶」的表自带「完成即冻结不回改」声明)。

复扫残留当前态 47 = **0**。⚠ 顺手纠一条**会教错方法**的陈旧:naive 计数 `grep -c '#page='` 上一笔写的是
22,现在真值是 **23**(文件头示例行也算一次)——旧文档里那个 22 **恰好等于新的正确 bound 数**,不改的话,
下一个人用错算法还能碰巧对上,比错更糟。

⚠ `AGENTS.md` 里本次有两件事同行相邻(本笔的内容页 53 页 + 批次三那句 `TC-*` 停发),**分两句说明**:
前者是计数同步,后者是昨天那条「批次三不坐」裁定的入口文案,二者不是同一件事。

钩子显示名改在 `.pre-commit-config.yaml`(47 → 53)。**这条必须与代码同批入库**:配置脏而未 stage 时
pre-commit 会直接报错挡住全仓任何提交(今天已实测两次),所以本笔先落它,把后面几笔的路清开。

自查:`check_doc_links --all` rc=0(203 篇)、`check_ids --strict` rc=0 且不可判定绝对
数 **979 未变**(新增
文本里的提交号与 `#page=comm` 没推高它)、`gen_task_table --check` 0、`check_bom_drift`
 0、18 只文件 noBOM /
LF / U+FFFD=0;行数变动 +49/−47 全部可归属(插 6、删 2、并 1),其余为 1:1 等行替换。登记簿销项与叶数
(`UI补齐.md` + `docs/任务规划/README.md`)**不在本笔** —— 那是口径变更不是计数同步。
2026-10-27 13:54:05 +08:00

360 lines
26 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.
# 采集与数据处理短板评测(2026-10-23)
> **定位**:以参考项目 CLS100(`Scatter_P_HV03.01_SV01.01`)的"采样 → 预处理 → 相量 → 遥测 → 录波 → 上送"全链路为对照,评测本项目在**电力采集与数据处理**上的完成度,指出下一步该补的短板与顺序。
> **不是待办登记簿**:排序权威仍是 `docs/任务规划/README.md` §2;本文只出评测结论与建议,条目落地时按语义标识登记进 `docs/任务规划/登记簿.md`。
> **对照口径**:项目内以 `docs/算法/继电保护功能复现规划.md` §3 的 L1~L5 清单为准;参考侧以参考项目 `项目分析文档/04-算法与采样专题/` 三篇(《ADC采集至数据使用全流程详解》《项目详细分析-交流采样与有效值计算》《傅氏算法详解》)与源码为准。
> **硬件前提**:结论只针对 **V0.1 现板**;受「双转换器无共同采样触发」(8 路电气量分属两片转换器)制约的项单独标注,V0.2 改版后解禁。
---
## 1. 一页结论
**已建成的是一条"保护链",还不是一台"能上送的测控装置"。**
采集侧从 TIM3 1 kHz 节拍到全周傅氏、保护元件、SOE、104 上送,纵向打通并台架闭环;但横向的三条链**没有一条完整**:
| 链 | 现状 | 缺什么 |
|---|---|---|
| **测量链(遥测)** | 104 每 100 ms 直接读相量瞬时值 | 工程量折算、谐波方和根、平均/死区/零漂、品质位 |
| **记录链(录波)** | 只有 64 B 定长 SOE 文本记录 | 波形数据面(4 kHz 过采样)、COMTRADE 文件、104 文件服务 |
| **就地闭环(开入开出)** | 固件完全没有 | 开入量采集与防抖、遥信变位、遥控出口、跳闸出口 |
**四个阻断级短板**(不补则送检必挂):
1. **工程量折算缺失**——遥测上送的是 ADC 原始码值(数千~数万),点表要求"短浮点、系数 = 1"的工程量;保护定值(A/V)也在跟码值比较,量纲不成立。
2. **遥测链缺失**——没有 200 ms 测量轨:无谐波方和根、无 4 点平均、无死区确认、无零漂、无畸变率;死区做在 104 层(架构错位)。
3. **运行参数段 0x8020~0x8058 缺失**——死区、变比、零漂门槛、三级负荷报警、录波投退与定值,主站读写全部回"未知地址"。
4. **录波与 104 文件传输缺失**——点表明确要求"录波文件存储 ≤ 15 s""104 读文件目录/文件 ≤ 30 s"。
**建议顺序**:先做"数据可信"(1 + 2 + 3 + 频率点,纯软件、可主机单测),再做"精度与安全网"(等周波 + 削顶检测 + 派生量),最后单独立项"录波与文件"(最大单块)。开入开出与功率/电度需硬件与产品先拍板,软件先建接口不使能。
---
## 2. 对照基准:参考系统在采集与数据处理上有什么
按数据流动的七个环节对照,只列与本项目有差距的维度:
| 环节 | 参考实现 | 本项目 | 差距 |
|---|---|---|---|
| **采样节拍** | 内总线 4 kHz(80 点/周波),保护取 1/4 → 1 kHz;交流板本地插值对齐 | TIM3 1 kHz 单节拍,无过采样通路 | 录波无数据源;等周波未闭环 |
| **预处理** | 码值 × 每通道系数(定点 2^10)→ 浮点工程量;自产零序 `3I0=Ia+Ib+Ic`;插值异常闭锁 | 码值直通(系数 = 1),无标定、无自产零序 | **量纲缺失**;零序只能靠外部通道 |
| **保护相量** | 全周傅氏 15 基波 + 3 二次 + 1 五次,每 1 ms 重算 | 5 实例(IA/UA/UN 基波 + IA 二/五次),每 1 ms 重算 | 实例数按 V0.1 有效通道裁剪(合理),但**无派生量层** |
| **测量遥测** | 15 通道 × k=1~9 DFT → 方和根 → 4 点平均 → 死区 2 点确认 → 零漂置零 → 微调 TLV10 → 变比;22 交流 + 2 直流 + 7 功率 | 无遥测链;104 直读相量瞬时值 | **整链缺失** |
| **派生量** | 线电压 / 负序 / 正序 / 零序 / 差分 / 直流 / 同期量(`Calf*Vec` 系列 + `CalfAnaDC/Dif`) | 无 | 整层缺失 |
| **录波** | 80 点/周波 × 8 周波,突变量启动,COMTRADE 输出(`Wave.c` + `WaveComtrade.c` 共 7 582 行) | 无 | **整链缺失** |
| **记录** | SOE / COS / 跳闸 / 遥测 / 冻结 / 异常(`RecUnit` + `HistoryFile`) | SOE + 动作记录(B9) | 缺 COS/遥测/冻结/异常 |
| **上送** | 101/103/104/61850/ModBus,含文件服务与电度 | 104 子集:M_SP/M_DP/M_SP_TB/M_ME_NC/C_SE/C_RD/C_IC/C_CS | 无文件服务、无电度、无定值区 |
**规模感**:参考 `RelayUnit/` 有 45 个 `PRS_*.c`(分析文档口径 89 个模块),本项目 9 个元件实例。这个差距**不是**本项目的问题——V0.1 只有三路测量有效,硬凑元件数没有意义。真正该对标的不是"元件数量",而是**支撑元件的数据层厚度**:遥测链、派生量、录波、标定,这四层参考侧都是几千行量级,本项目基本为零。
---
## 3. 现状盘点
### 3.1 已闭环(有台架或单测证据)
> 表内「复现规划 §N.M」= `docs/算法/继电保护功能复现规划.md` 的对应小节。
| 层 | 项 | 证据 |
|---|---|---|
| L1 | 1 kHz 硬件节拍、TPAFE 快照、ADC1 DMA 乒乓、语义映射 | `docs/算法/继电保护功能复现规划.md` §3.1 的「周期 CONVST 重触发」~「通道语义映射」 |
| L1 | 采样有效性(静默/丢帧/倒退/错误增量) | 复现规划 §3.1(「采样有效性校验」);`docs/算法/采样有效性校验设计说明.md` |
| L1 | 谐波相量入口(IA 的 2/5 次) | 复现规划 §3.1(「二次谐波/五次谐波提取入口」) |
| L2 | 全周傅氏 5 实例、双区原子切换、每拍重算 | 复现规划 §3.2(「全周傅氏系数表」~「相位输出」) |
| L2.5 | 测频(自适应窗,45~55 Hz 最坏 0.0101 Hz) | 复现规划 §3.3(「过频 / 低频」) |
| L3 | 9 元件(三段过流/过负荷/过压/欠压/零序过压/过频/低频) | 复现规划 §3.3(「三段式相间过流」~「零序过压」) |
| L4 | SOE + 动作记录(64 B 定长、CP56 时标、SPSC 环异步落盘) | 复现规划 §3.4(「SOE 记录」) |
| L5 | 定值校验和 + 持久化 + 全局软压板 + 采样故障闭锁 | 复现规划 §3.5(「定值校验和」) |
| 上行 | 104 总召/变位/遥控/定值读写/时钟同步 | `docs/子系统设计/IEC104上行设计说明.md` |
### 3.2 部分闭环
| 项 | 到什么程度 | 差什么 |
|---|---|---|
| 定值模型 | 40 项保护定值 + 4 项 PT/CT 额定 | PT/CT 额定**零消费点**;运行参数段整段未实现 |
| 频率 | 算法层 0.01 Hz 可用 | 未闭环调采样率;104 的 `0x401D` 仍硬编码为无效 |
| 遥测 | 9 个点号在册,4 个有效 | 值是原始码值;无平均/死区/品质细分 |
| 自检 | 定值 + 采样有效性 | 无 Flash CRC、无 RAM 扫描、无出口回路自检 |
| 就地显示 | 页面在册 | `ui_page_ac.c` 是硬编码占位数据("1.03" 等),不接相量 |
### 3.3 完全空白
遥测链 · 派生量(线/序/差分/直流) · 录波与 COMTRADE · 104 文件服务 · 开入量采集 · 遥控出口 · 跳闸出口 · 功率与电度 · 同期 · 小电流选线 · 运行参数段 · 标定 · 等周波 · 削顶检测。
---
## 4. 阻断级短板
> 判据:**不补这一项,送检或现场投运必挂**。四项都是纯软件或纯软件为主,不依赖 V0.2 硬件。
### 4.1 工程量折算缺失(标定)
**现状与证据**
- `App/algo/adc_input.c` 的 `adc_input_raw()` 明确只搬原始码值、不做标定(见其头文件注释)。
- `App/algo/phasor.c` 的系数表只含 √2/N 折算,**不含通道增益**——`fAmSQ` 的数值量纲是"码值",不是 V/A。
- `App/algo/prot_elm.h` 与 `App/algo/freq.h` 均注明"工程量↔码值换算系数 = 1(「通道标定(一次系数 + 零漂)」标定未实现)"。
- `App/protocol/iec104/iec104_pts.c` 的遥测源直接返回 `p.fAmSQ`;死区 10.0 也是码值口径。
**参考做法**:`DataPre.c` 每拍做 `fValue = iVal * pfSamCoe[dwPinNo]`,每通道一个定点(2^10)系数,把码值换成二次侧工程量;再由 PT/CT 变比换一次值。
**不补的后果**(三条,逐条都足以挂验收)
1. 主站收到的"1Ua"是 11 000 左右的整数——不是伏特。点表要求短浮点、**采集上传系数 = 1**,即设备必须自己送工程量。
2. 保护定值(10.0 A / 120.0 V)在跟码值比较 → 实际动作门槛由前端增益和分压比偶然决定,**无法整定**,也无法解释。
3. 精度指标(幅值误差 ≤ 1%)无从谈起,标准源注入验收必然不过。
**建议动作**
- 新增 L1 后置标定层(建议 `App/algo/adc_cal.c/h`,零平台依赖便于主机单测):每通道 `k`/`b`(Q10 定点),对外只暴露"语义通道 → 工程量"。
- 落点放在 `adc_input_raw()` 与 `sample_ring_push_frame()` 之间,**上层一行不改**——相量、元件、遥测、UI 自动拿到工程量。
- 系数载体沿用 `prot_set_store` 的 blob 范式(magic + 版本 + 校验和 + 原子写),文件独立于定值档,避免标定与定值互相干扰。
- PT/CT 变比(`PS_PT_PRI`/`PS_CT_PRI` 等 4 项已在册但零消费)在此层接上,输出"二次值"与"一次值"两套口径。
- 规模:**M**(新模块 + 单测 + 标定流程文档 + 台架标准源注入)。
> ⚠ 顺序不可颠倒:**标定必须早于遥测链**。否则遥测链的平均/死区/零漂参数全部要按码值调一遍,标定落地后再按工程量调一遍。
### 4.2 遥测链(测量轨)缺失
**现状与证据**
- 全库无 200 ms 测量任务,无谐波方和根、无 4 点平均、无死区确认、无零漂、无畸变率(按关键词扫描 `App/` 与 `Drivers/BSP/` 均无命中)。
- `App/protocol/iec104/iec104_pts.c` 的 COV 比对在**协议层**做死区判定——遥测层不存在。
- 遥测值 = 相量瞬时值,每 1 ms 变化一次。
**参考做法**:`CalfYcMea.c`(2 453 行)——中断内回溯一周波 20 点入私有缓冲,主循环每 200 ms:`YcJLFilter` 对 k=1~9 逐次 DFT → 方和根 `√(ΣHk²)` → 4 点平均 → 死区连续 2 点确认 → 零漂门槛置零 → 微调系数 → 变比。
**不补的后果**
1. **有效值口径错**:保护要"基波有效值"(抗谐波误动),计量/遥测要"真有效值"(含 2~9 次谐波)。现在只有前者,且直接拿去上送。
2. **数值抖动**:每 1 ms 变化的瞬时值直接进 COV,主站看到的是一条抖动的曲线,不是稳定读数。
3. **死区语义错位**:死区做在 104 层,换协议(101/61850)就要重做一遍;它本质是测量层的属性。
4. 畸变率、谐波监视、电度、越限报警全部依赖这条链,没有它这些功能都没有落脚点。
**建议动作**
- 新增测量轨(建议 `App/algo/meas.c/h`):吃 `sample_ring` 的一周波窗,出"总有效值 + 各次谐波 + 畸变率 + 平均后工程值"。
- 新增 200 ms 节拍消费者(`App/task/meas_task.c` 或并入 `protectTask` 的低优先级分支——**不建议**并入,测量链会拖长保护任务的最坏链)。
- 把 104 的死区判定**上移**到测量层,104 只做"取值 + 打包"。这一步同时解决"换协议要重做"的问题。
- 品质位同步细分:`IV`(无效)/`NT`(未就绪)/`OV`(越限)/`BL`(闭锁),当前只有前两个。
- 规模:**L**(新模块 + 新任务 + 栈预算 + 运行参数接线 + 单测)。
### 4.3 运行参数段 0x8020~0x8058 缺失
**现状与证据**
- `App/algo/prot_set.c` 的元数据表 40 项集中在 `0x8820` 定值段;运行参数段只"借用"了 `0x8027~0x802A` 四个地址做欠压/过压保护定值(与参考一致,不算错)。
- 其余 `0x8020~0x8023`(死区)、`0x8026/0x8042/0x8045`(变比)、`0x8030~0x8032`(开入防抖、分合闸脉冲)、`0x8035~0x8038`(零漂门槛)、`0x8046~0x804B`(负荷越限/重载/过载三级)、`0x804C~0x8053`(录波投退与定值)、`0x8054~0x8056`(功率/电量变比、功率置负)**全部未实现**。
**参考做法**:`Const_CommPara.c` 的 `CommPara_ConfigTable` 是完整表(约 40 项),每项带名称、类型、长度、默认值。
**不补的后果**
1. 主站按点表读写这些地址,一律回"未知 IOA"——送检会逐项对表。
2. 死区、零漂、变比无法整定 → 4.1/4.2 的参数只能写死在代码里。
3. 负荷三级报警(点表 `YX22` 重载 / `YX23` 过载)没有定值来源,`YX22` 至今无效。
4. 录波投退与启动定值无处安放 → 4.4 的录波无法整定。
**建议动作**
- 把现有 `prot_set` 扩成"参数模型"(定值段 + 运行参数段),或新增并列的 `run_par.c/h`——**推荐后者**:定值段有 sum32 封存/闭锁语义,运行参数是"可随时改的运行旋钮",混在一起会把闭锁语义搅乱。
- 地址、类型、默认值以参考表为准逐项对照,**不要凭想象填**。
- 规模:**M**(表驱动,机械但量大;104 侧 `set_read/set_write` 已是通用接口,不用改协议)。
### 4.4 录波与 104 文件传输缺失
**现状与证据**
- 全库无录波、无 COMTRADE(关键词扫描零命中)。
- 104 只实现 8 种 ASDU,**无文件传输类型**(120~122 及读文件目录扩展),无定值区类型。
- 采样通路只有 1 kHz 一条,没有 4 倍过采样。
**参考做法**:`Wave.c`(2 061 行)+ `WaveComtrade.c`(5 521 行)——80 点/周波过采样区、突变量/开关变位/零序突变启动、8 周波 RAM 缓存、COMTRADE 文件生成与上传。
**不补的后果**
1. 点表两条硬指标直接落空:录波文件存储 ≤ 15 s、104 读文件目录/文件 ≤ 30 s。
2. 现场故障无波形可分析——保护动作了也说不清为什么动。
3. 涌流制动、故障启动、小电流选线等后续功能全部依赖波形数据。
**建议动作**(分两步,可分期交付)
- **数据面**:先做 1 kHz 录波(复用现有节拍,8 周波 RAM 环 + 突变量启动),跑通"触发 → 缓存 → 落盘"。这一版能满足"有波形",但谐波/暂态分析能力弱。
- **采样率升级**:若要 80 点/周波,需把 TIM3 提到 4 kHz、保护环按 1/4 抽取、录波环全速。器件不是瓶颈(TPAFE 无过采样时 350 kSPS),瓶颈是 `adcTask` 的 CPU 与 4 倍 RAM——**先实测再定**,不要先改节拍。
- **文件面**:COMTRADE 1999 生成 + 104 文件服务(读目录/读文件/召唤)。
- 规模:**L**(数据面 M,文件面 M,采样率升级另算)。
---
## 5. 功能级短板
> 判据:不影响"数据可信",但产品面不完整,送检会作为功能项抽查。
### 5.1 开入量采集与遥信(33 点只实现 6 点)
- **现状**:固件**完全没有开入/开出代码**(关键词扫描 `App/`、`Drivers/BSP/` 零命中)。硬件上子板桥 U18 有 `EXTKI×3`(PE2/PE3/PE4)与 `EXTKO1/2/3`、`RELAY_STO`,但未配置、未读取。
- **缺口**:点表 33 点遥信中,`YX24~30` 外部遥信无来源,`YX1~4` 开关位置双点恒无效;开入防抖定值 `0x8030` 无处落地。
- **建议**:先确认子板开入路数(3 路 `EXTKI` 远少于点表 7 路外部遥信,**这是硬件问题不是软件问题**);软件侧做 `ki.c`(防抖 + 变位检测),变位复用已有 SOE 框架(加一个记录类型即可)。
- **规模**:S(软件)/ 依赖硬件确认。
### 5.2 遥控与出口(8 点遥控只 2 点转真)
- **现状**:`YK11`(信号复归)、`YK12`(软压板)已转真;`YK1~4`、`YK13/14` 一律否定确认,因 V0.1 无出口硬件(复现规划 §9 的 R7 否定确认口径)。保护动作只出遥信 + 日志,无电气出口。
- **建议**:硬件确认出口回路后,做 `ko.c` 抽象(脉冲宽度用 `0x8031/0x8032`)+ 出口自检。软件侧可先建接口不使能。
- **规模**:M / 依赖硬件。
### 5.3 派生量(「线/负序/零序合成」)
- **现状**:只有 3 个基波实例 + 2 个谐波实例,无线电压、无负序/正序/零序合成、无差分、无直流分量。
- **为什么现在做**:V0.1 受双转换器无共同采样触发限制,跨转换器合成**不成立**(`UA` 与 `UB` 无同一时刻性);但**代码与单测可以先就绪**,V0.2 只改映射表就能使能。参考侧 `CalfLineVec`/`CalfNegVec`/`CalfPosVec`/`CalfSeqVec`/`CalfZeroVec`/`CalfAnaDC`/`CalfAnaDif` 是七个小模块,逻辑清晰、天然可主机单测。
- **建议**:按"吃实例下标、出合成相量"的接口建 `derived.c/h`,V0.1 标注"不使能",单测用合成正弦验证相位关系。
- **规模**:M。
### 5.4 保护元件扩展
- **现状**:9 个元件。缺 PT 断线、CT 断线、涌流制动、母线接地、故障启动、无压/无流闭锁、零序过流(V0.2)、重合闸、后加速。
- **优先做哪一个**:**PT 断线**。它不是"多一个元件",而是电压类保护的**安全前置**——PT 断线时 `UA` 跌落会直接触发欠压动作,这是现场最典型的误动来源。涌流制动要等三相(V0.2),其余随产品定义。
- **建议**:PT 断线用"电压突变 + 负序/零序"判据(需派生量层,见 5.3);故障启动与录波启动共用一套突变量判据(见 4.4)。
- **规模**:M(PT 断线)/ 其余随 V0.2。
### 5.5 功率与电度
- **现状**:零。点表 `4019~401c`(P/Q/S/PF)与电度上送缺失。
- **关键判断**:V0.1 上**算不出来**(双转换器无共同采样触发 → 禁止跨转换器功率运算),产品口径是"取子板计量模块结果"(见 `docs/硬件平台/ADC通道映射说明.md` §1)。所以这不是"补算法",而是**先定数据来源**:
- 若子板计量有数字接口(RS-485/SPI)→ 这是 B2(RS-485 采集,已暂缓)的一部分;
- 若没有 → 等 V0.2 三相全上 TPAFE 后自算。
- **建议**:**先拍板来源,再写代码**。现在写功率算法在 V0.1 上无法验证,属于无效工作。
- **规模**:取决于来源。
---
## 6. 精度与数据质量
### 6.1 等周波采样未闭环(「等周波采样(软件测频 + 调频闭环)」)
- **现状**:TIM3 固定 1 kHz。`freq.c` 已能出 0.0101 Hz 的测频结果,但**没人用它调采样率**。
- **后果**:频偏 ±2 Hz 时窗长偏离整周波,基波幅值误差 1~2%,相位误差更大;2 次/5 次谐波相量(涌流、选线)误差被放大。参考侧靠"测频 → 调 EHRPWM 周期"把窗长锁死在 20 点/周波。
- **建议**:闭环 = `freq_get()` → 查表/PI → TIM3 ARR 微调(1 kHz ±2%)。注意三点:① 调 ARR 会同时改变 ADC1 触发与 TPAFE CONVST 节拍,要核算 ADC1 9 通道扫描(≈67 µs)与 TPAFE 转换时间在最短周期内仍有余量;② 先开环验证固定 50 Hz 精度,再上闭环;③ 调频期间相量窗会短暂不整周波,保护侧要有过渡处理(或仅在频率稳定时调)。
- **规模**:M。
### 6.2 削顶/越界检测缺失(「采样通道自检」残余)
- **现状**:`adc_health` 只判"前进量"(静默/丢帧/倒退/错误增量),**不判数据合理性**。STM32 侧交流量负半周削顶(R5)在代码里无法被检出。
- **后果**:V0.1 的 `UB/UC/IB/IC/IN` 读数"看起来有值",实际是削顶后的假值。现在靠"在点表里标 IV"规避——那是**配置**,不是**检测**。一旦有人把点表改回有效,或者 V0.2 上线后某一路前端失效,系统不会告警。
- **建议**:加两条判据进 `adc_health`:① 码值触顶/触底比例(连续 N 点贴满量程 → 削顶位);② 直流偏置超限(一周波均值偏离中点)。两条都是纯算术,天然可单测。
- **规模**:S。
### 6.3 就地显示实时值
- **现状**:`Drivers/BSP/UI/ui_page_ac.c` 是硬编码占位数据(`"1.03"` 等),不接相量/频率。
- **后果**:现场无法就地读数,只能靠主站;产品需求的内容页要求显示实时值。
- **建议**:走 UI 数据快照层(App 侧 `ui_data_feed` 推、BSP 侧 `ui_data` 存、页面只读),**不能**让页面直接 include `phasor.h` / `freq.h`——分层门禁禁止。方案见 `docs/UI设计/UI_数据供给设计说明.md`。**放在标定(§4.1)之后做**——没有工程量,显示出来也是码值。
- **规模**:S。
---
## 7. 自检覆盖
| 项 | 参考 | 本项目 |
|---|---|---|
| 定值校验和 | ✅ | ✅ |
| 采样有效性 | ✅(插值异常、AD 自检) | ✅(部分,见 6.2) |
| Flash CRC | ✅ | ❌ |
| RAM 扫描 | ✅(`RamScan.c`) | ❌ |
| 出口回路自检 | ✅ | ❌(无出口硬件) |
| 电源/时钟监测 | ✅ | ❌(RTC 有诊断) |
**建议**:Flash CRC(启动 + 周期)与 RAM 扫描成本低、价值高,且不依赖硬件,可与 4.x 并行做;出口自检随 5.2。
---
## 8. 建议的下一步
### 阶段一:数据可信(代码以纯软件为主,可主机单测)
> 目标:**主站读到的每一个数都是工程量、稳定、可整定。**
> 除标定系数的**实际整定**需要标准源外,其余四项的代码与单测都不占台架。
1. **工程量折算**(4.1)——一切精度的前提。
2. **遥测链**(4.2)——谐波方和根 + 平均 + 死区 + 零漂,死区从 104 层上移。
3. **运行参数段**(4.3)——死区/变比/零漂/负荷报警/录波投退的落点。
4. **顺手项**:`0x401D` 频率点绑定 `freq_get()`(现在是一行 `-1` 硬编码,`freq.c` 早就能出数);`YX22/YX23` 三级负荷报警接运行参数。
这四项合起来是**一次完整的"测量子系统"立项**,建议按一个波次做,因为它们共享同一批参数与同一条数据通路;拆开做会互相返工。
> **已立项(2026-10-23)**:本阶段 = **「数据可信」**,任务卡、事实基线与验收判据见
> `docs/任务规划/数据可信.md`。排序已由 `docs/任务规划/README.md` §2 接管,本文只保留成因分析。
### 阶段二:精度与安全网
5. **削顶/越界检测**(6.2)——小改动,先把安全网补上。
6. **等周波闭环**(6.1)——需要台架与频率源,排在纯软件项之后。
7. **派生量层**(5.3)——为 V0.2 与 PT 断线铺路。
8. **PT 断线**(5.4)——依赖派生量。
### 阶段三:记录与文件(建议单独立项)
9. **录波数据面**(4.4 前半)——1 kHz 起步,跑通触发与落盘。
10. **COMTRADE + 104 文件服务**(4.4 后半)——送检硬指标。
### 并行:硬件与产品确认(不确认就无法开工)
| # | 待确认 | 卡住什么 |
|---|---|---|
| 1 | 子板开入实际路数与电平(`EXTKI` 只有 3 路,点表要 7 路外部遥信) | 5.1 |
| 2 | 出口回路形态(`RELAY_STO`/`EXTKO`,有无回读) | 5.2、出口自检 |
| 3 | 功率/电度数据来源(子板计量有无数字接口) | 5.5 |
| 4 | 录波采样率要求(20 点/周波够不够,还是必须 80 点) | 4.4 的采样率升级决策 |
| 5 | 送检是否逐项核对 33 遥信 / 8 遥控 | 5.1/5.2 的优先级 |
| 6 | V0.2 硬件时间表 | 5.3/5.4/零序过流/三相过流的排期 |
---
## 9. 不建议现在做
| 项 | 为什么不做 |
|---|---|
| 45 个保护元件全量移植 | V0.1 只有三路测量有效,多数元件无输入可验;移植了也只能"建接口不使能",价值低于补数据层 |
| 同期合闸、小电流接地选线 | 依赖三相/零序电流与出口,V0.1 均不具备;参考侧同期组件本身也被注释未启用 |
| IEC 61850 / GOOSE | 与单核 FreeRTOS 平台、当前产品定义都不匹配 |
| 双核拆分 / DSP 移植 | 平台不匹配;单核 168 MHz + FPU 目前余量够 |
| 在 V0.1 上写功率算法 | 双转换器无共同采样触发使相位关系不成立,写出来无法验证(见 5.5) |
| 先改 4 kHz 节拍再想录波 | 节拍一改,保护窗、CPU、RAM 全变;应先定"录波要不要 80 点"再动 |
---
## 10. 本报告与既有登记的关系
本报告**不新增编号**,避免与既有登记重复。各短板的落点:
| 短板 | 既有登记位置 | 本报告补充了什么 |
|---|---|---|
| 标定 | `docs/算法/继电保护功能复现规划.md` §3.1 的「通道标定(一次系数 + 零漂)」(⬜) | 明确它是**遥测链的前置**,且给出落点(`adc_input_raw()` 与采样环之间) |
| 等周波 | 同 §3.1 的「等周波采样(软件测频 + 调频闭环)」(⬜) | 补三条实施约束(ARR 联动、开环先行、过渡处理) |
| 遥测链 | 复现规划 §3.2(「遥测谐波轨(可选)」,标"可选") | **建议从"可选"升为"必做"**——它是遥测、电度、越限、畸变率的共同底座 |
| 派生量 | 复现规划 §3.2(「线/负序/零序合成」,V0.1 不适用) | 建议代码与单测先就绪,V0.2 只改映射 |
| 录波 | 复现规划 §3.4(「故障录波(可选)」,⬜) | 补"104 文件服务"这一半(原登记只写录波) |
| 运行参数段 | 未登记 | **新发现**,建议按语义标识登记("运行参数段 0x8020~0x8058") |
| 开入开出 | 未登记 | **新发现**,建议登记("开入量采集与遥信"、"遥控与出口") |
| 削顶检测 | 复现规划 §3.5(「采样通道自检」残余,"码值越界待做") | 给出两条具体判据 |
| 频率点 | `docs/子系统设计/IEC104上行设计说明.md` §8 第 4 条 | 明确它现在就能做(算法已就绪,只差绑定) |
---
## 附:参考侧能力清单(对照用)
| 模块 | 行数 | 能力 | 本项目 |
|---|---|---|---|
| `DataPre.c` | 2 512 | 码值→工程量、自产零序、录波拷贝、插值异常闭锁 | 无(仅语义映射) |
| `CalFFTVecFull.c` | 418 | 全周傅氏 | ✅ 有(`phasor.c`) |
| `CalfYcMea.c` | 2 453 | 遥测全链(k=1~9 方和根/平均/死区/零漂/微调/变比/功率) | ❌ |
| `CalSoftFr.c` | 398 | 过零测频 + 调频闭环 | 🔶 测频有,闭环无 |
| `Wave.c` + `WaveComtrade.c` | 7 582 | 录波 + COMTRADE | ❌ |
| `GetZoreSamData.c` | 232 | 零序采样缓存(选线) | ❌ |
| `CalSynClose.c` | 1 114 | 同期合闸 | ❌(参考侧亦未启用) |
| `Calf*Vec` 系列 | ≈ 1 000 | 线/正/负/零序/差分/直流 | ❌ |
| `RamScan.c` / `SelfChk.c` | — | RAM 扫描 / 自检 | ❌ |
| `RelayUnit/PRS_*.c` | 45 个文件 | 45 类保护元件 | 9 个实例 |
> 行数为源码实际统计(`wc -l`),供规模感参考,不代表移植工作量。