refactor(编号): 采集链分层 L1/L1.5/L2/L2.5/L3/L4/L5 → 语义名(批次 1)
用户裁定(2026-10-28):L1/L1.5/L2/L2.5/L3 这套层号「谁能看懂」,改用语义名。 映射(同一批定稿,含 L4/L5): L1 → 语义取数与有效性 L1.5 → 标定折算 L2 → 全周傅氏相量 L2.5 → 测频与遥测快照 L3 → 保护判据 L4 → 出口与记录 L5 → 动作留痕 实测规模:384 站点 / 62 文件(App/algo、App/task、test/host 六个套件、docs/算法、 产品需求、架构总览、启动顺序、ADC 采样节拍、IEC104 上行、采集短板评测、内存管理、 AGENTS.md、README.md、docs/README.md、.pre-commit-config.yaml 与 scripts 里的注释)。 改法(不是全局替换,逐模式有上下文规则): - 先吃同位语再落裸词:L1 有效性校验 → 语义取数与有效性校验、L2 相量层 → 全周傅氏 相量层、L3 保护 → 保护判据、L2.5 遥测快照 → 测频与遥测快照,避免「保护判据保护判据」 这类重复(第一版就是这么坏掉的,已整体回滚重做)。 - .c/.h 只改注释:先把字符串字面量切出去(引号数为奇数的跨行注释按整行处理), C 字符串里的 L2-in ring 之类原样保留——AGENTS 铁律「字符串字面量必须纯 ASCII」。 - 层内条目号(L1-3 / L2-3 这类)**本批不动**,属批次 2;另外三族(UI 菜单层级 L0~L3、链路延迟分段 L1~L8、CubeMX 防丢失三层)也不动,属批次 3。 - 顺手修的措辞:范围写法 L1~L3 → 「分层(语义取数与有效性 → 保护判据)」、 CI 段「不含 L1/L2/L3」→「不含采集链分层」、目录地图里同一处并列表述。 验证:@build 0 错 0 警(Code=236456,与改前逐字节同尺寸——纯注释改动); 内存布局配图已按新脚本重生成(自检通过);doc-links --all --sections-strict 通过 (195 文档);mojibake / bom-guard / coding-standard / 新编号门禁自查 全 rc=0; git diff --check 干净。
This commit is contained in:
+21
-21
@@ -1,4 +1,4 @@
|
||||
# App/algo/ — 采集与算法层(L1 / L2 / L3)
|
||||
# App/algo/ — 采集与算法层(语义取数与有效性 / 全周傅氏相量 / 保护判据)
|
||||
|
||||
> 本目录的**索引**:文件清单、依赖、逐文件的"改代码必须知道"、构建与测试入口、新增模块动作。
|
||||
> **详细设计——机制、契约、判据、为什么这样设计 → `docs/算法/采集与算法层设计说明.md`**(本文不复制其内容)。
|
||||
@@ -9,21 +9,21 @@
|
||||
|
||||
| 文件 | 层 | 作用(一句话) | 主要对外入口 | 覆盖规划项 |
|
||||
|---|---|---|---|---|
|
||||
| `adc_input.h` / `.c` | L1 | 统一语义取数:两片转换器的码值按语义(`UA…IN` / 温度)暴露,并消费 STM32 ADC1 的 DMA 乒乓缓冲 | `adc_input_init()` `adc_input_poll()` `adc_input_raw()` | TPAFE 快照消费 / STM32 ADC1 启动与扫描 / 通道语义映射 |
|
||||
| `adc_health.h` / `.c` | L1 | 采样有效性判定:吃计数快照,产出静默 / 丢帧 / 单调性 / 错误增量故障位(判定与告警编排分离);「采样通道自检」残余的码值贴轨观察器同层 | `adc_health_check()` `adc_health_flags()` `adc_health_rail_watch()` | 「采样有效性校验」/「采样通道自检」(残余) |
|
||||
| `adc_cal.h` / `.c` | L1.5 | 通道标定折算(「数据可信」标定折算与落盘整定):工程量 =(code+b)×k,Q16 系数/零点两段落盘 + 三态 flags + 合法带哨兵 + 两点公式 | `adc_cal_apply()` `adc_cal_flags()` `adc_cal_set()` | 「通道标定(一次系数 + 零漂)」(M4 半边) |
|
||||
| `meas.h` / `.c` | L2 发布 | 遥测快照(「数据可信」遥测快照发布,M5 地基):200 ms 基波有效值 + 品质快照,双区无锁读,全仓唯一发布者 = adcTask | `meas_tick()` `meas_get()` `meas_seq()` | M5(104 改读快照与频率点绑定、UI 是读者) |
|
||||
| `sample_ring.h` / `.c` | L2 输入 | 按语义通道存最近 2 周波(40 点),供相量层"以当前时刻为终止"取窗 | `sample_ring_push_frame()` `sample_ring_window()` | L2 输入(为「每 1 ms 滑动窗刷新」供数) |
|
||||
| `phasor.h` / `.c` | L2 | 全周傅氏:一周波 20 点 DFT → 基波 / 谐波相量(有效值口径),双区原子切换供无锁读 | `phasor_run()` `phasor_get()` `phasor_calc()` | 全周傅氏系数表 / 基波相量实例 / 相量有效值输出 / 每 1 ms 滑动窗刷新 / 双区指针原子交换 |
|
||||
| `freq.h` / `.c` | L2 派生量 | 频率测量:相邻两拍基波相量共轭乘积取角 + 自适应窗滑动平均 + 假值钳制 + 幅值门(UA→IA 源回退) | `freq_run()` `freq_get()` `freq_valid()` | 「过频 / 低频」测量侧(测频范围 → `docs/算法/继电保护功能复现规划.md` §4.2) |
|
||||
| `prot_set.h` / `.c` | L3 输入 | 保护定值模型:Q10 定点 RAM 表 + 范围校验 + 校验和封存 / 自检 / 闭锁 + 持久化 blob 纯逻辑 | `prot_set_load_raw()` `prot_set_get_f()` `prot_set_selfcheck()` | 「定值校验和」载体 |
|
||||
| `prot_elm.h` / `.c` | L3 | 保护元件框架:通用"越限 + 返回系数滞回 + 定时限"核 + 数据驱动实例表(过流三段 / 过负荷 / 过压 / 欠压 / 零序过压 / 过频 / 低频) | `prot_elm_run()` `prot_elm_eval()` `prot_elm_active_mask()` | 「三段式相间过流」/「过负荷」/「过压 / 欠压」/「过频 / 低频」/「零序过压」(软件侧) |
|
||||
| `adc_input.h` / `.c` | 语义取数与有效性 | 统一语义取数:两片转换器的码值按语义(`UA…IN` / 温度)暴露,并消费 STM32 ADC1 的 DMA 乒乓缓冲 | `adc_input_init()` `adc_input_poll()` `adc_input_raw()` | TPAFE 快照消费 / STM32 ADC1 启动与扫描 / 通道语义映射 |
|
||||
| `adc_health.h` / `.c` | 语义取数与有效性 | 采样有效性判定:吃计数快照,产出静默 / 丢帧 / 单调性 / 错误增量故障位(判定与告警编排分离);「采样通道自检」残余的码值贴轨观察器同层 | `adc_health_check()` `adc_health_flags()` `adc_health_rail_watch()` | 「采样有效性校验」/「采样通道自检」(残余) |
|
||||
| `adc_cal.h` / `.c` | 标定折算 | 通道标定折算(「数据可信」标定折算与落盘整定):工程量 =(code+b)×k,Q16 系数/零点两段落盘 + 三态 flags + 合法带哨兵 + 两点公式 | `adc_cal_apply()` `adc_cal_flags()` `adc_cal_set()` | 「通道标定(一次系数 + 零漂)」(M4 半边) |
|
||||
| `meas.h` / `.c` | 全周傅氏相量发布 | 遥测快照(「数据可信」遥测快照发布,M5 地基):200 ms 基波有效值 + 品质快照,双区无锁读,全仓唯一发布者 = adcTask | `meas_tick()` `meas_get()` `meas_seq()` | M5(104 改读快照与频率点绑定、UI 是读者) |
|
||||
| `sample_ring.h` / `.c` | 全周傅氏相量输入 | 按语义通道存最近 2 周波(40 点),供相量层"以当前时刻为终止"取窗 | `sample_ring_push_frame()` `sample_ring_window()` | 全周傅氏相量输入(为「每 1 ms 滑动窗刷新」供数) |
|
||||
| `phasor.h` / `.c` | 全周傅氏相量 | 全周傅氏:一周波 20 点 DFT → 基波 / 谐波相量(有效值口径),双区原子切换供无锁读 | `phasor_run()` `phasor_get()` `phasor_calc()` | 全周傅氏系数表 / 基波相量实例 / 相量有效值输出 / 每 1 ms 滑动窗刷新 / 双区指针原子交换 |
|
||||
| `freq.h` / `.c` | 全周傅氏相量的派生量 | 频率测量:相邻两拍基波相量共轭乘积取角 + 自适应窗滑动平均 + 假值钳制 + 幅值门(UA→IA 源回退) | `freq_run()` `freq_get()` `freq_valid()` | 「过频 / 低频」测量侧(测频范围 → `docs/算法/继电保护功能复现规划.md` §4.2) |
|
||||
| `prot_set.h` / `.c` | 保护判据输入 | 保护定值模型:Q10 定点 RAM 表 + 范围校验 + 校验和封存 / 自检 / 闭锁 + 持久化 blob 纯逻辑 | `prot_set_load_raw()` `prot_set_get_f()` `prot_set_selfcheck()` | 「定值校验和」载体 |
|
||||
| `prot_elm.h` / `.c` | 保护判据 | 保护元件框架:通用"越限 + 返回系数滞回 + 定时限"核 + 数据驱动实例表(过流三段 / 过负荷 / 过压 / 欠压 / 零序过压 / 过频 / 低频) | `prot_elm_run()` `prot_elm_eval()` `prot_elm_active_mask()` | 「三段式相间过流」/「过负荷」/「过压 / 欠压」/「过频 / 低频」/「零序过压」(软件侧) |
|
||||
|
||||
依赖(自下而上、无环):`adc_input.h`(纯枚举 + 声明)← `adc_cal`(另依赖 `cfg_file.h` 接口,
|
||||
纯头文件级)← `sample_ring` ← `phasor` ← `freq`;`meas` ← `sample_ring` + `phasor`
|
||||
(仅 `phasor_calc` 纯核;频率/品质由调用方注入,**不链** `freq`/`adc_cal`);
|
||||
`prot_set` **独立**;`prot_elm` ← `prot_set` + `phasor` + `freq`。
|
||||
`adc_health` 只吃调用方喂进来的计数 / 码值,不反向依赖 L1 实现(「采样通道自检」贴轨门限由调用方
|
||||
`adc_health` 只吃调用方喂进来的计数 / 码值,不反向依赖 语义取数与有效性实现(「采样通道自检」贴轨门限由调用方
|
||||
从 `adc_cal_rail_ths()` 取,本层仍零算法依赖)。
|
||||
|
||||
**除 `adc_input.c` 外全部零平台依赖**(只用 `stdint.h` / `math.h` / `stddef.h` 与本目录头)
|
||||
@@ -32,40 +32,40 @@
|
||||
|
||||
## 2. 一拍的数据流(一眼版)
|
||||
|
||||
`adc_input_poll()` → `adc_input_raw()` ×9 → `adc_cal_apply()` ×9(L1.5 折算,现口径 =
|
||||
`adc_input_poll()` → `adc_input_raw()` ×9 → `adc_cal_apply()` ×9(标定折算折算,现口径 =
|
||||
ADC 引脚电压 V)+ `adc_health_rail_watch()` ×9(「采样通道自检」,码值域)→ `sample_ring_push_frame()`
|
||||
→ `phasor_run()` → `freq_run()` → 消费者(`adcTask` 心跳与 L1 健康判定;`protectTask` 每 20 ms 取相量 / 频率跑
|
||||
→ `phasor_run()` → `freq_run()` → 消费者(`adcTask` 心跳与 语义取数与有效性健康判定;`protectTask` 每 20 ms 取相量 / 频率跑
|
||||
`prot_elm_run()`;**每 200 ms** `meas_tick()` 发布遥测快照供 iec104Task / uiTask 读,即「数据可信」遥测快照发布)。节拍 = TIM3 1 kHz 更新事件,两片转换器同源触发。
|
||||
完整数据流图与初始化落点 → `docs/算法/采集与算法层设计说明.md` §2。
|
||||
|
||||
## 3. 逐文件要点(只留"改代码时必须知道"的;机制与理由见设计文档)
|
||||
|
||||
> **改本目录前先记五条红线**:① 取数只经 `adc_input_raw()`,不写死下标;② **禁止跨转换器**做
|
||||
> 相位 / 功率 / 矢量运算(双转换器无共同采样触发);③ 帧值已是 L1.5 工程量,但 **未标定(`adc_cal_flags()` 无
|
||||
> 相位 / 功率 / 矢量运算(双转换器无共同采样触发);③ 帧值已是 标定折算工程量,但 **未标定(`adc_cal_flags()` 无
|
||||
> VALID)时单位只是 ADC 引脚电压**,不是端子二次值——下游消费精度判据见「数据可信」§4.2 三态
|
||||
> 表;④ 工程量 → 帧的唯一折算点是 `adc_cal_apply()`,禁止旁路再乘系数;⑤ 本层不建任务、
|
||||
> 不等事件、不写日志(`adc_cal` 的 `[ERR]` 哨兵留痕是唯一例外,且每通道每开机一次),
|
||||
> `*_init()` 才可在内核前调。
|
||||
> 全文 → `docs/算法/采集与算法层设计说明.md` §10。
|
||||
|
||||
### 3.1 `adc_input.c` / `adc_input.h` — L1 语义取数
|
||||
### 3.1 `adc_input.c` / `adc_input.h` — 语义取数与有效性语义取数
|
||||
- 语义映射表 `k_adc_map[]` 的**内容**唯一权威是 `docs/硬件平台/ADC通道映射说明.md`;V0.2 改版只改表内容,API 不动。
|
||||
- `adc_input_poll()` **仅任务上下文**(TPAFE 快照是临界区);STM32 侧固定滞后 1 拍。
|
||||
- 四类 STM32 计数(`adc1_seq` / `adc1_gap` / `adc1_err` / `adc1_hw`)成因不同,**勿混读**。
|
||||
- 本目录**唯一**允许出现 HAL 调用的文件。→ `docs/算法/采集与算法层设计说明.md` §3。
|
||||
|
||||
### 3.2 `sample_ring.c` / `.h` — L2 输入采样环
|
||||
### 3.2 `sample_ring.c` / `.h` — 全周傅氏相量输入采样环
|
||||
- 整帧写入后才推进写指针 → 取到的窗永远落在整帧边界。
|
||||
- 本拍取数失败 → **整拍跳过入环**(`adc_task.c` 的 `skip`),**绝不补 0 点**。
|
||||
- 不做跨通道运算、不做丢帧判定(只出 `frames()` 计数)。→ `docs/算法/采集与算法层设计说明.md` §5。
|
||||
|
||||
### 3.3 `phasor.c` / `.h` — L2 相量计算
|
||||
### 3.3 `phasor.c` / `.h` — 全周傅氏相量计算
|
||||
- 系数表预乘 √2/N → `fAmSQ` **直接是有效值**(口径 `docs/算法/傅氏算法详解.md` §2.3)。
|
||||
- 实例表 `k_inst[]` 数据驱动:**新增实例只在表尾加一行**。
|
||||
- 任一实例不足一周波 → **本拍整体不产出**(不切使用区);每拍 20 点**全部重算**(不做增量递推)。
|
||||
- → `docs/算法/采集与算法层设计说明.md` §6。
|
||||
|
||||
### 3.4 `adc_health.c` / `.h` — L1 有效性判定
|
||||
### 3.4 `adc_health.c` / `.h` — 语义取数与有效性判定
|
||||
- 三类位**严格分开**:电平(可自愈)/ 锁存(必留痕)/ 边沿事件(仅当拍);**静默 ≠ 丢帧**。
|
||||
- **gap 不告警**(消费者超拍是已知现象);告警编排在 `adc_task.c`,不在本层。
|
||||
- 首拍 `check()` 只建基线。→ `docs/算法/采集与算法层设计说明.md` §4。
|
||||
@@ -76,7 +76,7 @@ ADC 引脚电压 V)+ `adc_health_rail_watch()` ×9(「采样通道自检」
|
||||
- 定值项 / 实例**只许尾部追加**(枚举序 = 数组序 = 校验和覆盖序)。
|
||||
- blob **换代(返回 2)≠ 损坏(返回负)**:前者打 INFO、不记自检。→ `docs/算法/采集与算法层设计说明.md` §8、§12.3。
|
||||
|
||||
### 3.6 `prot_elm.c` / `.h` — L3 保护元件框架
|
||||
### 3.6 `prot_elm.c` / `.h` — 保护判据元件框架
|
||||
- 数据缺失两种处理**刻意不同**:相量类任一未就绪 → 整拍跳过;频率类无有效读数 → 按方向填"必不启动"值,**不整拍跳过**。
|
||||
- `prot_set_locked()` 或投退 = 0 → 元件整体复位不判据;跨上下文复归走 `prot_elm_request_reset()`。
|
||||
- 零序过流(IN 走 STM32)**故意不在实例表**;OF / UF 无独立 104 遥信点,只经 YX15 总聚合可见。
|
||||
@@ -90,7 +90,7 @@ ADC 引脚电压 V)+ `adc_health_rail_watch()` ×9(「采样通道自检」
|
||||
- 源切换即废相位基准重建(UA / IA 无共同相位基准,即双转换器无共同采样触发)。
|
||||
- 判据 **J1~J6** 与实测口径 → `docs/算法/采集与算法层设计说明.md` §7.2(与 `test/host/freq/freq_test.c` 文件头同源)。
|
||||
|
||||
### 3.8 `adc_cal.c` / `.h` — L1.5 通道标定折算(「数据可信」标定折算与落盘整定)
|
||||
### 3.8 `adc_cal.c` / `.h` — 标定折算通道标定折算(「数据可信」标定折算与落盘整定)
|
||||
- 折算模型:工程量 = (code + b) × k;**k 落盘用 int32 Q16(µV/码 × 65536)**、b 用
|
||||
int32 码值(负零点靠 `CFG_VAL_INT`)——单位与定点格式的选型依据见
|
||||
`docs/任务规划/数据可信.md` §4.1,勿改回 V/码 直存(Q16 只剩 20 个刻度)。
|
||||
@@ -107,7 +107,7 @@ ADC 引脚电压 V)+ `adc_health_rail_watch()` ×9(「采样通道自检」
|
||||
- cfg 两段 `[adc_cal]` / `[adc_cal_ofs]` **不挂回调**(RAM 副本即生效值,引擎 load/poll
|
||||
原地改写,逐点现读);注册在 `app_main_init()` 内核前完成,必须先于 `cfg_file_load`。
|
||||
|
||||
### 3.9 `meas.c` / `.h` — 遥测快照发布(L2 发布侧,「数据可信」波次)
|
||||
### 3.9 `meas.c` / `.h` — 遥测快照发布(全周傅氏相量发布侧,「数据可信」波次)
|
||||
- **唯一发布者 = adcTask**:`phasor_run()`/`freq_run()` 同拍、200 ms **tick 经过**分频
|
||||
调 `meas_tick()`(非拍计数——idle/skip 拍拉长名义节拍)。docs/任务规划/数据可信.md §8
|
||||
风险表"快照双写"行 = 评审判据:全仓 `meas_tick` 调用点数须为 1;iec104Task /
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* 模块名称:通道标定与量纲折算(L1.5)——实现
|
||||
* 模块名称:通道标定与量纲折算(标定折算)——实现
|
||||
* 模块功能:见 adc_cal.h。折算模型(工程量 = (code + b) × k × 1e-6,k 为 Q16
|
||||
* µV/码)与两段 cfg 布局([adc_cal]:k_* + valid 位图;[adc_cal_ofs]:
|
||||
* b_*)照 docs/任务规划/数据可信.md §4.1 / §4.4 落地;系数口径
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* 模块名称:通道标定与量纲折算(L1.5,「数据可信」标定折算与落盘整定)
|
||||
* 模块名称:通道标定与量纲折算(标定折算,「数据可信」标定折算与落盘整定)
|
||||
* 模块功能:把 adc_input 的原始码值折算成工程量——模型与系数口径的唯一落点:
|
||||
* 工程量 = (code + b) × k_f,k_f = k[µV/码] × 1e-6
|
||||
* k 以 int32 **Q16**(µV/码 × 65536)落盘、b 以 int32 码值落盘,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* 模块名称:ADC 采样有效性校验(L1 采集与预处理)
|
||||
* 模块名称:ADC 采样有效性校验(语义取数与预处理)
|
||||
*(保护功能清单见 docs/算法/继电保护功能复现规划.md)
|
||||
* 模块功能:见 adc_health.h 文件头。本文件为**纯逻辑实现**:输入计数快照、
|
||||
* 输出故障位/事件位,零平台依赖(仅 stdint.h/string.h 标准 C)→
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* 模块名称:ADC 采样有效性校验(L1 采集与预处理)
|
||||
* 模块名称:ADC 采样有效性校验(语义取数与预处理)
|
||||
*(保护功能清单见 docs/算法/继电保护功能复现规划.md)
|
||||
* 模块功能:对两片转换器的"节拍是否还在喂数据"做**判定层**(观测计数由
|
||||
* `adc_input` / `tpafe5160` 驱动提供,本模块只做判定与告警位):
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* 模块名称:ADC 输入层(L1 采集与预处理)
|
||||
* 模块名称:ADC 输入层(语义取数与预处理)
|
||||
* 模块功能:语义通道映射(通道语义映射)+ STM32 ADC1 采样消费(STM32 ADC1 启动与扫描,TIM3 TRGO 触发 +
|
||||
*(保护功能清单见 docs/算法/继电保护功能复现规划.md)
|
||||
* DMA 双缓冲)+ TPAFE 快照消费。
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* 模块名称:ADC 输入层(L1 采集与预处理)
|
||||
* 模块名称:ADC 输入层(语义取数与预处理)
|
||||
* 模块功能:把两片转换器的原始码值按**语义**(UA/UB/UC/UN/IA/IB/IC/IN/温度)统一
|
||||
* 暴露,使上层(UI / 自检 / 保护算法)**按语义取数,不写死下标**:
|
||||
* ① 语义通道映射表(通道语义映射)——权威口径 docs/硬件平台/ADC通道映射说明.md;
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* 模块名称:频率测量层(L2 派生量)——实现
|
||||
* 模块名称:频率测量层(全周傅氏相量的派生量)——实现
|
||||
* 模块功能:见 freq.h。相邻两拍基波相量共轭乘积取角(= 每拍相位增量,免
|
||||
* 显式解缠绕)+ **自适应窗长滑动平均** + 瞬时值钳制 + 幅值门。
|
||||
* 输入 = phasor 使用区基波相量(UA 优先,UA 无幅值用 IA)。
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 模块名称:频率测量层(L2 派生量,过频 / 低频的测量输入)
|
||||
* 模块名称:频率测量层(全周傅氏相量的派生量,过频 / 低频的测量输入)
|
||||
*(保护功能清单见 docs/算法/继电保护功能复现规划.md)
|
||||
* 模块功能:由 L2 相量使用区的基波相量导出系统频率——相邻两拍基波相量取
|
||||
* 模块功能:由 全周傅氏相量使用区的基波相量导出系统频率——相邻两拍基波相量取
|
||||
* **共轭乘积** P = Z(m)·conj(Z(m-1))(其角 = 每拍相位增量,纯音 =
|
||||
* +2πf/Fs,免显式解缠绕),再对**自适应窗长**的相位增量做滑动平均:
|
||||
* K_eff = round(8·Fs/(2·f_hat)) ≈ 泄漏纹波周期 fs/(2f) 的整数倍
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* 模块名称:遥测快照发布层(L2 派生·发布侧,「数据可信」§4.5)
|
||||
* 模块名称:遥测快照发布层(全周傅氏相量派生·发布侧,「数据可信」§4.5)
|
||||
* 模块功能:实现见 meas.h——200 ms 基波有效值 + 品质快照,双区无锁读。
|
||||
* 本文件纯算法:输入 = sample_ring 取窗 + 调用方注入(频率/削顶位图),
|
||||
* 无 RTOS / 无寄存器 / 无日志(「数据可信」层内禁令:本目录不写日志)。
|
||||
|
||||
+3
-3
@@ -1,12 +1,12 @@
|
||||
/*
|
||||
* 模块名称:遥测快照发布层(L2 派生·发布侧,「数据可信」§4.5)
|
||||
* 模块功能:每 **200 ms** 从 L2 层取一次基波有效值 + 品质,产出一份全仓唯一的
|
||||
* 模块名称:遥测快照发布层(全周傅氏相量派生·发布侧,「数据可信」§4.5)
|
||||
* 模块功能:每 **200 ms** 从 全周傅氏相量层取一次基波有效值 + 品质,产出一份全仓唯一的
|
||||
* 遥测快照(meas_snap_t,布局权威 = docs/任务规划/数据可信.md §4.5),
|
||||
* 让 104 与 UI **共用同一份上游**——"什么时候算新值、品质怎么判"只此
|
||||
* 一处决定(M5 遥测链的地基;104 侧消费见「数据可信」104 改读快照,UI 侧 ui_data_feed 属
|
||||
* 「UI 扩展」波次,两者都只是本快照的读者)。
|
||||
* 值口径(批 2「遥测快照发布」的 A-lite 裁决,2026-10-25):**基波有效值瞬时透传**
|
||||
* (同拍 phasor 使用区口径,系数已在 L1.5 折算进帧值——现单位 = ADC
|
||||
* (同拍 phasor 使用区口径,系数已在 标定折算折算进帧值——现单位 = ADC
|
||||
* 引脚电压 V,二次值语义等 adc_cal_flags() 出 VALID,见
|
||||
* docs/算法/采集与算法层设计说明.md §10 红线③);**不做** 4 点平均 /
|
||||
* 谐波方和根——docs/任务规划/数据可信.md §4.5 明示"200 ms 是上送节拍
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* 模块名称:相量计算层(L2 相量计算)
|
||||
* 模块名称:相量计算层(全周傅氏相量计算)
|
||||
* 模块功能:全周傅氏算法(单频 DFT)——系数表预乘 √2/N,fAmSQ 直接即有效值。
|
||||
* 覆盖 全周傅氏系数表 / 基波相量实例 / 相量有效值输出 / 每 1 ms 滑动窗刷新 / 双区指针原子交换。
|
||||
* 适用平台:STM32F407ZGTx(Cortex-M4F,硬件 FPU)
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* 模块名称:相量计算层(L2 相量计算)
|
||||
* 模块名称:相量计算层(全周傅氏相量计算)
|
||||
* 模块功能:全周傅氏(全周波傅里叶)算法——对一周波 20 点采样做单频 DFT,
|
||||
* 产出基波/谐波相量。系数表**预乘 √2/N**(口径见
|
||||
* `docs/算法/傅氏算法详解.md` §2.3),故 `fAmSQ = √(fRe²+fIm²)`
|
||||
|
||||
+3
-3
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* 模块名称:保护元件框架(L3,P1 子集)——实现
|
||||
* 模块名称:保护元件框架(保护判据,P1 子集)——实现
|
||||
* 模块功能:见 prot_elm.h。判据核 prot_elm_eval() 为纯逻辑(prot_set RAM +
|
||||
* 测量数组 → 状态机),prot_elm_run() 是 phasor→测量的薄适配层。
|
||||
*
|
||||
@@ -204,7 +204,7 @@ void prot_elm_eval(uint32_t now_ms, const float meas[PE_COUNT]) {
|
||||
* 函数功能:适配层——按实例表 src 组装测量数组后调判据核
|
||||
* 入口参数:now_ms - 单调时基(tick ms)
|
||||
* 返 回 值:无
|
||||
* 限定条件:仅保护消费者任务上下文;测量已是 L1.5 工程量(未标定域由
|
||||
* 限定条件:仅保护消费者任务上下文;测量已是 标定折算工程量(未标定域由
|
||||
* protectTask 未标定即闭锁挡在门外,本函数不感知标定态)
|
||||
* 函数说明:src=PHASOR 行任一相量未就绪(未满一周波)→ **整拍跳过**,
|
||||
* 不引入陈旧/半新测量(B5 口径)。src=FREQ 行:freq 有有效读数
|
||||
@@ -260,7 +260,7 @@ void prot_elm_state(prot_elm_id_t id, prot_elm_state_t *out) {
|
||||
/*
|
||||
* 函数功能:聚合动作位图
|
||||
* 入口参数:无
|
||||
* 返 回 值:bit i = 元件 i asserted(供 L4 出口 / 心跳日志)
|
||||
* 返 回 值:bit i = 元件 i asserted(供 出口与记录 / 心跳日志)
|
||||
*/
|
||||
uint32_t prot_elm_active_mask(void) {
|
||||
uint32_t mask = 0u;
|
||||
|
||||
+4
-4
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* 模块名称:保护元件框架(L3,P1 子集)
|
||||
* 模块名称:保护元件框架(保护判据,P1 子集)
|
||||
* 模块功能:通用"越限 + 返回系数滞回 + 定时限"元件核 + 实例表(数据驱动,
|
||||
* 同 phasor 实例表模式)。判据为**纯逻辑**(吃测量值 + 定值),
|
||||
* 主机侧可离线单测;出口/SOE(L4)与任务编排为后续。
|
||||
* 主机侧可离线单测;出口/SOE(出口与记录)与任务编排为后续。
|
||||
*
|
||||
* V0.1 有效实例(双转换器无共同采样触发 → 仅 TPAFE 三路):
|
||||
* OC1/OC2/OC3 三段式相间过流(A 相 IA)
|
||||
@@ -23,7 +23,7 @@
|
||||
* - 返回**即时**(参考 GRly_TimeRelay 带 10 ms 返回延时——V0.1 无出口硬件,
|
||||
* 抖动只影响日志,P4 接出口时再补返回延时);
|
||||
* - 复压/方向/无压无流闭锁(dwSetFyCtrl 类)随 P2/P3 元件扩展;
|
||||
* - 测量输入 = adc_task 经 adc_cal_apply() 折算后的工程量(L1.5,标定折算已落地):
|
||||
* - 测量输入 = adc_task 经 adc_cal_apply() 折算后的工程量(标定折算,标定折算已落地):
|
||||
* 未标定(VALID=0)时单位只是 ADC 引脚电压——该域下判据必然错配,由
|
||||
* protectTask 的「数据可信」未标定即闭锁停走整条判据链,元件核本身不掺和
|
||||
* 标定语义(保持纯逻辑);标定后单位 = 二次值,定值口径才名副其实。
|
||||
@@ -98,7 +98,7 @@ void prot_elm_run(uint32_t now_ms);
|
||||
/* 状态快照拷贝(NULL 安全;越界全零) */
|
||||
void prot_elm_state(prot_elm_id_t id, prot_elm_state_t *out);
|
||||
|
||||
/* 动作位图(bit i = 元件 i asserted),供 L4 出口 / 心跳日志 */
|
||||
/* 动作位图(bit i = 元件 i asserted),供 出口与记录 / 心跳日志 */
|
||||
uint32_t prot_elm_active_mask(void);
|
||||
|
||||
/* 启动位图(bit i = 元件 i picked),供「保护启动」记录边沿(task-10,2026-10-26):
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* 模块名称:运行参数段(L2/L3 整定层,「数据可信」这一项)——实现
|
||||
* 模块名称:运行参数段(全周傅氏相量/保护判据整定层,「数据可信」这一项)——实现
|
||||
* 模块功能:见 run_par.h。工厂默认 = 「数据可信」下游常数按工程量重定后的额定 0.5 % 档(电压 500
|
||||
* mV / 电流 5 mA / 频率 500 mHz,毫单位 int32 定点落盘);[run_par]
|
||||
* 段 9 键(db_ua…db_freq,均 ≤15 字符)≤ CFG_FILE_MAX_KEYS 不拆段
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* 模块名称:运行参数段(L2/L3 整定层,「数据可信」这一项)
|
||||
* 模块名称:运行参数段(全周傅氏相量/保护判据整定层,「数据可信」这一项)
|
||||
* 模块功能:遥测死区(9 点)与通道标定系数覆盖(k/b 各 8 路)的**单一真源**:
|
||||
* - 死区 = 本模块 int32 毫单位 RAM 副本(注册进 cfg 引擎 [run_par] 段,
|
||||
* 工厂默认 = 「数据可信」下游常数按工程量重定后的额定 0.5 % 档),104 消费侧
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
/*
|
||||
* 模块名称:采样环缓冲(L2 相量计算的输入)
|
||||
* 模块功能:按语义通道保存最近 2 个周波(40 点)采样值,供 L2 相量计算按窗取数。
|
||||
* 模块名称:采样环缓冲(全周傅氏相量计算的输入)
|
||||
* 模块功能:按语义通道保存最近 2 个周波(40 点)采样值,供 全周傅氏相量计算按窗取数。
|
||||
* 适用平台:STM32F407ZGTx(纯算法,无寄存器/无 RTOS 依赖)
|
||||
* 作者:王建锋
|
||||
* 创建日期:2026-10-10
|
||||
* 修改记录:
|
||||
* v1.0 2026-10-10 王建锋 创建:L2 输入环缓冲(20 点/周波 × 2 周波)
|
||||
* v1.0 2026-10-10 王建锋 创建:全周傅氏相量输入环缓冲(20 点/周波 × 2 周波)
|
||||
*/
|
||||
|
||||
#include "sample_ring.h"
|
||||
@@ -48,7 +48,7 @@ void sample_ring_init(void) {
|
||||
* 入口参数:values - 按语义通道顺序排列的一帧采样值(长度须 = ADC_SEM_COUNT)
|
||||
* n - 实际长度(必须等于 ADC_SEM_COUNT)
|
||||
* 返 回 值:0 - 成功;-1 - 参数错
|
||||
* 限定条件:同一帧内各通道须同刻(同族量同刻性由上游 L1 负责)
|
||||
* 限定条件:同一帧内各通道须同刻(同族量同刻性由上游 语义取数与有效性负责)
|
||||
* 函数说明:整帧写入完毕后**统一**推进写指针——单帧内不存在"半新半旧",
|
||||
* 消费侧取到的窗永远落在整帧边界上(无帧内撕裂)。
|
||||
*/
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* 模块名称:采样环缓冲(L2 相量计算的输入)
|
||||
* 模块功能:按**语义通道**保存最近若干周波的采样值,供 L2 相量计算按窗取数。
|
||||
* 模块名称:采样环缓冲(全周傅氏相量计算的输入)
|
||||
* 模块功能:按**语义通道**保存最近若干周波的采样值,供 全周傅氏相量计算按窗取数。
|
||||
* V0.1 上 8 路电气量分属两片转换器(双转换器无共同采样触发),本层只做"按时序
|
||||
* 存/取",**不做任何跨通道运算**——同刻性由上游(L1)保证,本层不假设。
|
||||
* 存/取",**不做任何跨通道运算**——同刻性由上游(语义取数与有效性)保证,本层不假设。
|
||||
* 容量取 **2 个周波(40 点)**,与参考系统 `CN_BUFSAM_CYCLE = 2`
|
||||
* (规划 §10.1)一致,为后续加长数据窗(1.5~2 周波,抗衰减直流,
|
||||
* 见 `傅氏算法详解.md` §9 Q4)预留空间。
|
||||
@@ -10,7 +10,7 @@
|
||||
* 作者:王建锋
|
||||
* 创建日期:2026-10-10
|
||||
* 修改记录:
|
||||
* v1.0 2026-10-10 王建锋 创建:L2 输入环缓冲(20 点/周波 × 2 周波)
|
||||
* v1.0 2026-10-10 王建锋 创建:全周傅氏相量输入环缓冲(20 点/周波 × 2 周波)
|
||||
*/
|
||||
|
||||
#ifndef SAMPLE_RING_H
|
||||
@@ -45,7 +45,7 @@ void sample_ring_init(void);
|
||||
* 入口参数:values - 按语义通道顺序排列的一帧采样值(浮点工程量,长度须 = ADC_SEM_COUNT)
|
||||
* n - 实际长度(必须等于 ADC_SEM_COUNT,否则拒收)
|
||||
* 返 回 值:0 - 成功;-1 - 参数错(空指针或长度不符)
|
||||
* 限定条件:调用方保证同一帧内各通道**同刻**(同族量同刻性由上游 L1 负责)
|
||||
* 限定条件:调用方保证同一帧内各通道**同刻**(同族量同刻性由上游 语义取数与有效性负责)
|
||||
* 函数说明:整帧一次性写入,写完统一推进写指针——单帧内不可能出现"半新半旧",
|
||||
* 即天然无帧内撕裂。消费侧读到的窗永远是**整帧**边界。
|
||||
*/
|
||||
@@ -76,7 +76,7 @@ uint16_t sample_ring_filled(void);
|
||||
* 入口参数:无
|
||||
* 返 回 值:累计入环帧数(32 位,1 kHz 下约 49.7 天回绕)
|
||||
* 限定条件:无
|
||||
* 函数说明:与 L1 的 `tpafe5160_frame_seq()` 对照可判丢帧(采样有效性校验
|
||||
* 函数说明:与 语义取数与有效性的 `tpafe5160_frame_seq()` 对照可判丢帧(采样有效性校验
|
||||
*(保护功能清单见 docs/算法/继电保护功能复现规划.md)
|
||||
* 的判据之一,本层只提供计数,不做判定)。
|
||||
*/
|
||||
|
||||
+11
-11
@@ -24,14 +24,14 @@
|
||||
#include "sys_clock.h"
|
||||
#include "gd5f2gq5ue.h"
|
||||
#include "tpafe5160.h"
|
||||
#include "adc_input.h" /* L1 采集层:adc_input_init()(语义映射 + STM32 ADC1 扫描) */
|
||||
#include "adc_cal.h" /* L1.5 标定层:adc_cal_init()(ROM 系数 + cfg 两段注册,道A 标定折算与落盘整定) */
|
||||
#include "adc_input.h" /* 语义取数与有效性层:adc_input_init()(语义映射 + STM32 ADC1 扫描) */
|
||||
#include "adc_cal.h" /* 标定折算层:adc_cal_init()(ROM 系数 + cfg 两段注册,道A 标定折算与落盘整定) */
|
||||
#include "run_par.h" /* 运行参数段:run_par_init()([run_par] 注册 + 104 地址映射真源,道D 这一项) */
|
||||
#include "iec104_comm.h" /* [comm] 段:iec104_comm_init()(ca/端口注册,道G task-8) */
|
||||
#include "phasor.h" /* L2 相量层:phasor_init()(系数表 + 实例 + 双区交换) */
|
||||
#include "freq.h" /* L2 派生量:freq_init()(相位解缠绕测频,B8) */
|
||||
#include "prot_set.h" /* L3 定值模型:prot_set_init()(B5,内核前封存) */
|
||||
#include "prot_elm.h" /* L3 元件框架:prot_elm_init()(B5,解析相量索引) */
|
||||
#include "phasor.h" /* 全周傅氏相量层:phasor_init()(系数表 + 实例 + 双区交换) */
|
||||
#include "freq.h" /* 全周傅氏相量的派生量:freq_init()(相位解缠绕测频,B8) */
|
||||
#include "prot_set.h" /* 保护判据定值模型:prot_set_init()(B5,内核前封存) */
|
||||
#include "prot_elm.h" /* 保护判据元件框架:prot_elm_init()(B5,解析相量索引) */
|
||||
#include "sys_log.h"
|
||||
#include "task_watchdog.h" /* task_wd_seg_report():第 8 轮复位不丢"进段打点"上报 */
|
||||
#include "test_config.h" /* 套件开关:身份戳的构建变体串(FW_BUILD_VARIANT)依赖本头,
|
||||
@@ -108,7 +108,7 @@ static void reset_cause_str(uint32_t csr, char *buf, unsigned int len) {
|
||||
* 1) 时间子系统(SD2506 RTC → 墙钟基准)
|
||||
* 2) RS-485
|
||||
* 3) GD5F NAND
|
||||
* 4) TPAFE5160 ADC → ADC 输入层(L1,语义映射 + STM32 ADC1)
|
||||
* 4) TPAFE5160 ADC → ADC 输入层(语义取数与有效性,语义映射 + STM32 ADC1)
|
||||
* 5) SD2506 诊断信息
|
||||
* 6) 启动 TIM3 1 kHz 采样节拍(ISR 内脉冲 CONVST;同一更新事件经 TRGO 硬件触发 ADC1 + DMA)
|
||||
*/
|
||||
@@ -239,7 +239,7 @@ int app_main_init(void) {
|
||||
DBG_ERROR("ADC1 disable before DMA arm: TIMEOUT");
|
||||
}
|
||||
|
||||
/* 4b) ADC 输入层(L1)初始化:清原始码值缓冲与统计 + **语义映射表自洽性自检**
|
||||
/* 4b) ADC 输入层(语义取数与有效性)初始化:清原始码值缓冲与统计 + **语义映射表自洽性自检**
|
||||
* (映射指向了不会被扫描的通道 → 返回 -1,避免"读到恒为陈旧值"的静默错)
|
||||
* + 挂载一次 STM32 ADC1 的 DMA(失败返回 -2)。
|
||||
* ADC1 外设已由 MX_ADC1_Init()(main.c)配好 9 通道 / 144 cycles /
|
||||
@@ -259,20 +259,20 @@ int app_main_init(void) {
|
||||
}
|
||||
}
|
||||
|
||||
/* 4c) 相量层(L2)初始化:清双区结果与有效标志 + 复位采样环缓冲。
|
||||
/* 4c) 相量层(全周傅氏相量)初始化:清双区结果与有效标志 + 复位采样环缓冲。
|
||||
* 纯算法层(无外设 / 无 RTOS 依赖,见 docs/算法/继电保护功能复现规划.md
|
||||
* §3.2),须在启动采样节拍(步骤 6)之前。幂等、当前无失败路径
|
||||
* (返回值保留供后续自检扩展)。 */
|
||||
(void)phasor_init();
|
||||
DBG_INFO("phasor layer init: OK (inst=%u)", (unsigned)phasor_inst_count());
|
||||
|
||||
/* 4c-2) 测频层(L2 派生量,B8)初始化:清平均窗/相位基准/有效标志。
|
||||
/* 4c-2) 测频层(全周傅氏相量的派生量,B8)初始化:清平均窗/相位基准/有效标志。
|
||||
* 纯算法(输入 = phasor 使用区),消费在 adcTask(freq_run 每拍)
|
||||
* 与 protectTask(OF/UF 判据经 prot_elm_run 取数)。 */
|
||||
(void)freq_init();
|
||||
DBG_INFO("freq layer init: OK");
|
||||
|
||||
/* 4c-3) 通道标定层(L1.5,「数据可信」标定折算与落盘整定)初始化:RAM 系数副本置
|
||||
/* 4c-3) 通道标定层(标定折算,「数据可信」标定折算与落盘整定)初始化:RAM 系数副本置
|
||||
* ROM 默认(量程口径冻结定死的引脚侧 LSB,docs/硬件平台/ADC通道映射说明.md §7.1)
|
||||
* + 向配置引擎注册 [adc_cal] / [adc_cal_ofs] 两段。注册必须先于
|
||||
* defaultTask 的 cfg_file_load(「先注册后 load」契约)→ 只能落内核前;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 模块名称:IEC 60870-5-104 点表与数据源适配(实现)
|
||||
* 模块功能:实现 iec104_pts.h——YC/YX/YK/定值点表(ROM)、板端默认源
|
||||
* (**L2 遥测快照**(104 改读快照)/ prot_elm / prot_set)、COV 比对(遥信变位 +
|
||||
* (**测频与遥测快照**(104 改读快照)/ prot_elm / prot_set)、COV 比对(遥信变位 +
|
||||
* 遥测死区 2 点确认 + 品质变化)。点表口径见 iec104_pts.h 文件头与
|
||||
* 设计文档 §3。
|
||||
* 线程约定:init/bind 建服务前;其余仅 104 服务任务上下文(快照非原子)。
|
||||
@@ -12,7 +12,7 @@
|
||||
* k_yc 表头注释;数值随 104 改读快照迁运行参数,本表将退化为
|
||||
* ROM 默认载体。
|
||||
* 2026-10-25 DTU 项目组 104 改读快照与频率点绑定(「数据可信」,道D):YC 板端源改读
|
||||
* L2 遥测快照(App/algo/meas.h,meas_get 无锁双区);
|
||||
* 测频与遥测快照(App/algo/meas.h,meas_get 无锁双区);
|
||||
* 削顶五路由快照品质 CLIPPED 驱动线上 IV(不再绑死 -1,
|
||||
* V0.2 消除双转换器无共同采样触发后零改动自动启用);0x401d 绑频率源(频率点绑定);
|
||||
* 死区改运行时副本 + set/get 入口;COV 遥测腿 = 死区
|
||||
@@ -36,7 +36,7 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "iec104_asdu.h" /* QDS/DIQ 品质位常量 */
|
||||
#include "meas.h" /* 板端源:遥测 = L2 遥测快照(104 改读快照;品质域位同源) */
|
||||
#include "meas.h" /* 板端源:遥测 = 测频与遥测快照(104 改读快照;品质域位同源) */
|
||||
#include "run_par.h" /* 运行参数段:死区真源 + 104 读写路由 */
|
||||
#include "prot_elm.h" /* 板端源:遥信 = 元件状态 */
|
||||
#include "prot_set.h" /* 板端源:定值 + 闭锁 */
|
||||
@@ -45,7 +45,7 @@
|
||||
|
||||
/* ---------------- YC 表(§1.5 点号 4011+;死区列 = ROM 默认值) ------------ */
|
||||
/* 源类型(「数据可信」频率点绑定:YC 表加 src 类型区分相量/频率) */
|
||||
#define PTS_SRC_MEAS 0u /* L2 快照槽 sem(电气量,yc/qds 直读) */
|
||||
#define PTS_SRC_MEAS 0u /* 全周傅氏相量快照槽 sem(电气量,yc/qds 直读) */
|
||||
#define PTS_SRC_FREQ 1u /* 快照频率(freq_valid 门 → IV) */
|
||||
|
||||
typedef struct {
|
||||
@@ -458,7 +458,7 @@ int iec104_pts_set_write(uint32_t addr, float v, uint8_t select) {
|
||||
/* ============================ 板端默认源 ================================= */
|
||||
|
||||
/*
|
||||
* 函数功能:板端默认源 - 遥测 = L2 遥测快照直读(「数据可信」104 改读快照与频率点绑定)
|
||||
* 函数功能:板端默认源 - 遥测 = 测频与遥测快照直读(「数据可信」104 改读快照与频率点绑定)
|
||||
* 入口参数:idx - YC 表下标 out/qds - 值 + uint16 域品质(MEAS_QDS_*)
|
||||
* 返 回 值:0 / -1 越界或频率未新鲜(IV)/ -2 快照从未发布(NT) int
|
||||
* 限定条件:iec104Task 上下文(meas_get 为双区无锁读,App/algo/meas.h)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
* (asdu+pts+link)可离线跑(分层约束:协议解析与硬件 I/O 分离)。
|
||||
* 点表口径(docs/算法/继电保护功能复现规划.md §1.5,验收 = 省电科院点表):
|
||||
* - YC:IOA 0x4011~0x4018 + 0x401d(频率),短浮点、系数 1;数据源 =
|
||||
* L2 遥测快照(App/algo/meas.h,「数据可信」104 改读快照与频率点绑定):电气 8 路绑快照槽,
|
||||
* 测频与遥测快照(App/algo/meas.h,「数据可信」104 改读快照与频率点绑定):电气 8 路绑快照槽,
|
||||
* 有效性由快照品质驱动——V0.1 削顶路(docs/算法/继电保护功能复现规划.md
|
||||
* §1.6)快照置 CLIPPED → 本层映射为线上 IV(V0.2 后自动启用,绑定零
|
||||
* 改动,见 docs/任务规划/数据可信.md §10「双转换器无共同采样触发」行);0x401d 绑频率源,
|
||||
@@ -25,7 +25,7 @@
|
||||
* 线程约定:init/bind 内核启动前或建服务前;cov_check/read 仅 104 服务任务上下文。
|
||||
* 创建日期:2026-10-12(B4)
|
||||
* 修改记录:
|
||||
* 2026-10-25 DTU 项目组 104 改读快照与频率点绑定(「数据可信」,道D):YC 数据源 = L2 遥测
|
||||
* 2026-10-25 DTU 项目组 104 改读快照与频率点绑定(「数据可信」,道D):YC 数据源 = 全周傅氏相量遥测
|
||||
* 快照(削顶路由品质驱动 IV);死区改运行时副本 +
|
||||
* set/get 入口;COV 遥测腿 = 死区 2 点确认(seq 去重)
|
||||
* + 品质变化即报;0x401d 绑频率源(freq_valid → IV)。
|
||||
|
||||
+22
-22
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 模块名称:ADC Sampling Task
|
||||
* 模块功能:ADC 采集消费 + L2 相量计算——TPAFE5160 快照 + STM32 ADC1 DMA 乒乓帧消费
|
||||
* (经 L1 层 App/algo/adc_input.c 按语义取数)→ 压入采样环
|
||||
* 模块功能:ADC 采集消费 + 全周傅氏相量计算——TPAFE5160 快照 + STM32 ADC1 DMA 乒乓帧消费
|
||||
* (经 语义取数与有效性层 App/algo/adc_input.c 按语义取数)→ 压入采样环
|
||||
* (App/algo/sample_ring.c)→ 全周傅氏相量重算(App/algo/phasor.c)
|
||||
* + 帧统计(节拍由 TIM3 硬件定时器提供)
|
||||
* 状态说明:**B1 已落地(2026-10-10)**——本任务从空桩转为真实消费者:
|
||||
@@ -15,7 +15,7 @@
|
||||
* 消除 0~1 ms 的 tick 量化相位抖动与"超拍永久落后 → 空转"风险;本任务优先级
|
||||
* 同步由 Normal 提到 **AboveNormal**(唤醒即抢占)。详见
|
||||
* docs/子系统设计/ADC采样节拍设计说明.md §6。
|
||||
* **L1 采集层**:取数改走 App/algo/adc_input.c——
|
||||
* **语义取数与有效性层**:取数改走 App/algo/adc_input.c——
|
||||
* 本任务每拍调 adc_input_poll()(TPAFE 快照 + STM32 ADC1 9 通道扫描),
|
||||
* 经 adc_input_raw() **按语义**读通道(STM32 ADC1 启动与扫描 / 通道语义映射),不再直接触碰驱动缓冲。
|
||||
*(保护功能清单见 docs/算法/继电保护功能复现规划.md)
|
||||
@@ -41,7 +41,7 @@
|
||||
* v2.3 2026-10-10 王建锋 STM32 ADC1 启动与扫描 / 通道语义映射:取数改走 App/algo/adc_input.c(语义映射 +
|
||||
* STM32 ADC1 9 通道扫描);首帧日志补全 8 路电气量 + 温度,
|
||||
* 心跳日志增 adc1_rc / adc1_err 观测 STM32 侧健康度。
|
||||
* v2.4 2026-10-10 王建锋 L2:接入相量层——每拍把 9 路语义值压入采样环
|
||||
* v2.4 2026-10-10 王建锋 全周傅氏相量:接入相量层——每拍把 9 路语义值压入采样环
|
||||
* (sample_ring)并重算全部相量实例(phasor_run);
|
||||
* 攒满一周波后**首拍即落一次相量日志**(开机证据,不等
|
||||
* 10 s 心跳),心跳日志增 ring / skip 计数与各实例相量
|
||||
@@ -85,7 +85,7 @@
|
||||
* 者;该入口同时不再打日志——它落在本任务静态最坏链上,
|
||||
* 每条 DBG_* 约 216 B 栈,而这一行毫无诊断价值(本任务
|
||||
* 存活由首帧日志与 TASK_WD_ADC 心跳证明)
|
||||
* v3.1 2026-10-25 DTU 项目组 L1.5 折算 + 采样通道自检 贴轨观测(「数据可信」标定折算落地,道A):
|
||||
* v3.1 2026-10-25 DTU 项目组 标定折算折算 + 采样通道自检 贴轨观测(「数据可信」标定折算落地,道A):
|
||||
* frame[s] 由 (float)code 改 adc_cal_apply()——工程量 =
|
||||
* (code+b)×k,现口径 = ADC 引脚电压 V(eng=0,量程口径冻结的
|
||||
* ROM 系数,docs/硬件平台/ADC通道映射说明.md §7.1);同拍
|
||||
@@ -93,7 +93,7 @@
|
||||
* 门限 adc_cal_rail_ths,码值域与标定正交),锁存边沿 →
|
||||
* DBG_ERROR + 每开机一次 SYSLOG;心跳增 cal: 行(mV 定点
|
||||
* + valid/clipped 位图 + rail 锁存),台架注入口径见该行判读
|
||||
* v3.2 2026-10-25 DTU 项目组 L2 遥测快照发布(「数据可信」这一项,道D,M5):新模块
|
||||
* v3.2 2026-10-25 DTU 项目组 测频与遥测快照发布(「数据可信」这一项,道D,M5):新模块
|
||||
* App/algo/meas.c——本任务为唯一发布者,新帧拍内
|
||||
* freq_run() 之后按 200 ms **tick 经过**分频调
|
||||
* meas_tick()(全仓调用点 = 1,评审判据);品质注入源 =
|
||||
@@ -111,13 +111,13 @@
|
||||
#include "adc_task.h"
|
||||
#include "cmsis_os.h"
|
||||
#include "task_handles.h" /* adcTaskHandle(原为本文件局部 extern) */
|
||||
#include "adc_input.h" /* L1 采集层:adc_input_poll()/adc_input_raw()(按语义取数) */
|
||||
#include "sample_ring.h" /* L2 输入:sample_ring_push_frame()(采样环缓冲) */
|
||||
#include "phasor.h" /* L2 相量层:phasor_run()/phasor_get()(全周傅氏) */
|
||||
#include "freq.h" /* L2 派生量:freq_run()/freq_get()(测频,B8) */
|
||||
#include "adc_input.h" /* 语义取数与有效性层:adc_input_poll()/adc_input_raw()(按语义取数) */
|
||||
#include "sample_ring.h" /* 全周傅氏相量输入:sample_ring_push_frame()(采样环缓冲) */
|
||||
#include "phasor.h" /* 全周傅氏相量层:phasor_run()/phasor_get()(全周傅氏) */
|
||||
#include "freq.h" /* 全周傅氏相量的派生量:freq_run()/freq_get()(测频,B8) */
|
||||
#include "adc_health.h" /* 采样有效性校验(静默/丢帧/单调性/错误增量/贴轨) */
|
||||
#include "adc_cal.h" /* L1.5:通道标定折算(「数据可信」标定折算落地;flags 供 cal 心跳行) */
|
||||
#include "meas.h" /* L2 发布侧:遥测快照 meas_tick()(「数据可信」遥测快照发布,道D) */
|
||||
#include "adc_cal.h" /* 标定折算:通道标定折算(「数据可信」标定折算落地;flags 供 cal 心跳行) */
|
||||
#include "meas.h" /* 全周傅氏相量发布侧:遥测快照 meas_tick()(「数据可信」遥测快照发布,道D) */
|
||||
#include "tpafe5160.h"
|
||||
#include "task_watchdog.h"
|
||||
#include "console_log.h"
|
||||
@@ -133,7 +133,7 @@
|
||||
#define ADC_TASK_REPORT_MS 10000U
|
||||
|
||||
/* 统计:已消费帧数 / 无新帧次数(首拍必为无新帧,之后应稳定为 0 增量)。
|
||||
* 原始码值缓冲由 L1 层 App/algo/adc_input.c 持有(消费侧按语义取数,不写死下标) */
|
||||
* 原始码值缓冲由 语义取数与有效性层 App/algo/adc_input.c 持有(消费侧按语义取数,不写死下标) */
|
||||
static uint32_t s_frames_consumed;
|
||||
static uint32_t s_frames_idle;
|
||||
/* 因通道尚未首次成功而**整拍跳过入环**的次数(不向相量窗注入 0 点) */
|
||||
@@ -194,7 +194,7 @@ void adc_tick_irq_notify(void) {
|
||||
* 限定条件:仅任务上下文;调用方须保证 dbg_console_writer_ready() 为真
|
||||
* 函数说明:MicroLIB 的 snprintf **不支持 %f** → 以 ×0.1 定点整数打印
|
||||
* (打印值 = 实际值 × 10,分辨率 0.1)。逐实例数据驱动输出,
|
||||
* 实例表加行即自动覆盖。输入自 v3.1 起为 L1.5 折算后的工程量
|
||||
* 实例表加行即自动覆盖。输入自 v3.1 起为 标定折算折算后的工程量
|
||||
* (现口径 = ADC 引脚电压 V,见 cal: 心跳行与文件头 v3.1 记录);
|
||||
* 二次值语义仅在 adc_cal_flags() 出 VALID 后成立。
|
||||
*/
|
||||
@@ -329,7 +329,7 @@ void adc_task_func(void *arg) {
|
||||
* (osPriorityBelowNormal),是"UI 心跳缺席"的候选占用者之一 */
|
||||
task_prof_enter(TASK_PROF_ADC_BEAT);
|
||||
|
||||
/* 1) 采集一拍:L1 层 adc_input_poll() = TPAFE 原子快照 + 消费一帧 STM32 ADC1
|
||||
/* 1) 采集一拍:语义取数与有效性层 adc_input_poll() = TPAFE 原子快照 + 消费一帧 STM32 ADC1
|
||||
* DMA 双缓冲(仅任务上下文;TPAFE 侧 1=有新帧 0=无新帧 -1=参数错)。
|
||||
* 采样节拍由 TIM3 更新事件提供(ISR 内触发 CONVST + TRGO 触发 ADC1),
|
||||
* 本任务既不触发也不等待转换。
|
||||
@@ -347,7 +347,7 @@ void adc_task_func(void *arg) {
|
||||
/* r == -1:参数错。调用点 count 为常量,不可达;不计入 idle 以区分异常 */
|
||||
}
|
||||
|
||||
/* 2) L2 输入 + 相量重算:把本拍 9 路语义值转浮点帧压入采样环,再重算全部
|
||||
/* 2) 全周傅氏相量输入 + 相量重算:把本拍 9 路语义值转浮点帧压入采样环,再重算全部
|
||||
* 相量实例(每 1 ms 滑动窗刷新:每拍以"当前时刻为终止的前一周波"整窗重算)。
|
||||
*
|
||||
* ⚠ **仅在本拍确有新帧(r == 1)时**才压环。
|
||||
@@ -374,7 +374,7 @@ void adc_task_func(void *arg) {
|
||||
all_ok = 0u;
|
||||
break;
|
||||
}
|
||||
/* L1.5 折算(「数据可信」标定折算落地,§4.1 模型):工程量 = (code + b) × k。
|
||||
/* 标定折算折算(「数据可信」标定折算落地,§4.1 模型):工程量 = (code + b) × k。
|
||||
* 现口径 = **ADC 引脚电压 V**(eng=0,量程口径冻结的 ROM 系数,见
|
||||
* docs/硬件平台/ADC通道映射说明.md §7.1);端子变比确认与两点标定写入标定
|
||||
* 系数(adc_cal_flags() 出 VALID)后才按二次值消费。TEMP 透传码值
|
||||
@@ -394,11 +394,11 @@ void adc_task_func(void *arg) {
|
||||
if (all_ok != 0u) {
|
||||
(void)sample_ring_push_frame(frame, (uint8_t)ADC_SEM_COUNT);
|
||||
phasor_run();
|
||||
/* L2 派生量测频(B8):同拍紧随 phasor_run——本拍使用区已
|
||||
/* 全周傅氏相量的派生量测频(B8):同拍紧随 phasor_run——本拍使用区已
|
||||
* 切换,freq 读的就是本拍相量(1 ms 同上下文,无竞态) */
|
||||
freq_run();
|
||||
|
||||
/* L2 遥测快照发布(「数据可信」这一项,道D,M5):200 ms tick 经过分频。
|
||||
/* 测频与遥测快照发布(「数据可信」这一项,道D,M5):200 ms tick 经过分频。
|
||||
* 唯一发布者 = 本任务(全仓 meas_tick 调用点数 = 1 为评审判据,
|
||||
* 「数据可信」§8 风险表"快照双写"行);只在**压环成功的真新帧拍**发布
|
||||
* ——idle/skip 拍压环未推进,发布 = 重复旧窗。品质注入唯一源 =
|
||||
@@ -480,7 +480,7 @@ void adc_task_func(void *arg) {
|
||||
(long)ia, (long)ib, (long)ic, (long)in, (long)temp);
|
||||
}
|
||||
|
||||
/* 4) 首拍相量上报:攒满一周波(20 ms)后立即落一次,作为 L2 链路的开机证据。
|
||||
/* 4) 首拍相量上报:攒满一周波(20 ms)后立即落一次,作为 全周傅氏相量链路的开机证据。
|
||||
* 不依赖 10 s 心跳 → 台架 @test 的 settle 窗口内即可见(否则会被静默判据
|
||||
* 截断,见 docs/测试说明/自动化测试流程.md 的 settle 口径)。 */
|
||||
if ((first_phasor_logged == 0u) && (dbg_console_writer_ready() != 0u)) {
|
||||
@@ -495,7 +495,7 @@ void adc_task_func(void *arg) {
|
||||
/* 5) 看门狗心跳(本任务已纳入 required_mask) */
|
||||
task_wd_beat(TASK_WD_ADC);
|
||||
|
||||
/* 6) 周期心跳日志:帧统计 + 驱动侧 FRSTDATA 错误计数 + L2 相量。
|
||||
/* 6) 周期心跳日志:帧统计 + 驱动侧 FRSTDATA 错误计数 + 全周傅氏相量。
|
||||
* 写者就绪前抑制(同 3) 的交错理由);到点无论是否落日志都推进下个上报点 */
|
||||
{
|
||||
if ((int32_t)(now - report_at) >= 0) {
|
||||
@@ -552,7 +552,7 @@ void adc_task_func(void *arg) {
|
||||
(long)rc[ADC_SEM_TEMP]);
|
||||
}
|
||||
|
||||
/* L1.5/采样通道自检 台架观测面(×1000 mV 定点,MicroLIB 无 %f):
|
||||
/* 标定折算/采样通道自检 台架观测面(×1000 mV 定点,MicroLIB 无 %f):
|
||||
* ua/un/ia_mv = 三路 TPAFE 引脚电压毫伏(未标定域,**不是**
|
||||
* 二次值;两点标定注入验证的读数落点,偏差判据 ≤2 %)
|
||||
* vl = VALID 位图(默认构建应恒 0x00——未标定即未标定,
|
||||
|
||||
Reference in New Issue
Block a user