From 8c28f3bfdd955346250aff25a632738a61a19f1c Mon Sep 17 00:00:00 2001 From: Wanderingss <1624155937@qq.com> Date: Sun, 25 Oct 2026 05:55:00 +0800 Subject: [PATCH] =?UTF-8?q?docs(=E6=94=B6=E5=8F=A3=E5=90=8C=E6=AD=A5):=20?= =?UTF-8?q?=E6=89=B9=201=20=E8=90=BD=E5=9C=B0=E5=90=8E=20AGENTS/104/?= =?UTF-8?q?=E7=AE=97=E6=B3=95=E5=B1=82=E5=8F=A3=E5=BE=84=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=20+=20SOE=207/8=20=E6=B6=88=E8=B4=B9=E9=9D=A2=E8=A1=A5?= =?UTF-8?q?=E9=BD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AGENTS.md:钩子 40→42、主机单测钩子 16→18(adc-cal/prot-dim)、 覆盖率总闸 28→35 套、layer-deps 基线 6→3(记录 reader 注入兑现) - IEC104上行设计说明.md:遥测读数改工程量口径 + 死区额定 0.5% 重定 已落地(卡 6);§8 第 4 条改写、变更记录追加行 - 采集与算法层设计说明.md:状态行/红线③/幅值门三处由「标定未实现」 更新为「折算已落地、精度复核待卡 12 注入」 - App/log/soe_rec.h 类型注释表补 7/8 两行(lane-a 口误 6/7 已勘误, 真值按枚举链 SAMPLE_RESUME=6 连续计数) - test/host/soe/decode_soe.py:TYPE_NAMES + docstring 补 7/8—— 否则台架 FTP 下载校验会把标定闭锁记录判 bad type 误红(隐藏消费边); soe 套件 32/32 复跑绿 --- AGENTS.md | 4 ++-- App/log/soe_rec.h | 2 ++ docs/子系统设计/IEC104上行设计说明.md | 9 ++++++--- docs/算法/采集与算法层设计说明.md | 11 +++++++---- test/host/soe/decode_soe.py | 3 ++- 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index f467645e..07eecddb 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -90,7 +90,7 @@ ## 提交门禁(pre-commit) -- 任一失败即拦截,共 **40 个钩子**(**每种门禁一篇详解(查什么 / 拦下过什么真事 / 限制与盲区 / 基线口径)→ `docs/门禁说明/README.md` 索引**;通用机制与整体口径 → `docs/代码规范/pre-commit使用说明.md`):通用 5 + `gitlint` + `cppcheck` / `test-cppcheck` + `no-mojibake` + `coding-standard` + 文档三件套 `doc-links` / `task-table` / `mem-numbers` + `id-check`(**编号门禁**,`docs/编号规范.md` §8 八项校验;**已关闸为【增量拦截】**:只拦 `scripts/id_known_backlog.json` 台账之外的新错误级问题,存量按指纹豁免、台账只减不增;另有一根恒生效的线——可判定比例跌破 `id_registry.json` 基线即失败)+ `lv-conf-sync`(两份 `lv_conf.h` 特性子集一致)+ `cubemx-survival` + 主机侧单测 16 个(`-unit-test` 后缀)+ `test-coverage`(**覆盖率总闸**:跑全部 28 套并守基线回退;缺 mscoverage 组件时按用户裁定 **FAIL**、不 skip,2026-10-24)+ `test-suite-switch` + `registration-check`(双端注册反向校验 + UI 页面描述符表接线,N-23/U4)+ `mem-budget`(RAM 92% 预算门禁,N-27)+ `font-charset`(UI 字符集差集检查,防缺字白框,U4)+ `ui-golden`(UI 像素回归,菜单 8 状态 + 内容页 11 页黄金参考,U4)+ `layer-deps`(**分层方向**:`Drivers/BSP/**` 不得 include `App/**` 的头;存量 6 条基线只减不增,报告 S-1)+ `bsp-err`(**BSP 错误码与超时命名约定**:公开 API 不得拿 `HAL_StatusTypeDef`/`bool` 当错误通道、`*_TIMEOUT` 宏不得取负值、非 void 须写「返回值:」、**返回错误码的函数不得裸丢弃返回值**(须接住或显式 `(void)`;实测编译器与 cppcheck 都不报这类,只有这条会响);约定正文 `Drivers/BSP/bsp_err.h`,存量基线只减不增(2026-10-23 首清点 19 条 → 已还 18;`consume-result` 上线又暴露 37 条存量丢弃 → **现 38 条**),报告 S-5) +- 任一失败即拦截,共 **42 个钩子**(**每种门禁一篇详解(查什么 / 拦下过什么真事 / 限制与盲区 / 基线口径)→ `docs/门禁说明/README.md` 索引**;通用机制与整体口径 → `docs/代码规范/pre-commit使用说明.md`):通用 5 + `gitlint` + `cppcheck` / `test-cppcheck` + `no-mojibake` + `coding-standard` + 文档三件套 `doc-links` / `task-table` / `mem-numbers` + `id-check`(**编号门禁**,`docs/编号规范.md` §8 八项校验;**已关闸为【增量拦截】**:只拦 `scripts/id_known_backlog.json` 台账之外的新错误级问题,存量按指纹豁免、台账只减不增;另有一根恒生效的线——可判定比例跌破 `id_registry.json` 基线即失败)+ `lv-conf-sync`(两份 `lv_conf.h` 特性子集一致)+ `cubemx-survival` + 主机侧单测 18 个(`-unit-test` 后缀,2026-10-25 增补 adc-cal / prot-dim 两个)+ `test-coverage`(**覆盖率总闸**:跑全部 35 套并守基线回退;缺 mscoverage 组件时按用户裁定 **FAIL**、不 skip,2026-10-24)+ `test-suite-switch` + `registration-check`(双端注册反向校验 + UI 页面描述符表接线,N-23/U4)+ `mem-budget`(RAM 92% 预算门禁,N-27)+ `font-charset`(UI 字符集差集检查,防缺字白框,U4)+ `ui-golden`(UI 像素回归,菜单 8 状态 + 内容页 11 页黄金参考,U4)+ `layer-deps`(**分层方向**:`Drivers/BSP/**` 不得 include `App/**` 的头;存量 3 条基线只减不增(2026-10-25 记录 reader 注入削掉 UI 记录 3 条边,6→3),报告 S-1)+ `bsp-err`(**BSP 错误码与超时命名约定**:公开 API 不得拿 `HAL_StatusTypeDef`/`bool` 当错误通道、`*_TIMEOUT` 宏不得取负值、非 void 须写「返回值:」、**返回错误码的函数不得裸丢弃返回值**(须接住或显式 `(void)`;实测编译器与 cppcheck 都不报这类,只有这条会响);约定正文 `Drivers/BSP/bsp_err.h`,存量基线只减不增(2026-10-23 首清点 19 条 → 已还 18;`consume-result` 上线又暴露 37 条存量丢弃 → **现 38 条**),报告 S-5) - **范围 = 项目代码**:第三方(`Lib/`、`Middlewares/`、CMSIS、HAL、`lftpd`、`dhara`、`MDK-ARM`)排除;`cppcheck`/`coding-standard` 另排除 `test/`,规范检查再排除 CubeMX 生成的 `Src/`/`Inc/`。**`simulator/` 已纳入全部钩子**(2026-10-11)——生成物只靠 `.gitignore` 挡,**不在 `exclude` 里写目录名**(教训见 `docs/代码规范/pre-commit使用说明.md` §5.5) - ⚠ **pre-commit 4.x 已移除 `always: true`**(实测对 `local` 钩子只告警 `Unexpected key(s)` 并跳过)→ 想"总是跑"的钩子**必须让 `files:` 覆盖到所有会触发它的文件**,没有兜底开关 - **改写型钩子(`trailing-whitespace` + `end-of-file-fixer`)豁免 CubeMX/Keil 生成文件**(配置里 YAML 锚点 `&cubemx-generated`);⚠ **只读检查不受影响**:`cppcheck` / 乱码 / `cubemx-survival` / `task-table` / `mem-numbers` 仍覆盖 `Src/`、`Inc/` @@ -173,7 +173,7 @@ | ADC 采样节拍 / 通道映射 / V0.1 硬件缺陷 | `docs/子系统设计/ADC采样节拍设计说明.md`、`docs/硬件平台/ADC通道映射说明.md` | | 存储栈(FatFs / dhara / lftpd / 两条 FatFs 陷阱) | `docs/架构设计/STM32F4-Base存储架构说明.md` | | RAM / 栈预算 / 容量台账 | `docs/内存管理/RAM使用分析与优化方案.md`、`内存内容分配策略.md` | -| **每个提交门禁一篇详解**(查什么 / 拦下过什么真事 / 限制与盲区 / 基线口径) | `docs/门禁说明/README.md`(40 个钩子 → 23 篇索引) | +| **每个提交门禁一篇详解**(查什么 / 拦下过什么真事 / 限制与盲区 / 基线口径) | `docs/门禁说明/README.md`(42 个钩子 → 23 篇索引) | | 实体编号怎么写 / 前缀总表 / `id-check` 八项校验 | `docs/编号规范.md`(§4 总表、§8 门禁与实测基线) | | 提交门禁通用机制(阶段 / stash 陷阱 / 触发面 / 增量拦截三段式) | `docs/代码规范/pre-commit使用说明.md` §2 | | 代码规范 V1.0 / cppcheck 口径 | `docs/代码规范/嵌入式C语言代码规范_V1.0.md`、`cppcheck使用说明.md` | diff --git a/App/log/soe_rec.h b/App/log/soe_rec.h index faf76dfd..3f938980 100644 --- a/App/log/soe_rec.h +++ b/App/log/soe_rec.h @@ -61,6 +61,8 @@ extern "C" { * 4 软压板投入 value = 1 * 5 采样闭锁 value = adc_health 闭锁位图(触发时的 hf & mask) * 6 采样恢复 value = 0 + * 7 标定闭锁 value = UA/UN/IA VALID 未齐的通道位图(卡 5,2026-10-25) + * 8 标定复归 value = 0 */ typedef enum { SOE_T_ELM_ASSERT = 1u, diff --git a/docs/子系统设计/IEC104上行设计说明.md b/docs/子系统设计/IEC104上行设计说明.md index 072607dc..0c397008 100644 --- a/docs/子系统设计/IEC104上行设计说明.md +++ b/docs/子系统设计/IEC104上行设计说明.md @@ -43,8 +43,9 @@ | 0x4016~0x4018 | 1Ib/1Ic/1I0 | — | ❌ 发 IV(同上) | | 0x401D | 1f 频率 | 软件测频 | ❌ 发 IV(L1-7 未实现) | -- 现读数为**原始码值**(L1-5 标定未实现,系数=1 口径与之一致);死区本期内置 - 10.0 码值/点,标定落地后复核。 +- 现读数为**工程量(引脚电压/电流一次折算后的二次口径)**——`App/algo/adc_cal` 标定折算层 + 已于 2026-10-25 落地(卡 6 同步把死区按额定 0.5% 逐点重定:电压 0.5 V / 电流 0.005 A, + 频率维持 0.5 Hz 绝对值);标定系数默认=ROM 引脚 LSB,标准源注入复核(卡 12)仍待台架。 - 相量未就绪(未满一周波)→ QDS 置 NT(0x20),与 IV(无效通道)语义区分。 ### 3.2 遥信 YX(IOA 1~33) @@ -171,7 +172,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 码值为拟定值,L1-5 标定后按工程量死区(点表 8020H 段)复核。 +4. ~~遥测死区 10.0 码值为拟定值~~——工程量死区已于 2026-10-25 卡 6 落地(额定 0.5%); + 死区参数挪入运行参数段(点表 8020H 段)主站可读写,仍归后续(「数据可信」卡 10)。 5. 多主站/双链路冗余不做(单连接语义)。 6. 主站侧验证工具 = `test/host/iec104_master.py`(B6 2026-10-12 就绪,台架往返 18/18,覆盖总召/变位/遥控/定值);**第三方送检环境仍未就绪**——lib60870 级第三方全流程归 B10。 7. **后连优先未实现**(V0.1 = 首到优先):单连接 socket 连接态无法 accept, @@ -187,4 +189,5 @@ | 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-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 节 | diff --git a/docs/算法/采集与算法层设计说明.md b/docs/算法/采集与算法层设计说明.md index ebdd695f..9d7fb6f9 100644 --- a/docs/算法/采集与算法层设计说明.md +++ b/docs/算法/采集与算法层设计说明.md @@ -5,7 +5,8 @@ > 边界与代价。**目录级索引(文件清单、构建与测试命令、新增模块动作)在 `App/algo/README.md`**, > 本文不重复其内容;本文不写历史演进、门禁复测记录与修订日志(需要时查 git 历史)。 > **状态**:L1 → L2 → L3 主线已闭环到板端消费者(`protectTask`,20 ms 判据节拍); -> 标定(`docs/算法/继电保护功能复现规划.md` §3.1 L1-5)尚未实现,幅值精度不在本层能力内。 +> 标定折算层 `App/algo/adc_cal` 已于 2026-10-25 落地(`docs/任务规划/数据可信.md` 卡 2/4, +> 引脚电压量纲 + 系数落盘 + 未标定闭锁);**幅值精度判据**仍待标准源两点注入复核(卡 12)。 > **相关文档**: > 分层与功能项(L1~L5)的唯一属主登记处:`docs/算法/继电保护功能复现规划.md` §2.1(分层)、§3(功能清单)、§4.2(精度)、§7(路线图) > `docs/硬件平台/ADC通道映射说明.md`(**语义映射唯一权威口径**) @@ -227,7 +228,8 @@ 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`(原始码值口径,**拟定值,待 L1-5 标定复核**):低于门视为 +- **幅值门** `FREQ_AMP_MIN = 50.0`(2026-10-25 卡 6 语义重定为**二次值 V**:50 V = 0.5×Un, + 数值沿旧 50.0 属巧合,量纲依据 `App/algo/prot_set.c` 头部量纲基准块):低于门视为 无有效波形(浮空 / PT 断线时 rms ≈ 0,相位无意义)→ 停止更新、`valid` 清零、读数保持, 台架浮空因此**不发散**;信号刚消失的过渡段(≤20 ms 残窗)读数漂移有界 ≤0.3 Hz。 - **源优先级 UA(C02) → IA(C01)**,按名前缀解析、每拍动态回退(台架只注电流也能测频); @@ -339,8 +341,9 @@ UA 无幅值落 IA → 0.0020 Hz。 2. **禁止跨转换器运算**(V0.1 硬件缺陷 **N-18**):`UA/UN/IA` 在 TPAFE、`UB/UC/IB/IC/IN` 在 STM32 ADC1,两片转换器没有共同采样触发 → 无同一时刻性、相位不确定。故本层**不做**跨转换器的 相位 / 功率 / 功率因数 / 负序零序类矢量运算;**8 路全接 TPAFE(V0.2 硬件)后方可解禁**。 -3. **标定未实现**(缺标准源,见 `docs/算法/继电保护功能复现规划.md` §3.1 L1-5):现以**原始码值** - 充当工程量(系数 = 1)→ 相量读数只证明**链路通**,**不可作幅值精度判据**。 +3. **标定折算已落地、精度复核未做**(2026-10-25 `App/algo/adc_cal`;标准源两点注入见 + `docs/任务规划/数据可信.md` 卡 12):帧值现 = 引脚侧工程量(ROM 默认系数 = 转换器 LSB 事实值), + 前端分压读法判别与端子变比仍待台架——**精度结论前不得把幅值当计量证据**。 4. **本层无副作用外溢**:不建任务、不等事件、不写日志(日志由调用侧打)、不碰寄存器 (例外只有 `adc_input.c` 驱动 ADC1)。 5. **上下文纪律**:内核启动前只允许调 `*_init()`;`adc_input_poll()` / `phasor_run()` / diff --git a/test/host/soe/decode_soe.py b/test/host/soe/decode_soe.py index 448bbf38..3adb0f50 100644 --- a/test/host/soe/decode_soe.py +++ b/test/host/soe/decode_soe.py @@ -10,7 +10,7 @@ 如实分段计数,不算失败); 4) 时标:IV 记录如实报告;非 IV 记录时标必须落在合理窗口 (2020..2099,对时链已就绪的台架前提); - 5) 类型合法(1..6);元件事件 elm_id < --max-elm(默认 16 留余量; + 5) 类型合法(1..8);元件事件 elm_id < --max-elm(默认 16 留余量; PE_COUNT 现 7,B8 过频/低频并入后 9——写死 7 会在 B8 合并后误报)。 任一断言失败 -> 退出码 1(台架腿 FAIL 判据之一)。 @@ -38,6 +38,7 @@ FLG_IV = 0x80 TYPE_NAMES = { 1: "ELM_ASSERT", 2: "ELM_RETURN", 3: "PLATE_OUT", 4: "PLATE_IN", 5: "SAMPLE_BLOCK", 6: "SAMPLE_RESUME", + 7: "CAL_BLOCK", 8: "CAL_RESUME", }