Files
STM32F4-Base/App/algo/prot_elm.h
T
wandering1 c936441c83 门禁扩容:新增 lv-conf-sync、simulator/ 纳入全部钩子;含 L3 定值/元件框架落地
本轮把"自研代码落在门禁之外"的口子收掉,同时落地 LVGL 特性裁剪与
L3 保护定值/元件框架。

门禁(.pre-commit-config.yaml,26 个钩子)
- 新增 scripts/check_lv_conf_sync.py + 钩子 lv-conf-sync:比对两份
  lv_conf.h 的**生效值**(未定义则取 lv_conf_internal.h 兜底默认),
  抓 MISMATCH / LVGL 不认的宏名 / 同文件重复定义
- 顶层 exclude 删掉 simulator/:其下 21 个 tracked 文件全是本项目自研
  代码,生成物(build/、SDL2/、tests/ref/、shot*)已在 .gitignore;
  doc-links 的 exclude 同步删除
- lv-conf-sync 的 files: 覆盖两端配置 → 只改 simulator/lv_conf.h 也触发
  (pre-commit 4.x 已移除 always: true,实测只告警并跳过,无兜底开关)
- 新增 prot-set-unit-test / prot-elm-unit-test 两个主机侧单测钩子
- S11(2.3.5) 判定细化:禁的是"用路径找文件",尖括号系统头带子目录
  (如 <sys/stat.h>)不再误报;全仓库复核仅 2 处项目代码判定变化

模拟器代码整改(纳入钩子后暴露,全部修代码而非豁免)
- cppcheck 4 处:sim_syslog.c 判空分支内解引用 p_epoch(真实 bug)、
  2 处 struct tm 未初始化、1 处指针可加 const
- coding-standard 61 处:44 处函数左大括号并到右括号同行、8 处补函数
  注释、3 处补文件头注释块、2 处 __ 前缀保护宏改 XXX_H、2 处 sprintf
  改 snprintf(写入字节数与原来完全一致)

LVGL 特性裁剪(F-1/F-2/F-3)
- 两端 lv_conf.h 对齐同一特性子集:删 26 个 LVGL 9.3 不存在的选项名、
  3 处重复定义,10 项靠默认值隐式生效的改为显式固化
- 实测对镜像体积中性;价值在防漂移,且模拟器 golden 回归跑的正是固件
  实际编译的配置

L3 软件侧
- App/algo/prot_set.* Q10 定值模型(范围校验 / 整表 all-or-nothing /
  校验和封存-自检-闭锁)+ prot_elm.* 通用"滞回+定时限"元件框架 7 实例
- test/host/prot_set、test/host/prot_elm 主机侧单测;uvprojx 挂载两处

文档同步
- pre-commit使用说明:§2.8 S11 口径、§2.15 lv-conf-sync 详解、新增 §5.5
  复盘(教训:exclude 只写真正不该进钩子的路径)
- AGENTS.md、UI_设计架构 §1.4 第 10 条、RAM 分析、审查报告刷新与销项

验证
- @build BUILD_OK 0/0(Code=194276 RO=15872 RW=876 ZI=139892)
- 模拟器重建:菜单 8 状态像素逐字节一致(池 5368 B)、11 内容页黄金参考
  全过(往返 5448 B)、remo sink 0/25600 位差异、--logtest/--cfgtest PASS
- 全仓库 cppcheck / coding-standard / no-mojibake --all-files 全过
- check_doc_links --all 129/0;check_mem_numbers --check 内存数字一致
- 端到端:往 simulator/lv_conf.h 注入一行漂移 → 钩子 FAIL(exit 1)
2026-10-11 08:48:49 +08:00

85 lines
3.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 模块名称:保护元件框架(L3,P1 子集)
* 模块功能:通用"越限 + 返回系数滞回 + 定时限"元件核 + 实例表(数据驱动,
* 同 phasor 实例表模式)。判据为**纯逻辑**(吃测量值 + 定值),
* 主机侧可离线单测;出口/SOE(L4)与任务编排为后续。
*
* V0.1 有效实例(N-18:仅 TPAFE 三路):
* OC1/OC2/OC3 三段式相间过流(A 相 IA,L3-1)
* OL 过负荷(A 相 IA,L3-3)
* OV/UV 过压/欠压(UA,L3-4)
* 3U0 零序过压(UN 外部零序电压通道,L3-6)
* ⚠ 过频/低频(L3-5)随频率测量算法(P2)落地,本表暂不含。
*
* 与参考系统的口径差异(有意简化,均已在规划文档登记):
* - 返回门槛 = 定值 × 返回系数(参考经 CN_SET_RET 独立定值,等价);
* - 返回**即时**(参考 GRly_TimeRelay 带 10 ms 返回延时——V0.1 无出口硬件,
* 抖动只影响日志,P4 接出口时再补返回延时);
* - 复压/方向/无压无流闭锁(dwSetFyCtrl 类)随 P2/P3 元件扩展;
* - 工程量↔码值换算系数暂为 1(L1-5 标定未实现,同 phasor 层口径)。
*
* 线程约定:init 内核启动前;eval/run 仅保护消费者任务上下文(P1 阶段 = 单测;
* 板端接线随 protectTask 立项,走栈预算 + 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_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;
/*
* 函数功能:复位全部元件状态(定值不动;幂等,内核启动前可调)
*/
void prot_elm_init(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 */