refactor(编号·批次二): 代码与测试侧 215 处保护功能号改成功能名,零行为改动
用户裁定「不要用字母加数字的编号,语义标识是最好的」后的批次二代码半(道 ui-param 执行,逐文件站点数与 自证见其交付)。唯一口径 = 映射表 ci-artifacts/lprot_map.tsv 的功能名列原文,**零自造同义词**;L2.5 与 L-TEST 经实测各 0 处(不是本族),TC 族一字未动。 固件 22 文件 128 处(adc_task.c 21、phasor.c 22、phasor.h 13…),主机测试 13 文件 87 处(pha sor_test.c 57…);设计文档指针新增 19 行,另 16 只文件本来就写着规划文档 ⇒ 不重复加。 **两条只有真改过 215 处才会踩到的坑,都写进注释规范实践**: · 指针**不能接在原句尾部**——那会替原文一个未闭合的半括号封口,实测咬坏 App/algo/sample_ring.h 这类 跨行句 ⇒ 指针一律**单独成行**; · 号删掉会留下**叠词**(「自检失败闭锁 闭锁判定」「定值校验和 定值巡检」)⇒ 复扫并收口 4 处,措辞只用 映射名本身;具体对象需要留住时写成「自检失败闭锁(采样故障闭锁)」。 自证(不靠嘴说):改前把 35 只文件原文备份到仓外 temp,逐文件比 `/*`、`*/` 计数、三类括号计数、行数增量 恰等于指针行数、全角括号增删相等、残留号 0 ⇒ **35/35 通过**;Lead 复核后跑权威 @build **0 错 0 警**, Program Size `Code=233900 RO=26104 RW=1536 ZI=136808` —— **与三条道各自改前改后测的四数逐 字节同数**, 这就是「只动注释与文本」的机器证据;八套主机单测 exit 0,cppcheck 按钩子参数零发现,coding-standard 0。 文件头「修改记录」里的号**一并换名、不还原**(Lead 裁定):这些号是全仓退役的,留一个查无此号的引用比 留一条改过名的条目更坏——「冻结历史不回改」保护的是**别替历史改口**,不是保护一个再也查不到的字符串; id-check 对变更记录行本就豁免,两种选择都不影响门禁。
This commit is contained in:
+20
-19
@@ -17,7 +17,8 @@
|
||||
* docs/子系统设计/ADC采样节拍设计说明.md §6。
|
||||
* **L1 采集层**:取数改走 App/algo/adc_input.c——
|
||||
* 本任务每拍调 adc_input_poll()(TPAFE 快照 + STM32 ADC1 9 通道扫描),
|
||||
* 经 adc_input_raw() **按语义**读通道(L1-3/L1-4),不再直接触碰驱动缓冲。
|
||||
* 经 adc_input_raw() **按语义**读通道(STM32 ADC1 启动与扫描 / 通道语义映射),不再直接触碰驱动缓冲。
|
||||
*(保护功能清单见 docs/算法/继电保护功能复现规划.md)
|
||||
* V0.1 上只有 TPAFE 三路(UA/UN/IA)测量有效;本任务只取数,不做保护运算。
|
||||
* 接入前必读:取数只用 adc_input_raw() / tpafe5160_snapshot()(临界区原子快照,
|
||||
* 仅任务上下文;旧的 get_buf/data_ready/clear_ready 已删除);接消费者前的
|
||||
@@ -37,7 +38,7 @@
|
||||
* 就绪前挂起上报,就绪后补报最近一帧。
|
||||
* v2.2 2026-10-10 王建锋 采样节拍改由 TIM3 更新中断(1 kHz)硬件触发;本任务
|
||||
* 删除自行触发,退化为纯消费者(见文件头"采样节拍")。
|
||||
* v2.3 2026-10-10 王建锋 L1-3/L1-4:取数改走 App/algo/adc_input.c(语义映射 +
|
||||
* 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 路语义值压入采样环
|
||||
@@ -46,9 +47,9 @@
|
||||
* 10 s 心跳),心跳日志增 ring / skip 计数与各实例相量
|
||||
* (Re/Im/有效值,×0.1 定点打印,因 MicroLIB 的 snprintf
|
||||
* 无 %f)。
|
||||
* ⚠ L1-5 通道标定未实现(缺标准源)→ 暂以**原始码值**
|
||||
* ⚠ 通道标定(一次系数 + 零漂)未实现(缺标准源)→ 暂以**原始码值**
|
||||
* 充作工程量(系数 = 1),故相量读数只证明**链路通**,
|
||||
* 不可作幅值精度判据(同 L1-3 的替代口径)。
|
||||
* 不可作幅值精度判据(同 STM32 ADC1 启动与扫描 的替代口径)。
|
||||
* v2.5 2026-10-10 王建锋 常开耗时测量埋点:单拍加探针
|
||||
* (task_prof ADC_BEAT),用于判定本任务是否超拍
|
||||
* (名义节拍 1 ms = 168000 周期)而挤占低优先级任务
|
||||
@@ -70,7 +71,7 @@
|
||||
* §3.2);STM32 侧改 DMA 双缓冲
|
||||
* 消费,adc_input_poll() 不再忙等;心跳日志增
|
||||
* adc1_seq / adc1_hw(adc1_err 语义改为"本拍无新帧")
|
||||
* v2.9 2026-10-11 王建锋 L1-6 采样有效性校验:每拍调 adc_health_check()
|
||||
* v2.9 2026-10-11 王建锋 采样有效性校验:每拍调 adc_health_check()
|
||||
* (App/algo/adc_health.c,纯逻辑判定:静默/丢帧/
|
||||
* 单调性/错误计数增量)——严重事件与故障电平上升沿
|
||||
* 打 DBG_ERROR + 每类每次开机一次 SYSLOG_SELFTEST;
|
||||
@@ -84,11 +85,11 @@
|
||||
* 者;该入口同时不再打日志——它落在本任务静态最坏链上,
|
||||
* 每条 DBG_* 约 216 B 栈,而这一行毫无诊断价值(本任务
|
||||
* 存活由首帧日志与 TASK_WD_ADC 心跳证明)
|
||||
* v3.1 2026-10-25 DTU 项目组 L1.5 折算 + L5-2 贴轨观测(「数据可信」卡 2,道A):
|
||||
* v3.1 2026-10-25 DTU 项目组 L1.5 折算 + 采样通道自检 贴轨观测(「数据可信」卡 2,道A):
|
||||
* frame[s] 由 (float)code 改 adc_cal_apply()——工程量 =
|
||||
* (code+b)×k,现口径 = ADC 引脚电压 V(eng=0,卡 1 冻结的
|
||||
* ROM 系数,docs/硬件平台/ADC通道映射说明.md §7.1);同拍
|
||||
* 经 adc_health_rail_watch() 逐通道贴轨观察(L5-2 残余,
|
||||
* 经 adc_health_rail_watch() 逐通道贴轨观察(采样通道自检 残余,
|
||||
* 门限 adc_cal_rail_ths,码值域与标定正交),锁存边沿 →
|
||||
* DBG_ERROR + 每开机一次 SYSLOG;心跳增 cal: 行(mV 定点
|
||||
* + valid/clipped 位图 + rail 锁存),台架注入口径见该行判读
|
||||
@@ -107,7 +108,7 @@
|
||||
#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_health.h" /* L1-6:采样有效性校验(静默/丢帧/单调性/错误增量/贴轨) */
|
||||
#include "adc_health.h" /* 采样有效性校验(静默/丢帧/单调性/错误增量/贴轨) */
|
||||
#include "adc_cal.h" /* L1.5:通道标定折算(「数据可信」卡 2;flags 供 cal 心跳行) */
|
||||
#include "meas.h" /* L2 发布侧:遥测快照 meas_tick()(「数据可信」卡 8,道D) */
|
||||
#include "tpafe5160.h"
|
||||
@@ -131,14 +132,14 @@ static uint32_t s_frames_idle;
|
||||
/* 因通道尚未首次成功而**整拍跳过入环**的次数(不向相量窗注入 0 点) */
|
||||
static uint32_t s_frames_skip;
|
||||
|
||||
/* L1-6 告警编排状态:
|
||||
/* 采样有效性校验 告警编排状态:
|
||||
* s_health_prev - 上次电平故障位(判上升/下降沿,避免每拍重复告警)
|
||||
* s_health_logged- 已写 SYSLOG_SELFTEST 的位(每类每次开机只留痕一次,
|
||||
* 防持续故障刷屏把 32KB selftest.log 写满) */
|
||||
static uint32_t s_health_prev;
|
||||
static uint32_t s_health_logged;
|
||||
|
||||
/* L5-2 贴轨编排状态(锁存本体在 adc_health 内,这里只留编排层视角):
|
||||
/* 采样通道自检 贴轨编排状态(锁存本体在 adc_health 内,这里只留编排层视角):
|
||||
* s_rail_edge_latched - 本开机以来出现过锁存边沿的通道位图(心跳 cal: 行展示)
|
||||
* s_rail_syslogged - SYSLOG 留痕只写一次的闸门(init 重置) */
|
||||
static uint32_t s_rail_edge_latched;
|
||||
@@ -206,7 +207,7 @@ static void log_phasors(const char *tag) {
|
||||
}
|
||||
}
|
||||
|
||||
/* 测频行(B8,L3-5 测量侧台架可见性):同样 x0.01 定点(分辨率 0.01 Hz)。
|
||||
/* 测频行(B8,过频 / 低频 测量侧台架可见性):同样 x0.01 定点(分辨率 0.01 Hz)。
|
||||
* valid=0 = 未启动收敛或幅值门失效(浮空输入 rms≈0),此时 f 为保持值
|
||||
* (从未收敛则 0)——判读:正常带波形应 valid=1 且 f≈5000。 */
|
||||
{
|
||||
@@ -219,7 +220,7 @@ static void log_phasors(const char *tag) {
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:L1-6 判定结果的告警编排(边沿 → 日志 + 自检留痕)
|
||||
* 函数功能:采样有效性校验 判定结果的告警编排(边沿 → 日志 + 自检留痕)
|
||||
* 入口参数:hs - adc_health_check() 判定结果快照
|
||||
* 返 回 值:无
|
||||
* 限定条件:仅任务上下文;日志仍受写者就绪门控(SYSLOG 不受——内核前有
|
||||
@@ -278,7 +279,7 @@ int adc_task_init(void) {
|
||||
s_rail_edge_latched = 0u;
|
||||
s_rail_syslogged = 0u;
|
||||
s_meas_ms = 0u;
|
||||
adc_health_init(); /* 内含 L5-2 贴轨观察器复位(rail_init) */
|
||||
adc_health_init(); /* 内含 采样通道自检 贴轨观察器复位(rail_init) */
|
||||
(void)meas_init(); /* 遥测快照双区/序号复位(幂等;发布状态属本任务,init 无日志) */
|
||||
return 0;
|
||||
}
|
||||
@@ -340,7 +341,7 @@ void adc_task_func(void *arg) {
|
||||
}
|
||||
|
||||
/* 2) L2 输入 + 相量重算:把本拍 9 路语义值转浮点帧压入采样环,再重算全部
|
||||
* 相量实例(L2-6 滑动窗:每拍以"当前时刻为终止的前一周波"整窗重算)。
|
||||
* 相量实例(每 1 ms 滑动窗刷新:每拍以"当前时刻为终止的前一周波"整窗重算)。
|
||||
*
|
||||
* ⚠ **仅在本拍确有新帧(r == 1)时**才压环。
|
||||
* 原实现在 r == 0(TPAFE 无新帧)时**仍然**压环 + phasor_run(),只有 r == -1
|
||||
@@ -373,7 +374,7 @@ void adc_task_func(void *arg) {
|
||||
* 不折算(决策 5)。*/
|
||||
frame[s] = adc_cal_apply((adc_semantic_t)s, code);
|
||||
|
||||
/* L5-2 码值越界(贴轨)观察:在**码值域**判定,与标定正交——
|
||||
/* 采样通道自检 码值越界(贴轨)观察:在**码值域**判定,与标定正交——
|
||||
* 连续一周波贴轨带且此前见过释放沿才锁存(空载恒 0 不误报)。
|
||||
* TEMP 无「轨」语义,adc_cal_rail_ths() 返 -1 自然跳过。*/
|
||||
if (adc_cal_rail_ths((adc_semantic_t)s, &lo_th, &hi_th) == 0) {
|
||||
@@ -428,7 +429,7 @@ void adc_task_func(void *arg) {
|
||||
}
|
||||
}
|
||||
|
||||
/* 2b) L1-6 采样有效性校验(每拍,常数次整数运算):把驱动侧观测计数交给
|
||||
/* 2b) 采样有效性校验(每拍,常数次整数运算):把驱动侧观测计数交给
|
||||
* 纯逻辑判定层,本任务只做告警编排。⚠ 计数一律取**本拍 poll 之后**
|
||||
* 的值——与刚消费的帧同一时点,避免"下一拍的增量被提前看到"。 */
|
||||
{
|
||||
@@ -449,7 +450,7 @@ void adc_task_func(void *arg) {
|
||||
/* 3) 首帧码值上报:**写者就绪后**才落日志。写者未注册时 con_append 走
|
||||
* 无锁直发路径,与 defaultTask 的存储初始化日志会字节级交错
|
||||
* (2026-10-10 台架实测);此时挂起上报,就绪后补报最近一帧。
|
||||
* 8 路电气量 + 温度全部经 adc_input_raw() **按语义**取数(L1-4),
|
||||
* 8 路电气量 + 温度全部经 adc_input_raw() **按语义**取数(通道语义映射),
|
||||
* 用于验证"语义 → 物理通道"映射与两片转换器取数契约 */
|
||||
if ((first_logged == 0u) && (s_frames_consumed != 0u) &&
|
||||
(dbg_console_writer_ready() != 0u)) {
|
||||
@@ -500,7 +501,7 @@ void adc_task_func(void *arg) {
|
||||
* adc1_hw = HAL ADC/DMA 错误回调
|
||||
* 判读:adc1_seq 停增而 seq 仍涨 → STM32 侧停摆;
|
||||
* adc1_gap 增长 → 本任务耗时超拍(看 adcm/adcn);
|
||||
* tgap = TPAFE 侧同类丢帧计数(L1-6,与 adc1_gap 对称) */
|
||||
* tgap = TPAFE 侧同类丢帧计数(采样有效性校验,与 adc1_gap 对称) */
|
||||
DBG_INFO("frames=%lu idle=%lu skip=%lu seq=%lu frst_err=%u ring=%lu"
|
||||
" adc1_rc=%d adc1_err=%lu adc1_seq=%lu adc1_gap=%lu adc1_hw=%lu"
|
||||
" tgap=%lu",
|
||||
@@ -519,7 +520,7 @@ void adc_task_func(void *arg) {
|
||||
|
||||
log_phasors("hb");
|
||||
|
||||
/* L1.5/L5-2 台架观测面(×1000 mV 定点,MicroLIB 无 %f):
|
||||
/* L1.5/采样通道自检 台架观测面(×1000 mV 定点,MicroLIB 无 %f):
|
||||
* ua/un/ia_mv = 三路 TPAFE 引脚电压毫伏(未标定域,**不是**
|
||||
* 二次值;卡 12 注入验证的读数落点,偏差判据 ≤2 %)
|
||||
* vl = VALID 位图(默认构建应恒 0x00——未标定即未标定,
|
||||
|
||||
@@ -261,7 +261,7 @@ static void s_serv_poll(void) {
|
||||
if (s_client < 0) {
|
||||
int c;
|
||||
|
||||
/* F-NET-4:门控从 net_can_accept(只认 ESTABLISHED,已退役)
|
||||
/* accept 门控迁移(docs/网络/网络自愈架构设计.md §4.2):门控从 net_can_accept(只认 ESTABLISHED,已退役)
|
||||
* 迁 net_listener_armed——旧门控把 LISTENING 窗口全挡掉,:2404 的丢
|
||||
* CONNECT 探针(net_accept_locked 内)因此从不运行(与已修的 :7003
|
||||
* 同型);armed=ESTABLISHED 待 accept / LISTENING /
|
||||
|
||||
+2
-1
@@ -115,7 +115,8 @@ int net_stack_bring_up(void) {
|
||||
|
||||
/* 强制 PHY 模式后链路会短暂掉线再重建,CH395F 会锁存 GINT_STAT_PHY_CHANGE(0x04) 全局中断标志。
|
||||
* 这里只轮询 ch395f_get_phy_status() 确认链路是否已真正建立——**不读全局中断寄存器**:
|
||||
* 它读即清,唯一读者 = net_poll(F-NET-7,用户裁定 2026-10-13 测试代码同样禁自行读取)。
|
||||
* 它读即清,唯一读者 = net_poll(唯一读者红线,docs/网络/网络自愈架构设计.md §4.10;
|
||||
* 用户裁定 2026-10-13 测试代码同样禁自行读取)。
|
||||
* 锁存的 PHY_CHANGE 会在 net_poll 首轮被正常消费(喂驱动链路态缓存,无害)。
|
||||
* 链路一就绪(phy != DISCONN)即跳出;最多等约 3s(60 × 50ms),超时仍按实际状态继续(由下方日志暴露问题)。 */
|
||||
uint8_t phy = CH395F_PHY_DISCONN;
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
/*
|
||||
* 模块名称:保护任务(L3 板端接线,B5)——实现
|
||||
* 模块功能:见 protect_task.h。每拍三件事:
|
||||
* ① L5-4 采样故障闭锁:adc_health_flags() 电平位命中 → 元件状态
|
||||
* ① 自检失败闭锁 采样故障闭锁:adc_health_flags() 电平位命中 → 元件状态
|
||||
*(保护功能清单见 docs/算法/继电保护功能复现规划.md)
|
||||
* 复位(防陈旧判据)+ 本拍不 eval;
|
||||
* ② prot_set_selfcheck()(L5-1 定值完整性巡检,40 项 sum32——
|
||||
* ② prot_set_selfcheck()(定值校验和 完整性巡检,40 项 sum32——
|
||||
* B8 后 PS_ID_COUNT=40,开销
|
||||
* 可忽略;失配 → prot_set 内部闭锁,eval 自动复位全元件);
|
||||
* ③ prot_elm_run()(phasor rms → 判据步进)+ 动作位图边沿日志;
|
||||
@@ -26,7 +27,7 @@
|
||||
* 跨上下文复归(104 YK11)经 prot_elm_request_reset 落请求。
|
||||
* 创建日期:2026-10-12(B5)
|
||||
* 修改记录:
|
||||
* v1.0 2026-10-12 王建锋 创建:L5-4 采样故障闭锁 + L5-1 定值巡检 + 判据节拍
|
||||
* v1.0 2026-10-12 王建锋 创建:自检失败闭锁(采样故障闭锁)+ 定值校验和 巡检 + 判据节拍
|
||||
* v1.1 2026-10-21 王建锋 ①之外增加**兜底新鲜度门**:本任务用自己的时基直接
|
||||
* 看两个中断侧计数器是否还在前进(ADC_HF_STALE)。
|
||||
* adc_health 的 stall 位依赖 adcTask 每拍跑 check(),
|
||||
@@ -64,7 +65,7 @@
|
||||
#include "task_watchdog.h"
|
||||
#include "tpafe5160.h" /* tpafe5160_frame_seq():帧序号(BUSY EXTI 写) */
|
||||
|
||||
/* L5-4 采样故障电平闭锁位:stall(可自愈)+ backward(锁存)都须停判据。
|
||||
/* 自检失败闭锁 采样故障电平闭锁位:stall(可自愈)+ backward(锁存)都须停判据。
|
||||
* 锁存类(FRSTDATA/HW_ERR 等)不在此列——它们是一次性事件痕迹,不构成
|
||||
* "当前测量不可信";持续 stall/backward 才是。 */
|
||||
#define PROT_HF_LOCK_MASK (ADC_HF_TPAFE_STALL | ADC_HF_STM32_STALL | \
|
||||
@@ -195,7 +196,7 @@ void protect_task(void *argument) {
|
||||
uint32_t now = osKernelGetTickCount();
|
||||
uint32_t hf = adc_health_flags();
|
||||
|
||||
/* 兜底新鲜度门(L5-4 的独立通道):节拍源停摆时 adcTask 会永久阻塞在
|
||||
/* 兜底新鲜度门(自检失败闭锁 的独立通道):节拍源停摆时 adcTask 会永久阻塞在
|
||||
* osThreadFlagsWait(那是刻意的 fail-safe),check() 不再执行 → stall 位
|
||||
* 永远是 0。这里用本任务自己的时基直接读两个**中断侧递增**的计数器,
|
||||
* 与 adcTask 的存亡无关;两者都只要 TIM3 还在触发就会前进。
|
||||
@@ -218,7 +219,7 @@ void protect_task(void *argument) {
|
||||
}
|
||||
|
||||
if ((hf & PROT_HF_LOCK_MASK) != 0u) {
|
||||
/* L5-4:测量链不可信 → 复位元件(本任务上下文,直接 init 合法)
|
||||
/* 自检失败闭锁:测量链不可信 → 复位元件(本任务上下文,直接 init 合法)
|
||||
* 并跳过判据;stall 自愈后下一拍自动恢复 */
|
||||
if (s_prev_hf_lock == 0u) {
|
||||
DBG_ERROR("sampling FAULT -> protection blocked (hf=0x%08lX)",
|
||||
@@ -256,7 +257,7 @@ void protect_task(void *argument) {
|
||||
SOE_ELM_NONE, 1u);
|
||||
s_prev_cal_lock = 0u;
|
||||
}
|
||||
/* L5-1 巡检:定值区与封存校验和不符 → prot_set 闭锁(下一拍起
|
||||
/* 定值校验和 巡检:定值区与封存校验和不符 → prot_set 闭锁(下一拍起
|
||||
* eval 自动复位全元件)。B7 收口:104 定值写改走
|
||||
* prot_set_set_sealed(影子区写+封存后单字交换),selfcheck 另有
|
||||
* seqlock 式复核(提交撞见 = 本轮跳过),误锁窗口已消除。 */
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
/*
|
||||
* 模块名称:保护任务(L3 板端接线,B5)
|
||||
* 模块功能:protectTask 线程入口——以固定节拍驱动保护判据
|
||||
* (`prot_elm_run()`:phasor rms → 元件步进),并落实 L5-4 采样
|
||||
* (`prot_elm_run()`:phasor rms → 元件步进),并落实 自检失败闭锁 采样
|
||||
*(保护功能清单见 docs/算法/继电保护功能复现规划.md)
|
||||
* 故障闭锁(`adc_health_flags()` 电平位 → 元件状态复位 + 本拍不判据)。
|
||||
* 判据本体在 `App/algo/prot_elm.c`(纯逻辑,L0.5 已覆盖),本文件
|
||||
* 只做消费/编排(AGENTS 目录地图:task 不装算法)。
|
||||
|
||||
Reference in New Issue
Block a user