Files
STM32F4-Base/App/algo/prot_set.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

117 lines
5.5 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.
/*
* 模块名称:保护定值模型(P1,L5-1 载体)
* 模块功能:保护定值的 RAM 模型——编号 / 通讯地址 / 范围 / 默认值 / 校验和自检。
* 纯逻辑(仅 stdint.h),主机侧可离线单测;持久化(cfg_file 定值段)
* 属 P4,本层只提供 load_raw/validate 的装载接口。
*
* 设计口径(docs/算法/继电保护功能复现规划.md §5):
* - 定点存储:Q10(×1024),与参考系统定点系数 2^10 一致(§5.3);
* - 通讯地址:与参考 g_tCommSetParaTab(Comm/Pub/Const_CommSetPara.c)逐项对齐,
* 基址 0x8820(=34848);告警类沿用运行参数段 0x8027/0x8029;
* - 校验和(L5-1):sum32 正码 + 反码成对封存(参考 tagPRS 的
* dwTagSum/dwTagSumN 模式),selfcheck 失配 → 置闭锁;
* - ⚠ 默认值/范围为**拟定值**:参考 EEPROM 出厂默认表未在本仓库,
* 待对照后逐项修订(规划 §10.3 待补项);范围先按 DTU 馈线典型量级。
*
* 线程约定:装载(init/load_raw)在 defaultTask(P4 起);读在保护消费者任务。
* 读接口返回快照值(单个 int32 读取原子);写与封存必须同一任务(P4 定)。
*
* 创建日期:2026-10-11
*/
#ifndef PROT_SET_H
#define PROT_SET_H
#include <stdint.h>
/* Q10 定点:工程量 × 1024(与参考 2^10 口径一致) */
#define PROT_SET_Q10(v) ((int32_t)(((double)(v)) * 1024.0))
#define PROT_SET_FROM_Q10(v) ((float)((double)(v) / 1024.0))
/* 定值项编号(枚举序 = RAM 数组序 = 校验和覆盖序,只增不删不改序) */
typedef enum {
/* --- 三段式相间过流(A 相,L3-1):投退/跳闸投退/电流/延时 --- */
PS_OC1_EN = 0, /* 0x8856 Ⅰ段投退 */
PS_OC1_TRIP, /* 0x8857 Ⅰ段跳闸投退(0 告警 / 1 跳闸) */
PS_OC1_CUR, /* 0x8858 Ⅰ段电流定值(A,二次值) */
PS_OC1_DLY, /* 0x8859 Ⅰ段延时(ms) */
PS_OC2_EN, /* 0x885A */
PS_OC2_TRIP, /* 0x885B */
PS_OC2_CUR, /* 0x885C */
PS_OC2_DLY, /* 0x885D */
PS_OC3_EN, /* 0x885E */
PS_OC3_TRIP, /* 0x885F */
PS_OC3_CUR, /* 0x8860 */
PS_OC3_DLY, /* 0x8861 */
/* --- 过负荷(A 相,L3-3) --- */
PS_OL_EN, /* 0x8871 */
PS_OL_TRIP, /* 0x8872 */
PS_OL_CUR, /* 0x8873 */
PS_OL_DLY, /* 0x8874 */
/* --- 过压 / 欠压(UA,L3-4;沿用参考告警段 0x8029/0x8027) --- */
PS_OV_EN, /* 本地投退(参考告警类无独立投退,V0.1 补) */
PS_OV_VOL, /* 0x8029 过电压门限(V,二次值) */
PS_OV_DLY, /* 0x802A 过电压延时(ms) */
PS_UV_EN, /* 本地投退 */
PS_UV_VOL, /* 0x8027 低电压门限(V,二次值) */
PS_UV_DLY, /* 0x8028 低电压延时(ms) */
/* --- 零序过压(UN,L3-6) --- */
PS_3U0_EN, /* 0x888E */
PS_3U0_VOL, /* 0x888F 3U0 定值(V,二次值) */
PS_3U0_DLY, /* 0x8890 延时(ms) */
/* --- 公共 --- */
PS_RET_OVER, /* 过量返回系数(返回门槛 = 定值 × 系数,<1) */
PS_RET_UNDER, /* 欠量返回系数(返回门槛 = 定值 × 系数,>1) */
PS_PT_PRI, /* 0x8820 PT 一次额定(V) */
PS_PT_SEC, /* 0x8821 PT 二次额定(V) */
PS_CT_PRI, /* 0x8825 CT 一次额定(A) */
PS_CT_SEC, /* 0x8826 CT 二次额定(A) */
PS_ID_COUNT
} prot_set_id_t;
/* 定值项元数据(ROM 常量表,校验和自检不覆盖它——只覆盖 RAM 值区) */
typedef struct {
uint16_t comm_addr; /* 通讯信息体地址(0 = 本地项,不上送) */
uint8_t is_ctl; /* 1 = 投退/枚举项(0/1),0 = 模拟量项 */
int32_t def; /* 默认值(Q10;投退项为 0/1 的 Q10) */
int32_t min; /* 下限(Q10) */
int32_t max; /* 上限(Q10) */
} prot_set_meta_t;
extern const prot_set_meta_t g_prot_set_meta[PS_ID_COUNT];
/*
* 函数功能:装载出厂默认值并封存校验和(幂等,内核启动前可调)
*/
void prot_set_init(void);
/*
* 函数功能:整表装载外部值(P4 起由 cfg_file 定值段调用),逐项范围校验
* 入口参数:vals - PS_ID_COUNT 个 Q10 值
* 返 回 值:0 全部合法(已装载并封存)/ -1 存在越界项(**整表不装载**,
* 返回前可经 prot_set_bad_mask() 取越界位图)
*/
int prot_set_load_raw(const int32_t *vals);
/* 越界位图(bit i = 第 i 项越界;load_raw 失败后有效) */
uint32_t prot_set_bad_mask(void);
/*
* 函数功能:单项写入(范围校验;**不自动重封校验和**——批量改完必须
* 显式 prot_set_seal(),否则 selfcheck 判"定值被非法改写")
* 返 回 值:0 / -1 越界拒写
*/
int prot_set_set(prot_set_id_t id, int32_t q10);
int32_t prot_set_get(prot_set_id_t id); /* Q10 原值 */
float prot_set_get_f(prot_set_id_t id); /* 工程量浮点 */
uint8_t prot_set_get_ctl(prot_set_id_t id); /* 投退项:!=0 视为投入 */
/* 校验和(L5-1):sum32 覆盖 RAM 值区;seal 封存正/反码对 */
uint32_t prot_set_checksum(void);
void prot_set_seal(void);
/* 自检:重算并与封存值比对,失配 → 置闭锁并返回 -1(已闭锁也返回 -1) */
int prot_set_selfcheck(void);
uint8_t prot_set_locked(void);
#endif /* PROT_SET_H */