0f7b5a87fb
登记簿、文档与代码注释里的存量字母加数字编号(N-x / S-x / T-x / E-x / A-x / 卡号) 一律改写为语义短语,净删 2,028 处引用;删除基线与待确认、并行分道方案、排期详述、 采集保护收尾 4 篇(内容已并入 docs/任务规划/README 与登记簿)。 门禁机器与三张账同批重打:check_ids.py 新增变更记录行豁免与第二根护栏 undecidable_total_ceiling;check_test_traceability.py 只加 stdout/stderr UTF-8 reconfigure(TC_RE 未动);check_cubemx_survival.py 的 --write 固定 newline=LF; id_registry / id_aliases(+19 条 retired-to-phrase)/ id_known_backlog 重打。 test/ 56 个文件同步 TC 标签语义化,其中 18 个 TU 改了 CHECK / printf 里的标签文字, 是本批唯一改变构建产物的文件集合。 为什么合成一笔、不拆四笔(实测撞闸,非偏好):pre-commit 跑钩子前会 stash 未 staged 部分,拆开后中间提交必然是「新规则 + 旧语料」——实跑可判定 85.15% < 基线 86.00%、 不可判定 1,453 > 上限 1,166,编号门禁直接拦下。编号识别面与它描述的语料只能同码移动。 实跑基线(工作区全量):754 文件 / 8,230 处编号字面量 / 可判定 7,079 = 86.01% (基线 86.0%,容差 0.1pp)/ 不可判定绝对数 1,151(上限 1,166)/ 校验 1-6 错误级 0 / 告警 = 悬空 2(App/algo/freq.c 的 S2,属 §4.4 同号不同义)+ 孤儿 50。 基线从 84.0 抬到 86.0 的理由见 docs/门禁说明/id-check.md §7.6:本批真删了 2,028 处 引用,可判定面随真实内容上升,不是把分母做小。同批新增排除 docs/硬件平台/ 语料,使 识别面少 264 处——芯片手册位号与网表料号不属编号空间(registry 有 excluded_paths_note)。 ⚠ 余量只剩 0.11pp(约 10 处)与绝对数 15 处:把「可判定的引用」改成散文会立刻撞第二 根护栏。另遗留一项:id_aliases 里 retired 的 N / S / T / A 别名没有 scope(U1~U5 有), 今后有人新写一个 A-4,校验 3 不会响,只能靠人,建议下批补 scope。 固件不变证据:115 个 .c/.h 剥注释并归一字符串后与 HEAD 逐字节全等,残留代码差异 0; App / Src / Drivers 的字符串字面量零改动。@build 0 错误 0 警告;40/40 主机套件、2,889 断言全通过;覆盖率 line 89.2% / func 92.6%;pre-commit 48 钩子 --all-files 全绿; check_doc_links --all 通过(176 文档,章节引用无法判定 0);逐字节卫生核过:14 个带 BOM 文件与 HEAD 一致、0 个 CR、0 个 U+FFFD,字符串字面量纯 ASCII。 .cubemx_survival_baseline.json 的 watchdog-module 哈希 56bf27 变 2bb051 属合法: Src/freertos.c 的 USER CODE 区内只有注释文字随编号改写,代码未变。 同批带上体积同码凭证与 RAM 台账行(@build 之后盖戳):RW_IRAM1 79,008 B / 60.3%, RW_CCM 57,376 B / 87.9%,阈值 92%。
107 lines
5.5 KiB
C
107 lines
5.5 KiB
C
/*
|
||
* 模块名称:保护元件框架(L3,P1 子集)
|
||
* 模块功能:通用"越限 + 返回系数滞回 + 定时限"元件核 + 实例表(数据驱动,
|
||
* 同 phasor 实例表模式)。判据为**纯逻辑**(吃测量值 + 定值),
|
||
* 主机侧可离线单测;出口/SOE(L4)与任务编排为后续。
|
||
*
|
||
* V0.1 有效实例(双转换器无共同采样触发 → 仅 TPAFE 三路):
|
||
* OC1/OC2/OC3 三段式相间过流(A 相 IA,L3-1)
|
||
* OL 过负荷(A 相 IA,L3-3)
|
||
* OV/UV 过压/欠压(UA,L3-4)
|
||
* 3U0 零序过压(UN 外部零序电压通道,L3-6)
|
||
* OF/UF 过频/低频(测量量 = freq 层测得频率,L3-5,B8 落地)
|
||
*
|
||
* 测量数组口径:相量类实例 = 基波有效值(A/V);OF/UF = 测得频率(Hz)。
|
||
* run() 按实例表 src 字段取数(0=phasor rms,1=freq)。freq 无有效读数
|
||
* (未启动收敛或幅值门失效)→ 该行按方向填"必不启动"值(过量填 0、
|
||
* 欠量填极大值 → 滞回核比较恒假 → 元件复位不误动),**不整拍跳过**
|
||
* (否则浮空台架会把 OC/UV 等全部饿死,B5 行为回归)。
|
||
*
|
||
* 与参考系统的口径差异(有意简化,均已在规划文档登记):
|
||
* - 返回门槛 = 定值 × 返回系数(参考经 CN_SET_RET 独立定值,等价);
|
||
* - 返回**即时**(参考 GRly_TimeRelay 带 10 ms 返回延时——V0.1 无出口硬件,
|
||
* 抖动只影响日志,P4 接出口时再补返回延时);
|
||
* - 复压/方向/无压无流闭锁(dwSetFyCtrl 类)随 P2/P3 元件扩展;
|
||
* - 测量输入 = adc_task 经 adc_cal_apply() 折算后的工程量(L1.5,卡 2 已落地):
|
||
* 未标定(VALID=0)时单位只是 ADC 引脚电压——该域下判据必然错配,由
|
||
* protectTask 的未标定闭锁(卡 5)停走整条判据链,元件核本身不掺和
|
||
* 标定语义(保持纯逻辑);标定后单位 = 二次值,定值口径才名副其实。
|
||
*
|
||
* 线程约定:init 内核启动前或保护消费者任务上下文;eval/run 仅保护消费者任务
|
||
* 上下文(B5 起 = protectTask);request_reset 任意上下文(跨上下文复归请求,
|
||
* 如 104 遥控 YK11 在 iec104Task 落请求、下一拍 eval 头部消费)。板端接线
|
||
* 走栈预算 + IWDG 心跳门禁。
|
||
*
|
||
* 创建日期:2026-10-11
|
||
*/
|
||
#ifndef PROT_ELM_H
|
||
#define PROT_ELM_H
|
||
|
||
#include <stdint.h>
|
||
|
||
/* 元件实例编号(枚举序 = 实例表序 = 测量数组序;尾追加,编号不回收) */
|
||
typedef enum {
|
||
PE_OC1 = 0, /* 过流 Ⅰ 段(IA) */
|
||
PE_OC2, /* 过流 Ⅱ 段(IA) */
|
||
PE_OC3, /* 过流 Ⅲ 段(IA) */
|
||
PE_OL, /* 过负荷(IA) */
|
||
PE_OV, /* 过压(UA) */
|
||
PE_UV, /* 欠压(UA,欠量方向) */
|
||
PE_3U0, /* 零序过压(UN) */
|
||
PE_OF, /* 过频(测量量 = freq 层测得频率,B8,L3-5) */
|
||
PE_UF, /* 低频(测量量 = freq 层测得频率,欠量方向,B8,L3-5) */
|
||
PE_COUNT
|
||
} prot_elm_id_t;
|
||
|
||
/* 单元件状态快照(读侧拷贝语义,见 prot_elm_state) */
|
||
typedef struct {
|
||
uint8_t enabled; /* 本拍投入(定值投退 && 未闭锁) */
|
||
uint8_t picked; /* 越限启动(滞回后电平) */
|
||
uint8_t asserted; /* 定时限到点(动作) */
|
||
uint32_t pick_ms; /* 本次启动起始时基(0 = 未启动过;asserted 延时观测用) */
|
||
} prot_elm_state_t;
|
||
|
||
/*
|
||
* 函数功能:复位全部元件状态(定值不动;幂等,内核启动前可调)
|
||
* 限定条件:内核启动前,或保护消费者任务上下文(跨上下文请用 request_reset)
|
||
*/
|
||
void prot_elm_init(void);
|
||
|
||
/*
|
||
* 函数功能:登记"复归元件状态"请求(任意上下文安全,单字标志)
|
||
* 函数说明:下一拍 prot_elm_eval() 头部消费并执行 prot_elm_init()。
|
||
* 104 遥控 YK11(iec104Task 上下文)必须走本接口,不得直接调
|
||
* prot_elm_init()(会与 protectTask 的 eval 竞态)。
|
||
*/
|
||
void prot_elm_request_reset(void);
|
||
|
||
/*
|
||
* 函数功能:纯判据步进——按当前定值(prot_set RAM)+ 给定测量值推进所有元件
|
||
* 入口参数:now_ms - 单调时基(tick ms,回绕安全:差值法)
|
||
* meas - PE_COUNT 个测量值(工程量:A / V),NULL 视为全 0
|
||
* 返 回 值:无
|
||
* 限定条件:仅保护消费者任务上下文;调用方保证定值已装载
|
||
* 函数说明:越限方向由实例表决定;投退=0 或定值闭锁(L5-1)→ 状态复位、
|
||
* 不判据。延时判定用 (uint32_t)(int32_t)(now - t0) >= dly,回绕安全。
|
||
*/
|
||
void prot_elm_eval(uint32_t now_ms, const float meas[PE_COUNT]);
|
||
|
||
/*
|
||
* 函数功能:适配层——从 phasor 使用区取 rms 组装测量数组后调 prot_elm_eval
|
||
* 入口参数:now_ms - 同上
|
||
* 说明:phasor 未就绪(-2,未满一周波)的实例本拍按"测量=上一拍值"处理会
|
||
* 引入陈旧判据 → 直接**整拍跳过**(不 eval),与 adc_task 跳拍同口径。
|
||
*/
|
||
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 出口 / 心跳日志 */
|
||
uint32_t prot_elm_active_mask(void);
|
||
|
||
/* 实例名(ROM 常量,日志用) */
|
||
const char *prot_elm_name(prot_elm_id_t id);
|
||
|
||
#endif /* PROT_ELM_H */
|