diff --git a/AGENTS.md b/AGENTS.md
index 893dbdf1..b1f23792 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -137,7 +137,7 @@
## 硬件引脚
-- **完整引脚表(含 SD2506 I2C1、SWD、调试口)→ `docs/产品需求/产品需求设计文档.md` §4.2**(权威,V0.1 口径;勿在本文重复抄表)
+- **完整引脚表(含 SD2506 I2C1、SWD、调试口)→ `docs/架构设计/系统架构与硬件规格.md` §2.2**(权威,V0.1 口径;勿在本文重复抄表)
- ⚠ **网名 `AINn` ≠ 板级 `ADCn` ≠ 转换器通道号**(17 路里 13 路置换)→ 取数**必须查** `docs/硬件平台/ADC通道映射说明.md`(TPAFE `buf[2]=IA`/`buf[5]=UN`/`buf[6]=UA`;网名 ADC17=PC4 用 `ADC_CHANNEL_14`,**不是** `ADC_CHANNEL_12`)
- ⚠ **8 路电气量被分给两片转换器是 V0.1 硬件缺陷,不是有意分配**(跨转换器无共同采样触发 → 无同一时刻性、相位不确定)→ V0.1 上**禁止**跨转换器做相位/功率/功率因数/矢量运算;**V0.2 须把 8 路全接 TPAFE**(登记簿条目「双转换器无共同采样触发」)
diff --git a/docs/README.md b/docs/README.md
index 59e5d07a..f9589081 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -12,8 +12,8 @@
docs/
├── README.md 本索引(阅读顺序 + 全量清单)
├── 任务规划/ 统一待办(README 单一入口 + 6 个职责文件)
-├── 产品需求/ 产品需求设计文档(面向产品的需求基线)
-├── 架构设计/ 全局架构与设计方法论
+├── 产品需求/ 产品需求设计文档(需求基线)+ 参考产品复刻明细(逐项差额)
+├── 架构设计/ 全局架构与设计方法论(含 系统架构与硬件规格:位表/引脚权威)
├── 子系统设计/ 各功能子系统的设计说明
├── 算法/ 傅氏算法与继电保护算法专题
├── 网络/ BSD Socket API 使用与内部实现
@@ -41,7 +41,7 @@ docs/
| 顺序 | 文档 | 读它能得到什么 |
|:---:|---|---|
-| 1 | [`产品需求设计文档.md`](产品需求/产品需求设计文档.md) | 产品定位、功能/非功能需求、接口规范、UI 规格、路线图与验收判据 |
+| 1 | [`产品需求设计文档.md`](产品需求/产品需求设计文档.md) | 产品定位·用户·场景、优先级总览、功能/非功能需求、接口规范、UI 规格、路线图与验收判据(架构与硬件规格见 [`系统架构与硬件规格.md`](架构设计/系统架构与硬件规格.md),复刻逐项差额见 [`参考产品复刻明细.md`](产品需求/参考产品复刻明细.md)) |
| 2 | [`项目架构总览.md`](架构设计/项目架构总览.md) | 六层分层、启动时序、存储/网络/UI 三栈、目录组织 |
| 3 | [`项目启动顺序管理.md`](架构设计/项目启动顺序管理.md) | Event Flags 就绪屏障(取代魔法延时)的任务启动模型 |
| 4 | [`项目部署环境要求.md`](环境与部署/项目部署环境要求.md) | 开发机/目标板/现场部署的完整环境核对清单 |
@@ -62,7 +62,8 @@ docs/
| 文档 | 内容 |
|---|---|
-| [`产品需求设计文档.md`](产品需求/产品需求设计文档.md) | **面向产品的需求基线**:产品定位与形态、六层架构与任务模型、V0.1 硬件规格、功能需求(网络/存储/时间/配置/日志/UI/看门狗/LED + 待实现的 ADC/RS-485)、接口规范(RemoDispBus / 对时 / FTP / 配置 / 串口)、非功能需求(可靠性/性能/内存/门禁/双端)、UI 规格、待实现项与路线图、验收判据 |
+| [`产品需求设计文档.md`](产品需求/产品需求设计文档.md) | **面向产品的需求基线**:背景·目标用户·典型场景、范围与产品级非目标、需求总览(P0/P1/P2)、功能需求(网络/存储/时间/配置/日志/UI/看门狗/LED/ADC/RS-485/测频/保护/定值/SOE/104/屏板链路)、接口规范(RemoDispBus / 对时 / FTP / 配置 / 串口)、非功能需求(可靠性/性能/内存/门禁/双端)、UI 规格、缺口清单与推进顺序、验收判据 |
+| [`参考产品复刻明细.md`](产品需求/参考产品复刻明细.md) | **1:1 复刻的逐项差额权威**:参考源码能力清单(复刻基线)、104 地址空间、定值 249 项、遥测/开入开出/动作事件/元件/录波/记录/规约逐项明细、复刻完成判据、屏板链路复刻任务规划 |
---
@@ -71,6 +72,7 @@ docs/
| 文档 | 内容 |
|---|---|
| [`项目架构总览.md`](架构设计/项目架构总览.md) | 系统全景:六层分层、启动时序、存储·网络·UI 栈、目录组织 |
+| [`系统架构与硬件规格.md`](架构设计/系统架构与硬件规格.md) | 就绪位表 / 线程通信机制表 / 启动时序图 / V0.1 引脚表与硬件未确认项(H1~H3)——**位表、机制表、时序图、引脚表以本档为准**(自产品需求档拆出) |
| [`STM32F4-Base存储架构说明.md`](架构设计/STM32F4-Base存储架构说明.md) | GD5F2GQ5UE SPI NAND 之上的三层存储软件栈(FTL / dhara / FatFs) |
| [`项目启动顺序管理.md`](架构设计/项目启动顺序管理.md) | CMSIS-RTOS v2 Event Flags 就绪屏障(`SYS_EVT_NET_READY` 等) |
| [`图形绘制流程.md`](架构设计/图形绘制流程.md) | 文档配图规范:SVG 生成器 / Mermaid 选型与检查清单 |
diff --git a/docs/产品需求/产品需求设计文档.md b/docs/产品需求/产品需求设计文档.md
index 7f1f6483..1aba8694 100644
--- a/docs/产品需求/产品需求设计文档.md
+++ b/docs/产品需求/产品需求设计文档.md
@@ -1,23 +1,21 @@
# STM32F4-Base 产品需求设计文档
-> **文档定位**:本项目**面向产品的需求基线**——把散落在架构、子系统、测试、问题记录各文档中的
-> "产品做什么 / 做到什么程度 / 依据是什么"收敛成一份可评审、可追溯的需求说明,供甲方、产品、
-> 开发、测试与评审者建立统一认知。
-> **范围**:硬件规格、系统架构、功能需求(FR)、接口规范、非功能需求(NFR)、UI 规格、平台约束、
-> 待实现项与路线图、验收判据。
-> **事实来源**:本文所有数值与结论均取自仓库内**受管事实源**(代码、`.ioc`、`.map`、网表分析报告与
-> 各模块设计文档),凡与其它文档冲突处,以本文标注的权威来源为准。
-> **版本**:v1.9 **日期**:2026-10-28 **状态**:现状基线(含已实现项 + 待实现项)
-> **阅读前提**:建议先读 [`docs/README.md`](../../docs/README.md)(文档索引)与
-> [`docs/架构设计/项目架构总览.md`](../../docs/架构设计/项目架构总览.md)(全景架构)。
+> **文档定位**:本项目**面向产品的需求基线**——回答三个问题:产品是什么(§2 背景·用户·场景)、
+> 要做到什么程度(§4~§8 需求与验收标准)、当前做到哪一步(§4 总览表 + §9 路线图)。
+> 散落在架构、子系统、测试文档中的"产品做什么 / 做到什么程度 / 依据是什么"以本文为唯一收敛点。
+> **版本**:v2.0 **日期**:2026-10-30 **状态**:现状基线(含已实现项 + 待实现项)
> **范围口径:1:1 复刻**——本产品是参考产品 **CLS100**(`Scatter_P_HV03.01_SV01.01`,OMAP-L138
-> ARM+DSP 双核 + VxWorks 配电保护测控装置)的**逐模块复刻**。产品范围 = 参考源码的能力全集,
-> 差异只允许来自物理不可移植项(§2.4.1)。§2.5 以**参考工程源码的常量表与模块文件**为唯一清单,
-> 给出 20 项能力对照与复刻进度;§9 的缺口一律表述为"复刻进度"而非"不做",
-> 其中 **§9.4~§9.13 是逐项明细**(每个定值 / 每个点 / 每个模块 / 每条链路的报文差在哪、怎么算做完)。
-> 产品定义的技术细化见 [`docs/算法/继电保护功能复现规划.md`](../算法/继电保护功能复现规划.md)。
+> ARM+DSP 双核 + VxWorks 配电保护测控装置)的**逐模块复刻**;差异只允许来自物理不可移植项
+> (§3.2)。能力基线与逐项明细已独立成档:
+> [`参考产品复刻明细.md`](参考产品复刻明细.md)(能力清单、点表/定值/元件/规约逐项差额)。
+> **配套权威档**:运行时架构与硬件规格(引脚表、就绪位表、启动时序、硬件能力边界)→
+> [`../架构设计/系统架构与硬件规格.md`](../架构设计/系统架构与硬件规格.md)。
+> **事实来源**:本文所有数值与结论均取自仓库内**受管事实源**(代码、`.ioc`、`.map`、网表分析
+> 报告与各模块设计文档),凡与其它文档冲突处,以本文标注的权威来源为准。
+> **阅读前提**:建议先读 [`docs/README.md`](../../docs/README.md)(文档索引)。
+> 产品定义的技术细化(保护功能复现)见
+> [`docs/算法/继电保护功能复现规划.md`](../算法/继电保护功能复现规划.md)。
----
## 1. 文档说明
@@ -25,12 +23,18 @@
本文回答三个问题:
-1. **产品是什么**——一块工业级嵌入式 DTU 平台固件,做什么、面向谁、部署在哪;
-2. **产品要做到什么程度**——每一项功能/接口/性能/可靠性的**可验收要求**;
-3. **产品当前做到哪一步**——已实现、已验收、待实现的**明确边界**。
+1. **产品是什么**——一块工业级嵌入式 DTU 平台固件,做什么、面向谁、部署在哪(§2);
+2. **产品要做到什么程度**——每一项功能/接口/性能/可靠性的**可验收要求**(§4~§8);
+3. **产品当前做到哪一步**——已实现、已验收、待实现的**明确边界**(§4 总览 + §9)。
+
+**不含**(各有权威档,本文不重复):
+
+- 代码实现细节 → 各模块设计文档(`docs/子系统设计/`、`docs/算法/`、`docs/网络/`);
+- 运行时架构与硬件规格(分层/任务/就绪位/启动时序/引脚/硬件边界)→
+ [`../架构设计/系统架构与硬件规格.md`](../架构设计/系统架构与硬件规格.md);
+- 参考产品能力基线与复刻逐项明细 → [`参考产品复刻明细.md`](参考产品复刻明细.md);
+- 测试用例步骤 → `docs/测试说明/`;未闭环事项逐条跟踪 → [`docs/任务规划/README.md`](../任务规划/README.md)。
-**不含**:具体代码实现细节(见各模块设计文档)、测试用例步骤(见 `docs/测试说明/`)、
-未闭环事项的逐条跟踪(见 [`docs/任务规划/README.md`](../任务规划/README.md))。
### 1.2 术语与缩写
@@ -63,29 +67,31 @@
| **固有 / 运行 / 保护定值** | 三类参数:只读身份信息、可整定的运行参数、可整定的保护定值(§5.13) |
| **软压板** | 软件投退开关(全局软压板 = 保护总投入,可经 104 遥控投退) |
| **遥测死区** | 遥测变化上送门槛;本产品按"连续 2 个新测量点越限才确认" |
+| **架构硬件档** | [`docs/架构设计/系统架构与硬件规格.md`](../架构设计/系统架构与硬件规格.md) 的简称(本文与复刻明细档共用此简称) |
+| **复刻明细档** | [`docs/产品需求/参考产品复刻明细.md`](参考产品复刻明细.md) 的简称 |
| **CLS100** | 参考产品(配电保护测控装置,ARM + DSP 双核 / VxWorks),仅作能力对照,非本产品代次 |
### 1.3 读者与相关文档
| 角色 | 建议读法 |
|---|---|
-| 甲方 / 产品 | §2 产品概述 → §5 功能需求 → §9 待实现项与路线图 → §10 验收判据 |
+| 甲方 / 产品 | §2 背景·用户·场景 → §4 需求总览 → §9 路线图 → §10 验收判据 |
| 开发 | 全文;深入时按 §11 指向各模块设计文档 |
| 测试 / 验证 | §5、§6、§7、§10 + `docs/测试说明/` |
-| 评审 | §2、§7、§8、§9 |
+| 评审 | §2、§3、§7、§9 |
---
-## 2. 产品概述
+## 2. 背景、目标用户与产品目标
-### 2.1 产品定位
+### 2.1 背景与产品定位
**STM32F4-Base 是一块工业级嵌入式 DTU 平台固件**,基于 STM32F407ZGTx,集成
**以太网通信、SPI NAND 存储、ADC 采集、RS-485 通信与 FTP 文件服务**,并自带
**远程显示(UI 推流)、墙钟对时、看门狗自恢复、运行/自检记录**等工业现场能力。
它的**产品目标是 1:1 复刻参考产品 CLS100**(配电保护测控装置)——按参考工程源码的
-常量表与模块文件逐项对齐点表、定值、保护元件与规约栈(§2.4、§2.5)。在此过程中沉淀出的
+常量表与模块文件逐项对齐点表、定值、保护元件与规约栈(§3.1、复刻明细 §1)。在此过程中沉淀出的
分层底座(采集链 语义取数与有效性~出口与记录、配置引擎、就绪屏障、双端测试)同时是可复用的平台能力。
> **产品现状一句话**:平台能力(网络 / 存储 / 时间 / UI / 日志 / 看门狗 / FTP / 配置)
@@ -94,7 +100,11 @@
> 集中在三处:① 保护判据处于**未标定闭锁**态(等标准源两点标定)、② **点表规模**远小于参考
> (定值 40 vs 249 项、遥测 9 vs 31 点、开入开出 0 vs 138/31 点)、③ **独立子系统未立项**
> (故障录波、电度、多规约、SNTP)。即:**"数"与"判据"已可信到引脚电压口径,
-> 缺的是标定、点表铺开与一次设备接口**(明细见 §2.5.2、§9)。
+> 缺的是标定、点表铺开与一次设备接口**(明细见 复刻明细 §1.2、§9)。
+
+> 交付节奏与验收锚点见 §9、§10;本文对"为什么是这四点能力组合"不再另立论证——
+> 它是 DTU 数据接入类产品的工业现场最小完备集(通信、存储、采集、对外规约),
+> 并以 1:1 复刻 CLS100 为纵深(§3)。
### 2.2 产品形态与部署
@@ -126,7 +136,31 @@ flowchart LR
**关键产品特征**:**MCU 端无物理屏幕**——UI 画面以 160×160 单色位图(1bpp)经 TCP 推送到远端
客户端渲染,按键亦由远端下发(见 §5.6、§8)。
-### 2.3 设计目标与原则
+### 2.3 目标用户
+
+| 角色 | 与产品的接触面 | 关心的事 |
+|---|---|---|
+| **主站操作员 / 调度** | IEC 60870-5-104(:2404):总召、变位、遥控、定值、对时 | 数据可信(品质位如实)、动作可追溯(SOE 时标)、异常可自恢复 |
+| **现场调试与运维** | 串口屏板(本地带屏运行)、UART5 日志口(:115200)、FTP(:21)、ST-LINK 烧录 | 上电即用的接线口径、看得见的状态灯与日志、改配置不重启、掉电不丢参数 |
+| **工厂生产 / 出厂** | `/config.ini` 工厂默认、UI 工厂菜单、自检记录 | 产线可批量预置网络与口令、自检留痕可查 |
+| **远程看图 / 注键人员** | TCP :7003(RemoDispBus)+ DTU-RemoteLCD | 与本地屏板同源的画面与按键(两出口并发互不干扰) |
+| **送检 / 验收方** | §10 验收判据、第三方 104 主站往返 | 每项要求都有可跑通的判据,"没做"与"接线错"可区分 |
+
+### 2.4 典型使用场景
+
+1. **开关柜现场部署**:设备上电 → 按 `/config.ini` 出厂 IP 组网 → 主站连 :2404 总召 →
+ 现场用屏板看测量、按按键翻菜单;死机由看门狗自恢复(无需到场)。
+2. **远程运维**:PC 经 :7003 看同一份 UI、注键操作;FTP 取 `/log`(运行/自检/SOE 记录)
+ 与 `/config.ini`;改 IP 后 2~5 s 生效不重启;PC 推 :8888 对时。
+3. **脱离 PC 独立带屏运行**:串口屏板直连 USART1(700 kbaud),主机 275 ms 召唤、
+ ≤200 ms 回 4208 B 帧(3200 B 显存 + 状态灯掩码 + info)——无 PC 也能看与按(§5.16)。
+4. **保护运行(等标定解锁)**:1 kHz 采样 → 全周傅氏相量 → 20 ms 判据节拍 → 动作只落
+ 遥信 + SOE + 日志(V0.1 无出口硬件);**未标定态判据整体停走且 `YX31` 如实置位**——
+ 这是刻意的安全设计,不是缺陷。
+5. **复刻验收**:按 [`参考产品复刻明细.md`](参考产品复刻明细.md) 逐项对照点表/定值/元件/规约,
+ 差额即排期输入(§9)。
+
+### 2.5 目标与成功指标
| # | 目标 | 落地手段 |
|---|---|---|
@@ -148,13 +182,28 @@ flowchart LR
7. **点表优先于实现**——本期做不了的 104 点照常入表并置 IV;缺行比置 IV 更糟,
主站将无法区分"没做"与"接线错"(§6.8)。
-### 2.4 产品范围(1:1 复刻口径)
+**成功指标(可判定)**:
+
+| 指标 | 目标 | 当前状态 |
+|---|---|---|
+| 平台能力台架验收 | 网络/存储/时间/UI/日志/看门狗/FTP/配置 全部闭环 | ✅ 已达成(§10.4) |
+| 采集主线到业务出口 | 采样→相量→测频→遥测快照→判据→104/UI 全链路数据同源 | ✅ 软件链路闭环;判据等标定(§9.1.1) |
+| 屏板独立带屏 | 串口通道交付并台架验收 | ✅ 主机侧交付(§5.16;尾巴见屏板链路设计说明 §9.2) |
+| 送检就绪 | 两点标定 → 保护解卡 → 第三方主站验收 | ⬜ 等标准源与端子变比(§9.2 第 4/5 步) |
+| 复刻完成 | 复刻明细各项达"做完了"口径 | 🔶 见 [`参考产品复刻明细.md`](参考产品复刻明细.md) §1.2 |
+
+
+---
+
+## 3. 范围与产品级非目标
+
+### 3.1 产品范围(1:1 复刻口径)
**产品范围 = 参考产品 CLS100 的可移植能力全集。** 本产品不是"在参考产品里挑一部分做",
而是**按参考工程源码逐模块复刻**:凡参考源码中存在的点表、定值单元、保护元件、记录类型、
-规约栈,都属本产品目标范围;差异只允许来自**物理不可移植项**(§2.4.1)。
+规约栈,都属本产品目标范围;差异只允许来自**物理不可移植项**(§3.1.1)。
-范围按**复刻完成度**分三档,判定口径见 §2.5.1:
+范围按**复刻完成度**分三档,判定口径见 `参考产品复刻明细.md` §1.1:
| 档 | 含义 | 处置 |
|---|---|---|
@@ -162,395 +211,67 @@ flowchart LR
| 🔶 **部分对齐** | 骨架、口径、地址编排已对齐,覆盖范围小于参考(通道数 / 元件数 / 点数) | 差额逐条进 §9 |
| ⬜ **未开始** | 参考源码存在、本产品无对应实现 | 逐条进 §9,**不等于"不做"** |
-**当前分布**(20 项能力,明细见 §2.5.2):✅ **2 项**(采样节拍、自检类型)、🔶 **10 项**、
+**当前分布**(20 项能力,明细见 `参考产品复刻明细.md` §1.2):✅ **2 项**(采样节拍、自检类型)、🔶 **10 项**、
⬜ **7 项**、— **1 项**(双核分工,不可移植)。
-#### 2.4.1 不可移植项(唯一允许落在范围外的部分)
+#### 3.1.1 不可移植项(产品级非目标)(唯一允许落在范围外的部分)
| # | 不可移植项 | 参考实现 | 本产品 | 归因 |
|---|---|---|---|---|
| X1 | 双核 ARM + DSP 分工 | OMAP-L138(ARM 跑通信/HMI,DSP 跑保护) | 单核 Cortex-M4F 按任务划分承担 | 芯片形态 |
| X2 | 实时操作系统与工具链 | VxWorks 5.x + CCS | FreeRTOS V10.3.1 + Keil ARMCC | 平台形态 |
-| X3 | 一次设备接口 | KO / KI 板卡(出口、开入、硬压板) | V0.1 无该硬件(§4.6 H3) | 硬件缺失 |
+| X3 | 一次设备接口 | KO / KI 板卡(出口、开入、硬压板) | V0.1 无该硬件(架构硬件档 §2.6 H3) | 硬件缺失 |
| X4 | 独立计量通道 | 专用计量芯片(电度) | 无(跨转换器无同刻,§4.6 H1) | 硬件缺失 |
> **X1~X4 是范围外项的全部。** 除此以外**不存在"参考有、我们决定不做"的能力**—
+### 3.2 产品级非目标(本期不做,与"范围外"不同义)
-### 2.5 1:1 复刻基线(参考源码能力清单)
-
-**判定口径**:本节所有"参考能力"的数字,**一律从参考工程源
-(实测已发现"89 个元件模块"实为 45 个、定值"约 260 项"实为 249 项两处偏差)。
-
-#### 2.5.1 复刻基线三要素
-
-1. **点表即契约**:参考源码用常量表(`g_t*Tab[]`)定义点表、定值、事件、压板。
- 这些表就是"要复刻什么"的**唯一清单**——表有几行,目标就有几个点。
-2. **地址即接口**:104 的 IOA 由 `Rly_IEC104.h` 的基址宏划分段,**段基址必须逐字对齐**(§2.5.3)。
-3. **模块即元件**:`RelayUnit/` 下一个 `.c` 对应一个保护元件,元件数 = 文件数(§2.5.5)。
-
-#### 2.5.2 能力清单与复刻进度(源码实测)
-
-| # | 能力 | 参考源码出处 | 参考数量 | 本产品现状 | 状态 |
-|---|---|---|---|---|---|
-| 1 | 定值项 | `APP/EquipCfg/Const_Set.c` `g_tSetModelTab` | **249 项** | 40 项(`PS_ID_COUNT`) | 🔶 |
-| 2 | 定值单元 | `APP/EquipCfg/Const_Set.h` `EN_SET_CELL_*` | **23 个有项**(枚举 28) | 5 组(短路/接地/过负荷/电压/频率) | 🔶 |
-| 3 | 104 定值映射 | `Comm/Pub/Const_CommSetPara.c` `g_tCommSetParaTab` | **107 项**,`0x8820~0x8891` | 40 项(`0x8820~0x8890` 局部) | 🔶 |
-| 4 | 遥测 YC | `APP/EquipCfg/Const_Ana.c` `g_tYcIndexTab` | **31 点** | 9 点(`0x4011~0x4018` + `0x401D`) | 🔶 |
-| 5 | 遥测模型 | 同上 `g_tAnaModelTab` | 35 行 | 0 | ⬜ |
-| 6 | 电度 YM | 同上 `g_tYmIndexTab` | **8 种** | 0 | ⬜ |
-| 7 | 开入 KI | `APP/EquipCfg/Const_IO.c` `g_tInputModelTab` | **138 点** | 0(无硬件,X3) | ⬜ |
-| 8 | 开出 KO | 同上 `g_tOutputModelTab` | **31 点** | 0(无硬件,X3) | ⬜ |
-| 9 | 动作事件 | `APP/EquipCfg/Const_Rec.c` `g_tActRecTab` | **33 条**(421~453) | 7 类记录(`App/log/sys_log.h`) | 🔶 |
-| 10 | 录波测量通道 | 同上 `g_tMeasureModelTab` | **65 通道** | 8(本波口径,2026-10-29 代码面已交付;65 通道仍为 0,参考机口径未改)| 🔶 |
-| 11 | 软压板 | `APP/EquipCfg/Const_Soft.c` `g_tSoftTab` | **9 面**(表容量 32) | 1 面(`PS_GLOBAL_EN`) | 🔶 |
-| 12 | 保护元件 | `RelayUnit/*.c` | **45 个模块** | 9 个实例 | 🔶 |
-| 13 | 记录队列 | `RecUnit/RecFile.c` + `GlobalDef/Const_Sys.h` | **13 类**(128/256 条) | 8 通道(7 文本 + SOE) | 🔶 |
-| 14 | 自检类型 | `GlobalUnit/SelfChk.c` | **3 类型 + 2 闭锁** | 3 类 | ✅ |
-| 15 | 故障录波 | `APP/EquipCfg/Const_Wave.h` | **3 类型 / 6 段 / RAM 16 个** | 0 | ⬜ |
-| 16 | 采样节拍 | `APP/EquipCfg/Const_VisEquip.h` | **20 点/周波**(50 Hz) | 20 点/周波(1000 Hz) | ✅ |
-| 17 | 上行规约 | `Comm/Pub/`、`Comm/Mon/` | **12 种** | 1 种(104) | 🔶 |
-| 18 | 加密算法 | `Comm/Ecc/` | SM2 / SM3 / ECDSA | 0 | ⬜ |
-| 19 | 双核分工 | `CLS100_Arm/`、`CLS100_Dsp/` | ARM + DSP | 单核(X1) | — |
-| 20 | 远端屏与按键链路 | `HMI/RemoeDisp/RemoDispBus.c`、`HMI/Dsp/Key.c`、`HMI/Dsp/Disp_Pub.c`;屏板侧 `DTU-LCD` | **串口屏板通道**(显存 3200 B + **状态灯 4 B 位掩码**下行 / 键号上行)+ **TCP 7003 镜像** | 7003 四命令已通;**串口屏板通道整条缺失**(协议已按屏板源码定版,见 §5.16.2);INIT 应答 8 B(参考 29 B,其中 13 B 颜色信息**不对齐**)、无断点续传、无链路监视、缺 F1/F2 | 🔶 |
-
-> **读法**:🔶 / ⬜ 行**全部是待办**,逐条对应 §9.1;`—` 只出现在 X1~X4 不可移植项上。
-> 本表是范围判定的唯一出处,§9 不再重复解释"为什么缺"。
-
-#### 2.5.3 104 地址空间(段基址逐字对齐)
-
-| 段 | 基址 | 范围 | 容量 | 本产品使用 |
-|---|---|---|---|---|
-| 遥信 YX | `0x0001` | `0x0001~0x1000` | 4096 | 定义 1~31,有效 6(YX15~18/23/31) |
-| 保护 BH | `0x1001` | `0x1001~0x4000` | 12288 | 0 |
-| 遥测 YC | `0x4001` | `0x4001~0x5000` | 4096 | `0x4011~0x4018`、`0x401D` |
-| 参数 PM | `0x5001` | `0x5001~0x6000` | 4096 | 0 |
-| 遥控 YK | `0x6001` | `0x6001~0x6200` | 512 | `0x600A`(信号复归)、`0x600B`(全局压板) |
-| 设定 YS | `0x6201` | `0x6201~0x6400` | 512 | 0 |
-| 电能 YM | `0x6401` | `0x6401~0x6600` | 512 | 0 |
-| 步位置 STEP | `0x6601` | `0x6601~0x6700` | 256 | 0 |
-
-> ⚠ **段基址是 `0x4001` / `0x6001`,不是 `0x4000` / `0x6000`**。参考源码
-> `Comm/Pub/Rly_IEC104.h` 的 `CONST_104_BASEADDR_YC` / `_YK` 明确 1 起编
-> (注释即写 `4001-5000H`、`6001-6200H`)。本仓 v1.1 及更早文档按 `4000H+` / `6000H+` 描述
-> 属笔误,以本表为准;§5.15、§6.8 已同步更正。
-
-#### 2.5.4 定值单元(23 个有项单元,合计 249 项)
-
-| 单元 | 语义 | 项数 | 本产品 |
-|---|---|---|---|
-| `EN_SET_CELL_WatchDog` | 看门狗功能 | 63 | ⬜ |
-| `EN_SET_CELL_SYS3` | 系统参数 | 45 | 🔶 |
-| `EN_SET_CELL_VolTimeRecv` | 电压时间型自愈 | 17 | ⬜ |
-| `EN_SET_CELL_AutoReCls` | 重合闸 | 16 | ⬜ |
-| `EN_SET_CELL_SYN` | 同期元件(FTU 型) | 13 | ⬜ |
-| `EN_SET_CELL_OverCurI0` | 接地告警 | 13 | 🔶 |
-| `EN_SET_CELL_VolPro` | 电压保护 | 13 | 🔶 |
-| `EN_SET_CELL_WAVESTART` | 录波启动 | 12 | ⬜ |
-| `EN_SET_CELL_MeaLimit` | 遥测越限 | 10 | ⬜ |
-| `EN_SET_CELL_OverCurSpeed` | 过流加速 | 8 | ⬜ |
-| `EN_SET_CELL_SYS1` | PT 参数 | 6 | 🔶 |
-| `EN_SET_CELL_SYS2` | CT 参数 | 4 | 🔶 |
-| `EN_SET_CELL_Auto_FG` | 自动分闸 | 4 | ⬜ |
-| `EN_SET_CELL_Auto_HH` | 自动合闸 | 4 | ⬜ |
-| `EN_SET_CELL_InRush` | 励磁涌流闭锁 | 3 | ⬜ |
-| `EN_SET_CELL_OverCur` | 短路告警 | 3 | 🔶 |
-| `EN_SET_CELL_VolQuaRate` | 电压合格率 | 3 | ⬜ |
-| `EN_SET_CELL_FZDDL` | 非遮断电流闭锁 | 3 | ⬜ |
-| `EN_SET_CELL_BHKO` | 保护出口展宽 | 2 | ⬜ |
-| `EN_SET_CELL_MeaRecord` | 遥测记录 | 2 | ⬜ |
-| `EN_SET_CELL_PowerSet` | 功率电压设置 | 2 | ⬜ |
-| `EN_SET_CELL_PTBreak` | PT 断线告警 | 2 | ⬜ |
-| `EN_SET_CELL_AutoCtrl` | 自动控制(活化/复归) | 1 | ⬜ |
-
-> 枚举中另有 4 个单元在参考源码表内**无项**(`EN_SET_CELL_YB_TY` 功能软压板、`OnceCch`
-> 一次重合闸、`TwiceCch` 二次重合闸、`OverLoad` 过负荷保护)——已被条件编译或注释掉,
-> 因此 249 项分布在 **23** 个单元而非枚举的 28 个。另有 3 个单元(`SYN` / `OverCurSpeed` /
-> `VolTimeRecv`)受 `CN_DEV_TYPE_FTU` 宏控制,属 FTU 型专属。
->
-> **104 定值地址编排**:107 项占 `0x8820~0x8891` 连续段中的 107 个地址,**8 个空洞**
-> (`0x8822`、`0x8823`、`0x883E`、`0x883F`、`0x8842`、`0x8851`、`0x8852`、`0x8853`)
-> 对应参考源码中被注释掉的 4 条映射(`ULTV_PARA_2`、`ULTV_Phase` 等)。
-
-#### 2.5.5 保护元件(45 个模块 → 覆盖 8 个模块 / 9 个实例)
-
-按功能归类(`RelayUnit/` 文件名去 `PRS_` 前缀):
-
-| 类别 | 元件模块 | 个数 | 本产品 |
-|---|---|---|---|
-| 过流类 | `OverCurrent`、`OverCurrent_I0`、`OverCurrent_SpeedUp`、`OverCurrentI0_SpeedUp`、`FZDOverCur`、`OverCurWarn`、`OverCurWarn_I0`、`OverLoad` | 8 | 🔶 过流 Ⅰ/Ⅱ/Ⅲ + 过负荷(4) |
-| 电压类 | `OverVol`、`OverVol_U0`、`LackVol`、`LineHaveVol`、`HaveVolCls`、`NoVolTrip`、`PTBreak`、`CTBreak` | 8 | 🔶 过压 / 欠压 / 零序过压(3) |
-| 频率类 | `OverFr`、`LackFr` | 2 | ✅ 过频 / 低频(2) |
-| 重合闸 | `AutoReCls`、`AutoReCls_JD`、`OnceCch`、`TwiceCch`、`ConnectBrkCls` | 5 | ⬜ |
-| 方向 / 功率 | `DirCell`、`PowDirJudge`、`PowerSet`、`YcOverLimit` | 4 | ⬜ |
-| 涌流 / 故障 | `InRushCur`、`FaultIsola`、`FaultRecov`、`BusEarthAlm`、`SgzAlarm` | 5 | ⬜ |
-| 自动控制 | `AutoCtrlTrip`、`ManualTrip`、`MusterRecov`、`ExvRec`、`ExvRecGW` | 5 | ⬜ |
-| 记录类 | `SOERecord`、`CORecord`、`FrzRecord`、`YcMeaRecord`、`YcMeaLimitRec`、`YcVolQuaRate` | 6 | 🔶 SOE 落盘(1,非判据元件) |
-| 录波 / 采样 | `WaveQdCell`、`RlyCommSam` | 2 | ⬜ |
-
-**判据结构对齐**(以 `PRS_OverCurrent.c` 为样板,三段过流共用一个核):
-
-```
-M_GRly_OverRelay(&bRelay, fAmp, fSetStart, fSetRet) 越限 + 返回系数滞回
- ∧ bFyOpen ∧ bDirOpenX ∧ bNOVOpen 复压 / 方向 / 低压闭锁
-GRly_TimeRelay(&bRelay, &tTimer, dwSetDelay, CN_T10MS) 定时限(10 ms 基准)
-tTimer_KeepKI 电流保持(返回后仍延时保持)
-tTimer_NoUI 无压无流判据(CN_T20MS / CN_T200MS)
-```
-
-> 本产品 `prot_elm.c` 的"越限 + 返回系数滞回 + 定时限"三元核与上述结构**同构**;
-> 差异在于本产品用**每元件独立实例表**替代参考的全局定时器数组——这是单核移植的必要调整,
-> 不改变判据语义。逐元件复刻计划见
-> [`docs/算法/继电保护功能复现规划.md`](../算法/继电保护功能复现规划.md)。
-
-#### 2.5.6 上行规约全集(12 种 → 已复刻 1 种;加密算法另计)
-
-| 方向 | 规约 | 参考源码 | 本产品 |
-|---|---|---|---|
-| 主站侧(对上) | IEC 60870-5-101 | `Comm/Pub/Rly_IEC101.c`、`Rly_IEC101_B.c` | ⬜ |
-| | IEC 60870-5-102(电度) | `Comm/Pub/Rly_IEC102.c` | ⬜ |
-| | IEC 60870-5-103 | `Comm/Pub/RLY_IEC103.c`、`RLY_IEC103-tcp.c`、`Rly_IEC103T.c` | ⬜ |
-| | **IEC 60870-5-104** | `Comm/Pub/Rly_IEC104.c` | ✅ |
-| | ModBus | `Comm/Pub/Rly_ModBus.c` | ⬜ |
-| | CDT | `Comm/Pub/Rly_Cdt.c` | ⬜ |
-| | 国标电度 `Whm_GB` | `Comm/Pub/Whm_GB.c` | ⬜ |
-| | IEC 61850(MMS / GOOSE / SV) | `Comm/Pub/struct61850.h`、`GlobalUnit/SttnLvlGoose.c` | ⬜ |
-| | CAN | `Comm/Pub/Rly_Can.h` | ⬜ |
-| 子站侧(对下) | IEC 101(含 ABB / 西门子 / 无优先级变体) | `Comm/Mon/Rtu_IEC101*.c` | ⬜ |
-| | IEC 104(含调试 / RIS 变体) | `Comm/Mon/Rtu_IEC104.c`、`Rtu_Dbg104.c`、`Rtu_RIS104.c` | ⬜ |
-| | BALA101 / ModBus | `Comm/Mon/Rtu_BALA101*.c`、`Rtu_ModBus.c` | ⬜ |
-| 加密 | SM2 / SM3 / ECDSA | `Comm/Ecc/` | ⬜ |
-
-> **排期判断**:104 已对齐;**对下 ModBus RTU 与 101 是"配网终端"的必要项**(接一次开关 / FTU),
-> 与 RS-485 簇同批解冻;61850 依赖以太网多播与 MMS 栈,单核 M4 资源上需单独评估,属最末批。
-
-#### 2.5.7 差异归因与结论
-
-| 归因 | 涉及条目 | 解除方式 |
+| 非目标 | 边界 | 理由 |
|---|---|---|
-| **外部资源**(标准源、端子变比) | 定值标定、保护判据解卡 | 两点标定(§9.2 第 4 步) |
-| **硬件缺失**(X3 / X4) | 开入 138、开出 31、电度 8、同期、三相通道 | V0.2 硬件 |
-| **立项未排** | 多规约、SNTP、定值铺开 | 按 §9.2 顺序。**录波最小闭环已交付代码面**(2026-10-29,卡片 docs/任务规划/故障录波.md、设计 docs/子系统设计/故障录波设计说明.md;1 kHz 起步与本文 80 点/周波口径的偏离在该设计文档 §2 显式登记);**4 kHz 全速、多段、COMTRADE、104 文件传输仍未排**,属二期范围 |
-| **算力 / 形态**(X1 / X2) | 双核分工、VxWorks | 不解除。**屏板链路已从范围外项移入范围内**(规格 §5.16,主机侧实现 docs/子系统设计/屏板链路设计说明.md;串口通道已实现,网络通道未做):主机侧链路与参考 1:1 同构,不属"替代方案" |
+| 屏板硬件本体固件 | `DTU-LCD` 独立工程 | 不在本仓;主机侧以需求档 §5.16 契约为黑盒验收线 |
+| 多定值区 / 定值文件下装 | 参考有 4 区 | 本产品只定义单定值区(§5.15 未实现项表) |
+| 主站 IP 白名单 | — | 单 socket 语义下"拒绝"= 断链重听,可被扫描打成 SPI 风暴(§5.15) |
+| LOGO 下发 | 帧 info[4..5] 保留位恒 0 | 参考该功能无消费方,协议保留位存在但主机不提供操作(§5.16) |
+| 归一化 / 标度化遥测 | 点表要求短浮点(系数 1) | 协议语义决定,非进度缺口 |
+
+> "非目标"是**产品决策**;复刻差额不是(那是进度,见 §9 与复刻明细档)。两者不混。
-> **结论**:本产品与参考产品的差距**全部是"进度"而非"范围"**——没有一项是"参考有而我们不做"。
-> 已对齐的是**软件骨架**(采样节拍、相量算法、定值模型、104 上行、SOE 落盘、自检闭锁);
-> 未对齐的是**点表规模**(249 / 31 / 138 / 31 / 33 / 65 vs 40 / 9 / 0 / 0 / 7 / 0)
-> 与**独立子系统**(录波、电度、多规约)。因此 §9 统一表述为"复刻进度",不再出现"不做"。
---
-## 3. 系统总体架构
+## 4. 需求总览(优先级与状态)
-### 3.1 六层分层架构
+> 优先级是**排期语义**:P0 = 交付/送检主线;P1 = 复刻铺开项(可并行、依赖标定或硬件);
+> P2 = 冻结或等立项。状态口径同 §5 章头(✅ / 🔶 / ⬜)。细节与验收判据在 §5 各节。
-
-
-> 上图由 `tools/arch_diagram/gen_arch_svg.py` 生成(手绘 SVG,零连线交叉);改架构后编辑脚本顶部
-> `ROWS` 数据重跑即可,源数据与下表一致。
-
-分层原则:**上层只依赖相邻下层(单向)**;**① 业务层为顶层**(仅 `net_cfg`,被 UI 与基础服务共用),
-**② UI 层与 ③ 基础服务层同级并列**。
-
-| 层 | 目录 | 职责 | 关键模块 |
+| 优先级 | 需求域 | 状态 | 一句话边界 |
|---|---|---|---|
-| ① 业务层 | `Drivers/BSP/NETCFG/` | 顶层共享配置(被 UI 与基础服务共用) | `net_cfg` |
-| ② UI 层 | `Drivers/BSP/UI/` | LVGL 界面(与 PC 模拟器共用源码) | `ui_port` `ui_menu` `ui_menu_view` `ui_menu_tab` `ui_content_page` `ui_page_*` `ui_net_sink` `ui_font_cn_12` `ui_deco` |
-| ③ 基础服务层 | `App/`、`Drivers/BSP/NET/lftpd/` | 应用侧服务、采集算法与协议编排 | `app_main` `sys_events` `app_cfg` `task/*` `algo/*`(语义取数与有效性~保护判据)`protocol/iec104/*` `log/soe_store` `lftpd` `time_sync` |
-| ④ 中间件层 | `Drivers/BSP/NET/`、`Lib/`、`App/util/` | 通用库 / 协议栈 | `net_socket` `net_select` `FatFs` `nand_ftl`(dhara) `LVGL` `sys_clock` |
-| ⑤ 驱动层 | `Drivers/BSP/{CH395F,GD5F2GQ5UE,TPAFE5160,SD2506,RS485}/` | 芯片寄存器 / 时序 / 中断 | `ch395f` `gd5f2gq5ue` `tpafe5160` `sd2506` `rs485` |
-| ⑥ 内核 / HAL | `Middlewares/`、`Drivers/STM32F4xx_HAL_Driver/`、`Drivers/CMSIS/` | 任务调度、外设 HAL、启动 | FreeRTOS V10.3.1 · STM32 HAL · CMSIS |
-| ⑦ 硬件 | — | STM32F407ZGTx @168MHz | SPI1 / SPI2 / I2C1 / UART4 / USART1 / DMA / GPIO / TIM7 |
+| P0 | FR-NET 网络通信(§5.1) | ✅ | CH395F + BSD 抽象 + 单连接自愈 |
+| P0 | FR-STO 存储(§5.2) | ✅ | SPI NAND→dhara→FatFs,卷自愈 |
+| P0 | FR-TIME 时间(§5.3) | ✅ | SD2506 墙钟 + :8888 对时(2038 已知限) |
+| P0 | FR-CFG 配置引擎(§5.4) | ✅ | INI 段键表 + 外科保存 + 免重启生效 |
+| P0 | FR-LOG 记录与日志(§5.5) | ✅ | 定长记录 + 控制台单写者 |
+| P0 | FR-WD 看门狗(§5.7) | ✅ | 心跳位图 + 复位原因 + Fault 现场 |
+| P0 | FR-ADC 采集与标定(§5.9) | ✅ | 1 kHz 同源节拍;两点标定后解卡 |
+| P0 | FR-MEAS 遥测与相量(§5.11) | ✅ | 全周傅氏 + 测频 + 200 ms 快照单源 |
+| P0 | FR-IEC104 上行(§5.15) | ✅ | 被控站;无效点入表置 IV |
+| P0 | FR-PROT 保护(§5.12) | 🔶 | 软件就绪;**未标定闭锁**(用户裁定走标准源) |
+| P0 | FR-SET 定值(§5.13) | ✅ | 40 项;原子封存 + 掉电保持 |
+| P0 | FR-SOE 事件记录(§5.14) | ✅ | 判据路径零 NAND I/O |
+| P0 | FR-HMI 屏板链路(§5.16) | 🔶 | 串口主通道已交付;7003 报文口径 6 项未做 |
+| P0 | FR-UI 远程显示(§5.6) | ✅ | 两出口同源推流 |
+| P1 | FR-LED 状态指示(§5.8) | ✅ | 主板 6 路;屏板 20 路属 FR-HMI |
+| P1 | 复刻铺开(定值/遥测/元件/规约/软压板) | 🔶 | 明细见复刻明细档;顺序不可早于标定(§9.2) |
+| P1 | 故障录波 | 🔶 | 最小闭环代码面已交付;4 kHz/多段/COMTRADE 二期 |
+| P2 | FR-RS485 对下采集(§5.10) | ⬜ | 整簇冻结(用户决定),重启门禁见该节 |
+| P2 | FR-PROT-5 出口(§5.12) | ⬜ | 等 V0.2 硬件 |
-### 3.2 运行时任务模型
-
-**九个** FreeRTOS 任务(`Src/freertos.c` 创建,任务体在 `App/task/`、`App/sync/`):
-
-| 任务 | 栈(words / B) | 优先级 | 职责 |
-|---|---|---|---|
-| `defaultTask` | 1280 / 5120 | Normal | FatFS 挂载(无卷 `f_mkfs`)→ 卷健康探针/自愈 → `net_cfg_load` + 定值/运行参数/通讯参数装载(**配置引擎属主**)→ 置 `STORAGE_READY` → 日志落盘(唯一写者)+ 2 s 配置轮询 + 各模块脏位落盘(`prot_set` / `run_par` / `comm`)+ SOE 排空 + LED 闪烁 + 栈水位观测 + **看门狗唯一喂狗者** |
-| `netTask` | 960 / 3840 | Normal | 等存储 → `net_stack_bring_up()` → 置 `NET_READY` → `net_poll` 轮询 + CH395F 操作串行化(消息队列执行者) |
-| `ftpTask` | 1024 / 4096 | Normal | 等网络**且**存储(`WaitAll`)→ `lftpd_start("/", 21)` → 单客户端会话循环 |
-| `testTask` | 2048 / 8192 | BelowNormal | 测试套件入口(`test/board/test_config.h` 选择)。**产品构建不创建**(未选套件时立即 `vTaskDelete` 回收其 8 KB CCM 栈) |
-| `uiTask` | 4096 / 16384 | BelowNormal | 等网络 → `ui_port_init`/`ui_menu_init`/`ui_standby_init`(空闲 60 s 切待机屏)/`ui_net_sink` → 10 ms 刷新 + 数据注入 |
-| `timeSyncTask` | 640 / 2560 | Normal | 等网络 → TCP :8888 收 PC 推送时间 → 写 RTC |
-| `adcTask` | 640 / 2560 | AboveNormal | **采集主线唯一消费者**:每拍 `adc_input_poll()`(TPAFE 快照 + ADC1 DMA 帧)→ `adc_health` 有效性 → `phasor_run()` 相量 → `freq_run()` 测频 → 每 200 ms `meas_tick()` 发布遥测快照 |
-| `iec104Task` | 640 / 2560 | Normal | 等网络 → TCP :2404 监听 → 104 链路状态机(总召/变位/周期/遥控/定值/对时)+ 断链重听 + 网络代次自愈 |
-| `protectTask` | 512 / 2048 | Normal | **20 ms 判据节拍**:采样故障闭锁判定 → 定值校验和巡检 → `prot_elm_run()` 元件判据 → 动作边沿投递 SOE(**不做 NAND I/O**) |
-
-> `idle`(128 words)/ `timer`(256 words)由 FreeRTOS 内核创建。所有任务栈从 **56 KB** `heap_4` 堆
-> (CCM)分配;CCM 水位 87.9%(<92% 门禁)。
-> 任务表与 `Src/freertos.c` 的 `osThreadAttr_t` 一致,由 `scripts/gen_task_table.py` 生成并门禁校验;
-> **栈配置与实测余量**见 §7.3,改栈前后必须重跑 `scripts/stack_report.py`。
->
-> ⚠ **节拍同源**:TIM3 更新事件(1 kHz)同时触发 TPAFE `CONVST` 与(经 TRGO)ADC1 一轮 9 通道扫描,
-> 并在 ISR 内唤醒 `adcTask`——采集节拍与任务唤醒**不允许**各自计时。
-> ⚠ **ADC1 必须在挂 DMA 的瞬间处于关闭态**:`app_main_init()` 步骤 4b-pre 的 `adc1_disable()` 不可删、不可后移,
-> 否则 DMA 乒乓缓冲整体旋转 2 格(表象与"映射表写错"一致)。证据见
-> [`docs/子系统设计/ADC采样节拍设计说明.md`](../子系统设计/ADC采样节拍设计说明.md) §4.5。
-
-### 3.3 就绪屏障(Event Flags)
-
-
-
-用 CMSIS-RTOS2 Event Flags(`sys_evtHandle`)表达"子系统就绪",取代魔法延时与全局标志轮询。
-生产者与消费者互不知晓,只经事件组解耦;新增子系统只需定义新 bit + 各自 wait/set。
-
-| 位 | 名称 | 类型 | 语义 |
-|---|---|---|---|
-| bit0 | `SYS_EVT_NET_READY` | 状态位 | netTask:`net_init` + PHY 稳定完成 |
-| bit1 | `SYS_EVT_STORAGE_READY` | 状态位 | defaultTask:FTL/FatFS 挂载 + 配置就绪 |
-| bit2 | `SYS_EVT_FTP_READY` | 状态位 | ftpTask:`lftpd_start` 完成 |
-| bit3 | `SYS_EVT_TIMESYNC_READY` | 状态位 | timeSyncTask:首次时间同步完成 |
-| bit4 | `SYS_EVT_NET_RECONFIG` | 命令位 | UI:请求立即应用新网口配置 |
-| bit5 | `SYS_EVT_CFG_SAVE` | 命令位 | UI:网口配置保存请求(defaultTask 消费并写盘) |
-| bit6 | `SYS_EVT_CONSOLE_TX` | 命令位 | 控制台单写者:生产者入环形缓冲后置位 |
-| bit7 | `SYS_EVT_PROT_SET_SAVE` | 命令位 | 保护定值落盘请求:104 检测到定值脏后置位,defaultTask 原子写 `/prot_set.bin` |
-| bit8 | `SYS_EVT_RUN_PAR_SAVE` | 命令位 | 运行参数段落盘请求:104 写运行参数后置位,defaultTask 整档外科保存 |
-
-> ⚠️ **铁律**:状态位(bit0~3)表达**持久状态**,任何消费者都**不许消费**——必须
-> `osFlagsWaitAny|osFlagsNoClear`。命令位(bit4~8)表达"请做一件事",必须**恰好被消费一次**(消费型等待)。
-> 历史事故:就绪位被先到的等待者消费,导致 `ftpTask` 的 `WaitAll(bit0|bit1)` 永不成立、21 端口从未监听(静默)。
-
-### 3.4 启动时序
-
-```mermaid
-sequenceDiagram
- autonumber
- participant M as main
- participant A as app_main_init
- participant K as osKernelStart
- participant D as defaultTask
- participant N as netTask
- participant S as adcTask / protectTask
- participant F as ftpTask
- participant U as uiTask
- participant I as iec104Task / timeSyncTask
-
- M->>M: HAL_Init + CubeMX 外设初始化
(SPI1/SPI2/I2C1/UART4/USART1/DMA/GPIO/TIM3/TIM7)
- M->>A: app_main_init()
- Note over A: 时间子系统优先,使后续日志带时间戳
- A->>A: sd2506_init() → sys_clock_init()(墙钟基准)
- A->>A: rs485_init() → gd5f2gq5ue_init()(BBT 扫描)
- A->>A: tpafe5160_init() → adc_input_init()(语义映射自检)
- A->>A: 配置段注册(adc_cal / run_par / prot_set / comm)→ 定值/元件初始化
- A->>A: adc1_disable() → ADC1 挂 DMA(4b-pre,顺序不可变)→ 启动 TIM3 1 kHz 节拍
- A-->>M: "App init OK"
- M->>K: osKernelStart()
- K->>D: 调度
- D->>D: f_mount(无卷则 f_mkfs FAT32)→ 卷探针/自愈 → 配置装载
→ 定值整表原子装载(损坏则保出厂默认 + 自检留痕)
- D-->>N: set SYS_EVT_STORAGE_READY
- S->>S: adcTask:等 TIM3 节拍 → 采集 → 相量/测频 → 200 ms 遥测快照
- S->>S: protectTask:20 ms 判据(未标定/采样故障则停走)
- N->>N: wait STORAGE_READY(Any|NoClear)→ net_init(ip,mask,gw,mac)
→ PHY 强制 100M 全双工 → 等链路 ≤3s
- N-->>F: set SYS_EVT_NET_READY
- F->>F: wait NET_READY|STORAGE_READY(All|NoClear)→ lftpd_start("/", 21)
- U->>U: wait NET_READY(Any|NoClear)→ ui_port_init → ui_menu_init → ui_net_sink_start(7003)
- I->>I: wait NET_READY(Any|NoClear)→ TCP listen :2404 / :8888
-```
-
-> **顺序铁律**:① 配置段注册必须**先于** `cfg_file_load`(否则 FTP 上传的段不生效);
-> ② `adc1_disable()` 必须在挂 DMA 之前;③ `osKernelStart` 之前禁调任何内核 API(含 `osDelay` / 队列)。
-
-### 3.5 线程间通信
-
-| 机制 | 对象 | 用途 |
-|---|---|---|
-| Event Flags | `sys_evtHandle` | 启动就绪屏障 + 命令位(§3.3) |
-| Message Queue | `netMsgQueue`(深度 8,`net_msg_t`) | 所有 CH395F 操作经队列**串行化**到 netTask 执行,保证 SPI 单线程访问 |
-| 双区 + 序号(无锁) | `phasor` 相量区、`meas` 遥测快照 | 写侧填满计算区后单字节翻转活跃索引;读者先取索引再整份拷贝,`seq` 判"是否换帧" |
-| SPSC 环(无锁) | `soe_store`(深度 8) | protectTask 只投递动作边沿,defaultTask 排空落盘——**保护路径零 NAND I/O** |
-| 脏位 + 事件位 | `prot_set` / `run_par` / `comm` | 写入方置脏;104 侧 peek 后投递事件位,配置属主(defaultTask)落盘,失败保留脏位下轮重试 |
-| 单字请求标志 | `prot_elm_request_reset()` | 跨上下文复归请求(104 遥控 YK11 在 iec104Task 落请求,protectTask 下一拍消费) |
-
----
-
-## 4. 硬件规格
-
-### 4.1 主控与内存
-
-| 项 | 值 | 说明 |
-|---|---|---|
-| MCU | STM32F407ZGTx | Cortex-M4(FPU),LQFP144 |
-| 主频 | 168 MHz | HSE 8 MHz → PLL M=4 / N=168 / P=2 |
-| Flash | 1 MB(0x08000000) | 片内 |
-| SRAM | 192 KB(128 KB 主 SRAM1+SRAM2 + 64 KB CCM) | 链接器映射 128 KB 主 SRAM;CCM 用于 FreeRTOS 堆(任务栈) |
-| RTOS | FreeRTOS V10.3.1(CMSIS-RTOS2) | HAL 时基 TIM7,tick = 1 ms;NVIC 4 位抢占,外设中断优先级 ≥5 |
-| 工具链 | Keil MDK-ARM v5(ARMCC v5) | 工程锁 `uAC6=0`,**不支持 armclang** |
-| CubeMX | 6.17.0 + STM32Cube FW_F4 V1.28.3 | 与 `.ioc` 记录一致,再生成须用此组合 |
-
-### 4.2 外设与引脚分配
-
-> **权威来源**:V0.1 网表分析报告 + `Inc/main.h`(代码已迁移至 V0.1)。下表为 **V0.1 硬件**的引脚。
-
-| 外设 | 接口 | 引脚 | 说明 |
-|---|---|---|---|
-| **CH395F 以太网** | SPI2 | PB12 CS / PB13 SCK / PB14 SDO / PB15 SDI | 10/100M 以太网控制器;PHY 强制 100M 全双工;**SPI 分频系数必须为 8**(PCB 设计约束) |
-| **GD5F2GQ5UE NAND** | SPI1 | PE0 CS / PB3 SCK / PB4 MISO / PB5 MOSI / PB8 WP / PE1 HOLD | 256 MB SPI NAND(2 Gbit) |
-| **TPAFE5160 ADC** | 并行 16 位 | PG0~PG15 数据 / **PC6 FRSTDATA** / **PC7 BUSY**(EXTI) / **PC8 RD** / **PC9 CONVST** / **PA8 OS2** / **PA11 OS1** / **PA12 OS0** | 高精度多通道 ADC |
-| **SD2506 RTC** | I2C1 | PB6 SCL / PB7 SDA | 提供墙钟基准与日志时间戳 |
-| **USART1(U5 直连 TTL)** | UART | PA9 TX / PA10 RX | **700000 8N1 → 屏板链路**(TTL 直连、无 DE,§5.16.2);PA10 双向均已接线;日志已迁 UART5 |
-| **UART4(RS-485)** | UART | PC10 TX / PC11 RX / **PA15 DE** | 半双工通信(V0.1 轮换后 RS485#4 = UART4,`docs/硬件平台/V0.1_网表详细分析报告.md` §4.2) |
-| **USART2(RS-232 #3)** | UART | PD5 TX / PD6 RX | 经 U10 隔离 → U13 TPT3232E → CN1;固件目前未占用(日志实际走 UART5/RS232#1) |
-| **UART5(RS-232 #1)** | UART | PC12 TX / PD2 RX | 经 U9 隔离 → U13 → CN1;**日志口**(115200,`@test` 采集通道;台架端子 docs/子系统设计/屏板链路设计说明.md §3.2) |
-| **状态 LED ×6** | GPIO | PC5 / PB0 / PB1 / PB2 / PF11 / PF12 | **低电平点亮** |
-| SWD | — | PA13 SWDIO / PA14 SWCLK | V0.1 已修复 V0.0 的 SWCLK 引脚缺陷 |
-| 调试口 | — | CN2(XH-3A,1=SWDIO/2=SWCLK/3=GND) | V0.1 由 H2 排针改为 XH 端子 |
-
-> ⚠️ **V0.0 / V0.1 差异**:V0.1 相比 V0.0 做了**接口裁剪(删 8080 LCD 与 8 键)+ U17 大面积引脚重排 +
-> ADC 前端通道置换(17 路中 13 路变化)+ 调试口改型**。固件 BSP 与 ADC 通道映射表**必须按 V0.1 重映射**;
-> 详见 `docs/硬件平台/V0.1_网表详细分析报告.md`。
-
-### 4.3 存储器件
-
-| 器件 | 容量 | 组织 | 软件栈 |
-|---|---|---|---|
-| GD5F2GQ5UE | 2 Gbit(256 MB) | 2048 块 × 64 页 × 2048 B | FatFS(FAT32)→ dhara FTL(磨损均衡 / 坏块管理 / GC)→ NAND 驱动 |
-| SD2506 | — | I2C1 | RTC(时间/温度/电池诊断) |
-
-- **BBT 持久化**:坏块表存于保留块池(顶部 4 块),不交给 dhara 管理。
-- **单写者纪律**:`defaultTask` 拥有存储;`netTask` 只读 RAM 配置副本,不触卷。
-- **FatFs 约束**:`FF_USE_LFN=0`(严格 8.3 文件名);`FF_FS_REENTRANT=1` + `ffsystem.c` 互斥钩子(超时 1 s);`FF_FS_NORTC=0`(`get_fattime` 直引用墙钟)。
-
-### 4.4 硬件版本与兼容性
-
-| 版本 | 状态 | 说明 |
-|---|---|---|
-| V0.0 | 历史 | 含 8080 LCD、8 按键;存在 2 处设计缺陷(SWCLK 引脚错误致 SWD 不通、ADC17 落在非 ADC 引脚) |
-| **V0.1** | **当前** | 架构与 V0.0 一致;裁剪 LCD/按键、U17 引脚重排、修复上述 2 处缺陷;固件已迁移 |
-| V0.2 | 规划关注 | 新增关注项:VCAP 电容值未标注、PC13/14/15 子板 LED 3 mA 限流、SPI1 无法双落点 |
-
-### 4.5 平台约束
-
-| 约束 | 内容 |
-|---|---|
-| **CubeMX 生成文件** | `Inc/`、`Src/` 中带 `USER CODE BEGIN/END` 标记;自定义代码**只能**写标记区内 |
-| **生成区外的定制** | 仅限 `Src/iwdg.c` 延后启动、4 个 Fault Handler 实体(`scripts/check_cubemx_survival.py` 审计兜底) |
-| **`osKernelStart` 前** | 禁止任何 FreeRTOS / CMSIS-RTOS API 调用 |
-| **BOM / 编码** | 部分源文件带 BOM(`Drivers/BSP/UI/*`、`App/task/ui_task.c`、`App/cfg/cfg_file.c`、`Lib/lv_conf.h`),被工具改写丢 BOM 会导致 ARMCC 按 CP936 解码、中文字面量编译失败 |
-| **SDIO** | V0.1 主板 SDIO 固定引脚组被 TPAFE/UART 全部占用 → **无 SDIO 能力**(当前设计不受影响,FatFs 卷在 SPI NAND 上) |
-| **新源文件** | 必须双端注册(Keil `.uvprojx` + `simulator/CMakeLists.txt`),否则不参与编译 |
-
-### 4.6 V0.1 硬件能力边界(对产品的硬约束)
-
-下列五条是**硬件事实**,不是软件缺陷;§5 的功能范围与 §9 的"等条件"项均由它们推导:
-
-| # | 约束 | 具体内容 | 产品影响 | 解除条件 |
-|---|---|---|---|---|
-| H1 | **双转换器无共同采样触发** | 8 路电气量分属 TPAFE5160(16 位、8 通道同步、±5 V 双极性)与 STM32 ADC1(12 位、顺序扫描、0~3.3 V 单极性)两片;两片无共同触发,STM32 侧 9 通道一轮约 67 µs | 跨转换器的**相位 / 功率 / 功率因数 / 对称分量 / 三相同时刻判据**一律不成立 → 方向元件、PT/CT 断线、三相过流、零序过流延后 | **V0.2 硬件**:8 路电气量全部接 TPAFE(与备用路对调串联电阻,料号不变,走线级改动);固件只改映射表内容 |
-| H2 | **STM32 侧无中点偏置** | 单极性 0~3.3 V,交流量负半周削顶 | `UB/UC/IB/IC/IN` 无有效值/相量,只能读码值**监视**;104 对应点恒置 IV | V0.2 补偏置 |
-| H3 | **无出口继电器与开入回路** | 无跳闸/告警出口、无硬压板与开入遥信 | 保护动作只体现为**遥信 + 日志 + SOE**;104 遥控 `YK1~4/13/14` 否定确认 | 开入开出独立立项 + 硬件 |
-| H4 | **无本地屏与按键** | 160×160 单色屏仅存在于远端客户端 | UI 以 TCP :7003 推流 + 远端按键回注(§8) | 产品形态即如此,不解除 |
-| H5 | **无 SDIO** | SDIO 固定引脚组被 TPAFE/UART 占用 | FatFs 卷只能落 SPI NAND(当前设计不受影响) | 不解除 |
-
-> **量纲口径**(由 H1/H2 派生):在端子/子板变比确认与两点标定完成前,遥测与保护读数的单位是
-> **ADC 引脚电压**(`eng=0`),不是二次值;此时 `ADC_CAL_F_VALID` 未置位,
-> **保护判据整体停走**(§5.12)。这是刻意设计,不是"保护不动作"的缺陷。
---
## 5. 功能需求
-> 每项功能给出:**需求描述 → 实现要点 → 验收判据**。状态标注:✅ 已实现并验收 / ⚠️ 已实现待专项 / ⬜ 待实现。
+> 每项功能给出:**需求 → 实现要点 → 验收判据**。状态标注:✅ 已实现并验收 / 🔶 部分对齐(含已实现待专项、软件就绪待条件)/ ⬜ 待实现。
### 5.1 网络通信子系统(FR-NET)✅
@@ -736,7 +457,7 @@ sequenceDiagram
- `1k 串联 + 1k 到地` 是**源阻抗匹配、不是分压**:`ADCn` 节点只有 {串阻、滤波电容、转换器引脚},
「1k 到地」接在差分负端(`ADC7_GND` → R32 → AGND),故 AINn↔引脚变比 **1:1**。
- 芯片手册 ±10 V 档的 LSB(305.18 / 1611.3 µV/码)是**另一回事**,不可与本板变比混用。
-- 剩余未知量只有**子板/端子板变比**,因此系数只能推到"µV/码 @ 引脚"(§4.6 量纲口径)。
+- 剩余未知量只有**子板/端子板变比**,因此系数只能推到"µV/码 @ 引脚"(架构硬件档 §2.6 量纲口径)。
- 拓扑图 [`docs/images/ADC前端电路.svg`](../images/ADC前端电路.svg)。
### 5.10 RS-485 采集(FR-RS485)⬜ 冻结
@@ -804,7 +525,7 @@ sequenceDiagram
> 不要把它误读成"元件没动作"。
- **未复刻的元件**(建接口不使能,等条件):三相完整过流(B/C 相)、零序过流、方向/功率类、
- PT/CT 断线、涌流制动、重合闸、故障隔离——原因见 §4.6 的 H1/H2,属 §9.1.1「三相与同期」,
+ PT/CT 断线、涌流制动、重合闸、故障隔离——原因见架构硬件档 §2.6 的 H1/H2,属需求档 §9.1.1「三相与同期」,
解除条件为 V0.2 硬件。
- 判据:`[PROT] elm` 边沿日志与 104 变位一致;未使能元件不误动。
@@ -906,7 +627,7 @@ sequenceDiagram
- 判据:主机侧 174 断言全绿;台架主站往返 STARTDT → 总召四组 → actterm 全通过。
**FR-IEC104-2 遥测上送**
-- 需求:遥测短浮点、系数 1、点号落在 `0x4001` 起的遥测段(段基址见 §2.5.3);支持背景/总召、
+- 需求:遥测短浮点、系数 1、点号落在 `0x4001` 起的遥测段(段基址见 复刻明细 §1);支持背景/总召、
周期(60 s)、死区与品质上送。
- 实现:数据源 = 测频与遥测快照(§5.11);品质直传,`CLIPPED` 映射为 `IV`;死区运行时副本(运行参数段可读写)。
- 判据:总召读回值与 UI 同源一致;死区两拍确认、品质翻转直报;削顶五路恒 IV。
@@ -1144,7 +865,7 @@ ISR 抢占,一抢就撞第 1 条,而后果在屏板侧完全不可见。时
|---|---|---|---|
| **USART1** | PA9 / PA10 | 调试口 + **U5 直连 TTL**(ST_TX0/RX0),**MCU 直出、不经任何收发器** | ✅ **屏板链路**(700 kbaud) |
| **USART2** | PD5 / PD6 | **RS232#3**(U10 隔离 → U13 TPT3232E → CN1) | 已初始化、固件未占用(日志最终选了 UART5) |
-| UART5 | PC12 / PD2 | **RS232#1**(U9 隔离 → U13 → CN1) | ✅ **调试日志**(115200,已迁移、台架在用;端子见 docs/子系统设计/屏板链路设计说明.md §3.2) |
+| UART5 | PC12 / PD2 | **RS232#1**(U9 隔离 → U13 → CN1) | ✅ **调试日志**(115200,已迁移、台架在用;端子见 `docs/子系统设计/屏板链路设计说明.md` §3.2) |
| UART4 | PC10 / PC11,DE = **PA15** | **RS485#4**(U11 隔离 → U15 → A/B → CN1) | 冻结簇,本项不碰 |
| USART3 | PB10 / PB11 | U5 直连 TTL(ST_TX2/RX2) | 空闲 |
@@ -1327,7 +1048,7 @@ for (i = 1; i < LED_COUNT; i++) /* LE
> `CN_RDISP_LCD_TYPE` + 12 B RGB `CN_RGB_RED/GREEN/BLUE`),而这 13 B 在**参考自己的构建里就是死字段**:
> `RemoDispBus.h:46` 的 `CN_RDISP_TYPE_MONO = TRUE` → 链路显存本身就是 1 bpp;三个 RGB 值是编译期
> 常量(每次召唤发同样的 12 B);`RDisp_LcdColor_To_Mono()` 对 `CN_MODE_GREY_MONO` 直接 `return TRUE`,
-> RGB565 分支永不进入(§2.4.1)。本产品屏板同为单色 1 bpp(`DTU-LCD` 的 `ScreenPrintf()` 只吃 1 bpp
+> RGB565 分支永不进入(§3.1.1)。本产品屏板同为单色 1 bpp(`DTU-LCD` 的 `ScreenPrintf()` 只吃 1 bpp
> 点阵),这 13 B **既无接收方也无语义** → **整段删除,不对齐多色协议**:29 − 13 = **16 B**。
**键值是位掩码,不是枚举**——可组合下发:`CN_KEY_F1|CN_KEY_ENT = 0x24`(`Key.c` 物理键号 `10` 即此值)。
@@ -1481,7 +1202,7 @@ for (i = 1; i < LED_COUNT; i++) /* LE

> **口径**:本节按**参考源码**(`HMI/RemoeDisp/RemoDispBus.c`)给线上格式;本产品当前实现与该口径的
-> 逐项差异、以及为什么会有差异,见 §5.16.9。**以参考为准**,差异项按 §9.13 排期收敛。
+> 逐项差异、以及为什么会有差异,见 §5.16.9。**以参考为准**,差异项按 `参考产品复刻明细.md` §11 排期收敛。
>
> 本节只讲**网络**通道(TCP 7003)。**串口屏板通道不走本协议**——它是 RS-485 上的
> **Modbus RTU 风格裸二进制帧**(6 B 召唤 + **4208 B** 图像应答,CRC-16/MODBUS **低字节在前**),
@@ -1572,7 +1293,7 @@ mac=00:00:00:00:00:00
| 项 | 值 |
|---|---|
-| 端口 | UART5(RS232#1:PC12 TX / PD2 RX,经 U9 隔离 → U13 → CN1 端子),115200 8N1;台架端子接法见 docs/子系统设计/屏板链路设计说明.md §3.2 |
+| 端口 | UART5(RS232#1:PC12 TX / PD2 RX,经 U9 隔离 → U13 → CN1 端子),115200 8N1;台架端子接法见 `docs/子系统设计/屏板链路设计说明.md` §3.2 |
| 用途 | printf 日志 + `@test` 采集通道 |
| 配置源 | `.serialtest/config.json`(单一配置源) |
| 工具 | 仓库内置 Python 串口助手(`.dsh/skills/serial-assistant/`,常驻 daemon + CLI) |
@@ -1610,7 +1331,7 @@ mac=00:00:00:00:00:00
> **权威口径**:验收以《检测平台配电终端送检要求(点表)》为准;本表是 V0.1 实现摘要,
> 逐点细节与未实现项见 [`docs/子系统设计/IEC104上行设计说明.md`](../子系统设计/IEC104上行设计说明.md) §3。
-> **段基址与参考产品逐字对齐**(8 段全表见 §2.5.3):遥信 `0x0001`、保护 `0x1001`、遥测 `0x4001`、
+> **段基址与参考产品逐字对齐**(8 段全表见 复刻明细 §1):遥信 `0x0001`、保护 `0x1001`、遥测 `0x4001`、
> 参数 `0x5001`、遥控 `0x6001`、设定 `0x6201`、电能 `0x6401`、步位置 `0x6601`。
> **点表规模是当前最大差距**:本产品 9 遥测 / 33 遥信 / 2 遥控,参考产品 31 遥测 / 138 开入 / 31 开出。
@@ -1649,11 +1370,14 @@ mac=00:00:00:00:00:00
> **与参考的差额**:参考 104 定值映射 **107 项**占 `0x8820~0x8891`(8 个空洞),
> 底层定值表 **249 项 / 23 单元**。本产品 40 项,缺的是重合闸(16)、电压时间型自愈(17)、
-> 同期(13)、看门狗(63)、遥测越限(10)等整单元(§2.5.4)。
+> 同期(13)、看门狗(63)、遥测越限(10)等整单元(复刻明细 §1)。
**链路参数**:k=12 / w=8 / t1=15 s / t2=10 s / t3=20 s;IOA 3 字节、公共地址 2 字节、传送原因 2 字节;
公共地址与端口可配(`[comm]` 段,工厂默认 1 / 2404,改后需重启生效)。
+---
+
+
---
## 7. 非功能需求
@@ -1787,6 +1511,9 @@ pre-commit run --all-files
| 104 上行 | **无应用层鉴权**(标准 104 本身不带认证):安全边界 = 现场同网段部署 + 单连接语义 + 首到优先。主站 IP 白名单**不实现**(单 socket 上"拒绝"= close + 重听,可被端口扫描打成 SPI 风暴,且配错即锁死真主站;属协议语义决定,非范围裁剪,见 §9 卷首)→ 需冗余/白名单时随 net 层立项 |
| 配置面 | 配置与定值只能经 FTP(需口令)或 104(同网段)改写;UI 侧修改需修改密码。**本地无串口配置命令通道** |
+---
+
+
---
## 8. UI 规格
@@ -1891,11 +1618,13 @@ docs/任务规划/UI补齐.md §5);原「当前执行 6 项」(记录 5
---
-## 9. 复刻进度与路线图
+---
-> **口径**:本章条目全部来自 §2.5.2 的 🔶 / ⬜ 行——即"参考源码有、本产品还没做或只做了一部分"。
+## 9. 缺口清单与推进顺序
+
+> **口径**:本章条目全部来自 复刻明细 §1.2 的 🔶 / ⬜ 行——即"参考源码有、本产品还没做或只做了一部分"。
> **"不做"一词在本章不出现**:1:1 复刻口径下没有主动放弃的能力,只有尚未排期的能力。
-> 唯二例外是 §2.5.7 标为"不适用"的两条(归一化值上送、主站 IP 白名单),那是**协议语义决定**,
+> 唯二例外是 复刻明细 §1.7 标为"不适用"的两条(归一化值上送、主站 IP 白名单),那是**协议语义决定**,
> 不是范围裁剪。
>
> **命名**:本节条目一律用**语义短语**(编号规范 P-8 语义优先),不发字母+数字号——
@@ -1905,12 +1634,12 @@ docs/任务规划/UI补齐.md §5);原「当前执行 6 项」(记录 5
按**缺口性质**分两类:**阻塞型**(缺外部资源或硬件,排期无用)与**规模型**(无外部依赖,只等排期)。
-> 本节是**清单**;**§9.4~§9.12 是逐项明细**——参考源码到底有哪几项、本产品有哪几项、
+> 本节是**清单**;**逐项明细在 [`参考产品复刻明细.md`](参考产品复刻明细.md) §2~§10**——参考源码到底有哪几项、本产品有哪几项、
> 差额具体落在哪个定值 / 哪个点 / 哪个模块上、以及"怎么算做完了"。排期与估算以明细为准。
#### 9.1.1 阻塞型(等外部条件,排期不能解决)
-| 条目 | 对应 §2.5.2 | 现状 | 缺的是 | 解除条件 |
+| 条目 | 对应 复刻明细 §1.2 | 现状 | 缺的是 | 解除条件 |
|---|---|---|---|---|
| **标定闭锁** | 1~3 | 9 个元件、定值、闭锁链、SOE、104 上送全部就绪,但 `ADC_CAL_F_VALID` 未置位 → 判据整体停走 | **外部资源**:子板/端子板变比 + 标准源 | 端子变比确认 → 8 通道两点标定 → VALID 置位(届时自动解卡,无需改代码) |
| **出口与开入** | 7、8 | 无硬件;保护动作只体现为遥信 + SOE;遥控开关量否定确认 | **硬件 + 立项**:出口继电器、开入回路、回读自检 | 开入开出作为独立模块立项(不可移植项 X3 解除) |
@@ -1921,7 +1650,7 @@ docs/任务规划/UI补齐.md §5);原「当前执行 6 项」(记录 5
#### 9.1.2 规模型(无外部依赖,只等排期)
-| 条目 | 对应 §2.5.2 | 参考 | 现状 | 差额 |
+| 条目 | 对应 复刻明细 §1.2 | 参考 | 现状 | 差额 |
|---|---|---|---|---|
| **定值铺开** | 1、2 | 249 项 / 23 单元 | 40 项(覆盖参考 35 + 本地 5)/ 5 组 | +214 项 / +18 单元 |
| **映射铺开** | 3 | 107 项 `0x8820~0x8891` | 40 项局部 | +67 项 |
@@ -1936,7 +1665,7 @@ docs/任务规划/UI补齐.md §5);原「当前执行 6 项」(记录 5
| **SNTP 对时** | 17 | 参考对时走 SNTP | 私有 TCP 8888 + 104 `C_CS` | SNTP 客户端 |
| **固有参数** | 1 | `8001H~800AH` 字符串类参数 | 未实现(无法短浮点上送) | 随送检点表设计 |
| **遥测增强** | 4、5 | k=1~9 谐波方和根 + 4 点平均 | 仅基波轨 | 谐波 / 等周波调频 / 零序自产外接切换 三条算法轨 |
-| **屏板链路对齐** | 20 | **串口屏板通道**(**700000 8N1 / USART1 TTL 直连、无 DE**,帧 A 6 B 召唤、帧 B **4208 B** 应答:显存 3200 B + **状态灯 4 B 位掩码** + 4 B info)+ **7003 四命令**(INIT **16 B**,单色口径)+ 续传 / 拒绝握手 / 链路监视 / F1·F2 | **串口通道已交付**(4208 B 应答 / 状态灯掩码 / 键上行 / 双出口并发,屏板链路设计说明 §9.1);7003 四命令(INIT **8 B**);无续传、无 `bNeedFlash` 拒绝、无 1 分钟监视、键值 6 个 | 7003 报文口径 6 项(§9.13 第 2~9 条);串口侧验收尾巴见屏板链路设计说明 §9.2 |
+| **屏板链路对齐** | 20 | **串口屏板通道**(**700000 8N1 / USART1 TTL 直连、无 DE**,帧 A 6 B 召唤、帧 B **4208 B** 应答:显存 3200 B + **状态灯 4 B 位掩码** + 4 B info)+ **7003 四命令**(INIT **16 B**,单色口径)+ 续传 / 拒绝握手 / 链路监视 / F1·F2 | **串口通道已交付**(4208 B 应答 / 状态灯掩码 / 键上行 / 双出口并发,屏板链路设计说明 §9.1);7003 四命令(INIT **8 B**);无续传、无 `bNeedFlash` 拒绝、无 1 分钟监视、键值 6 个 | 7003 报文口径 6 项(`参考产品复刻明细.md` §11 第 2~9 条);串口侧验收尾巴见屏板链路设计说明 §9.2 |
> **一句话**:**「标定闭锁」是唯一"再排期也没用"的缺口**(等标准源);「出口与开入」「三相与同期」
> 「电度计量」等 V0.2 硬件;「对下采集」等用户决策;其余规模型条目**全部可在现有硬件上推进**,
@@ -1977,614 +1706,7 @@ docs/任务规划/UI补齐.md §5);原「当前执行 6 项」(记录 5
| `rs485_task.c` | `App/task/`(未建任务、白名单登记) | 唯一的结构白名单缺口:RS-485 整簇冻结期间**刻意不接线**,随该簇一并出白名单 |
| `DTU_BENCH` | 构建宏(`protect_task.c` 等) | 台架构建下允许保护判据在未标定时动作(仅测试用);产品构建(`#ifndef DTU_BENCH`)下保护闭锁 |
-### 9.4 定值复刻明细(参考 249 项 → 本产品 40 项)
-
-参考定值表的每一行固定 **21 个字段**:标识 ×2 / 类型(数值 | 枚举)/ 所属单元 / 单位组 / 值类型 /
-最小值 / 最大值 / 步长 / 两个标志 / 上下限原始值 ×3(`0xAA` / `0xAAAA` / `0xFF`)/ 104 地址 /
-单位 ×2 / 小数位 / 长度 / 显示名 / 结束标记。
-本产品对应物是 `App/algo/prot_set.h` 的 `PS_*` 枚举(`PS_ID_COUNT = 40`)。
-
-**40 项的去向必须能对上账**,否则"还差多少"无从谈起:
-
-| 去向 | 项数 |
-|---|---|
-| 覆盖参考定值项 | **35** |
-| 本产品本地扩展项(参考无对应行) | **5**(`PS_RET_OVER` / `PS_RET_UNDER` 返回系数,`PS_RET_OF` / `PS_RET_UF` 频率返回系数,`PS_GLOBAL_EN` 全局软压板) |
-| **合计** | **40** |
-
-因此**定值差额 = 249 − 35 = 214 项**。
-
-#### 9.4.1 23 个定值单元逐单元差额
-
-| 单元 | 语义 | 参考项数 | 本产品覆盖 | 差额 |
-|---|---|---|---|---|
-| `WatchDog` | 过流三段 / 零序三段 / 过负荷 / 重载 / 过载 / 过频 / 低频 | 63 | 22 | **41** |
-| `SYS3` | 系统参数(零飘、死区、变比、防抖、脉宽、FA 模式…) | 45 | 0 | **45** |
-| `VolTimeRecv` | 电压时间型馈线自动化(失电分闸 / 得电合闸 / 联络) | 17 | 0 | **17** |
-| `AutoReCls` | 重合闸 | 16 | 0 | **16** |
-| `SYN` | 同期(FTU 型) | 13 | 0 | **13** |
-| `OverCurI0` | 接地告警(小电流接地选线) | 13 | 0 | **13** |
-| `VolPro` | 电压保护(失压 / 过压 / 零序过压) | 13 | 9 | 4 |
-| `WAVESTART` | 录波启动 | 12 | 0 | **12** |
-| `MeaLimit` | 遥测越限 | 10 | 0 | **10** |
-| `OverCurSpeed` | 过流 / 零序后加速 | 8 | 0 | **8** |
-| `SYS1` | PT 参数 | 6 | 2 | 4 |
-| `SYS2` | CT 参数 | 4 | 2 | 2 |
-| `Auto_FG` | 延时自动分闸 | 4 | 0 | 4 |
-| `Auto_HH` | 延时自动合闸(电池活化) | 4 | 0 | 4 |
-| `InRush` | 励磁涌流闭锁 | 3 | 0 | 3 |
-| `OverCur` | 短路告警 | 3 | 0 | 3 |
-| `VolQuaRate` | 电压合格率 | 3 | 0 | 3 |
-| `FZDDL` | 非遮断电流闭锁 | 3 | 0 | 3 |
-| `BHKO` | 保护出口展宽 | 2 | 0 | 2 |
-| `MeaRecord` | 遥测记录周期 | 2 | 0 | 2 |
-| `PowerSet` | 功率电压组 | 2 | 0 | 2 |
-| `PTBreak` | PT / 控回断线告警 | 2 | 0 | 2 |
-| `AutoCtrl` | 自动复归 | 1 | 0 | 1 |
-| **合计** | | **249** | **35** | **214** |
-
-> 单元名 `WatchDog` 有误导性:它装的是**全部保护元件的动作定值**(过流 / 零序 / 负荷 / 频率),
-> 不是看门狗参数。移植时不要按名字去找"看门狗定值"。
-
-#### 9.4.2 已覆盖单元的逐项对照(35 项)
-
-**过流三段:参考 24 项,本产品 12 项**(每段缺 4 项,共缺 12)
-
-| 参考项(Ⅰ/Ⅱ/Ⅲ 段各一份) | 本产品 | 说明 |
-|---|---|---|
-| 过流 n 段投入 | `PS_OCn_EN` | ✅ |
-| 过流 n 段跳闸投入 | `PS_OCn_TRIP` | ✅ 语义 = 0 告警 / 1 跳闸 |
-| 过流 n 段定值 | `PS_OCn_CUR` | ✅ 二次值 A |
-| 过流 n 段延时 | `PS_OCn_DLY` | ✅ ms(参考为 S,换算在整定入口) |
-| 过流 n 段方向投入 | — | ❌ 无方向元件(`DirCell` / `PowDirJudge` 未复刻) |
-| 过流 n 段低压投入 | — | ❌ 无复压闭锁(`bNOVOpen` 无来源) |
-| 过流 n 段告警投入 | — | ❌ 参考把"告警投退"与"跳闸投退"拆成两项,本产品只有一项 |
-| 过流 n 段低压定值 | — | ❌ 同上 |
-
-> **这一处差额最容易被低估**:本产品的三段过流是"简化版三段",参考的三段每段还带
-> **方向 / 低压 / 告警** 三个独立开关和一个低压定值。缺这四项时,三段过流只能做无方向、
-> 无复压闭锁的纯过流保护——在环网或双电源线路上会误动。
-
-**零序过流三段:参考 18 项,本产品 0 项**
-
-参考在 `WatchDog` 内另有完整的零序三段(每段 6 项:投退 / 方向 / 告警投入 / 跳闸 / 定值 / 时限)。
-本产品 `PS_3U0_*` 三项是**零序过压**(属 `VolPro`),**不是零序过流**——两者不可混为一谈:
-零序过流看 `3I0` 幅值,零序过压看 `3U0` 幅值。因此零序过流保护目前**完全没有定值载体**,
-`OverCurrent_I0` 元件也无从判据。
-
-**过负荷 / 重载 / 过载:参考 12 项,本产品 4 项**
-
-| 参考项组 | 本产品 | 差额 |
-|---|---|---|
-| 过负荷报警(投退 / 跳闸 / 定值 / 时限) | `PS_OL_*` 4 项 | ✅ 齐 |
-| 重载报警(同上 4 项) | — | ❌ 缺 4 |
-| 过载报警(同上 4 项) | — | ❌ 缺 4 |
-
-> 参考把"过负荷 / 重载 / 过载"分成三级(默认 150 A / 70 A / 100 A 步长,时限 9000 s / 0 / 0),
-> 对应事件 435 / 436 / 437。本产品只有一级过负荷。三级是**同一判据不同门槛**,
-> 复刻成本低(元件框架已具备),但需先补 `OverLoad` 的三个实例与三条事件映射。
-
-**过频 / 低频:参考 8 项,本产品 6 项 + 2 本地项**
-
-| 参考项 | 本产品 | 说明 |
-|---|---|---|
-| 过频 / 低频 保护投退 | `PS_OF_EN` / `PS_UF_EN` | ✅ |
-| 过频 / 低频 保护定值 | `PS_OF_HZ` / `PS_UF_HZ` | ✅ 参考单位 HZ 存 5000~5500(0.01 Hz),本产品存 Hz 浮点 |
-| 过频 / 低频 保护时限 | `PS_OF_DLY` / `PS_UF_DLY` | ✅ |
-| 过频 / 低频 **跳闸**投退 | — | ❌ 缺 2:参考区分"保护投入"与"跳闸投入",本产品只有前者 |
-
-**电压保护:参考 13 项,本产品 9 项**
-
-| 参考项 | 本产品 | 说明 |
-|---|---|---|
-| 失压保护投退 / 定值 / 时限 | `PS_UV_EN` / `PS_UV_VOL` / `PS_UV_DLY` | ✅ |
-| 过压保护投退 / 定值 / 时限 | `PS_OV_EN` / `PS_OV_VOL` / `PS_OV_DLY` | ✅ |
-| 零序过压投退 / 定值 / 时限 | `PS_3U0_EN` / `PS_3U0_VOL` / `PS_3U0_DLY` | ✅ |
-| 失压 / 过压 / 零压 **跳闸**投退(3 项) | — | ❌ 缺 3 |
-| 零压 **告警**投退(1 项) | — | ❌ 缺 1 |
-
-**PT / CT 参数:参考 10 项,本产品 4 项**
-
-| 参考项 | 本产品 | 说明 |
-|---|---|---|
-| 母线一次额定(kV) | `PS_PT_PRI` | ✅ 本产品存 V |
-| 母线二次额定(线)(V) | `PS_PT_SEC` | ✅ |
-| 额定 TA 一次值(A) | `PS_CT_PRI` | ✅ |
-| 额定 TA 二次值(A) | `PS_CT_SEC` | ✅ |
-| 母线二次额定(相)(V) | — | ❌ 缺:线 / 相两种二次额定的换算关系需显式给出 |
-| 零序一次额定(kV) | — | ❌ 缺 |
-| 零序二次额定(V) | — | ❌ 缺 |
-| 零序一次额定(A) | — | ❌ 缺 |
-| 零序二次额定(A) | — | ❌ 缺 |
-| PT 接入数目(1~3) | — | ❌ 缺:决定用线电压还是相电压作判据源 |
-
-#### 9.4.3 完全未覆盖单元逐项清单(163 项)
-
-214 项差额中,**51 项**落在 §9.4.2 已部分覆盖的四个单元里(过流 12 / 零序 18 / 重载与过载 8 /
-频率 2 / 电压 4 / PT·CT 6 / 备用控制字 1),余下 **163 项**落在下面这些**一项都没有**的单元里。
-逐项列出以便排期时按"整单元"认领,不要拆散。
-
-**系统参数 `SYS3`(45 项)**——零飘门槛 10 项:额定电压零飘门槛、额定电流零飘门槛、直流电压零飘、
-功率零飘、频率零飘、功率因数零飘、相角零飘门槛、备用 ×4;死区 7 项:电流死区、电压死区、
-直流电压死区、功率死区、频率死区、功率因数死区、相角死区;开入开出 4 项:开入防抖(10~60000 ms)、
-分闸脉宽、合闸脉宽、开入手动分合;变比 5 项:PT 变比、相 CT 变比、零序 CT 变比、功率变比、电量变比;
-其余 19 项:开关类型、故障遥信保持时间、功率置负、单项接地选线投入、单相接地跳闸时间、FA 模式、
-对时切换长延时、断线告警确认时间、事故总判小电流接地告警、加速段保护开放时间、
-重合闸检有压等待时间、连续分闸时间、分闸次数、备用参数 01~08。
-
-> 本产品的死区落在**运行参数段**(`0x8030~0x8038` 九点,RAM 副本 + 104 可写),
-> 变比落在 `prot_set` 的 PT/CT 四项。**语义已覆盖、载体不同**——复刻 `SYS3` 时是把这
-> 两类合并进定值表,不是重新实现。
-
-**电压时间型自愈 `VolTimeRecv`(17 项)**:就地 FA 模式、LS(0/1,1 = 联络)、
-失电分闸投退、失电分闸时限(0~100000 s)、得电合闸投退、X 时间(1~100 s,默认 7)、
-故障电流检测、故障电流定值(1~10000 A)、Y 时间(1~100 s,默认 5)、联络开关合闸、
-联络充电时限(0~1800 s)、联络合闸时限(0~300 s)、正方向选择、残压定值(0~300 V)、
-残压判定时限、停电时间(1~10 s)、人工闭锁。
-
-> 这是**馈线自动化(FA)的核心**:失电分闸 → 得电合闸 → 联络转供。对应元件
-> `NoVolTrip` / `HaveVolCls` / `ConnectBrkCls` / `FaultIsola` / `FaultRecov` 五个模块。
-> 无开入(开关位置)与出口(分合闸)时**无法闭环**,属 X3 依赖项。
-
-**重合闸 `AutoReCls`(16 项)**:重合闸投退、充电时间(0~100000 s)、重合闸次数(0~3)、
-一次 / 二次 / 三次重合闸时间(0~60000 s)、重合闸闭锁时间(0~9900 s)、整组复归时间、
-大电流闭锁投退、大电流闭锁定值、重合闸检同期、重合闸检无压、同期检无压定值(0~15000 V)、
-同期检角差定值(1~30°)、过流禁止重合闸、零序禁止重合闸。
-
-> 参考支持**三次重合**且每次时间独立可整定,充电时间与整组复归时间分离——这三项
-> 是"重合闸能不能用"的关键(无充电时间 = 每次跳闸都立即重合,会连击)。
-> 依赖出口(合闸)与开入(开关位置),属 X3 依赖项。
-
-**同期 `SYN`(13 项,FTU 型专属)**:检无压投退、检同期投退、频差 / 角差 / 压差 / 滑差闭锁投退
-(4 项)、检无压定值(1000~9999 V)、检频差定值(0~200,0.01 Hz)、检角差定值(1~180°)、
-检压差定值(0~9999 V)、检频率滑差值(0~200 Hz/s)、开关合闸时限(0~200 s)、整组复归时间。
-
-> 需**两路电压同刻**(母线侧 + 线路侧)才能算角差与频差——本产品 V0.1 只有一个转换器的
-> 电压通道,属 X3 / H1 依赖项。
-
-**录波启动 `WAVESTART`(12 项)**:电流启动投退 / 定值(0~10000 A)、低压启动投退 / 定值
-(0~10000 V)、零压启动投退 / 定值(0~30000 V)、零流启动投退 / 定值(0~1000 A)、
-零流突变投退 / 定值(0~1000 A)、录波启动延时、保护启动录波。
-
-> 录波启动是**独立于保护判据的触发源**:即使保护不动作,只要越启动值也要录波。
-> 本产品无录波子系统,这 12 项无处落地(见 §9.9)。
-
-**遥测越限 `MeaLimit`(10 项)**:有压鉴别投退 / 线路有压定值(0~300 V)、无压鉴别投退 /
-线路无压定值(0~300 V)、线路有压时限(2~100000 s)、电压越上限 / 越下限(0~100000 V)、
-电流越上限(0~10000 A)、越上限延时 / 越下限延时。
-
-> 越限记录(`OVER` 队列,128 条)的判据来源。本产品无越限记录类,故这 10 项也无载体。
-
-**过流后加速 `OverCurSpeed`(8 项)**:后加速投退、线路 1 前加速投退、过流后加速电流值
-(1~10000 A)、过流后加速时限(0~10000 s)、零序后加速投退、线路 1 前加速投退(重复项,
-参考源码如此)、零序后加速电流值(1~1000 A)、零序后加速时限。
-
-**接地告警 `OverCurI0`(13 项)**:线路接地告警投退、零序电流反极性、零序电压反极性、
-接地备用 02、接地告警投退、接地跳闸投退、接地方向投退、接地定值(0~10000 A)、接地时限、
-接地跳闸时限(0~600 s)、零压启动定值(1~10000 V)、接地重合投退、接地后加速投退。
-
-> **反极性**两项是现场接线纠错开关(CT / PT 装反时不必改线,改定值即可),
-> 属"现场可维护性"需求,不是可选项。
-
-**其余小单元(合计 29 项)**:励磁涌流闭锁 3(闭锁投退、涌流制动系数 1~100、闭锁复归时间);
-短路告警 3(投退 / 时限 / 线路 01 短路电流定值);电压合格率 3(上限 / 下限定值 0~200 %、周期类型 0~4);
-非遮断电流闭锁 3(电流闭锁投退、停电跳闸投退、非遮断电流值 1~10000 A);
-出口展宽 2(跳闸出口时间、合闸出口时间,1~100000 ms);
-遥测记录 2(遥测记录周期 0~2880、极值记录周期 0~360);
-功率电压组 2(1~4 组);PT 断线 2(断线告警、控回断线告警);自动复归 1(自动复归投退);
-延时自动分闸 4(延时复归投退、2:时 1:分 0:秒、延时复归时限 ×2);
-延时自动合闸 4(自动活化投退、2:分 1:时 0:日、自动活化周期 0~360、自动活化时限 0~23000 s)。
-
----
-
-### 9.5 遥测复刻明细(参考 31 点 → 本产品 9 点)
-
-参考 `g_tYcIndexTab` 的 31 点是**按"两回线 × 三相 + 线电压 + 零序 + 功率"组织的完整电气量集**。
-本产品 9 点(`0x4011~0x4018`、`0x401D`)只覆盖第一回线的相量与频率。
-
-| # | 参考遥测 | 参考枚举 | 本产品 | 差额原因 |
-|---|---|---|---|---|
-| 1 | 1 回 A 相电流 | `EN_YCMEA_IA01` | `0x4015` ✅ | |
-| 2 | 1 回 B 相电流 | `EN_YCMEA_IB01` | `0x4016` ✅ | 削顶 → 恒 IV |
-| 3 | 1 回 C 相电流 | `EN_YCMEA_IC01` | `0x4017` ✅ | 削顶 → 恒 IV |
-| 4 | 2 回 A 相电流 | `EN_YCMEA_IA02` | — | ❌ 无第二回线 |
-| 5 | 2 回 B 相电流 | `EN_YCMEA_IB02` | — | ❌ |
-| 6 | 2 回 C 相电流 | `EN_YCMEA_IC02` | — | ❌ |
-| 7 | 1 回 A 相电压 | `EN_YCMEA_UA1` | `0x4011` ✅ | |
-| 8 | 1 回 B 相电压 | `EN_YCMEA_UB1` | `0x4012` ✅ | 削顶 → 恒 IV |
-| 9 | 1 回 C 相电压 | `EN_YCMEA_UC1` | `0x4013` ✅ | 削顶 → 恒 IV |
-| 10 | 2 回 A 相电压 | `EN_YCMEA_UA2` | — | ❌ |
-| 11 | 2 回 B 相电压 | `EN_YCMEA_UB2` | — | ❌ |
-| 12 | 2 回 C 相电压 | `EN_YCMEA_UC2` | — | ❌ |
-| 13 | 1 回 AB 线电压 | `EN_YCMEA_UAB1` | — | ❌ 需两相相量之差 |
-| 14 | 1 回 BC 线电压 | `EN_YCMEA_UBC1` | — | ❌ |
-| 15 | 1 回 CA 线电压 | `EN_YCMEA_UCA1` | — | ❌ |
-| 16 | 2 回 AB 线电压 | `EN_YCMEA_UAB2` | — | ❌ |
-| 17 | 2 回 BC 线电压 | `EN_YCMEA_UBC2` | — | ❌ |
-| 18 | 2 回 CA 线电压 | `EN_YCMEA_UCA2` | — | ❌ |
-| 19 | 1 回零序电流 | `EN_YCMEA_3I01` | `0x4018` ✅ | 近似对齐(本产品为外部零序通道) |
-| 20 | 1 回零序电压 | `EN_YCMEA_3U01` | `0x4014` ✅ | 近似对齐 |
-| 21 | 2 回零序电压 | `EN_YCMEA_3U02` | — | ❌ |
-| 22 | 频率 | `EN_YCMEA_FR1` | `0x401D` ✅ | |
-| 23 | 直流 1 | `EN_YCMEA_DC_01` | — | ❌ 无直流采样通道 |
-| 24 | 直流 2 | `EN_YCMEA_DC_02` | — | ❌ |
-| 25 | A 相有功 | `EN_YCMEA_PA_1` | — | ❌ 需跨转换器同刻(H1) |
-| 26 | B 相有功 | `EN_YCMEA_PB_1` | — | ❌ |
-| 27 | C 相有功 | `EN_YCMEA_PC_1` | — | ❌ |
-| 28 | 总有功 | `EN_YCMEA_P_1` | — | ❌ |
-| 29 | 总无功 | `EN_YCMEA_Q_1` | — | ❌ |
-| 30 | 总视在 | `EN_YCMEA_S_1` | — | ❌ |
-| 31 | 功率因数 | `EN_YCMEA_COS_1` | — | ❌ |
-
-**缺的 22 点按依赖分三批**:
-
-| 批次 | 点数 | 内容 | 依赖 |
-|---|---|---|---|
-| 线电压与功率 | 13 | 6 线电压 + 7 功率/功率因数 | **H1**:电压在 TPAFE、电流在 STM32 ADC1,无共同触发,功率的 `U×I` 需同刻 |
-| 第二回线 | 7 | 2 回 6 相量 + `3U02` | 采样通道数(V0.2 硬件) |
-| 直流 | 2 | `DC_01` / `DC_02` | 无直流采样通道 |
-
-> 线电压本身**不一定要等 H1**:`Uab = Ua − Ub` 只需同一转换器内的两相相量,
-> 若两相都落在 TPAFE 侧即可算。当前 `Ub`/`Uc` 削顶(在 STM32 侧),所以连带算不出。
-> **先解决"三相电压全落 TPAFE"这一件事,能一次解锁 6 个线电压点**。
-
-**遥测模型 `g_tAnaModelTab`(35 行)**:参考为每个遥测点定义死区、变比、系数、越限档等属性行,
-是"点表 + 整定"的合体。本产品的对应物拆成了三处:`iec104_pts.c` 的 YC 表(地址 + 死区系数)、
-`run_par.c` 的死区九点、`adc_cal.c` 的 k/b。复刻模型表 = 把这三处收敛成一张可整定的表。
-
-**电度 `g_tYmIndexTab`(8 种,本产品 0)**:正向有功 `Pt1`、正向无功 `Qt1`、Q1 象限、Q4 象限、
-反向有功 `Pt0`、反向无功 `Qt0`、Q2 象限、Q3 象限。地址段 `0x6401~0x6600`。
-电度 = 功率对时间积分,**与功率同批解锁**(同一 H1 依赖)。
-
----
-
-### 9.6 开入 / 开出复刻明细(138 + 31 → 本产品 0)
-
-参考把"开入"分成四类,本产品**一个都没有**(无硬件,不可移植项 X3)。
-
-**开入 138 点的构成**:
-
-| 类别 | 点数 | 含义 |
-|---|---|---|
-| 软遥信 `EN_KI_SOFTYX_*` | **104** | 由保护元件/逻辑产生的内部状态,不占物理端子(如"过流Ⅰ段动作""重合闸充电完成""FA 投入") |
-| 硬件开入 `EN_KI_*` / `EN_KIA_*` | **27** | 物理端子:开关合位 / 分位 / 未储能 / 就地远方 / 接地位置 / 隔离位置 / 停用重合闸 / 保护投入 / 检修压板 / 远方信号 / 就地 FTU 手合手分 / 电源输入 / 活化状态 / 电池欠压 / 活化投入 |
-| 双点遥信 `EN_KI_TWIN_YX_*` | **6** | 开关位置用双点表达(00 中间态 / 01 分 / 10 合 / 11 无效) |
-| 多态遥信 `EN_KI_INT8U_*` | **1** | 8 位状态量(如"设备状态"枚举) |
-
-> **104 点 ≠ 104 个端子**。真正要接线的是 27 个硬件开入;104 个软遥信是**元件输出**,
-> 只要元件复刻出来就自然存在。这个区分决定了工作量估算:不是"买 138 路开入板",
-> 而是"27 路端子 + 104 个元件状态映射"。
-
-**开出 31 点的构成**:
-
-| 类别 | 点数 | 明细 |
-|---|---|---|
-| 出口类 | **11** | 保跳 1(`BH_TZ1`)、保合 1(`BH_HZ1`)、遥分 1(`YT01`)、遥合 1(`YH01`)、遥分 2(`YT02`)、遥合 2(`YH02`)、电池活化(`DCHH`)、活化退出(`DCHH_Esc`)、信号复归(`FG`)、开入变位(`KICHANGE`)、录波启动(`WAVE_START`) |
-| 信号类 | **20** | 事故信号 `SignTV`、运行 `SignRun`、通信中断 `SignCOMM`、硬件故障 `SignHW`、储能 `SignCN`、电池欠压 `SignBatQY`、失电 `SignSD`、过负荷 `SignGL`、接地 `SignJD`、闭锁 `SignBM`、备用 `SignBS`、自检 `SignCHK`、重合 `SignCH`、备用 3 个 `SignBAK1~3`、告警 `SignALM`、保护动作 `SignPro`、就地 FA `SignJDFA`、集中 FA `SignJZFA` |
-
-> 本产品当前**保护动作只体现为遥信 + SOE**,没有任何物理出口。这在"保护测控装置"的
-> 定义里是硬缺口:保护判据做得再准,不跳闸就等于没保护。X3 解除前,`YX` 里的
-> 动作类遥信必须**如实标 IV**,不能让主站误以为已跳闸。
-
----
-
-### 9.7 动作事件复刻明细(参考 33 条 → 本产品 9 条)
-
-参考 `g_tActRecTab` 的 33 条动作事件编号 **421~453**,是"保护动作 → 事件码 → 记录 → 上送"的
-中间层。本产品用 `App/log/sys_log.h` 的七类记录 + SOE,**没有事件码表**。
-
-| 事件码 | 参考事件 | 本产品 | 说明 |
-|---|---|---|---|
-| 421 | 线路励磁涌流闭锁 | ❌ | `InRushCur` 未复刻 |
-| 422 | 线路Ⅰ段过流保护动作 | ✅ | `PS_OC1_*` |
-| 423 | 线路Ⅱ段过流保护动作 | ✅ | `PS_OC2_*` |
-| 424 | 线路Ⅲ段过流保护动作 | ✅ | `PS_OC3_*` |
-| 425 | 线路零序Ⅰ段过流保护动作 | ❌ | 无零序过流定值载体 |
-| 426 | 线路零序Ⅱ段过流保护动作 | ❌ | 同上 |
-| 427 | 线路零序Ⅲ段过流保护动作 | ❌ | 同上 |
-| 428 | 线路后加速保护动作(过流) | ❌ | `OverCurrent_SpeedUp` 未复刻 |
-| 429 | 线路后加速保护动作(零序) | ❌ | `OverCurrentI0_SpeedUp` 未复刻 |
-| 430 | 零序过压保护动作 | ✅ | `PS_3U0_*` |
-| 431 | 线路欠压保护动作 | ✅ | `PS_UV_*` |
-| 432 | 线路过压保护动作 | ✅ | `PS_OV_*` |
-| 433 | 高频保护动作(过频) | ✅ | `PS_OF_*` |
-| 434 | 低频保护动作 | ✅ | `PS_UF_*` |
-| 435 | 线路过负荷保护动作 | ✅ | `PS_OL_*` |
-| 436 | 线路重载保护动作 | ❌ | 三级负荷只做了一级 |
-| 437 | 线路过载保护动作 | ❌ | 同上 |
-| 438 | 线路接地保护动作 | ❌ | `OverCurI0` 未复刻 |
-| 439 | 一次重合动作 | ❌ | 重合闸未复刻 |
-| 440 | 二次重合动作 | ❌ | 同上 |
-| 441 | 三次重合动作 | ❌ | 同上 |
-| 442 | 接地重合动作 | ❌ | 同上 |
-| 443 | 接地后加速动作 | ❌ | 同上 |
-| 444 | 失电分闸动作 | ❌ | `NoVolTrip` 未复刻 |
-| 445 | 得电合闸动作 | ❌ | `HaveVolCls` 未复刻 |
-| 446 | 闭锁合闸动作 | ❌ | 需开入(闭锁压板) |
-| 447 | 闭锁分闸动作 | ❌ | 同上 |
-| 448 | 联络开关合闸动作 | ❌ | `ConnectBrkCls` 未复刻 |
-| 449 | 联络开关分闸动作 | ❌ | 同上 |
-| 450 | 保护动作备用 02 | — | 参考即备用 |
-| 451 | A 相故障 | ❌ | 需分相判别(三相全接) |
-| 452 | B 相故障 | ❌ | 同上 |
-| 453 | C 相故障 | ❌ | 同上 |
-
-> **本产品覆盖 9 / 33 条**。注意 428 与 429 在参考源码里**同名**(都叫"线路后加速保护动作"),
-> 靠事件码区分过流与零序——移植时不能按名字去重。
->
-> 事件码缺失的连带后果:**事故报告(`CN_NUM_QUE_REC_RPT` 队列)无法生成**。
-> 参考的事故报告是按事件码索引动作时序的,没有事件码表就没有"保护动作报告"这一页。
-
----
-
-### 9.8 保护元件复刻明细(参考 45 个模块 → 本产品 8 个)
-
-**模块级口径**:参考 `RelayUnit/` 45 个 `.c` 文件 = 45 个元件模块。本产品覆盖 **8 个模块**
-(7 个判据模块 + 1 个记录模块),以 **9 个实例**落地(`OverCurrent` 一个模块出三段实例)。
-
-| 类别 | 参考模块 | 本产品 | 缺 |
-|---|---|---|---|
-| 过流类 | 8 | 2(`OverCurrent`、`OverLoad`) | **6** |
-| 电压类 | 8 | 3(`OverVol`、`OverVol_U0`、`LackVol`) | **5** |
-| 频率类 | 2 | 2(`OverFr`、`LackFr`) | 0 |
-| 重合闸 | 5 | 0 | **5** |
-| 方向 / 功率 | 4 | 0 | **4** |
-| 涌流 / 故障 | 5 | 0 | **5** |
-| 自动控制 | 5 | 0 | **5** |
-| 记录类 | 6 | 1(`SOERecord`) | **5** |
-| 录波 / 采样 | 2 | 0 | **2** |
-| **合计** | **45** | **8** | **37** |
-
-**缺的 37 个模块,逐个给出"缺它意味着什么"**:
-
-| 模块 | 类别 | 判据要点 | 缺它的后果 | 依赖 |
-|---|---|---|---|---|
-| `OverCurrent_I0` | 过流 | 零序电流三段 + 方向 | 接地故障无保护 | 定值载体(零序 18 项) |
-| `OverCurrent_SpeedUp` | 过流 | 后加速:重合后短延时无选择跳闸 | 重合于故障时靠 Ⅰ 段延时切除,慢一拍 | 重合闸 |
-| `OverCurrentI0_SpeedUp` | 过流 | 零序后加速 | 同上(接地) | 重合闸 |
-| `FZDOverCur` | 过流 | 非遮断电流闭锁(负荷电流以下不允许跳闸) | 小电流跳闸可能拉弧不熄 | 定值 3 项 |
-| `OverCurWarn` | 过流 | 过流告警(只告警不跳闸) | 过流只能跳不能告警 | 定值(告警投入) |
-| `OverCurWarn_I0` | 过流 | 零序过流告警 | 同上 | 定值 |
-| `LineHaveVol` | 电压 | 线路有压鉴别 | 无法区分"有压合闸"与"无压合闸" | 定值(MeaLimit 有压鉴别) |
-| `HaveVolCls` | 电压 | 得电合闸 | FA 的"来电自动合闸"缺失 | 开入 + 出口 |
-| `NoVolTrip` | 电压 | 失电分闸 | FA 的"失电自动分闸"缺失 | 开入 + 出口 |
-| `PTBreak` | 电压 | PT 断线(电压消失但电流正常) | 断线时电压类保护可能误动/拒动 | 定值 2 项 |
-| `CTBreak` | 电压 | CT 断线 | 同上(电流侧) | 定值 |
-| `AutoReCls` | 重合闸 | 充电 → 跳闸 → 延时重合 → 整组复归 | 瞬时故障必须人工合闸 | 开入 + 出口 + 16 项定值 |
-| `AutoReCls_JD` | 重合闸 | 接地故障重合 | 同上(接地) | 同上 |
-| `OnceCch` | 重合闸 | 一次重合(表内无定值,条件编译) | — | 同上 |
-| `TwiceCch` | 重合闸 | 二次重合(表内无定值,条件编译) | — | 同上 |
-| `ConnectBrkCls` | 重合闸 | 联络开关合闸(转供) | 环网无法转供 | 开入 + 出口 + 17 项定值 |
-| `DirCell` | 方向 / 功率 | 方向元件(功率方向判别) | 双电源/环网会反送电误动 | 三相电压 + 三相电流同刻(H1) |
-| `PowDirJudge` | 方向 / 功率 | 功率方向(有功/无功象限) | 同上 | 同上 |
-| `PowerSet` | 方向 / 功率 | 功率电压组切换(1~4 组) | 多组 PT/CT 变比无法切换 | 定值 2 项 |
-| `YcOverLimit` | 方向 / 功率 | 遥测越限判据 | 越限记录无来源 | 定值(MeaLimit 10 项) |
-| `InRushCur` | 涌流 / 故障 | 二次谐波制动(励磁涌流闭锁) | 变压器空投时过流误动 | 谐波算法(见 §9.12 遥测增强) |
-| `FaultIsola` | 涌流 / 故障 | 故障隔离 | FA 无法定位故障区段 | 开入 + 出口 |
-| `FaultRecov` | 涌流 / 故障 | 故障恢复供电 | 同上 | 同上 |
-| `BusEarthAlm` | 涌流 / 故障 | 母线接地告警 | 母线接地无告警 | 零序电压 |
-| `SgzAlarm` | 涌流 / 故障 | 事故总告警 | 事故总信号缺失 | 事件码表 |
-| `AutoCtrlTrip` | 自动控制 | 自动控制跳闸(电池活化等) | 活化流程无法跳闸 | 出口 |
-| `ManualTrip` | 自动控制 | 手动跳闸 | 就地手动分闸缺失 | 开入 + 出口 |
-| `MusterRecov` | 自动控制 | 总复归(复归所有保持态) | 动作态只能靠重启清 | 无(**可先做**) |
-| `ExvRec` | 自动控制 | 事故记录 | 事故报告缺失 | 事件码表 |
-| `ExvRecGW` | 自动控制 | 事故记录(网关侧) | 同上 | 同上 |
-| `CORecord` | 记录 | COS 变位记录 | 开入变位无记录 | 开入 |
-| `FrzRecord` | 记录 | 冻结记录(整点冻结电量) | 电度无冻结 | 电度 |
-| `YcMeaRecord` | 记录 | 遥测定时记录 | 无遥测历史 | 定值 2 项 |
-| `YcMeaLimitRec` | 记录 | 遥测越限记录 | 无越限记录 | 越限判据 |
-| `YcVolQuaRate` | 记录 | 电压合格率统计 | 无合格率 | 定值 3 项 |
-| `WaveQdCell` | 录波 / 采样 | 录波启动判据 | 录波无触发源 | 录波子系统 |
-| `RlyCommSam` | 录波 / 采样 | 保护通信采样(跨装置采样同步) | 多装置差动类保护不可能 | 通信 + 对时 |
-
-> **唯一"现在就能做"的是 `MusterRecov`(总复归)**:它不依赖任何硬件,只把各元件的
-> 保持态与出口标志清一遍。本产品已有 `prot_elm_request_reset` 单字请求标志(§3.5),
-> 接上即可。其余 36 个模块都至少依赖定值载体、开入、出口、事件码四者之一。
-
----
-
-### 9.9 故障录波子系统规格(本产品 0)
-
-录波是**唯一一个"完全独立的子系统"级缺口**:它不在保护链路上,但有独立的采样率、
-独立的存储格式、独立的文件传输通道。参考实现的硬指标如下,可直接作为复刻验收判据。
-
-| 指标 | 参考值(`APP/EquipCfg/Const_Wave.h`) | 说明 |
-|---|---|---|
-| 录波采样率 | `CN_SAM_RATE × CN_WAVE_RATIO` = 20 × 4 = **80 点/周波**(50 Hz 下 4000 Hz) | 保护计算用 20 点/周波,录波要 4 倍过采样才能看清波形。**偏离登记**:本装置先按 1 kHz(20 点/周波)立项,理由与二期不返工的结构约束见 docs/子系统设计/故障录波设计说明.md §2 与 §2.1 |
-| 录波段数 | `CN_WAVE_SECT_NUM` = **6 段** | 每段独立缓冲,支持连续多次录波 |
-| 启动前缓冲 | `CN_WAVE_CYCLE_SUM_REFRE_BUF` = **5 周波**(100 ms) | 循环刷新,保证故障前有数据 |
-| 动作后 | `CN_WAVE_CYCLE_SUM_ACTED` = **10 周波**(200 ms) | |
-| 返回段 | `CN_WAVE_CYCLE_SUM_RET` = **2 周波** | 返回过程也要录 |
-| 手动录波 | `CN_WAVE_CYCLE_SUM_HAND` = **6 周波** | |
-| 单次最长 | `CN_WAVE_MAX_TIME` = **9000 ms** | 超长故障(如持续性接地)按此截断 |
-| RAM 录波个数 | `CN_WAVE_RAM_NUM` = **16** | RAM 里最多同时存 16 份,满了转存文件 |
-| COMTRADE 保存数 | 动作 **64** / 启动 **64** / 手动 **16** | 三类独立配额,满了循环覆盖 |
-| 单份最大开关变位 | `CN_WAVE_MAX_RECSWI` = **64** | |
-| 布尔量通道 | `CN_WAVE_NUM_BOOLFLG` = **320** | 全局布尔变量按位录波 |
-| 模拟量通道 | 原始 + 计算 = `CN_WAVE_ALL_ANA_NUM` | 本产品对应 **65 通道**(`g_tMeasureModelTab`) |
-| 录波类型 | 动作 `TYPE_ACT`=1 / 启动 `TYPE_START`=2 / 手动 `TYPE_HAND`=3 | |
-| 文件格式 | COMTRADE(`.cfg` + `.dat`) | 主站侧通用格式,非私有 |
-| 上送方式 | 104 文件传输(`F_FR_NA_1` 目录 / `F_SR_NA_1` 读文件) | 本产品 104 未实现文件传输 |
-
-**复刻所需的四件东西**(缺一不可):
-
-1. **4 倍过采样缓冲**:当前 `adcTask` 以 1000 Hz 出样本,录波要 4000 Hz。要么提高采样率
- 再抽取给保护(改变整条链节拍),要么在 TPAFE 侧单独开一条 4 倍速通路(改驱动)。
-2. **环形缓冲 + 触发点定位**:5 周波前缓冲 + 10 周波后缓冲,触发时刻要能反算出缓冲内偏移。
-3. **COMTRADE 编码器**:`.cfg`(通道定义、采样率、时标)+ `.dat`(二进制采样值)+ `.hdr`。
-4. **文件存储与配额管理**:SPI NAND 上按 64/64/16 配额循环覆盖,需与现有 FatFs + dhara 层对接。
-
-> **排期判断**:录波不是"加个功能",是**新增一条 4 倍速采样通路 + 一套文件格式 + 一个配额管理器**。
-> 它排在定值/元件铺开之后,因为录波通道表(65 路)本身依赖元件输出。
-
----
-
-### 9.10 记录体系复刻明细(参考 13 类 → 本产品 8 类)
-
-参考用 13 个定长队列分类存记录,容量按类分配(`GlobalDef/Const_Sys.h`):
-
-| 参考队列 | 容量 | 语义 | 本产品 |
-|---|---|---|---|
-| `REC_ACT` | 128 | 动作记录(保护动作) | ✅ 事故记录 `/log/accid.log` |
-| `REC_ALM` | 128 | 告警记录 | ✅ 保护告警 `/log/alarm.log` |
-| `REC_OVER` | 128 | 越限记录 | ❌ |
-| `REC_START` | 128 | 启动记录(元件启动但未动作) | ✅ 保护启动 `/log/start.log` |
-| `REC_LOCK` | 128 | 闭锁记录(保护被闭锁) | ❌ |
-| `REC_SOE` | **256** | SOE(带时标的开入变位) | ✅ `soe_store`(SPSC 深度 8 → 落盘) |
-| `REC_COS` | **256** | COS(无时标的状态变位) | ❌ |
-| `REC_CHK` | 128 | 自检记录 | ✅ `/log/selftest.log` |
-| `REC_RUN` | 128 | 运行记录(上电/重启) | ✅ `/log/run.log` |
-| `REC_OPT` | 128 | 操作记录(复归/对时/定值保存) | ✅ `/log/oper.log` |
-| `REC_YK` | 128 | 遥控记录 | ✅ `/log/yk.log` |
-| `REC_SC` | 128 | 顺控记录 | ❌ |
-| `REC_SCSTEPINFO` | 128 | 顺控执行明细 | ❌ |
-
-**缺的 5 类及其依赖**:
-
-| 缺的队列 | 依赖 | 能否先做 |
-|---|---|---|
-| 越限记录 | 越限判据(`MeaLimit` 10 项定值 + `YcOverLimit` 元件) | 可先做判据、后做记录 |
-| 闭锁记录 | 闭锁源已具备(四源闭锁,§5.12),**只缺记录落点** | ✅ **最该先补**——现在闭锁发生了但无记录,现场排障靠猜 |
-| COS 记录 | 开入(X3) | ❌ |
-| 顺控记录 / 顺控执行明细 | 顺控功能(参考 `YKRly.c` 63 KB 的顺控执行引擎) | ❌ 整功能未立项 |
-
-> **闭锁记录是本表里性价比最高的一项**:闭锁源(未标定 / 采样故障 / 定值校验和 / 软压板退出)
-> 已经全部实现,但闭锁的**发生与解除都没有留痕**。加一个 `REC_LOCK` 等价队列,
-> 只需在 `protect_task` 的闭锁判定处加一条写入,不依赖任何硬件。
-
-**格式差异**:参考是**二进制定长记录 + 独立队列 + 循环覆盖**;本产品是**文本行(64 B 定长)+ 文件**。
-文本行的优点是 FTP 直接可读、现场排障友好;缺点是容量利用率低、无结构化解码。
-复刻时建议**保留文本格式**(本产品优势),只补队列分类与配额。
-
----
-
-### 9.11 规约栈复刻明细(参考 12 种 → 本产品 1 种)
-
-| 规约 | 参考源码 | 链路 | 用途 | 工作量特征 |
-|---|---|---|---|---|
-| **IEC 60870-5-104** | `Comm/Pub/Rly_IEC104.c` | TCP | 主站接入(本产品已实现) | ✅ 已完成 |
-| IEC 60870-5-101 | `Rly_IEC101.c`、`Rly_IEC101_B.c` | 串口 | 主站接入(老站) | 与 104 共享 ASDU 层,**只换链路层**(平衡/非平衡链路、可变帧长) |
-| IEC 60870-5-102 | `Rly_IEC102.c` | 串口 | 电度采集 | 独立 ASDU(电度专用类型),依赖电度 |
-| IEC 60870-5-103 | `RLY_IEC103.c`、`RLY_IEC103-tcp.c`、`Rly_IEC103T.c` | 串口 / TCP | 保护装置信息接口 | 三种变体(串口 / TCP / T 型),ASDU 与 101/104 不同族 |
-| ModBus | `Rly_ModBus.c` | 串口 / TCP | 通用工业设备 | 简单,**对下采集首选** |
-| CDT | `Rly_Cdt.c` | 串口 | 循环式远动(老国标) | 帧结构简单,无确认机制 |
-| `Whm_GB` | `Whm_GB.c` | 串口 | 国标电度 | 依赖电度 |
-| IEC 61850 | `struct61850.h`、`GlobalUnit/SttnLvlGoose.c` | 以太网多播 | MMS / GOOSE / SV | **最大工作量**:需 MMS 栈 + ASN.1 + 多播组管理 |
-| CAN | `Rly_Can.h` | CAN 总线 | 内部总线 | 依赖 CAN 硬件 |
-| 子站 IEC 101 | `Comm/Mon/Rtu_IEC101*.c`(含 ABB / 西门子 / 无优先级变体) | 串口 | 对下接 FTU / 开关 | **对下主站侧**,与对上从站侧是不同角色 |
-| 子站 IEC 104 | `Rtu_IEC104.c`、`Rtu_Dbg104.c`、`Rtu_RIS104.c` | TCP | 对下 | 含调试与 RIS 变体 |
-| BALA101 / ModBus | `Rtu_BALA101*.c`、`Rtu_ModBus.c` | 串口 | 对下 | 与 RS-485 簇同批 |
-| 加密 | `Comm/Ecc/`(SM2 / SM3 / ECDSA) | — | 安全加固 | 国密算法库,纯软件可移植 |
-
-**排期分层**:
-
-| 层 | 规约 | 理由 |
-|---|---|---|
-| 先做 | ModBus(对上 + 对下)、IEC 101 | 与 104 共享 ASDU 或结构简单;对下采集是配网终端必备 |
-| 次做 | IEC 103、CDT、BALA101 | 老设备兼容,结构清晰 |
-| 后做 | IEC 102、`Whm_GB` | 依赖电度(H1) |
-| 末做 | IEC 61850 | 需 MMS/ASN.1/多播,单核 M4 资源需专项评估 |
-| 并行 | SM2 / SM3 / ECDSA | 纯软件,无硬件依赖,可随时插入 |
-
-> **一个容易漏的点**:参考同时有**对上(`Comm/Pub`,本机作从站)**与**对下(`Comm/Mon`,本机作主站)**
-> 两套规约。本产品只有对上 104。做"配网终端"时对下那套(101/104/ModBus 主站侧)
-> 是**必须**的——否则接不了一次开关。
-
----
-
-### 9.12 复刻完成判据(逐缺口可验证)
-
-每一条缺口给出"怎么算做完了",避免"实现了但没验收"。
-
-| 缺口 | 完成判据 |
-|---|---|
-| 定值铺开 | `PS_ID_COUNT = 249`(或按单元分批:每批新增项在 104 上可读写、跨复位保持、校验和正确);`check` 脚本比对参考表逐项一致 |
-| 104 定值映射 | 107 个地址(`0x8820~0x8891` 含 8 空洞)全部可读可写;空洞地址返回"未知信息体地址" |
-| 元件铺开 | 45 个模块对应 45 个实例;每个实例有:定值项齐全、启动/动作/返回三态可观测、事件码正确、单测覆盖判据边界 |
-| 遥测铺开 | 31 点全部非 IV(除物理不可达点明确标 IV);线电压与相量满足 `Uab = Ua − Ub` 误差 ≤ 0.5 % |
-| 开入开出 | 27 路硬件开入可读、31 路开出可驱动;开入防抖可整定;双点遥信四态正确(00/01/10/11) |
-| 录波 | **(二期口径;本波按 1 kHz / 8 路 / 单段 / 无 COMTRADE,对照表见 §9.1 第 10 行)**4000 Hz 采样;三类录波各生成一份 COMTRADE 且被第三方工具打开;配额 64/64/16 循环覆盖正确 |
-| 记录体系 | 13 类队列各有落点;每类容量达标;断电不丢已确认记录 |
-| 多规约 | 每种规约与对应主站/子站工具完成一次完整交互(连接 / 总召 / 变位 / 遥控 / 断链重连) |
-| 国密 | SM2 签名验签、SM3 摘要与标准测试向量一致 |
-| 软压板 | 9 面全部可投退且行为可观测(投退后对应功能确实停走/恢复) |
-| 出口与开入 | 保护动作 → 出口继电器动作 → 开入回读确认,全链路 ≤ 120 ms |
-| 标定解卡 | 8 通道两点标定后 `ADC_CAL_F_VALID` 全置位;注入标准源,保护动作值与定值误差 ≤ 3 % |
-| 屏板链路 | **串口通道**:屏板 280 ms 召唤、主机 ≤200 ms 内**发完** **4208 B**(整帧无 2 个字符时间以上的间隙),连续 10 min **主机侧**零超时、零 CRC 错帧;显存 3200 B 与 `g_ui_fbuf` 逐字节一致;7 个物理键(`1/2/3/4/7/8/9`)动作正确;**状态灯位掩码逐位一致、LED 0 恒亮**;屏板 ≈5000 s 自复位不误判离线;LOGO 下发出局(不实现);**网络通道**:INIT 应答 **16 B** 逐字段一致且无颜色字段、`LCDMEM` 偏移 0 得 3204 B、重复召唤无应答、偏移 ≥3200 无应答、`KEEPLIVE` 无应答且 1 分钟不掉链、8 键(含 `F1\|ENT` 组合)动作正确(§5.16.10 十四条,第 15 条 LOGO 出局) |
-
----
-
-### 9.13 屏板链路复刻任务规划
-
-> **口径**:条目一律用**语义短语**(编号规范 P-8),执行序即表序。
-> 改动范围只含本产品固件与 `DTU-RemoteLCD` 客户端;**屏板固件不在本仓库**,
-> 其行为以 §5.16 为契约做黑盒验收。
->
-> **两种部署形态,两条通道都要**:① **串口直连屏板**(参考的形态,第 10~15 条)——屏板直接挂在设备
-> 串口上,无需任何网络设备;② **串口服务器透传 / 网络镜像**(第 2~9 条)——屏板或调试软件经以太网连 7003。
-> 现场用串口服务器把屏板接到网上时,两种形态等价,但**固件侧不能只实现后者**:
-> 只有 7003 时,设备离开网络就没有任何本地显示,与参考产品不等价。
->
-> **方向相反,别写错**:网络通道是"**客户端召唤、设备应答**";串口通道是"**屏板召唤、设备应答**"。
-> 两条通道共用同一份显存快照,但**帧格式、校验、时序完全不同**(网络用 `0xAA/0xBB` + XOR,
-> 串口用裸二进制 + CRC-16/MODBUS),不能共用组帧代码。
->
-> **实现事实另立**:主机侧的接线、串口配置、协议实现口径、验证状态与未闭环项在
-> `docs/子系统设计/屏板链路设计说明.md`;本节只保留**需求视角**的缺口与顺序,不复制实现细节。
-
-| 序 | 任务 | 改动点 | 判据 | 跨端 |
-|---|---|---|---|---|
-| 1 | **报文口径定版** | 本节 + §5.16 + §6.2 按参考源码成文 | 文档门禁全绿(已完成) | — |
-| 2 | **INIT 应答补足 16 字节** | `ui_net_sink.c` 的 `remo_send_init()` 组帧由 8 B 扩到 **16 B**:补 8 B 键值表;**不加颜色位与 RGB**(单色屏不对齐多色协议,§5.16.5) | 16 B 逐字节比对通过,且报文内**无颜色字段** | **是** |
-| 3 | **键值表补 F1 / F2** | `ui_net_sink.h` 键值宏补 `0x04` / `0x80`;`ui_net_sink_inject_key()` 映射;UI 键处理接受组合键 | 下发 `0x04` / `0x80` / `0x24` 界面响应正确 | 否 |
-| 4 | **显存断点续传** | `CMD_LCDMEM` 分支去掉"仅偏移 0"限制:按偏移取 `g_ui_fbuf + off`,长度 `min(9800, 3200 − off)` | `off=1600` 得 `4+1600` B,内容与整帧尾部逐字节一致 | 否 |
-| 5 | **召唤拒绝握手** | 新增"帧代次 + 已上送"等价状态:新图未就绪时重复召唤**不应答**;偏移 ≥3200 不应答 | §5.16.10 第 2、3 条通过 | **是** |
-| 6 | **链路监视** | 1 分钟通信中断计时(收到帧 / 发送成功即重置);超时置状态位并落一行日志 | 断链 60 s 有明确日志与状态;重连后自动恢复推流 | 否 |
-| 7 | **KEEPLIVE 静默** | 去掉空帧回显,改为仅重置计时 | §5.16.10 第 4 条通过 | **是** |
-| 8 | **发送重试评估** | 对比参考"BUSY + 200 ms 放弃"与现有 `net_send` 阻塞模型,出结论并回填 §5.16.9 第 7 行 | 结论有实测数据支撑(实现 / 明确不实现) | 否 |
-| 9 | **客户端一致性回归** | `DTU-RemoteLCD` 按 **16 B** 解析;把 §5.16.10 第 1~7 条做成自动化用例 | 七条判据全 PASS | **是** |
-| 10 | **串口物理层落地** | 按 §5.16.2 定版:**700000 8N1、`BRR = 0x0078`**(USART1,APB2 84 MHz)、**无 DE**(TTL 直连,不走收发器)、RX 缓冲 16 B + 空闲中断断帧、发送走 **DMA 一次性发完**(禁逐块阻塞;主机侧 TX 用 `DMA2_Stream7`,RX 走 IDLE 中断、不用 RX DMA) | 环回 + 示波器实测 700 kbaud 分频零误差;屏板能收到帧 A 并回帧 B | 否 |
-| 11 | **帧 A 解析 / 帧 B 组帧** | 新增屏板通道模块:识别 6 B 请求(`01 03 type key CRC_L CRC_H`)、校验 CRC-16/MODBUS(**低字节在前**,口径见 §5.16.2);组 **4208 B** 帧 B(3200 显存 + 4 B LED + 4 B info 保留 + 998 B 填充 + 2 B CRC) | 屏板出图与 `g_ui_fbuf` 逐字节一致;`info[0..3]` 与下发的 LED 掩码一致 | 否 |
-| 12 | **状态灯位映射表** | 定义"**业务状态 → 屏板 LED 位**"映射(参考源码**无此表**,须自定);`info[0..3]` 按 **32 位小端**填,bit0 恒 0、bit20~31 恒 0 | §5.16.10 第 11 条通过 | 否 |
-| 13 | **串口上行按键** | 帧 A 的 `key` 字节按**屏板 `KEY_TYPE`** 解释——实际可达值只有 **`1/2/3/4/7/8/9`**(`5`/`6`/`10` 无物理入口);映射为逻辑键值后与 7003 注入**同一入口**合并 | §5.16.10 第 10 条通过;`9`/`10` 语义按 §5.16.3 ② 处置 | 否 |
-| 14 | **双通道并发 + 自复位容忍** | 两出口各自独立发送上下文;串口 4208 B 阻塞不拖 7003;链路监视按"**连续 ≥10 s 无应答**"判离线,**忽略屏板 ≈5000 s 周期自复位** | §5.16.10 第 12、13、14 条通过 | 否 |
-| 15 | **LOGO 下发流程(出局,不实现)** | 主机不提供 LOGO 帧,总线上不会出现 `info[4..5] = 0x89 0x45` | —(不参与验收) | 否 |
-| 16 | **日志口迁移(USART1 → RS-232 通道)** | ① `console_log.c` 的 `huart1`、`USART1_IRQn`、`__HAL_RCC_USART1_CLK_*`、`MX_USART1_UART_Init()` 收口成**一处端口宏**,指向 RS232#1(`huart5` / UART5);② **不动** UART4 的 `g_rs485` 绑定 | 日志在 RS-232 侧(CN1)可读且内容与迁移前一致;USART1 **完全空出**;连续 10 分钟无 `[ERR]` | 否 |
-
-**批次划分**:
-
-| 批 | 任务 | 理由 |
-|---|---|---|
-| 第一批(无跨端风险,可独立发版) | 3、6、8 | 只动本端,旧客户端不受影响 |
-| 第二批(跨端,须与客户端同步发版) | 2、4、5、7、9 | 报文口径变更,两端必须同版本 |
-| 第三批(**独立立项**,不随 RS-485 冻结) | **16**、10、11、12、13、14 | 屏板串口通道是**独立需求**,与 §5.10 冻结的"对下采集簇"不是一回事。**第 16 条排在 10 之前**:日志先腾出 USART1,屏板链路才能独占这条通道 |
-
-> ⚠ **唯一破坏性变更**:第 2 条把 INIT 应答从 8 B 改成 **16 B**。**旧客户端会把 16 B 的前 8 B 当全部、
-> 把后 8 B 当作下一帧的 TAG 去找**,解析状态机会被这 8 B 拖住直到超时——表现为"连上了但不出图"。
-> 因此第 2、5、7、9 条必须**同批发布**,且发版说明中明确"客户端需升级"。
->
-> ⚠ **16 B 与参考的 29 B 不可互换**:删掉 13 B 颜色字段后,偏移 4 之后全部前移——
-> 参考的"显存大小在偏移 5、键值表在偏移 21"在本产品变成"偏移 4、偏移 8"。
-> 客户端**不得**复用参考的 29 B 解析器再截前 16 B(会读出颜色位当显存高位)。
->
-> **屏板固件边界**:本表不覆盖屏板侧固件(帧解析 / 显存写入 / 按键扫描 / 状态灯驱动)。
-> 屏板固件工程在 `D:\Code\DTU Code\DTU-LCD`,**不在本仓库**,其契约已按源码逐字节成文(§5.16.2 / §5.16.3)。
-> 本产品只要满足 §5.16.10 的十四条判据即为兼容(第 15 条 LOGO 出局)。
->
-> **第三批状态**:串口通道(第 10~14、16 条)主机侧已实现并经台架与真屏板验收,屏板实物已上台架;
-> 帧长**已固化 4208 B**(代码实参为准,屏板 readme 的 3208 B 不作数——真屏板出图为端到端证据)。
-> 未闭环项(2 h 长稳、仪器项等)见 `docs/子系统设计/屏板链路设计说明.md` §9.2;**网络通道(第 2~9 条)未开工**。
->
-> **一条物理前置(已完成 2026-10-29)+ 一条实现纪律**:
-> ① **台架串口线已挪位**——日志口迁到 RS-232 侧后,台架那根线改接 CN1 的 RS232#1 端子
-> (`CN1.10` 接适配器 TXD、`CN1.12` 接适配器 RXD、`CN1.7` 或 `CN1.8` 接 GND),台架日志口
-> 因此由 `COM6` 变为 **`COM3`**,`.serialtest/config.json` 的 `portName` 已同步,`@test` 与
-> `serial-assistant` 不必再手工指端口。这些端子是 **RS-232 电平**,TTL 的 CH340 直连不了,
-> 用的是 USB 转 RS-232 适配器;接法与端子出处见 `docs/子系统设计/屏板链路设计说明.md` §3.2。
-> **这条要在第 16 条动代码之前完成。**
-> ② **RX 要真的读、ORE 要真的清**——PA10 一直是接线的(§5.16.2),
-> 但"RX 使能却不读 `DR`"本身就足以让 ORE 永久锁存。第 11 条实现时必须在
-> `HAL_UART_ErrorCallback` 里清 ORE 并重挂接收,否则一次噪声就永久静默。
+> **逐项明细(定值 249 / 遥测 31 / 开入开出 / 动作事件 / 元件 / 录波 / 记录 / 规约 / 完成判据 / 屏板规划)已独立成档** → [`参考产品复刻明细.md`](参考产品复刻明细.md) §2~§11。
---
@@ -2648,6 +1770,7 @@ docs/任务规划/UI补齐.md §5);原「当前执行 6 项」(记录 5
| **定值与压板持久化** | `YK12` 投退 + 非默认定值跨复位 | ✅ 2026-10-12 21/21 + 13/13 + 4/4 + 4/4 PASS |
| **SOE 落盘** | 自发 `M_SP_TB_1` 带时标 + FTP 下载解码 | ✅ 2026-10-12 56 条记录全 PASS |
+
---
## 11. 相关文档
@@ -2655,6 +1778,8 @@ docs/任务规划/UI补齐.md §5);原「当前执行 6 项」(记录 5
| 主题 | 文档 |
|---|---|
| 文档索引 | [`docs/README.md`](../../docs/README.md) |
+| 系统架构与硬件规格(本文拆出的运行时架构与引脚/量纲权威) | [`docs/架构设计/系统架构与硬件规格.md`](../架构设计/系统架构与硬件规格.md) |
+| 参考产品复刻明细(能力基线与逐项差额) | [`docs/产品需求/参考产品复刻明细.md`](参考产品复刻明细.md) |
| 项目全景架构 | [`docs/架构设计/项目架构总览.md`](../../docs/架构设计/项目架构总览.md) |
| 存储架构 | [`docs/架构设计/STM32F4-Base存储架构说明.md`](../../docs/架构设计/STM32F4-Base存储架构说明.md) |
| 启动顺序 / 就绪屏障 | [`docs/架构设计/项目启动顺序管理.md`](../../docs/架构设计/项目启动顺序管理.md) |
diff --git a/docs/产品需求/参考产品复刻明细.md b/docs/产品需求/参考产品复刻明细.md
new file mode 100644
index 00000000..203019ec
--- /dev/null
+++ b/docs/产品需求/参考产品复刻明细.md
@@ -0,0 +1,803 @@
+# STM32F4-Base 参考产品复刻明细(CLS100)
+
+> **文档定位**:1:1 复刻口径下**「参考有什么 / 我们有什么 / 差额在哪 / 怎么算做完」**的
+> 逐项明细权威——自 `docs/产品需求/产品需求设计文档.md` v1.9 的「复刻基线」章与
+> 原「复刻缺口明细」各节(v1.9 编号 2.5 与 9.4~9.13)拆出:本文 §1 = 复刻基线,
+> 本文 §2~§11 = 各专题逐项明细。
+> **范围口径、缺口清单与排期(需求档 §3 / 需求档 §9.1~需求档 §9.3)仍在需求档**;本档只放明细。
+> 本档「**需求档**」= [`产品需求设计文档.md`](产品需求设计文档.md);「架构硬件档」=
+> [`../架构设计/系统架构与硬件规格.md`](../架构设计/系统架构与硬件规格.md)。
+> 判定纪律:所有参考能力数字一律从参考工程源码常量表实测
+> (`Scatter_P_HV03.01_SV01.01`),不做估计。
+
+## 1. 复刻基线(参考源码能力清单)
+
+**判定口径**:本节所有"参考能力"的数字,**一律从参考工程源
+(实测已发现"89 个元件模块"实为 45 个、定值"约 260 项"实为 249 项两处偏差)。
+
+### 1.1 复刻基线三要素
+
+1. **点表即契约**:参考源码用常量表(`g_t*Tab[]`)定义点表、定值、事件、压板。
+ 这些表就是"要复刻什么"的**唯一清单**——表有几行,目标就有几个点。
+2. **地址即接口**:104 的 IOA 由 `Rly_IEC104.h` 的基址宏划分段,**段基址必须逐字对齐**(需求档 §1.3)。
+3. **模块即元件**:`RelayUnit/` 下一个 `.c` 对应一个保护元件,元件数 = 文件数(本文 §1.5)。
+
+### 1.2 能力清单与复刻进度(源码实测)
+
+| # | 能力 | 参考源码出处 | 参考数量 | 本产品现状 | 状态 |
+|---|---|---|---|---|---|
+| 1 | 定值项 | `APP/EquipCfg/Const_Set.c` `g_tSetModelTab` | **249 项** | 40 项(`PS_ID_COUNT`) | 🔶 |
+| 2 | 定值单元 | `APP/EquipCfg/Const_Set.h` `EN_SET_CELL_*` | **23 个有项**(枚举 28) | 5 组(短路/接地/过负荷/电压/频率) | 🔶 |
+| 3 | 104 定值映射 | `Comm/Pub/Const_CommSetPara.c` `g_tCommSetParaTab` | **107 项**,`0x8820~0x8891` | 40 项(`0x8820~0x8890` 局部) | 🔶 |
+| 4 | 遥测 YC | `APP/EquipCfg/Const_Ana.c` `g_tYcIndexTab` | **31 点** | 9 点(`0x4011~0x4018` + `0x401D`) | 🔶 |
+| 5 | 遥测模型 | 同上 `g_tAnaModelTab` | 35 行 | 0 | ⬜ |
+| 6 | 电度 YM | 同上 `g_tYmIndexTab` | **8 种** | 0 | ⬜ |
+| 7 | 开入 KI | `APP/EquipCfg/Const_IO.c` `g_tInputModelTab` | **138 点** | 0(无硬件,X3) | ⬜ |
+| 8 | 开出 KO | 同上 `g_tOutputModelTab` | **31 点** | 0(无硬件,X3) | ⬜ |
+| 9 | 动作事件 | `APP/EquipCfg/Const_Rec.c` `g_tActRecTab` | **33 条**(421~453) | 7 类记录(`App/log/sys_log.h`) | 🔶 |
+| 10 | 录波测量通道 | 同上 `g_tMeasureModelTab` | **65 通道** | 8(本波口径,2026-10-29 代码面已交付;65 通道仍为 0,参考机口径未改)| 🔶 |
+| 11 | 软压板 | `APP/EquipCfg/Const_Soft.c` `g_tSoftTab` | **9 面**(表容量 32) | 1 面(`PS_GLOBAL_EN`) | 🔶 |
+| 12 | 保护元件 | `RelayUnit/*.c` | **45 个模块** | 9 个实例 | 🔶 |
+| 13 | 记录队列 | `RecUnit/RecFile.c` + `GlobalDef/Const_Sys.h` | **13 类**(128/256 条) | 8 通道(7 文本 + SOE) | 🔶 |
+| 14 | 自检类型 | `GlobalUnit/SelfChk.c` | **3 类型 + 2 闭锁** | 3 类 | ✅ |
+| 15 | 故障录波 | `APP/EquipCfg/Const_Wave.h` | **3 类型 / 6 段 / RAM 16 个** | 0 | ⬜ |
+| 16 | 采样节拍 | `APP/EquipCfg/Const_VisEquip.h` | **20 点/周波**(50 Hz) | 20 点/周波(1000 Hz) | ✅ |
+| 17 | 上行规约 | `Comm/Pub/`、`Comm/Mon/` | **12 种** | 1 种(104) | 🔶 |
+| 18 | 加密算法 | `Comm/Ecc/` | SM2 / SM3 / ECDSA | 0 | ⬜ |
+| 19 | 双核分工 | `CLS100_Arm/`、`CLS100_Dsp/` | ARM + DSP | 单核(X1) | — |
+| 20 | 远端屏与按键链路 | `HMI/RemoeDisp/RemoDispBus.c`、`HMI/Dsp/Key.c`、`HMI/Dsp/Disp_Pub.c`;屏板侧 `DTU-LCD` | **串口屏板通道**(显存 3200 B + **状态灯 4 B 位掩码**下行 / 键号上行)+ **TCP 7003 镜像** | 7003 四命令已通;**串口屏板通道整条缺失**(协议已按屏板源码定版,见需求档 §5.16.2);INIT 应答 8 B(参考 29 B,其中 13 B 颜色信息**不对齐**)、无断点续传、无链路监视、缺 F1/F2 | 🔶 |
+
+> **读法**:🔶 / ⬜ 行**全部是待办**,逐条对应 需求档 §9.1;`—` 只出现在 X1~X4 不可移植项上。
+> 本表是范围判定的唯一出处,需求档 §9 不再重复解释"为什么缺"。
+
+### 1.3 104 地址空间(段基址逐字对齐)
+
+| 段 | 基址 | 范围 | 容量 | 本产品使用 |
+|---|---|---|---|---|
+| 遥信 YX | `0x0001` | `0x0001~0x1000` | 4096 | 定义 1~31,有效 6(YX15~18/23/31) |
+| 保护 BH | `0x1001` | `0x1001~0x4000` | 12288 | 0 |
+| 遥测 YC | `0x4001` | `0x4001~0x5000` | 4096 | `0x4011~0x4018`、`0x401D` |
+| 参数 PM | `0x5001` | `0x5001~0x6000` | 4096 | 0 |
+| 遥控 YK | `0x6001` | `0x6001~0x6200` | 512 | `0x600A`(信号复归)、`0x600B`(全局压板) |
+| 设定 YS | `0x6201` | `0x6201~0x6400` | 512 | 0 |
+| 电能 YM | `0x6401` | `0x6401~0x6600` | 512 | 0 |
+| 步位置 STEP | `0x6601` | `0x6601~0x6700` | 256 | 0 |
+
+> ⚠ **段基址是 `0x4001` / `0x6001`,不是 `0x4000` / `0x6000`**。参考源码
+> `Comm/Pub/Rly_IEC104.h` 的 `CONST_104_BASEADDR_YC` / `_YK` 明确 1 起编
+> (注释即写 `4001-5000H`、`6001-6200H`)。本仓 v1.1 及更早文档按 `4000H+` / `6000H+` 描述
+> 属笔误,以本表为准;需求档 §5.15、需求档 §6.8 已同步更正。
+
+### 1.4 定值单元(23 个有项单元,合计 249 项)
+
+| 单元 | 语义 | 项数 | 本产品 |
+|---|---|---|---|
+| `EN_SET_CELL_WatchDog` | 看门狗功能 | 63 | ⬜ |
+| `EN_SET_CELL_SYS3` | 系统参数 | 45 | 🔶 |
+| `EN_SET_CELL_VolTimeRecv` | 电压时间型自愈 | 17 | ⬜ |
+| `EN_SET_CELL_AutoReCls` | 重合闸 | 16 | ⬜ |
+| `EN_SET_CELL_SYN` | 同期元件(FTU 型) | 13 | ⬜ |
+| `EN_SET_CELL_OverCurI0` | 接地告警 | 13 | 🔶 |
+| `EN_SET_CELL_VolPro` | 电压保护 | 13 | 🔶 |
+| `EN_SET_CELL_WAVESTART` | 录波启动 | 12 | ⬜ |
+| `EN_SET_CELL_MeaLimit` | 遥测越限 | 10 | ⬜ |
+| `EN_SET_CELL_OverCurSpeed` | 过流加速 | 8 | ⬜ |
+| `EN_SET_CELL_SYS1` | PT 参数 | 6 | 🔶 |
+| `EN_SET_CELL_SYS2` | CT 参数 | 4 | 🔶 |
+| `EN_SET_CELL_Auto_FG` | 自动分闸 | 4 | ⬜ |
+| `EN_SET_CELL_Auto_HH` | 自动合闸 | 4 | ⬜ |
+| `EN_SET_CELL_InRush` | 励磁涌流闭锁 | 3 | ⬜ |
+| `EN_SET_CELL_OverCur` | 短路告警 | 3 | 🔶 |
+| `EN_SET_CELL_VolQuaRate` | 电压合格率 | 3 | ⬜ |
+| `EN_SET_CELL_FZDDL` | 非遮断电流闭锁 | 3 | ⬜ |
+| `EN_SET_CELL_BHKO` | 保护出口展宽 | 2 | ⬜ |
+| `EN_SET_CELL_MeaRecord` | 遥测记录 | 2 | ⬜ |
+| `EN_SET_CELL_PowerSet` | 功率电压设置 | 2 | ⬜ |
+| `EN_SET_CELL_PTBreak` | PT 断线告警 | 2 | ⬜ |
+| `EN_SET_CELL_AutoCtrl` | 自动控制(活化/复归) | 1 | ⬜ |
+
+> 枚举中另有 4 个单元在参考源码表内**无项**(`EN_SET_CELL_YB_TY` 功能软压板、`OnceCch`
+> 一次重合闸、`TwiceCch` 二次重合闸、`OverLoad` 过负荷保护)——已被条件编译或注释掉,
+> 因此 249 项分布在 **23** 个单元而非枚举的 28 个。另有 3 个单元(`SYN` / `OverCurSpeed` /
+> `VolTimeRecv`)受 `CN_DEV_TYPE_FTU` 宏控制,属 FTU 型专属。
+>
+> **104 定值地址编排**:107 项占 `0x8820~0x8891` 连续段中的 107 个地址,**8 个空洞**
+> (`0x8822`、`0x8823`、`0x883E`、`0x883F`、`0x8842`、`0x8851`、`0x8852`、`0x8853`)
+> 对应参考源码中被注释掉的 4 条映射(`ULTV_PARA_2`、`ULTV_Phase` 等)。
+
+### 1.5 保护元件(45 个模块 → 覆盖 8 个模块 / 9 个实例)
+
+按功能归类(`RelayUnit/` 文件名去 `PRS_` 前缀):
+
+| 类别 | 元件模块 | 个数 | 本产品 |
+|---|---|---|---|
+| 过流类 | `OverCurrent`、`OverCurrent_I0`、`OverCurrent_SpeedUp`、`OverCurrentI0_SpeedUp`、`FZDOverCur`、`OverCurWarn`、`OverCurWarn_I0`、`OverLoad` | 8 | 🔶 过流 Ⅰ/Ⅱ/Ⅲ + 过负荷(4) |
+| 电压类 | `OverVol`、`OverVol_U0`、`LackVol`、`LineHaveVol`、`HaveVolCls`、`NoVolTrip`、`PTBreak`、`CTBreak` | 8 | 🔶 过压 / 欠压 / 零序过压(3) |
+| 频率类 | `OverFr`、`LackFr` | 2 | ✅ 过频 / 低频(2) |
+| 重合闸 | `AutoReCls`、`AutoReCls_JD`、`OnceCch`、`TwiceCch`、`ConnectBrkCls` | 5 | ⬜ |
+| 方向 / 功率 | `DirCell`、`PowDirJudge`、`PowerSet`、`YcOverLimit` | 4 | ⬜ |
+| 涌流 / 故障 | `InRushCur`、`FaultIsola`、`FaultRecov`、`BusEarthAlm`、`SgzAlarm` | 5 | ⬜ |
+| 自动控制 | `AutoCtrlTrip`、`ManualTrip`、`MusterRecov`、`ExvRec`、`ExvRecGW` | 5 | ⬜ |
+| 记录类 | `SOERecord`、`CORecord`、`FrzRecord`、`YcMeaRecord`、`YcMeaLimitRec`、`YcVolQuaRate` | 6 | 🔶 SOE 落盘(1,非判据元件) |
+| 录波 / 采样 | `WaveQdCell`、`RlyCommSam` | 2 | ⬜ |
+
+**判据结构对齐**(以 `PRS_OverCurrent.c` 为样板,三段过流共用一个核):
+
+```
+M_GRly_OverRelay(&bRelay, fAmp, fSetStart, fSetRet) 越限 + 返回系数滞回
+ ∧ bFyOpen ∧ bDirOpenX ∧ bNOVOpen 复压 / 方向 / 低压闭锁
+GRly_TimeRelay(&bRelay, &tTimer, dwSetDelay, CN_T10MS) 定时限(10 ms 基准)
+tTimer_KeepKI 电流保持(返回后仍延时保持)
+tTimer_NoUI 无压无流判据(CN_T20MS / CN_T200MS)
+```
+
+> 本产品 `prot_elm.c` 的"越限 + 返回系数滞回 + 定时限"三元核与上述结构**同构**;
+> 差异在于本产品用**每元件独立实例表**替代参考的全局定时器数组——这是单核移植的必要调整,
+> 不改变判据语义。逐元件复刻计划见
+> [`docs/算法/继电保护功能复现规划.md`](../算法/继电保护功能复现规划.md)。
+
+### 1.6 上行规约全集(12 种 → 已复刻 1 种;加密算法另计)
+
+| 方向 | 规约 | 参考源码 | 本产品 |
+|---|---|---|---|
+| 主站侧(对上) | IEC 60870-5-101 | `Comm/Pub/Rly_IEC101.c`、`Rly_IEC101_B.c` | ⬜ |
+| | IEC 60870-5-102(电度) | `Comm/Pub/Rly_IEC102.c` | ⬜ |
+| | IEC 60870-5-103 | `Comm/Pub/RLY_IEC103.c`、`RLY_IEC103-tcp.c`、`Rly_IEC103T.c` | ⬜ |
+| | **IEC 60870-5-104** | `Comm/Pub/Rly_IEC104.c` | ✅ |
+| | ModBus | `Comm/Pub/Rly_ModBus.c` | ⬜ |
+| | CDT | `Comm/Pub/Rly_Cdt.c` | ⬜ |
+| | 国标电度 `Whm_GB` | `Comm/Pub/Whm_GB.c` | ⬜ |
+| | IEC 61850(MMS / GOOSE / SV) | `Comm/Pub/struct61850.h`、`GlobalUnit/SttnLvlGoose.c` | ⬜ |
+| | CAN | `Comm/Pub/Rly_Can.h` | ⬜ |
+| 子站侧(对下) | IEC 101(含 ABB / 西门子 / 无优先级变体) | `Comm/Mon/Rtu_IEC101*.c` | ⬜ |
+| | IEC 104(含调试 / RIS 变体) | `Comm/Mon/Rtu_IEC104.c`、`Rtu_Dbg104.c`、`Rtu_RIS104.c` | ⬜ |
+| | BALA101 / ModBus | `Comm/Mon/Rtu_BALA101*.c`、`Rtu_ModBus.c` | ⬜ |
+| 加密 | SM2 / SM3 / ECDSA | `Comm/Ecc/` | ⬜ |
+
+> **排期判断**:104 已对齐;**对下 ModBus RTU 与 101 是"配网终端"的必要项**(接一次开关 / FTU),
+> 与 RS-485 簇同批解冻;61850 依赖以太网多播与 MMS 栈,单核 M4 资源上需单独评估,属最末批。
+
+### 1.7 差异归因与结论
+
+| 归因 | 涉及条目 | 解除方式 |
+|---|---|---|
+| **外部资源**(标准源、端子变比) | 定值标定、保护判据解卡 | 两点标定(需求档 §9.2 第 4 步) |
+| **硬件缺失**(X3 / X4) | 开入 138、开出 31、电度 8、同期、三相通道 | V0.2 硬件 |
+| **立项未排** | 多规约、SNTP、定值铺开 | 按需求档 §9.2 顺序。**录波最小闭环已交付代码面**(2026-10-29,卡片 `docs/任务规划/故障录波.md`、设计 `docs/子系统设计/故障录波设计说明.md`;1 kHz 起步与本文 80 点/周波口径的偏离在该设计文档 §2 显式登记);**4 kHz 全速、多段、COMTRADE、104 文件传输仍未排**,属二期范围 |
+| **算力 / 形态**(X1 / X2) | 双核分工、VxWorks | 不解除。**屏板链路已从范围外项移入范围内**(规格见需求档 §5.16,主机侧实现 `docs/子系统设计/屏板链路设计说明.md`;串口通道已实现,网络通道未做):主机侧链路与参考 1:1 同构,不属"替代方案" |
+
+> **结论**:本产品与参考产品的差距**全部是"进度"而非"范围"**——没有一项是"参考有而我们不做"。
+> 已对齐的是**软件骨架**(采样节拍、相量算法、定值模型、104 上行、SOE 落盘、自检闭锁);
+> 未对齐的是**点表规模**(249 / 31 / 138 / 31 / 33 / 65 vs 40 / 9 / 0 / 0 / 7 / 0)
+> 与**独立子系统**(录波、电度、多规约)。因此需求档 §9 统一表述为"复刻进度",不再出现"不做"。
+
+---
+
+## 2. 定值复刻明细(参考 249 项 → 本产品 40 项)
+
+参考定值表的每一行固定 **21 个字段**:标识 ×2 / 类型(数值 | 枚举)/ 所属单元 / 单位组 / 值类型 /
+最小值 / 最大值 / 步长 / 两个标志 / 上下限原始值 ×3(`0xAA` / `0xAAAA` / `0xFF`)/ 104 地址 /
+单位 ×2 / 小数位 / 长度 / 显示名 / 结束标记。
+本产品对应物是 `App/algo/prot_set.h` 的 `PS_*` 枚举(`PS_ID_COUNT = 40`)。
+
+**40 项的去向必须能对上账**,否则"还差多少"无从谈起:
+
+| 去向 | 项数 |
+|---|---|
+| 覆盖参考定值项 | **35** |
+| 本产品本地扩展项(参考无对应行) | **5**(`PS_RET_OVER` / `PS_RET_UNDER` 返回系数,`PS_RET_OF` / `PS_RET_UF` 频率返回系数,`PS_GLOBAL_EN` 全局软压板) |
+| **合计** | **40** |
+
+因此**定值差额 = 249 − 35 = 214 项**。
+
+### 2.1 23 个定值单元逐单元差额
+
+| 单元 | 语义 | 参考项数 | 本产品覆盖 | 差额 |
+|---|---|---|---|---|
+| `WatchDog` | 过流三段 / 零序三段 / 过负荷 / 重载 / 过载 / 过频 / 低频 | 63 | 22 | **41** |
+| `SYS3` | 系统参数(零飘、死区、变比、防抖、脉宽、FA 模式…) | 45 | 0 | **45** |
+| `VolTimeRecv` | 电压时间型馈线自动化(失电分闸 / 得电合闸 / 联络) | 17 | 0 | **17** |
+| `AutoReCls` | 重合闸 | 16 | 0 | **16** |
+| `SYN` | 同期(FTU 型) | 13 | 0 | **13** |
+| `OverCurI0` | 接地告警(小电流接地选线) | 13 | 0 | **13** |
+| `VolPro` | 电压保护(失压 / 过压 / 零序过压) | 13 | 9 | 4 |
+| `WAVESTART` | 录波启动 | 12 | 0 | **12** |
+| `MeaLimit` | 遥测越限 | 10 | 0 | **10** |
+| `OverCurSpeed` | 过流 / 零序后加速 | 8 | 0 | **8** |
+| `SYS1` | PT 参数 | 6 | 2 | 4 |
+| `SYS2` | CT 参数 | 4 | 2 | 2 |
+| `Auto_FG` | 延时自动分闸 | 4 | 0 | 4 |
+| `Auto_HH` | 延时自动合闸(电池活化) | 4 | 0 | 4 |
+| `InRush` | 励磁涌流闭锁 | 3 | 0 | 3 |
+| `OverCur` | 短路告警 | 3 | 0 | 3 |
+| `VolQuaRate` | 电压合格率 | 3 | 0 | 3 |
+| `FZDDL` | 非遮断电流闭锁 | 3 | 0 | 3 |
+| `BHKO` | 保护出口展宽 | 2 | 0 | 2 |
+| `MeaRecord` | 遥测记录周期 | 2 | 0 | 2 |
+| `PowerSet` | 功率电压组 | 2 | 0 | 2 |
+| `PTBreak` | PT / 控回断线告警 | 2 | 0 | 2 |
+| `AutoCtrl` | 自动复归 | 1 | 0 | 1 |
+| **合计** | | **249** | **35** | **214** |
+
+> 单元名 `WatchDog` 有误导性:它装的是**全部保护元件的动作定值**(过流 / 零序 / 负荷 / 频率),
+> 不是看门狗参数。移植时不要按名字去找"看门狗定值"。
+
+### 2.2 已覆盖单元的逐项对照(35 项)
+
+**过流三段:参考 24 项,本产品 12 项**(每段缺 4 项,共缺 12)
+
+| 参考项(Ⅰ/Ⅱ/Ⅲ 段各一份) | 本产品 | 说明 |
+|---|---|---|
+| 过流 n 段投入 | `PS_OCn_EN` | ✅ |
+| 过流 n 段跳闸投入 | `PS_OCn_TRIP` | ✅ 语义 = 0 告警 / 1 跳闸 |
+| 过流 n 段定值 | `PS_OCn_CUR` | ✅ 二次值 A |
+| 过流 n 段延时 | `PS_OCn_DLY` | ✅ ms(参考为 S,换算在整定入口) |
+| 过流 n 段方向投入 | — | ❌ 无方向元件(`DirCell` / `PowDirJudge` 未复刻) |
+| 过流 n 段低压投入 | — | ❌ 无复压闭锁(`bNOVOpen` 无来源) |
+| 过流 n 段告警投入 | — | ❌ 参考把"告警投退"与"跳闸投退"拆成两项,本产品只有一项 |
+| 过流 n 段低压定值 | — | ❌ 同上 |
+
+> **这一处差额最容易被低估**:本产品的三段过流是"简化版三段",参考的三段每段还带
+> **方向 / 低压 / 告警** 三个独立开关和一个低压定值。缺这四项时,三段过流只能做无方向、
+> 无复压闭锁的纯过流保护——在环网或双电源线路上会误动。
+
+**零序过流三段:参考 18 项,本产品 0 项**
+
+参考在 `WatchDog` 内另有完整的零序三段(每段 6 项:投退 / 方向 / 告警投入 / 跳闸 / 定值 / 时限)。
+本产品 `PS_3U0_*` 三项是**零序过压**(属 `VolPro`),**不是零序过流**——两者不可混为一谈:
+零序过流看 `3I0` 幅值,零序过压看 `3U0` 幅值。因此零序过流保护目前**完全没有定值载体**,
+`OverCurrent_I0` 元件也无从判据。
+
+**过负荷 / 重载 / 过载:参考 12 项,本产品 4 项**
+
+| 参考项组 | 本产品 | 差额 |
+|---|---|---|
+| 过负荷报警(投退 / 跳闸 / 定值 / 时限) | `PS_OL_*` 4 项 | ✅ 齐 |
+| 重载报警(同上 4 项) | — | ❌ 缺 4 |
+| 过载报警(同上 4 项) | — | ❌ 缺 4 |
+
+> 参考把"过负荷 / 重载 / 过载"分成三级(默认 150 A / 70 A / 100 A 步长,时限 9000 s / 0 / 0),
+> 对应事件 435 / 436 / 437。本产品只有一级过负荷。三级是**同一判据不同门槛**,
+> 复刻成本低(元件框架已具备),但需先补 `OverLoad` 的三个实例与三条事件映射。
+
+**过频 / 低频:参考 8 项,本产品 6 项 + 2 本地项**
+
+| 参考项 | 本产品 | 说明 |
+|---|---|---|
+| 过频 / 低频 保护投退 | `PS_OF_EN` / `PS_UF_EN` | ✅ |
+| 过频 / 低频 保护定值 | `PS_OF_HZ` / `PS_UF_HZ` | ✅ 参考单位 HZ 存 5000~5500(0.01 Hz),本产品存 Hz 浮点 |
+| 过频 / 低频 保护时限 | `PS_OF_DLY` / `PS_UF_DLY` | ✅ |
+| 过频 / 低频 **跳闸**投退 | — | ❌ 缺 2:参考区分"保护投入"与"跳闸投入",本产品只有前者 |
+
+**电压保护:参考 13 项,本产品 9 项**
+
+| 参考项 | 本产品 | 说明 |
+|---|---|---|
+| 失压保护投退 / 定值 / 时限 | `PS_UV_EN` / `PS_UV_VOL` / `PS_UV_DLY` | ✅ |
+| 过压保护投退 / 定值 / 时限 | `PS_OV_EN` / `PS_OV_VOL` / `PS_OV_DLY` | ✅ |
+| 零序过压投退 / 定值 / 时限 | `PS_3U0_EN` / `PS_3U0_VOL` / `PS_3U0_DLY` | ✅ |
+| 失压 / 过压 / 零压 **跳闸**投退(3 项) | — | ❌ 缺 3 |
+| 零压 **告警**投退(1 项) | — | ❌ 缺 1 |
+
+**PT / CT 参数:参考 10 项,本产品 4 项**
+
+| 参考项 | 本产品 | 说明 |
+|---|---|---|
+| 母线一次额定(kV) | `PS_PT_PRI` | ✅ 本产品存 V |
+| 母线二次额定(线)(V) | `PS_PT_SEC` | ✅ |
+| 额定 TA 一次值(A) | `PS_CT_PRI` | ✅ |
+| 额定 TA 二次值(A) | `PS_CT_SEC` | ✅ |
+| 母线二次额定(相)(V) | — | ❌ 缺:线 / 相两种二次额定的换算关系需显式给出 |
+| 零序一次额定(kV) | — | ❌ 缺 |
+| 零序二次额定(V) | — | ❌ 缺 |
+| 零序一次额定(A) | — | ❌ 缺 |
+| 零序二次额定(A) | — | ❌ 缺 |
+| PT 接入数目(1~3) | — | ❌ 缺:决定用线电压还是相电压作判据源 |
+
+### 2.3 完全未覆盖单元逐项清单(163 项)
+
+214 项差额中,**51 项**落在 需求档 §2.2 已部分覆盖的四个单元里(过流 12 / 零序 18 / 重载与过载 8 /
+频率 2 / 电压 4 / PT·CT 6 / 备用控制字 1),余下 **163 项**落在下面这些**一项都没有**的单元里。
+逐项列出以便排期时按"整单元"认领,不要拆散。
+
+**系统参数 `SYS3`(45 项)**——零飘门槛 10 项:额定电压零飘门槛、额定电流零飘门槛、直流电压零飘、
+功率零飘、频率零飘、功率因数零飘、相角零飘门槛、备用 ×4;死区 7 项:电流死区、电压死区、
+直流电压死区、功率死区、频率死区、功率因数死区、相角死区;开入开出 4 项:开入防抖(10~60000 ms)、
+分闸脉宽、合闸脉宽、开入手动分合;变比 5 项:PT 变比、相 CT 变比、零序 CT 变比、功率变比、电量变比;
+其余 19 项:开关类型、故障遥信保持时间、功率置负、单项接地选线投入、单相接地跳闸时间、FA 模式、
+对时切换长延时、断线告警确认时间、事故总判小电流接地告警、加速段保护开放时间、
+重合闸检有压等待时间、连续分闸时间、分闸次数、备用参数 01~08。
+
+> 本产品的死区落在**运行参数段**(`0x8030~0x8038` 九点,RAM 副本 + 104 可写),
+> 变比落在 `prot_set` 的 PT/CT 四项。**语义已覆盖、载体不同**——复刻 `SYS3` 时是把这
+> 两类合并进定值表,不是重新实现。
+
+**电压时间型自愈 `VolTimeRecv`(17 项)**:就地 FA 模式、LS(0/1,1 = 联络)、
+失电分闸投退、失电分闸时限(0~100000 s)、得电合闸投退、X 时间(1~100 s,默认 7)、
+故障电流检测、故障电流定值(1~10000 A)、Y 时间(1~100 s,默认 5)、联络开关合闸、
+联络充电时限(0~1800 s)、联络合闸时限(0~300 s)、正方向选择、残压定值(0~300 V)、
+残压判定时限、停电时间(1~10 s)、人工闭锁。
+
+> 这是**馈线自动化(FA)的核心**:失电分闸 → 得电合闸 → 联络转供。对应元件
+> `NoVolTrip` / `HaveVolCls` / `ConnectBrkCls` / `FaultIsola` / `FaultRecov` 五个模块。
+> 无开入(开关位置)与出口(分合闸)时**无法闭环**,属 X3 依赖项。
+
+**重合闸 `AutoReCls`(16 项)**:重合闸投退、充电时间(0~100000 s)、重合闸次数(0~3)、
+一次 / 二次 / 三次重合闸时间(0~60000 s)、重合闸闭锁时间(0~9900 s)、整组复归时间、
+大电流闭锁投退、大电流闭锁定值、重合闸检同期、重合闸检无压、同期检无压定值(0~15000 V)、
+同期检角差定值(1~30°)、过流禁止重合闸、零序禁止重合闸。
+
+> 参考支持**三次重合**且每次时间独立可整定,充电时间与整组复归时间分离——这三项
+> 是"重合闸能不能用"的关键(无充电时间 = 每次跳闸都立即重合,会连击)。
+> 依赖出口(合闸)与开入(开关位置),属 X3 依赖项。
+
+**同期 `SYN`(13 项,FTU 型专属)**:检无压投退、检同期投退、频差 / 角差 / 压差 / 滑差闭锁投退
+(4 项)、检无压定值(1000~9999 V)、检频差定值(0~200,0.01 Hz)、检角差定值(1~180°)、
+检压差定值(0~9999 V)、检频率滑差值(0~200 Hz/s)、开关合闸时限(0~200 s)、整组复归时间。
+
+> 需**两路电压同刻**(母线侧 + 线路侧)才能算角差与频差——本产品 V0.1 只有一个转换器的
+> 电压通道,属 X3 / H1 依赖项。
+
+**录波启动 `WAVESTART`(12 项)**:电流启动投退 / 定值(0~10000 A)、低压启动投退 / 定值
+(0~10000 V)、零压启动投退 / 定值(0~30000 V)、零流启动投退 / 定值(0~1000 A)、
+零流突变投退 / 定值(0~1000 A)、录波启动延时、保护启动录波。
+
+> 录波启动是**独立于保护判据的触发源**:即使保护不动作,只要越启动值也要录波。
+> 本产品无录波子系统,这 12 项无处落地(见 需求档 §7)。
+
+**遥测越限 `MeaLimit`(10 项)**:有压鉴别投退 / 线路有压定值(0~300 V)、无压鉴别投退 /
+线路无压定值(0~300 V)、线路有压时限(2~100000 s)、电压越上限 / 越下限(0~100000 V)、
+电流越上限(0~10000 A)、越上限延时 / 越下限延时。
+
+> 越限记录(`OVER` 队列,128 条)的判据来源。本产品无越限记录类,故这 10 项也无载体。
+
+**过流后加速 `OverCurSpeed`(8 项)**:后加速投退、线路 1 前加速投退、过流后加速电流值
+(1~10000 A)、过流后加速时限(0~10000 s)、零序后加速投退、线路 1 前加速投退(重复项,
+参考源码如此)、零序后加速电流值(1~1000 A)、零序后加速时限。
+
+**接地告警 `OverCurI0`(13 项)**:线路接地告警投退、零序电流反极性、零序电压反极性、
+接地备用 02、接地告警投退、接地跳闸投退、接地方向投退、接地定值(0~10000 A)、接地时限、
+接地跳闸时限(0~600 s)、零压启动定值(1~10000 V)、接地重合投退、接地后加速投退。
+
+> **反极性**两项是现场接线纠错开关(CT / PT 装反时不必改线,改定值即可),
+> 属"现场可维护性"需求,不是可选项。
+
+**其余小单元(合计 29 项)**:励磁涌流闭锁 3(闭锁投退、涌流制动系数 1~100、闭锁复归时间);
+短路告警 3(投退 / 时限 / 线路 01 短路电流定值);电压合格率 3(上限 / 下限定值 0~200 %、周期类型 0~4);
+非遮断电流闭锁 3(电流闭锁投退、停电跳闸投退、非遮断电流值 1~10000 A);
+出口展宽 2(跳闸出口时间、合闸出口时间,1~100000 ms);
+遥测记录 2(遥测记录周期 0~2880、极值记录周期 0~360);
+功率电压组 2(1~4 组);PT 断线 2(断线告警、控回断线告警);自动复归 1(自动复归投退);
+延时自动分闸 4(延时复归投退、2:时 1:分 0:秒、延时复归时限 ×2);
+延时自动合闸 4(自动活化投退、2:分 1:时 0:日、自动活化周期 0~360、自动活化时限 0~23000 s)。
+
+---
+
+---
+
+## 3. 遥测复刻明细(参考 31 点 → 本产品 9 点)
+
+参考 `g_tYcIndexTab` 的 31 点是**按"两回线 × 三相 + 线电压 + 零序 + 功率"组织的完整电气量集**。
+本产品 9 点(`0x4011~0x4018`、`0x401D`)只覆盖第一回线的相量与频率。
+
+| # | 参考遥测 | 参考枚举 | 本产品 | 差额原因 |
+|---|---|---|---|---|
+| 1 | 1 回 A 相电流 | `EN_YCMEA_IA01` | `0x4015` ✅ | |
+| 2 | 1 回 B 相电流 | `EN_YCMEA_IB01` | `0x4016` ✅ | 削顶 → 恒 IV |
+| 3 | 1 回 C 相电流 | `EN_YCMEA_IC01` | `0x4017` ✅ | 削顶 → 恒 IV |
+| 4 | 2 回 A 相电流 | `EN_YCMEA_IA02` | — | ❌ 无第二回线 |
+| 5 | 2 回 B 相电流 | `EN_YCMEA_IB02` | — | ❌ |
+| 6 | 2 回 C 相电流 | `EN_YCMEA_IC02` | — | ❌ |
+| 7 | 1 回 A 相电压 | `EN_YCMEA_UA1` | `0x4011` ✅ | |
+| 8 | 1 回 B 相电压 | `EN_YCMEA_UB1` | `0x4012` ✅ | 削顶 → 恒 IV |
+| 9 | 1 回 C 相电压 | `EN_YCMEA_UC1` | `0x4013` ✅ | 削顶 → 恒 IV |
+| 10 | 2 回 A 相电压 | `EN_YCMEA_UA2` | — | ❌ |
+| 11 | 2 回 B 相电压 | `EN_YCMEA_UB2` | — | ❌ |
+| 12 | 2 回 C 相电压 | `EN_YCMEA_UC2` | — | ❌ |
+| 13 | 1 回 AB 线电压 | `EN_YCMEA_UAB1` | — | ❌ 需两相相量之差 |
+| 14 | 1 回 BC 线电压 | `EN_YCMEA_UBC1` | — | ❌ |
+| 15 | 1 回 CA 线电压 | `EN_YCMEA_UCA1` | — | ❌ |
+| 16 | 2 回 AB 线电压 | `EN_YCMEA_UAB2` | — | ❌ |
+| 17 | 2 回 BC 线电压 | `EN_YCMEA_UBC2` | — | ❌ |
+| 18 | 2 回 CA 线电压 | `EN_YCMEA_UCA2` | — | ❌ |
+| 19 | 1 回零序电流 | `EN_YCMEA_3I01` | `0x4018` ✅ | 近似对齐(本产品为外部零序通道) |
+| 20 | 1 回零序电压 | `EN_YCMEA_3U01` | `0x4014` ✅ | 近似对齐 |
+| 21 | 2 回零序电压 | `EN_YCMEA_3U02` | — | ❌ |
+| 22 | 频率 | `EN_YCMEA_FR1` | `0x401D` ✅ | |
+| 23 | 直流 1 | `EN_YCMEA_DC_01` | — | ❌ 无直流采样通道 |
+| 24 | 直流 2 | `EN_YCMEA_DC_02` | — | ❌ |
+| 25 | A 相有功 | `EN_YCMEA_PA_1` | — | ❌ 需跨转换器同刻(H1) |
+| 26 | B 相有功 | `EN_YCMEA_PB_1` | — | ❌ |
+| 27 | C 相有功 | `EN_YCMEA_PC_1` | — | ❌ |
+| 28 | 总有功 | `EN_YCMEA_P_1` | — | ❌ |
+| 29 | 总无功 | `EN_YCMEA_Q_1` | — | ❌ |
+| 30 | 总视在 | `EN_YCMEA_S_1` | — | ❌ |
+| 31 | 功率因数 | `EN_YCMEA_COS_1` | — | ❌ |
+
+**缺的 22 点按依赖分三批**:
+
+| 批次 | 点数 | 内容 | 依赖 |
+|---|---|---|---|
+| 线电压与功率 | 13 | 6 线电压 + 7 功率/功率因数 | **H1**:电压在 TPAFE、电流在 STM32 ADC1,无共同触发,功率的 `U×I` 需同刻 |
+| 第二回线 | 7 | 2 回 6 相量 + `3U02` | 采样通道数(V0.2 硬件) |
+| 直流 | 2 | `DC_01` / `DC_02` | 无直流采样通道 |
+
+> 线电压本身**不一定要等 H1**:`Uab = Ua − Ub` 只需同一转换器内的两相相量,
+> 若两相都落在 TPAFE 侧即可算。当前 `Ub`/`Uc` 削顶(在 STM32 侧),所以连带算不出。
+> **先解决"三相电压全落 TPAFE"这一件事,能一次解锁 6 个线电压点**。
+
+**遥测模型 `g_tAnaModelTab`(35 行)**:参考为每个遥测点定义死区、变比、系数、越限档等属性行,
+是"点表 + 整定"的合体。本产品的对应物拆成了三处:`iec104_pts.c` 的 YC 表(地址 + 死区系数)、
+`run_par.c` 的死区九点、`adc_cal.c` 的 k/b。复刻模型表 = 把这三处收敛成一张可整定的表。
+
+**电度 `g_tYmIndexTab`(8 种,本产品 0)**:正向有功 `Pt1`、正向无功 `Qt1`、Q1 象限、Q4 象限、
+反向有功 `Pt0`、反向无功 `Qt0`、Q2 象限、Q3 象限。地址段 `0x6401~0x6600`。
+电度 = 功率对时间积分,**与功率同批解锁**(同一 H1 依赖)。
+
+---
+
+---
+
+## 4. 开入 / 开出复刻明细(138 + 31 → 本产品 0)
+
+参考把"开入"分成四类,本产品**一个都没有**(无硬件,不可移植项 X3)。
+
+**开入 138 点的构成**:
+
+| 类别 | 点数 | 含义 |
+|---|---|---|
+| 软遥信 `EN_KI_SOFTYX_*` | **104** | 由保护元件/逻辑产生的内部状态,不占物理端子(如"过流Ⅰ段动作""重合闸充电完成""FA 投入") |
+| 硬件开入 `EN_KI_*` / `EN_KIA_*` | **27** | 物理端子:开关合位 / 分位 / 未储能 / 就地远方 / 接地位置 / 隔离位置 / 停用重合闸 / 保护投入 / 检修压板 / 远方信号 / 就地 FTU 手合手分 / 电源输入 / 活化状态 / 电池欠压 / 活化投入 |
+| 双点遥信 `EN_KI_TWIN_YX_*` | **6** | 开关位置用双点表达(00 中间态 / 01 分 / 10 合 / 11 无效) |
+| 多态遥信 `EN_KI_INT8U_*` | **1** | 8 位状态量(如"设备状态"枚举) |
+
+> **104 点 ≠ 104 个端子**。真正要接线的是 27 个硬件开入;104 个软遥信是**元件输出**,
+> 只要元件复刻出来就自然存在。这个区分决定了工作量估算:不是"买 138 路开入板",
+> 而是"27 路端子 + 104 个元件状态映射"。
+
+**开出 31 点的构成**:
+
+| 类别 | 点数 | 明细 |
+|---|---|---|
+| 出口类 | **11** | 保跳 1(`BH_TZ1`)、保合 1(`BH_HZ1`)、遥分 1(`YT01`)、遥合 1(`YH01`)、遥分 2(`YT02`)、遥合 2(`YH02`)、电池活化(`DCHH`)、活化退出(`DCHH_Esc`)、信号复归(`FG`)、开入变位(`KICHANGE`)、录波启动(`WAVE_START`) |
+| 信号类 | **20** | 事故信号 `SignTV`、运行 `SignRun`、通信中断 `SignCOMM`、硬件故障 `SignHW`、储能 `SignCN`、电池欠压 `SignBatQY`、失电 `SignSD`、过负荷 `SignGL`、接地 `SignJD`、闭锁 `SignBM`、备用 `SignBS`、自检 `SignCHK`、重合 `SignCH`、备用 3 个 `SignBAK1~3`、告警 `SignALM`、保护动作 `SignPro`、就地 FA `SignJDFA`、集中 FA `SignJZFA` |
+
+> 本产品当前**保护动作只体现为遥信 + SOE**,没有任何物理出口。这在"保护测控装置"的
+> 定义里是硬缺口:保护判据做得再准,不跳闸就等于没保护。X3 解除前,`YX` 里的
+> 动作类遥信必须**如实标 IV**,不能让主站误以为已跳闸。
+
+---
+
+---
+
+## 5. 动作事件复刻明细(参考 33 条 → 本产品 9 条)
+
+参考 `g_tActRecTab` 的 33 条动作事件编号 **421~453**,是"保护动作 → 事件码 → 记录 → 上送"的
+中间层。本产品用 `App/log/sys_log.h` 的七类记录 + SOE,**没有事件码表**。
+
+| 事件码 | 参考事件 | 本产品 | 说明 |
+|---|---|---|---|
+| 421 | 线路励磁涌流闭锁 | ❌ | `InRushCur` 未复刻 |
+| 422 | 线路Ⅰ段过流保护动作 | ✅ | `PS_OC1_*` |
+| 423 | 线路Ⅱ段过流保护动作 | ✅ | `PS_OC2_*` |
+| 424 | 线路Ⅲ段过流保护动作 | ✅ | `PS_OC3_*` |
+| 425 | 线路零序Ⅰ段过流保护动作 | ❌ | 无零序过流定值载体 |
+| 426 | 线路零序Ⅱ段过流保护动作 | ❌ | 同上 |
+| 427 | 线路零序Ⅲ段过流保护动作 | ❌ | 同上 |
+| 428 | 线路后加速保护动作(过流) | ❌ | `OverCurrent_SpeedUp` 未复刻 |
+| 429 | 线路后加速保护动作(零序) | ❌ | `OverCurrentI0_SpeedUp` 未复刻 |
+| 430 | 零序过压保护动作 | ✅ | `PS_3U0_*` |
+| 431 | 线路欠压保护动作 | ✅ | `PS_UV_*` |
+| 432 | 线路过压保护动作 | ✅ | `PS_OV_*` |
+| 433 | 高频保护动作(过频) | ✅ | `PS_OF_*` |
+| 434 | 低频保护动作 | ✅ | `PS_UF_*` |
+| 435 | 线路过负荷保护动作 | ✅ | `PS_OL_*` |
+| 436 | 线路重载保护动作 | ❌ | 三级负荷只做了一级 |
+| 437 | 线路过载保护动作 | ❌ | 同上 |
+| 438 | 线路接地保护动作 | ❌ | `OverCurI0` 未复刻 |
+| 439 | 一次重合动作 | ❌ | 重合闸未复刻 |
+| 440 | 二次重合动作 | ❌ | 同上 |
+| 441 | 三次重合动作 | ❌ | 同上 |
+| 442 | 接地重合动作 | ❌ | 同上 |
+| 443 | 接地后加速动作 | ❌ | 同上 |
+| 444 | 失电分闸动作 | ❌ | `NoVolTrip` 未复刻 |
+| 445 | 得电合闸动作 | ❌ | `HaveVolCls` 未复刻 |
+| 446 | 闭锁合闸动作 | ❌ | 需开入(闭锁压板) |
+| 447 | 闭锁分闸动作 | ❌ | 同上 |
+| 448 | 联络开关合闸动作 | ❌ | `ConnectBrkCls` 未复刻 |
+| 449 | 联络开关分闸动作 | ❌ | 同上 |
+| 450 | 保护动作备用 02 | — | 参考即备用 |
+| 451 | A 相故障 | ❌ | 需分相判别(三相全接) |
+| 452 | B 相故障 | ❌ | 同上 |
+| 453 | C 相故障 | ❌ | 同上 |
+
+> **本产品覆盖 9 / 33 条**。注意 428 与 429 在参考源码里**同名**(都叫"线路后加速保护动作"),
+> 靠事件码区分过流与零序——移植时不能按名字去重。
+>
+> 事件码缺失的连带后果:**事故报告(`CN_NUM_QUE_REC_RPT` 队列)无法生成**。
+> 参考的事故报告是按事件码索引动作时序的,没有事件码表就没有"保护动作报告"这一页。
+
+---
+
+---
+
+## 6. 保护元件复刻明细(参考 45 个模块 → 本产品 8 个)
+
+**模块级口径**:参考 `RelayUnit/` 45 个 `.c` 文件 = 45 个元件模块。本产品覆盖 **8 个模块**
+(7 个判据模块 + 1 个记录模块),以 **9 个实例**落地(`OverCurrent` 一个模块出三段实例)。
+
+| 类别 | 参考模块 | 本产品 | 缺 |
+|---|---|---|---|
+| 过流类 | 8 | 2(`OverCurrent`、`OverLoad`) | **6** |
+| 电压类 | 8 | 3(`OverVol`、`OverVol_U0`、`LackVol`) | **5** |
+| 频率类 | 2 | 2(`OverFr`、`LackFr`) | 0 |
+| 重合闸 | 5 | 0 | **5** |
+| 方向 / 功率 | 4 | 0 | **4** |
+| 涌流 / 故障 | 5 | 0 | **5** |
+| 自动控制 | 5 | 0 | **5** |
+| 记录类 | 6 | 1(`SOERecord`) | **5** |
+| 录波 / 采样 | 2 | 0 | **2** |
+| **合计** | **45** | **8** | **37** |
+
+**缺的 37 个模块,逐个给出"缺它意味着什么"**:
+
+| 模块 | 类别 | 判据要点 | 缺它的后果 | 依赖 |
+|---|---|---|---|---|
+| `OverCurrent_I0` | 过流 | 零序电流三段 + 方向 | 接地故障无保护 | 定值载体(零序 18 项) |
+| `OverCurrent_SpeedUp` | 过流 | 后加速:重合后短延时无选择跳闸 | 重合于故障时靠 Ⅰ 段延时切除,慢一拍 | 重合闸 |
+| `OverCurrentI0_SpeedUp` | 过流 | 零序后加速 | 同上(接地) | 重合闸 |
+| `FZDOverCur` | 过流 | 非遮断电流闭锁(负荷电流以下不允许跳闸) | 小电流跳闸可能拉弧不熄 | 定值 3 项 |
+| `OverCurWarn` | 过流 | 过流告警(只告警不跳闸) | 过流只能跳不能告警 | 定值(告警投入) |
+| `OverCurWarn_I0` | 过流 | 零序过流告警 | 同上 | 定值 |
+| `LineHaveVol` | 电压 | 线路有压鉴别 | 无法区分"有压合闸"与"无压合闸" | 定值(MeaLimit 有压鉴别) |
+| `HaveVolCls` | 电压 | 得电合闸 | FA 的"来电自动合闸"缺失 | 开入 + 出口 |
+| `NoVolTrip` | 电压 | 失电分闸 | FA 的"失电自动分闸"缺失 | 开入 + 出口 |
+| `PTBreak` | 电压 | PT 断线(电压消失但电流正常) | 断线时电压类保护可能误动/拒动 | 定值 2 项 |
+| `CTBreak` | 电压 | CT 断线 | 同上(电流侧) | 定值 |
+| `AutoReCls` | 重合闸 | 充电 → 跳闸 → 延时重合 → 整组复归 | 瞬时故障必须人工合闸 | 开入 + 出口 + 16 项定值 |
+| `AutoReCls_JD` | 重合闸 | 接地故障重合 | 同上(接地) | 同上 |
+| `OnceCch` | 重合闸 | 一次重合(表内无定值,条件编译) | — | 同上 |
+| `TwiceCch` | 重合闸 | 二次重合(表内无定值,条件编译) | — | 同上 |
+| `ConnectBrkCls` | 重合闸 | 联络开关合闸(转供) | 环网无法转供 | 开入 + 出口 + 17 项定值 |
+| `DirCell` | 方向 / 功率 | 方向元件(功率方向判别) | 双电源/环网会反送电误动 | 三相电压 + 三相电流同刻(H1) |
+| `PowDirJudge` | 方向 / 功率 | 功率方向(有功/无功象限) | 同上 | 同上 |
+| `PowerSet` | 方向 / 功率 | 功率电压组切换(1~4 组) | 多组 PT/CT 变比无法切换 | 定值 2 项 |
+| `YcOverLimit` | 方向 / 功率 | 遥测越限判据 | 越限记录无来源 | 定值(MeaLimit 10 项) |
+| `InRushCur` | 涌流 / 故障 | 二次谐波制动(励磁涌流闭锁) | 变压器空投时过流误动 | 谐波算法(见需求档 §9.1.2「遥测增强」) |
+| `FaultIsola` | 涌流 / 故障 | 故障隔离 | FA 无法定位故障区段 | 开入 + 出口 |
+| `FaultRecov` | 涌流 / 故障 | 故障恢复供电 | 同上 | 同上 |
+| `BusEarthAlm` | 涌流 / 故障 | 母线接地告警 | 母线接地无告警 | 零序电压 |
+| `SgzAlarm` | 涌流 / 故障 | 事故总告警 | 事故总信号缺失 | 事件码表 |
+| `AutoCtrlTrip` | 自动控制 | 自动控制跳闸(电池活化等) | 活化流程无法跳闸 | 出口 |
+| `ManualTrip` | 自动控制 | 手动跳闸 | 就地手动分闸缺失 | 开入 + 出口 |
+| `MusterRecov` | 自动控制 | 总复归(复归所有保持态) | 动作态只能靠重启清 | 无(**可先做**) |
+| `ExvRec` | 自动控制 | 事故记录 | 事故报告缺失 | 事件码表 |
+| `ExvRecGW` | 自动控制 | 事故记录(网关侧) | 同上 | 同上 |
+| `CORecord` | 记录 | COS 变位记录 | 开入变位无记录 | 开入 |
+| `FrzRecord` | 记录 | 冻结记录(整点冻结电量) | 电度无冻结 | 电度 |
+| `YcMeaRecord` | 记录 | 遥测定时记录 | 无遥测历史 | 定值 2 项 |
+| `YcMeaLimitRec` | 记录 | 遥测越限记录 | 无越限记录 | 越限判据 |
+| `YcVolQuaRate` | 记录 | 电压合格率统计 | 无合格率 | 定值 3 项 |
+| `WaveQdCell` | 录波 / 采样 | 录波启动判据 | 录波无触发源 | 录波子系统 |
+| `RlyCommSam` | 录波 / 采样 | 保护通信采样(跨装置采样同步) | 多装置差动类保护不可能 | 通信 + 对时 |
+
+> **唯一"现在就能做"的是 `MusterRecov`(总复归)**:它不依赖任何硬件,只把各元件的
+> 保持态与出口标志清一遍。本产品已有 `prot_elm_request_reset` 单字请求标志(架构硬件档 §1.5),
+> 接上即可。其余 36 个模块都至少依赖定值载体、开入、出口、事件码四者之一。
+
+---
+
+---
+
+## 7. 故障录波子系统规格(本产品 0)
+
+录波是**唯一一个"完全独立的子系统"级缺口**:它不在保护链路上,但有独立的采样率、
+独立的存储格式、独立的文件传输通道。参考实现的硬指标如下,可直接作为复刻验收判据。
+
+| 指标 | 参考值(`APP/EquipCfg/Const_Wave.h`) | 说明 |
+|---|---|---|
+| 录波采样率 | `CN_SAM_RATE × CN_WAVE_RATIO` = 20 × 4 = **80 点/周波**(50 Hz 下 4000 Hz) | 保护计算用 20 点/周波,录波要 4 倍过采样才能看清波形。**偏离登记**:本装置先按 1 kHz(20 点/周波)立项,理由与二期不返工的结构约束见 `docs/子系统设计/故障录波设计说明.md` §2 与 §2.1 |
+| 录波段数 | `CN_WAVE_SECT_NUM` = **6 段** | 每段独立缓冲,支持连续多次录波 |
+| 启动前缓冲 | `CN_WAVE_CYCLE_SUM_REFRE_BUF` = **5 周波**(100 ms) | 循环刷新,保证故障前有数据 |
+| 动作后 | `CN_WAVE_CYCLE_SUM_ACTED` = **10 周波**(200 ms) | |
+| 返回段 | `CN_WAVE_CYCLE_SUM_RET` = **2 周波** | 返回过程也要录 |
+| 手动录波 | `CN_WAVE_CYCLE_SUM_HAND` = **6 周波** | |
+| 单次最长 | `CN_WAVE_MAX_TIME` = **9000 ms** | 超长故障(如持续性接地)按此截断 |
+| RAM 录波个数 | `CN_WAVE_RAM_NUM` = **16** | RAM 里最多同时存 16 份,满了转存文件 |
+| COMTRADE 保存数 | 动作 **64** / 启动 **64** / 手动 **16** | 三类独立配额,满了循环覆盖 |
+| 单份最大开关变位 | `CN_WAVE_MAX_RECSWI` = **64** | |
+| 布尔量通道 | `CN_WAVE_NUM_BOOLFLG` = **320** | 全局布尔变量按位录波 |
+| 模拟量通道 | 原始 + 计算 = `CN_WAVE_ALL_ANA_NUM` | 本产品对应 **65 通道**(`g_tMeasureModelTab`) |
+| 录波类型 | 动作 `TYPE_ACT`=1 / 启动 `TYPE_START`=2 / 手动 `TYPE_HAND`=3 | |
+| 文件格式 | COMTRADE(`.cfg` + `.dat`) | 主站侧通用格式,非私有 |
+| 上送方式 | 104 文件传输(`F_FR_NA_1` 目录 / `F_SR_NA_1` 读文件) | 本产品 104 未实现文件传输 |
+
+**复刻所需的四件东西**(缺一不可):
+
+1. **4 倍过采样缓冲**:当前 `adcTask` 以 1000 Hz 出样本,录波要 4000 Hz。要么提高采样率
+ 再抽取给保护(改变整条链节拍),要么在 TPAFE 侧单独开一条 4 倍速通路(改驱动)。
+2. **环形缓冲 + 触发点定位**:5 周波前缓冲 + 10 周波后缓冲,触发时刻要能反算出缓冲内偏移。
+3. **COMTRADE 编码器**:`.cfg`(通道定义、采样率、时标)+ `.dat`(二进制采样值)+ `.hdr`。
+4. **文件存储与配额管理**:SPI NAND 上按 64/64/16 配额循环覆盖,需与现有 FatFs + dhara 层对接。
+
+> **排期判断**:录波不是"加个功能",是**新增一条 4 倍速采样通路 + 一套文件格式 + 一个配额管理器**。
+> 它排在定值/元件铺开之后,因为录波通道表(65 路)本身依赖元件输出。
+
+---
+
+---
+
+## 8. 记录体系复刻明细(参考 13 类 → 本产品 8 类)
+
+参考用 13 个定长队列分类存记录,容量按类分配(`GlobalDef/Const_Sys.h`):
+
+| 参考队列 | 容量 | 语义 | 本产品 |
+|---|---|---|---|
+| `REC_ACT` | 128 | 动作记录(保护动作) | ✅ 事故记录 `/log/accid.log` |
+| `REC_ALM` | 128 | 告警记录 | ✅ 保护告警 `/log/alarm.log` |
+| `REC_OVER` | 128 | 越限记录 | ❌ |
+| `REC_START` | 128 | 启动记录(元件启动但未动作) | ✅ 保护启动 `/log/start.log` |
+| `REC_LOCK` | 128 | 闭锁记录(保护被闭锁) | ❌ |
+| `REC_SOE` | **256** | SOE(带时标的开入变位) | ✅ `soe_store`(SPSC 深度 8 → 落盘) |
+| `REC_COS` | **256** | COS(无时标的状态变位) | ❌ |
+| `REC_CHK` | 128 | 自检记录 | ✅ `/log/selftest.log` |
+| `REC_RUN` | 128 | 运行记录(上电/重启) | ✅ `/log/run.log` |
+| `REC_OPT` | 128 | 操作记录(复归/对时/定值保存) | ✅ `/log/oper.log` |
+| `REC_YK` | 128 | 遥控记录 | ✅ `/log/yk.log` |
+| `REC_SC` | 128 | 顺控记录 | ❌ |
+| `REC_SCSTEPINFO` | 128 | 顺控执行明细 | ❌ |
+
+**缺的 5 类及其依赖**:
+
+| 缺的队列 | 依赖 | 能否先做 |
+|---|---|---|
+| 越限记录 | 越限判据(`MeaLimit` 10 项定值 + `YcOverLimit` 元件) | 可先做判据、后做记录 |
+| 闭锁记录 | 闭锁源已具备(四源闭锁,需求档 §5.12),**只缺记录落点** | ✅ **最该先补**——现在闭锁发生了但无记录,现场排障靠猜 |
+| COS 记录 | 开入(X3) | ❌ |
+| 顺控记录 / 顺控执行明细 | 顺控功能(参考 `YKRly.c` 63 KB 的顺控执行引擎) | ❌ 整功能未立项 |
+
+> **闭锁记录是本表里性价比最高的一项**:闭锁源(未标定 / 采样故障 / 定值校验和 / 软压板退出)
+> 已经全部实现,但闭锁的**发生与解除都没有留痕**。加一个 `REC_LOCK` 等价队列,
+> 只需在 `protect_task` 的闭锁判定处加一条写入,不依赖任何硬件。
+
+**格式差异**:参考是**二进制定长记录 + 独立队列 + 循环覆盖**;本产品是**文本行(64 B 定长)+ 文件**。
+文本行的优点是 FTP 直接可读、现场排障友好;缺点是容量利用率低、无结构化解码。
+复刻时建议**保留文本格式**(本产品优势),只补队列分类与配额。
+
+---
+
+---
+
+## 9. 规约栈复刻明细(参考 12 种 → 本产品 1 种)
+
+| 规约 | 参考源码 | 链路 | 用途 | 工作量特征 |
+|---|---|---|---|---|
+| **IEC 60870-5-104** | `Comm/Pub/Rly_IEC104.c` | TCP | 主站接入(本产品已实现) | ✅ 已完成 |
+| IEC 60870-5-101 | `Rly_IEC101.c`、`Rly_IEC101_B.c` | 串口 | 主站接入(老站) | 与 104 共享 ASDU 层,**只换链路层**(平衡/非平衡链路、可变帧长) |
+| IEC 60870-5-102 | `Rly_IEC102.c` | 串口 | 电度采集 | 独立 ASDU(电度专用类型),依赖电度 |
+| IEC 60870-5-103 | `RLY_IEC103.c`、`RLY_IEC103-tcp.c`、`Rly_IEC103T.c` | 串口 / TCP | 保护装置信息接口 | 三种变体(串口 / TCP / T 型),ASDU 与 101/104 不同族 |
+| ModBus | `Rly_ModBus.c` | 串口 / TCP | 通用工业设备 | 简单,**对下采集首选** |
+| CDT | `Rly_Cdt.c` | 串口 | 循环式远动(老国标) | 帧结构简单,无确认机制 |
+| `Whm_GB` | `Whm_GB.c` | 串口 | 国标电度 | 依赖电度 |
+| IEC 61850 | `struct61850.h`、`GlobalUnit/SttnLvlGoose.c` | 以太网多播 | MMS / GOOSE / SV | **最大工作量**:需 MMS 栈 + ASN.1 + 多播组管理 |
+| CAN | `Rly_Can.h` | CAN 总线 | 内部总线 | 依赖 CAN 硬件 |
+| 子站 IEC 101 | `Comm/Mon/Rtu_IEC101*.c`(含 ABB / 西门子 / 无优先级变体) | 串口 | 对下接 FTU / 开关 | **对下主站侧**,与对上从站侧是不同角色 |
+| 子站 IEC 104 | `Rtu_IEC104.c`、`Rtu_Dbg104.c`、`Rtu_RIS104.c` | TCP | 对下 | 含调试与 RIS 变体 |
+| BALA101 / ModBus | `Rtu_BALA101*.c`、`Rtu_ModBus.c` | 串口 | 对下 | 与 RS-485 簇同批 |
+| 加密 | `Comm/Ecc/`(SM2 / SM3 / ECDSA) | — | 安全加固 | 国密算法库,纯软件可移植 |
+
+**排期分层**:
+
+| 层 | 规约 | 理由 |
+|---|---|---|
+| 先做 | ModBus(对上 + 对下)、IEC 101 | 与 104 共享 ASDU 或结构简单;对下采集是配网终端必备 |
+| 次做 | IEC 103、CDT、BALA101 | 老设备兼容,结构清晰 |
+| 后做 | IEC 102、`Whm_GB` | 依赖电度(H1) |
+| 末做 | IEC 61850 | 需 MMS/ASN.1/多播,单核 M4 资源需专项评估 |
+| 并行 | SM2 / SM3 / ECDSA | 纯软件,无硬件依赖,可随时插入 |
+
+> **一个容易漏的点**:参考同时有**对上(`Comm/Pub`,本机作从站)**与**对下(`Comm/Mon`,本机作主站)**
+> 两套规约。本产品只有对上 104。做"配网终端"时对下那套(101/104/ModBus 主站侧)
+> 是**必须**的——否则接不了一次开关。
+
+---
+
+---
+
+## 10. 复刻完成判据(逐缺口可验证)
+
+每一条缺口给出"怎么算做完了",避免"实现了但没验收"。
+
+| 缺口 | 完成判据 |
+|---|---|
+| 定值铺开 | `PS_ID_COUNT = 249`(或按单元分批:每批新增项在 104 上可读写、跨复位保持、校验和正确);`check` 脚本比对参考表逐项一致 |
+| 104 定值映射 | 107 个地址(`0x8820~0x8891` 含 8 空洞)全部可读可写;空洞地址返回"未知信息体地址" |
+| 元件铺开 | 45 个模块对应 45 个实例;每个实例有:定值项齐全、启动/动作/返回三态可观测、事件码正确、单测覆盖判据边界 |
+| 遥测铺开 | 31 点全部非 IV(除物理不可达点明确标 IV);线电压与相量满足 `Uab = Ua − Ub` 误差 ≤ 0.5 % |
+| 开入开出 | 27 路硬件开入可读、31 路开出可驱动;开入防抖可整定;双点遥信四态正确(00/01/10/11) |
+| 录波 | **(二期口径;本波按 1 kHz / 8 路 / 单段 / 无 COMTRADE,对照表见 需求档 §9.1 第 10 行)**4000 Hz 采样;三类录波各生成一份 COMTRADE 且被第三方工具打开;配额 64/64/16 循环覆盖正确 |
+| 记录体系 | 13 类队列各有落点;每类容量达标;断电不丢已确认记录 |
+| 多规约 | 每种规约与对应主站/子站工具完成一次完整交互(连接 / 总召 / 变位 / 遥控 / 断链重连) |
+| 国密 | SM2 签名验签、SM3 摘要与标准测试向量一致 |
+| 软压板 | 9 面全部可投退且行为可观测(投退后对应功能确实停走/恢复) |
+| 出口与开入 | 保护动作 → 出口继电器动作 → 开入回读确认,全链路 ≤ 120 ms |
+| 标定解卡 | 8 通道两点标定后 `ADC_CAL_F_VALID` 全置位;注入标准源,保护动作值与定值误差 ≤ 3 % |
+| 屏板链路 | **串口通道**:屏板 280 ms 召唤、主机 ≤200 ms 内**发完** **4208 B**(整帧无 2 个字符时间以上的间隙),连续 10 min **主机侧**零超时、零 CRC 错帧;显存 3200 B 与 `g_ui_fbuf` 逐字节一致;7 个物理键(`1/2/3/4/7/8/9`)动作正确;**状态灯位掩码逐位一致、LED 0 恒亮**;屏板 ≈5000 s 自复位不误判离线;LOGO 下发出局(不实现);**网络通道**:INIT 应答 **16 B** 逐字段一致且无颜色字段、`LCDMEM` 偏移 0 得 3204 B、重复召唤无应答、偏移 ≥3200 无应答、`KEEPLIVE` 无应答且 1 分钟不掉链、8 键(含 `F1\|ENT` 组合)动作正确(需求档 §5.16.10 十四条,第 15 条 LOGO 出局) |
+
+---
+
+---
+
+## 11. 屏板链路复刻任务规划
+
+> **口径**:条目一律用**语义短语**(编号规范 P-8),执行序即表序。
+> 改动范围只含本产品固件与 `DTU-RemoteLCD` 客户端;**屏板固件不在本仓库**,
+> 其行为以需求档 §5.16 为契约做黑盒验收。
+>
+> **两种部署形态,两条通道都要**:① **串口直连屏板**(参考的形态,第 10~15 条)——屏板直接挂在设备
+> 串口上,无需任何网络设备;② **串口服务器透传 / 网络镜像**(第 2~9 条)——屏板或调试软件经以太网连 7003。
+> 现场用串口服务器把屏板接到网上时,两种形态等价,但**固件侧不能只实现后者**:
+> 只有 7003 时,设备离开网络就没有任何本地显示,与参考产品不等价。
+>
+> **方向相反,别写错**:网络通道是"**客户端召唤、设备应答**";串口通道是"**屏板召唤、设备应答**"。
+> 两条通道共用同一份显存快照,但**帧格式、校验、时序完全不同**(网络用 `0xAA/0xBB` + XOR,
+> 串口用裸二进制 + CRC-16/MODBUS),不能共用组帧代码。
+>
+> **实现事实另立**:主机侧的接线、串口配置、协议实现口径、验证状态与未闭环项在
+> `docs/子系统设计/屏板链路设计说明.md`;本节只保留**需求视角**的缺口与顺序,不复制实现细节。
+
+| 序 | 任务 | 改动点 | 判据 | 跨端 |
+|---|---|---|---|---|
+| 1 | **报文口径定版** | 本节 + 需求档 §5.16 + 需求档 §6.2 按参考源码成文 | 文档门禁全绿(已完成) | — |
+| 2 | **INIT 应答补足 16 字节** | `ui_net_sink.c` 的 `remo_send_init()` 组帧由 8 B 扩到 **16 B**:补 8 B 键值表;**不加颜色位与 RGB**(单色屏不对齐多色协议,需求档 §5.16.5) | 16 B 逐字节比对通过,且报文内**无颜色字段** | **是** |
+| 3 | **键值表补 F1 / F2** | `ui_net_sink.h` 键值宏补 `0x04` / `0x80`;`ui_net_sink_inject_key()` 映射;UI 键处理接受组合键 | 下发 `0x04` / `0x80` / `0x24` 界面响应正确 | 否 |
+| 4 | **显存断点续传** | `CMD_LCDMEM` 分支去掉"仅偏移 0"限制:按偏移取 `g_ui_fbuf + off`,长度 `min(9800, 3200 − off)` | `off=1600` 得 `4+1600` B,内容与整帧尾部逐字节一致 | 否 |
+| 5 | **召唤拒绝握手** | 新增"帧代次 + 已上送"等价状态:新图未就绪时重复召唤**不应答**;偏移 ≥3200 不应答 | 需求档 §5.16.10 第 2、3 条通过 | **是** |
+| 6 | **链路监视** | 1 分钟通信中断计时(收到帧 / 发送成功即重置);超时置状态位并落一行日志 | 断链 60 s 有明确日志与状态;重连后自动恢复推流 | 否 |
+| 7 | **KEEPLIVE 静默** | 去掉空帧回显,改为仅重置计时 | 需求档 §5.16.10 第 4 条通过 | **是** |
+| 8 | **发送重试评估** | 对比参考"BUSY + 200 ms 放弃"与现有 `net_send` 阻塞模型,出结论并回填需求档 §5.16.9 第 7 行 | 结论有实测数据支撑(实现 / 明确不实现) | 否 |
+| 9 | **客户端一致性回归** | `DTU-RemoteLCD` 按 **16 B** 解析;把需求档 §5.16.10 第 1~7 条做成自动化用例 | 七条判据全 PASS | **是** |
+| 10 | **串口物理层落地** | 按需求档 §5.16.2 定版:**700000 8N1、`BRR = 0x0078`**(USART1,APB2 84 MHz)、**无 DE**(TTL 直连,不走收发器)、RX 缓冲 16 B + 空闲中断断帧、发送走 **DMA 一次性发完**(禁逐块阻塞;主机侧 TX 用 `DMA2_Stream7`,RX 走 IDLE 中断、不用 RX DMA) | 环回 + 示波器实测 700 kbaud 分频零误差;屏板能收到帧 A 并回帧 B | 否 |
+| 11 | **帧 A 解析 / 帧 B 组帧** | 新增屏板通道模块:识别 6 B 请求(`01 03 type key CRC_L CRC_H`)、校验 CRC-16/MODBUS(**低字节在前**,口径见需求档 §5.16.2);组 **4208 B** 帧 B(3200 显存 + 4 B LED + 4 B info 保留 + 998 B 填充 + 2 B CRC) | 屏板出图与 `g_ui_fbuf` 逐字节一致;`info[0..3]` 与下发的 LED 掩码一致 | 否 |
+| 12 | **状态灯位映射表** | 定义"**业务状态 → 屏板 LED 位**"映射(参考源码**无此表**,须自定);`info[0..3]` 按 **32 位小端**填,bit0 恒 0、bit20~31 恒 0 | 需求档 §5.16.10 第 11 条通过 | 否 |
+| 13 | **串口上行按键** | 帧 A 的 `key` 字节按**屏板 `KEY_TYPE`** 解释——实际可达值只有 **`1/2/3/4/7/8/9`**(`5`/`6`/`10` 无物理入口);映射为逻辑键值后与 7003 注入**同一入口**合并 | 需求档 §5.16.10 第 10 条通过;`9`/`10` 语义按需求档 §5.16.3 ② 处置 | 否 |
+| 14 | **双通道并发 + 自复位容忍** | 两出口各自独立发送上下文;串口 4208 B 阻塞不拖 7003;链路监视按"**连续 ≥10 s 无应答**"判离线,**忽略屏板 ≈5000 s 周期自复位** | 需求档 §5.16.10 第 12、13、14 条通过 | 否 |
+| 15 | **LOGO 下发流程(出局,不实现)** | 主机不提供 LOGO 帧,总线上不会出现 `info[4..5] = 0x89 0x45` | —(不参与验收) | 否 |
+| 16 | **日志口迁移(USART1 → RS-232 通道)** | ① `console_log.c` 的 `huart1`、`USART1_IRQn`、`__HAL_RCC_USART1_CLK_*`、`MX_USART1_UART_Init()` 收口成**一处端口宏**,指向 RS232#1(`huart5` / UART5);② **不动** UART4 的 `g_rs485` 绑定 | 日志在 RS-232 侧(CN1)可读且内容与迁移前一致;USART1 **完全空出**;连续 10 分钟无 `[ERR]` | 否 |
+
+**批次划分**:
+
+| 批 | 任务 | 理由 |
+|---|---|---|
+| 第一批(无跨端风险,可独立发版) | 3、6、8 | 只动本端,旧客户端不受影响 |
+| 第二批(跨端,须与客户端同步发版) | 2、4、5、7、9 | 报文口径变更,两端必须同版本 |
+| 第三批(**独立立项**,不随 RS-485 冻结) | **16**、10、11、12、13、14 | 屏板串口通道是**独立需求**,与 需求档 §5.10 冻结的"对下采集簇"不是一回事。**第 16 条排在 10 之前**:日志先腾出 USART1,屏板链路才能独占这条通道 |
+
+> ⚠ **唯一破坏性变更**:第 2 条把 INIT 应答从 8 B 改成 **16 B**。**旧客户端会把 16 B 的前 8 B 当全部、
+> 把后 8 B 当作下一帧的 TAG 去找**,解析状态机会被这 8 B 拖住直到超时——表现为"连上了但不出图"。
+> 因此第 2、5、7、9 条必须**同批发布**,且发版说明中明确"客户端需升级"。
+>
+> ⚠ **16 B 与参考的 29 B 不可互换**:删掉 13 B 颜色字段后,偏移 4 之后全部前移——
+> 参考的"显存大小在偏移 5、键值表在偏移 21"在本产品变成"偏移 4、偏移 8"。
+> 客户端**不得**复用参考的 29 B 解析器再截前 16 B(会读出颜色位当显存高位)。
+>
+> **屏板固件边界**:本表不覆盖屏板侧固件(帧解析 / 显存写入 / 按键扫描 / 状态灯驱动)。
+> 屏板固件工程在 `D:\Code\DTU Code\DTU-LCD`,**不在本仓库**,其契约已按源码逐字节成文(需求档 §5.16.2 / 需求档 §5.16.3)。
+> 本产品只要满足 需求档 §5.16.10 的十四条判据即为兼容(第 15 条 LOGO 出局)。
+>
+> **第三批状态**:串口通道(第 10~14、16 条)主机侧已实现并经台架与真屏板验收,屏板实物已上台架;
+> 帧长**已固化 4208 B**(代码实参为准,屏板 readme 的 3208 B 不作数——真屏板出图为端到端证据)。
+> 未闭环项(2 h 长稳、仪器项等)见 `docs/子系统设计/屏板链路设计说明.md` §9.2;**网络通道(第 2~9 条)未开工**。
+>
+> **一条物理前置(已完成 2026-10-29)+ 一条实现纪律**:
+> ① **台架串口线已挪位**——日志口迁到 RS-232 侧后,台架那根线改接 CN1 的 RS232#1 端子
+> (`CN1.10` 接适配器 TXD、`CN1.12` 接适配器 RXD、`CN1.7` 或 `CN1.8` 接 GND),台架日志口
+> 因此由 `COM6` 变为 **`COM3`**,`.serialtest/config.json` 的 `portName` 已同步,`@test` 与
+> `serial-assistant` 不必再手工指端口。这些端子是 **RS-232 电平**,TTL 的 CH340 直连不了,
+> 用的是 USB 转 RS-232 适配器;接法与端子出处见 `docs/子系统设计/屏板链路设计说明.md` §3.2。
+> **这条要在第 16 条动代码之前完成。**
+> ② **RX 要真的读、ORE 要真的清**——PA10 一直是接线的(需求档 §5.16.2),
+> 但"RX 使能却不读 `DR`"本身就足以让 ORE 永久锁存。第 11 条实现时必须在
+> `HAL_UART_ErrorCallback` 里清 ORE 并重挂接收,否则一次噪声就永久静默。
+
+---
diff --git a/docs/任务规划/故障录波.md b/docs/任务规划/故障录波.md
index fdfcc854..31c106fd 100644
--- a/docs/任务规划/故障录波.md
+++ b/docs/任务规划/故障录波.md
@@ -78,4 +78,4 @@ flowchart TD
| `docs/任务规划/登记簿.md` | 原「故障录波与 104 文件传输」暂缓行已随本波立项销项(104 文件传输仍留二期) |
| `docs/任务规划/UI补齐.md`、`docs/UI设计/页面补齐规划.md` | 「手动录波」叶子旧状态是「不做(录波模块不存在)」,重开条件正是本波;上线后两处的叶数闭合要一起改 |
| `docs/问题记录/采集与数据处理短板评测.md` | 记录链缺口的登记处;本波落地后该行改指设计文档 |
-| `docs/产品需求/产品需求设计文档.md` | 「录波采样率」行是本波偏离的对照基准;「立项未排」行与「文件传输(录波)」行按本波状态更新 |
+| `docs/产品需求/参考产品复刻明细.md` | 复刻明细 §7「录波采样率」行是本波偏离的对照基准;复刻明细 §1.2「立项未排」行与 §8「文件传输(录波)」行按本波状态更新 |
diff --git a/docs/子系统设计/故障录波设计说明.md b/docs/子系统设计/故障录波设计说明.md
index 98412f85..562b187d 100644
--- a/docs/子系统设计/故障录波设计说明.md
+++ b/docs/子系统设计/故障录波设计说明.md
@@ -50,7 +50,7 @@
## 2. 与产品需求口径的偏离(显式登记,不许静默降级)
-产品需求 `docs/产品需求/产品需求设计文档.md` 的「录波采样率」行写着:录波 = 20 × 4 = **80 点/周波(50 Hz 下 4 kHz)**,理由也写在那一行——「保护计算用 20 点/周波,录波要 4 倍过采样才能看清波形」。本波只做 20 点/周波,是**明知故犯的偏离**,把理由与代价写在明处:
+`docs/产品需求/参考产品复刻明细.md` §7 的「录波采样率」行写着:录波 = 20 × 4 = **80 点/周波(50 Hz 下 4 kHz)**,理由也写在那一行——「保护计算用 20 点/周波,录波要 4 倍过采样才能看清波形」。本波只做 20 点/周波,是**明知故犯的偏离**,把理由与代价写在明处:
| 项 | 内容 |
|---|---|
@@ -383,5 +383,5 @@ flowchart TD
| `docs/架构设计/STM32F4-Base存储架构说明.md` §10.1 | FatFs 陷阱与 8.3 短名的属主;本文 §5.2 只是消费者 |
| `docs/UI设计/页面补齐规划.md`、`docs/任务规划/UI补齐.md` | 「手动录波」叶子旧状态是「不做(无录波模块)」;P2 与 P3 落地时两处的叶数闭合与重开条件要同步 |
| `docs/问题记录/采集与数据处理短板评测.md` | 记录链缺口(波形数据面 / COMTRADE / 104 文件服务)的登记处;P1 落地后该行改指本文 |
-| `docs/产品需求/产品需求设计文档.md` | 「录波采样率」行是本文 §2 偏离的对照基准 |
+| `docs/产品需求/参考产品复刻明细.md` | §7「录波采样率」行是本文 §2 偏离的对照基准 |
| `docs/硬件平台/ADC通道映射说明.md` | 通道归属与注入点清单的属主;回放页「削」徽标的判据出处 |
diff --git a/docs/架构设计/系统架构与硬件规格.md b/docs/架构设计/系统架构与硬件规格.md
new file mode 100644
index 00000000..b3a266c9
--- /dev/null
+++ b/docs/架构设计/系统架构与硬件规格.md
@@ -0,0 +1,215 @@
+# STM32F4-Base 系统架构与硬件规格
+
+> **文档定位**:全仓**系统运行时架构**与**硬件规格(V0.1)**的权威表档——自
+> `docs/产品需求/产品需求设计文档.md` v1.9 的原 §3/§4 拆出(需求与验收口径仍在需求档)。
+> 与 [`docs/架构设计/项目架构总览.md`](项目架构总览.md) 的分工:总览是**叙述性全景**,
+> 本档是**完整口径表**——就绪屏障位表(bit0~8)、线程间通信机制表、启动时序图、
+> 引脚分配表、硬件能力边界表以**本档为准**,两处冲突以本档为准并回改总览。
+> **硬件口径**:V0.1(`docs/硬件平台/V0.1_网表详细分析报告.md` + `Inc/main.h`)。
+
+## 1. 系统运行时架构
+
+### 1.1 六层分层架构
+
+
+
+> 上图由 `tools/arch_diagram/gen_arch_svg.py` 生成(手绘 SVG,零连线交叉);改架构后编辑脚本顶部
+> `ROWS` 数据重跑即可,源数据与下表一致。
+
+分层原则:**上层只依赖相邻下层(单向)**;**① 业务层为顶层**(仅 `net_cfg`,被 UI 与基础服务共用),
+**② UI 层与 ③ 基础服务层同级并列**。
+
+| 层 | 目录 | 职责 | 关键模块 |
+|---|---|---|---|
+| ① 业务层 | `Drivers/BSP/NETCFG/` | 顶层共享配置(被 UI 与基础服务共用) | `net_cfg` |
+| ② UI 层 | `Drivers/BSP/UI/` | LVGL 界面(与 PC 模拟器共用源码) | `ui_port` `ui_menu` `ui_menu_view` `ui_menu_tab` `ui_content_page` `ui_page_*` `ui_net_sink` `ui_font_cn_12` `ui_deco` |
+| ③ 基础服务层 | `App/`、`Drivers/BSP/NET/lftpd/` | 应用侧服务、采集算法与协议编排 | `app_main` `sys_events` `app_cfg` `task/*` `algo/*`(语义取数与有效性~保护判据)`protocol/iec104/*` `log/soe_store` `lftpd` `time_sync` |
+| ④ 中间件层 | `Drivers/BSP/NET/`、`Lib/`、`App/util/` | 通用库 / 协议栈 | `net_socket` `net_select` `FatFs` `nand_ftl`(dhara) `LVGL` `sys_clock` |
+| ⑤ 驱动层 | `Drivers/BSP/{CH395F,GD5F2GQ5UE,TPAFE5160,SD2506,RS485}/` | 芯片寄存器 / 时序 / 中断 | `ch395f` `gd5f2gq5ue` `tpafe5160` `sd2506` `rs485` |
+| ⑥ 内核 / HAL | `Middlewares/`、`Drivers/STM32F4xx_HAL_Driver/`、`Drivers/CMSIS/` | 任务调度、外设 HAL、启动 | FreeRTOS V10.3.1 · STM32 HAL · CMSIS |
+| ⑦ 硬件 | — | STM32F407ZGTx @168MHz | SPI1 / SPI2 / I2C1 / UART4 / USART1 / DMA / GPIO / TIM7 |
+
+### 1.2 运行时任务模型
+
+**九个** FreeRTOS 任务(`Src/freertos.c` 创建,任务体在 `App/task/`、`App/sync/`):
+
+| 任务 | 栈(words / B) | 优先级 | 职责 |
+|---|---|---|---|
+| `defaultTask` | 1280 / 5120 | Normal | FatFS 挂载(无卷 `f_mkfs`)→ 卷健康探针/自愈 → `net_cfg_load` + 定值/运行参数/通讯参数装载(**配置引擎属主**)→ 置 `STORAGE_READY` → 日志落盘(唯一写者)+ 2 s 配置轮询 + 各模块脏位落盘(`prot_set` / `run_par` / `comm`)+ SOE 排空 + LED 闪烁 + 栈水位观测 + **看门狗唯一喂狗者** |
+| `netTask` | 960 / 3840 | Normal | 等存储 → `net_stack_bring_up()` → 置 `NET_READY` → `net_poll` 轮询 + CH395F 操作串行化(消息队列执行者) |
+| `ftpTask` | 1024 / 4096 | Normal | 等网络**且**存储(`WaitAll`)→ `lftpd_start("/", 21)` → 单客户端会话循环 |
+| `testTask` | 2048 / 8192 | BelowNormal | 测试套件入口(`test/board/test_config.h` 选择)。**产品构建不创建**(未选套件时立即 `vTaskDelete` 回收其 8 KB CCM 栈) |
+| `uiTask` | 4096 / 16384 | BelowNormal | 等网络 → `ui_port_init`/`ui_menu_init`/`ui_standby_init`(空闲 60 s 切待机屏)/`ui_net_sink` → 10 ms 刷新 + 数据注入 |
+| `timeSyncTask` | 640 / 2560 | Normal | 等网络 → TCP :8888 收 PC 推送时间 → 写 RTC |
+| `adcTask` | 640 / 2560 | AboveNormal | **采集主线唯一消费者**:每拍 `adc_input_poll()`(TPAFE 快照 + ADC1 DMA 帧)→ `adc_health` 有效性 → `phasor_run()` 相量 → `freq_run()` 测频 → 每 200 ms `meas_tick()` 发布遥测快照 |
+| `iec104Task` | 640 / 2560 | Normal | 等网络 → TCP :2404 监听 → 104 链路状态机(总召/变位/周期/遥控/定值/对时)+ 断链重听 + 网络代次自愈 |
+| `protectTask` | 512 / 2048 | Normal | **20 ms 判据节拍**:采样故障闭锁判定 → 定值校验和巡检 → `prot_elm_run()` 元件判据 → 动作边沿投递 SOE(**不做 NAND I/O**) |
+
+> `idle`(128 words)/ `timer`(256 words)由 FreeRTOS 内核创建。所有任务栈从 **56 KB** `heap_4` 堆
+> (CCM)分配;CCM 水位 87.9%(<92% 门禁)。
+> 任务表与 `Src/freertos.c` 的 `osThreadAttr_t` 一致,由 `scripts/gen_task_table.py` 生成并门禁校验;
+> **栈配置与实测余量**见 `../产品需求/产品需求设计文档.md` §7.3,改栈前后必须重跑 `scripts/stack_report.py`。
+>
+> ⚠ **节拍同源**:TIM3 更新事件(1 kHz)同时触发 TPAFE `CONVST` 与(经 TRGO)ADC1 一轮 9 通道扫描,
+> 并在 ISR 内唤醒 `adcTask`——采集节拍与任务唤醒**不允许**各自计时。
+> ⚠ **ADC1 必须在挂 DMA 的瞬间处于关闭态**:`app_main_init()` 步骤 4b-pre 的 `adc1_disable()` 不可删、不可后移,
+> 否则 DMA 乒乓缓冲整体旋转 2 格(表象与"映射表写错"一致)。证据见
+> [`docs/子系统设计/ADC采样节拍设计说明.md`](../子系统设计/ADC采样节拍设计说明.md) §4.5。
+
+### 1.3 就绪屏障(Event Flags)
+
+
+
+用 CMSIS-RTOS2 Event Flags(`sys_evtHandle`)表达"子系统就绪",取代魔法延时与全局标志轮询。
+生产者与消费者互不知晓,只经事件组解耦;新增子系统只需定义新 bit + 各自 wait/set。
+
+| 位 | 名称 | 类型 | 语义 |
+|---|---|---|---|
+| bit0 | `SYS_EVT_NET_READY` | 状态位 | netTask:`net_init` + PHY 稳定完成 |
+| bit1 | `SYS_EVT_STORAGE_READY` | 状态位 | defaultTask:FTL/FatFS 挂载 + 配置就绪 |
+| bit2 | `SYS_EVT_FTP_READY` | 状态位 | ftpTask:`lftpd_start` 完成 |
+| bit3 | `SYS_EVT_TIMESYNC_READY` | 状态位 | timeSyncTask:首次时间同步完成 |
+| bit4 | `SYS_EVT_NET_RECONFIG` | 命令位 | UI:请求立即应用新网口配置 |
+| bit5 | `SYS_EVT_CFG_SAVE` | 命令位 | UI:网口配置保存请求(defaultTask 消费并写盘) |
+| bit6 | `SYS_EVT_CONSOLE_TX` | 命令位 | 控制台单写者:生产者入环形缓冲后置位 |
+| bit7 | `SYS_EVT_PROT_SET_SAVE` | 命令位 | 保护定值落盘请求:104 检测到定值脏后置位,defaultTask 原子写 `/prot_set.bin` |
+| bit8 | `SYS_EVT_RUN_PAR_SAVE` | 命令位 | 运行参数段落盘请求:104 写运行参数后置位,defaultTask 整档外科保存 |
+
+> ⚠️ **铁律**:状态位(bit0~3)表达**持久状态**,任何消费者都**不许消费**——必须
+> `osFlagsWaitAny|osFlagsNoClear`。命令位(bit4~8)表达"请做一件事",必须**恰好被消费一次**(消费型等待)。
+> 历史事故:就绪位被先到的等待者消费,导致 `ftpTask` 的 `WaitAll(bit0|bit1)` 永不成立、21 端口从未监听(静默)。
+
+### 1.4 启动时序
+
+```mermaid
+sequenceDiagram
+ autonumber
+ participant M as main
+ participant A as app_main_init
+ participant K as osKernelStart
+ participant D as defaultTask
+ participant N as netTask
+ participant S as adcTask / protectTask
+ participant F as ftpTask
+ participant U as uiTask
+ participant I as iec104Task / timeSyncTask
+
+ M->>M: HAL_Init + CubeMX 外设初始化
(SPI1/SPI2/I2C1/UART4/USART1/DMA/GPIO/TIM3/TIM7)
+ M->>A: app_main_init()
+ Note over A: 时间子系统优先,使后续日志带时间戳
+ A->>A: sd2506_init() → sys_clock_init()(墙钟基准)
+ A->>A: rs485_init() → gd5f2gq5ue_init()(BBT 扫描)
+ A->>A: tpafe5160_init() → adc_input_init()(语义映射自检)
+ A->>A: 配置段注册(adc_cal / run_par / prot_set / comm)→ 定值/元件初始化
+ A->>A: adc1_disable() → ADC1 挂 DMA(4b-pre,顺序不可变)→ 启动 TIM3 1 kHz 节拍
+ A-->>M: "App init OK"
+ M->>K: osKernelStart()
+ K->>D: 调度
+ D->>D: f_mount(无卷则 f_mkfs FAT32)→ 卷探针/自愈 → 配置装载
→ 定值整表原子装载(损坏则保出厂默认 + 自检留痕)
+ D-->>N: set SYS_EVT_STORAGE_READY
+ S->>S: adcTask:等 TIM3 节拍 → 采集 → 相量/测频 → 200 ms 遥测快照
+ S->>S: protectTask:20 ms 判据(未标定/采样故障则停走)
+ N->>N: wait STORAGE_READY(Any|NoClear)→ net_init(ip,mask,gw,mac)
→ PHY 强制 100M 全双工 → 等链路 ≤3s
+ N-->>F: set SYS_EVT_NET_READY
+ F->>F: wait NET_READY|STORAGE_READY(All|NoClear)→ lftpd_start("/", 21)
+ U->>U: wait NET_READY(Any|NoClear)→ ui_port_init → ui_menu_init → ui_net_sink_start(7003)
+ I->>I: wait NET_READY(Any|NoClear)→ TCP listen :2404 / :8888
+```
+
+> **顺序铁律**:① 配置段注册必须**先于** `cfg_file_load`(否则 FTP 上传的段不生效);
+> ② `adc1_disable()` 必须在挂 DMA 之前;③ `osKernelStart` 之前禁调任何内核 API(含 `osDelay` / 队列)。
+
+### 1.5 线程间通信
+
+| 机制 | 对象 | 用途 |
+|---|---|---|
+| Event Flags | `sys_evtHandle` | 启动就绪屏障 + 命令位(§1.3) |
+| Message Queue | `netMsgQueue`(深度 8,`net_msg_t`) | 所有 CH395F 操作经队列**串行化**到 netTask 执行,保证 SPI 单线程访问 |
+| 双区 + 序号(无锁) | `phasor` 相量区、`meas` 遥测快照 | 写侧填满计算区后单字节翻转活跃索引;读者先取索引再整份拷贝,`seq` 判"是否换帧" |
+| SPSC 环(无锁) | `soe_store`(深度 8) | protectTask 只投递动作边沿,defaultTask 排空落盘——**保护路径零 NAND I/O** |
+| 脏位 + 事件位 | `prot_set` / `run_par` / `comm` | 写入方置脏;104 侧 peek 后投递事件位,配置属主(defaultTask)落盘,失败保留脏位下轮重试 |
+| 单字请求标志 | `prot_elm_request_reset()` | 跨上下文复归请求(104 遥控 YK11 在 iec104Task 落请求,protectTask 下一拍消费) |
+
+---
+
+## 2. 硬件规格
+
+### 2.1 主控与内存
+
+| 项 | 值 | 说明 |
+|---|---|---|
+| MCU | STM32F407ZGTx | Cortex-M4(FPU),LQFP144 |
+| 主频 | 168 MHz | HSE 8 MHz → PLL M=4 / N=168 / P=2 |
+| Flash | 1 MB(0x08000000) | 片内 |
+| SRAM | 192 KB(128 KB 主 SRAM1+SRAM2 + 64 KB CCM) | 链接器映射 128 KB 主 SRAM;CCM 用于 FreeRTOS 堆(任务栈) |
+| RTOS | FreeRTOS V10.3.1(CMSIS-RTOS2) | HAL 时基 TIM7,tick = 1 ms;NVIC 4 位抢占,外设中断优先级 ≥5 |
+| 工具链 | Keil MDK-ARM v5(ARMCC v5) | 工程锁 `uAC6=0`,**不支持 armclang** |
+| CubeMX | 6.17.0 + STM32Cube FW_F4 V1.28.3 | 与 `.ioc` 记录一致,再生成须用此组合 |
+
+### 2.2 外设与引脚分配
+
+> **权威来源**:V0.1 网表分析报告 + `Inc/main.h`(代码已迁移至 V0.1)。下表为 **V0.1 硬件**的引脚。
+
+| 外设 | 接口 | 引脚 | 说明 |
+|---|---|---|---|
+| **CH395F 以太网** | SPI2 | PB12 CS / PB13 SCK / PB14 SDO / PB15 SDI | 10/100M 以太网控制器;PHY 强制 100M 全双工;**SPI 分频系数必须为 8**(PCB 设计约束) |
+| **GD5F2GQ5UE NAND** | SPI1 | PE0 CS / PB3 SCK / PB4 MISO / PB5 MOSI / PB8 WP / PE1 HOLD | 256 MB SPI NAND(2 Gbit) |
+| **TPAFE5160 ADC** | 并行 16 位 | PG0~PG15 数据 / **PC6 FRSTDATA** / **PC7 BUSY**(EXTI) / **PC8 RD** / **PC9 CONVST** / **PA8 OS2** / **PA11 OS1** / **PA12 OS0** | 高精度多通道 ADC |
+| **SD2506 RTC** | I2C1 | PB6 SCL / PB7 SDA | 提供墙钟基准与日志时间戳 |
+| **USART1(U5 直连 TTL)** | UART | PA9 TX / PA10 RX | **700000 8N1 → 屏板链路**(TTL 直连、无 DE,`../产品需求/产品需求设计文档.md` §5.16.2);PA10 双向均已接线;日志已迁 UART5 |
+| **UART4(RS-485)** | UART | PC10 TX / PC11 RX / **PA15 DE** | 半双工通信(V0.1 轮换后 RS485#4 = UART4,`../硬件平台/V0.1_网表详细分析报告.md` §4.2) |
+| **USART2(RS-232 #3)** | UART | PD5 TX / PD6 RX | 经 U10 隔离 → U13 TPT3232E → CN1;固件目前未占用(日志实际走 UART5/RS232#1) |
+| **UART5(RS-232 #1)** | UART | PC12 TX / PD2 RX | 经 U9 隔离 → U13 → CN1;**日志口**(115200,`@test` 采集通道;台架端子 `../子系统设计/屏板链路设计说明.md` §3.2) |
+| **状态 LED ×6** | GPIO | PC5 / PB0 / PB1 / PB2 / PF11 / PF12 | **低电平点亮** |
+| SWD | — | PA13 SWDIO / PA14 SWCLK | V0.1 已修复 V0.0 的 SWCLK 引脚缺陷 |
+| 调试口 | — | CN2(XH-3A,1=SWDIO/2=SWCLK/3=GND) | V0.1 由 H2 排针改为 XH 端子 |
+
+> ⚠️ **V0.0 / V0.1 差异**:V0.1 相比 V0.0 做了**接口裁剪(删 8080 LCD 与 8 键)+ U17 大面积引脚重排 +
+> ADC 前端通道置换(17 路中 13 路变化)+ 调试口改型**。固件 BSP 与 ADC 通道映射表**必须按 V0.1 重映射**;
+> 详见 `docs/硬件平台/V0.1_网表详细分析报告.md`。
+
+### 2.3 存储器件
+
+| 器件 | 容量 | 组织 | 软件栈 |
+|---|---|---|---|
+| GD5F2GQ5UE | 2 Gbit(256 MB) | 2048 块 × 64 页 × 2048 B | FatFS(FAT32)→ dhara FTL(磨损均衡 / 坏块管理 / GC)→ NAND 驱动 |
+| SD2506 | — | I2C1 | RTC(时间/温度/电池诊断) |
+
+- **BBT 持久化**:坏块表存于保留块池(顶部 4 块),不交给 dhara 管理。
+- **单写者纪律**:`defaultTask` 拥有存储;`netTask` 只读 RAM 配置副本,不触卷。
+- **FatFs 约束**:`FF_USE_LFN=0`(严格 8.3 文件名);`FF_FS_REENTRANT=1` + `ffsystem.c` 互斥钩子(超时 1 s);`FF_FS_NORTC=0`(`get_fattime` 直引用墙钟)。
+
+### 2.4 硬件版本与兼容性
+
+| 版本 | 状态 | 说明 |
+|---|---|---|
+| V0.0 | 历史 | 含 8080 LCD、8 按键;存在 2 处设计缺陷(SWCLK 引脚错误致 SWD 不通、ADC17 落在非 ADC 引脚) |
+| **V0.1** | **当前** | 架构与 V0.0 一致;裁剪 LCD/按键、U17 引脚重排、修复上述 2 处缺陷;固件已迁移 |
+| V0.2 | 规划关注 | 新增关注项:VCAP 电容值未标注、PC13/14/15 子板 LED 3 mA 限流、SPI1 无法双落点 |
+
+### 2.5 平台约束
+
+| 约束 | 内容 |
+|---|---|
+| **CubeMX 生成文件** | `Inc/`、`Src/` 中带 `USER CODE BEGIN/END` 标记;自定义代码**只能**写标记区内 |
+| **生成区外的定制** | 仅限 `Src/iwdg.c` 延后启动、4 个 Fault Handler 实体(`scripts/check_cubemx_survival.py` 审计兜底) |
+| **`osKernelStart` 前** | 禁止任何 FreeRTOS / CMSIS-RTOS API 调用 |
+| **BOM / 编码** | 部分源文件带 BOM(`Drivers/BSP/UI/*`、`App/task/ui_task.c`、`App/cfg/cfg_file.c`、`Lib/lv_conf.h`),被工具改写丢 BOM 会导致 ARMCC 按 CP936 解码、中文字面量编译失败 |
+| **SDIO** | V0.1 主板 SDIO 固定引脚组被 TPAFE/UART 全部占用 → **无 SDIO 能力**(当前设计不受影响,FatFs 卷在 SPI NAND 上) |
+| **新源文件** | 必须双端注册(Keil `.uvprojx` + `simulator/CMakeLists.txt`),否则不参与编译 |
+
+### 2.6 V0.1 硬件能力边界(对产品的硬约束)
+
+下列五条是**硬件事实**,不是软件缺陷;需求档 §5 的功能范围与 需求档 §9 的"等条件"项均由它们推导:
+
+| # | 约束 | 具体内容 | 产品影响 | 解除条件 |
+|---|---|---|---|---|
+| H1 | **双转换器无共同采样触发** | 8 路电气量分属 TPAFE5160(16 位、8 通道同步、±5 V 双极性)与 STM32 ADC1(12 位、顺序扫描、0~3.3 V 单极性)两片;两片无共同触发,STM32 侧 9 通道一轮约 67 µs | 跨转换器的**相位 / 功率 / 功率因数 / 对称分量 / 三相同时刻判据**一律不成立 → 方向元件、PT/CT 断线、三相过流、零序过流延后 | **V0.2 硬件**:8 路电气量全部接 TPAFE(与备用路对调串联电阻,料号不变,走线级改动);固件只改映射表内容 |
+| H2 | **STM32 侧无中点偏置** | 单极性 0~3.3 V,交流量负半周削顶 | `UB/UC/IB/IC/IN` 无有效值/相量,只能读码值**监视**;104 对应点恒置 IV | V0.2 补偏置 |
+| H3 | **无出口继电器与开入回路** | 无跳闸/告警出口、无硬压板与开入遥信 | 保护动作只体现为**遥信 + 日志 + SOE**;104 遥控 `YK1~4/13/14` 否定确认 | 开入开出独立立项 + 硬件 |
+| H4 | **无本地屏与按键** | 160×160 单色屏仅存在于远端客户端 | UI 以 TCP :7003 推流 + 远端按键回注(`../产品需求/产品需求设计文档.md` §8) | 产品形态即如此,不解除 |
+| H5 | **无 SDIO** | SDIO 固定引脚组被 TPAFE/UART 占用 | FatFs 卷只能落 SPI NAND(当前设计不受影响) | 不解除 |
+
+> **量纲口径**(由 H1/H2 派生):在端子/子板变比确认与两点标定完成前,遥测与保护读数的单位是
+> **ADC 引脚电压**(`eng=0`),不是二次值;此时 `ADC_CAL_F_VALID` 未置位,
+> **保护判据整体停走**(`../产品需求/产品需求设计文档.md` §5.12)。这是刻意设计,不是"保护不动作"的缺陷。
diff --git a/scripts/check_doc_links.py b/scripts/check_doc_links.py
index e817e4bc..fdc06a88 100644
--- a/scripts/check_doc_links.py
+++ b/scripts/check_doc_links.py
@@ -300,6 +300,15 @@ def resolve_name(name: str, by_stem):
apath = (REPO_ROOT / alias) if alias else None
if apath is not None and apath.exists():
return apath, "alias"
+ # 别名后缀匹配:STEM_RE 贪心会把挂在前面的动词/修饰词一并吃进 name
+ # (「规格见需求档」「其行为以需求档」),精确查表落空后按**最长别名**做 endswith。
+ # 只放宽「此前判不了」的 token(原来进 skip),不改变已能判定的目标。
+ if not cand:
+ for key in sorted(load_aliases(), key=len, reverse=True):
+ if key != name and name.endswith(key):
+ apath = REPO_ROOT / load_aliases()[key]
+ if apath.exists():
+ return apath, "alias"
return None, None
@@ -431,9 +440,22 @@ def check_section_refs(path: pathlib.Path, lines, errors, warns):
continue
if tgt is None and prev_tgt is not None:
between = line[prev_end:m.start()]
- if not chain_blocked(between, by_stem):
- # 继承前一个 § 的目标**与它的判定档位**(自引用链仍按自引用处理)
- tgt, kind = prev_tgt, prev_kind
+ # 中间挂着的词若是已登记别名且**紧邻** §(间隔 ≤ SEC_MAX_GAP 字符),
+ # 视为换目标,不许链着继承前一个 § 的文档;远处的词不算
+ gap_txt = between
+ am = STEM_RE.search(line[max(0, m.start() - 120):m.start()])
+ if am and not any(c in SEC_TERMINATORS for c in gap_txt):
+ # § 前紧邻的裸名(STEM_RE 锚定在窗口尾)若能解析成**另一篇**文档
+ # (「…§2.6 的 H1/H2,属需求档 §9.1.1」),链在此换目标;
+ # 「本文 §3 / §4」的「本文」解析不出文档 → 仍走原继承。
+ atgt, _akind = resolve_name(am.group(1), by_stem)
+ if atgt is not None and atgt != prev_tgt:
+ prev_end, prev_tgt, prev_kind = None, None, None
+ tgt = None
+ if tgt is None and prev_tgt is not None:
+ if not chain_blocked(between, by_stem):
+ # 继承前一个 § 的目标**与它的判定档位**(自引用链仍按自引用处理)
+ tgt, kind = prev_tgt, prev_kind
if tgt is None:
sm = STEM_RE.search(window)
if sm:
diff --git a/scripts/section_aliases.json b/scripts/section_aliases.json
index d052b5ae..e0b7e007 100644
--- a/scripts/section_aliases.json
+++ b/scripts/section_aliases.json
@@ -2,5 +2,11 @@
"内存方案": "docs/内存管理/RAM使用分析与优化方案.md",
"架构总览": "docs/架构设计/项目架构总览.md",
"规划": "docs/算法/继电保护功能复现规划.md",
+ "需求档": "docs/产品需求/产品需求设计文档.md",
+ "产品需求设计文档": "docs/产品需求/产品需求设计文档.md",
+ "架构硬件档": "docs/架构设计/系统架构与硬件规格.md",
+ "系统架构与硬件规格": "docs/架构设计/系统架构与硬件规格.md",
+ "复刻明细档": "docs/产品需求/参考产品复刻明细.md",
+ "复刻明细": "docs/产品需求/参考产品复刻明细.md",
"V0.0": "docs/硬件平台/V0.0_网表详细分析报告.md"
}