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%。
131 lines
7.4 KiB
C
131 lines
7.4 KiB
C
/*
|
||
* 模块名称:运行参数段(L2/L3 整定层,「数据可信」卡 10)
|
||
* 模块功能:遥测死区(9 点)与通道标定系数覆盖(k/b 各 8 路)的**单一真源**:
|
||
* - 死区 = 本模块 int32 毫单位 RAM 副本(注册进 cfg 引擎 [run_par] 段,
|
||
* 工厂默认 = 「数据可信」卡 6 额定 0.5 % 档),104 消费侧
|
||
* (App/protocol/iec104/iec104_pts.c)每拍实时读取——无投递、无缓存
|
||
* 副本(卡 9 曾在 pts 侧留运行时副本 s_yc_db,卡 10 落地后收编于此,
|
||
* 双源必打架);
|
||
* - 系数覆盖 = **直通 adc_cal_set()**([adc_cal]/[adc_cal_ofs] 是系数
|
||
* 唯一真源,卡 4 已定;本模块只加 104 地址映射 + 落盘请求,不另存
|
||
* 一份系数——同 D1 裁"两处判断必打架"逻辑)。
|
||
* 104 地址映射(docs/算法/继电保护功能复现规划.md §5.1 运行参数类
|
||
* 0x8020H~0x8058H;逐项表原文"待补"(参考项目 CommPara_ConfigTable
|
||
* 不在仓),本表即卡 10 的落实,送检点表若另给权威地址只改常量段:
|
||
* 0x8030~0x8038 = 死区 UA/UB/UC/UN/IA/IB/IC/IN/FREQ(工程量 V/A/Hz);
|
||
* 0x8040~0x8047 = k 覆盖(µV/码);0x8048~0x804F = b 覆盖(码值,可负);
|
||
* 其余留白(未启用类别),**0x8027~0x802A 属 prot_set 告警段**,本表
|
||
* 永不让位(两表按精确地址分流,见 iec104_pts.c set 路由)。
|
||
* 持久化(B7 prot_set 先例同款):任一写成功 → 脏标志只置不清;
|
||
* iec104Task 主循环 peek → 置 SYS_EVT_RUN_PAR_SAVE → defaultTask
|
||
* (配置引擎属主)run_par_store_save() 调 cfg_file_save() 整档外科
|
||
* 保存(含 [run_par] 与刚被 adc_cal_set 改写的 [adc_cal]/[adc_cal_ofs]
|
||
* 副本)→ 成功清脏;失败留脏 = 下轮天然重试。本模块自身零文件 IO
|
||
* (属主纪律)。
|
||
* 并发契约:引擎副本 int32 对齐字读写在 Cortex-M4 上原子;poll 重载 µs 级窗口
|
||
* 为「数据可信」§4.4 明载设计(adc_cal 同款)。写路径 = 104 执行段
|
||
* (iec104Task)与引擎读路径互不加锁,勿改成"读侧缓存"(缓存 = 新真源)。
|
||
* 纯算法:只用 stdint/stddef/math + cfg_file.h/adc_cal.h 头(注册/直通均为
|
||
* 接口级)→ 主机侧可单测(test/host/run_par,链真 cfg 引擎 + 真 adc_cal)。
|
||
* 适用平台:STM32F407ZGTx(Cortex-M4F,硬件 FPU)
|
||
* 作者:DTU 项目组
|
||
* 创建日期:2026-10-25(道D 卡 10)
|
||
* 修改记录:
|
||
* v1.0 2026-10-25 DTU 项目组 创建:[run_par] 段 + 104 地址映射 + 直通
|
||
* adc_cal + B7 式脏标志落盘请求
|
||
*/
|
||
|
||
#ifndef RUN_PAR_H
|
||
#define RUN_PAR_H
|
||
|
||
#include <stdint.h>
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
/* 死区/覆盖点数(死区 = YC 表行数:电气 8 + 频率;覆盖 = 语义电气 8 路) */
|
||
#define RUN_PAR_DB_N 9u
|
||
#define RUN_PAR_CH_N 8u
|
||
|
||
/*
|
||
* 函数功能:运行参数初始化——副本置工厂默认 + 注册 [run_par] 段进 cfg 引擎
|
||
* 入口参数:无
|
||
* 返 回 值:无
|
||
* 限定条件:**内核启动前**调用(app_main_init,adc_cal_init 之后);注册必须先
|
||
* 于 defaultTask 的 cfg_file_load(FTP 鉴权确立的契约,同 adc_cal 先例);幂等
|
||
* 函数说明:注册失败(段名重复/段数超限)打 [ERR] 后继续——工厂默认照常生效,
|
||
* 仅文件整定失效(adc_cal_init 同款降级)。
|
||
*/
|
||
void run_par_init(void);
|
||
|
||
/*
|
||
* 函数功能:读第 idx 路遥测死区(工程量)
|
||
* 入口参数:idx - 0..7 = 语义通道序(UA..IN),8 = 频率 uint8_t
|
||
* 返 回 值:死区 V / A / Hz;idx 越界返 0.0(调用方按"无死区"保守处理) float
|
||
* 限定条件:任意上下文(int32 单字读原子;104 COV 每拍调用)
|
||
* 函数说明:毫单位 → 浮点的换算点(除以 1000 唯一在此,勿在消费侧另写)。
|
||
*/
|
||
float run_par_deadband(uint8_t idx);
|
||
|
||
/*
|
||
* 函数功能:写第 idx 路死区(工程量,含范围守卫 + 脏置位)
|
||
* 入口参数:idx - 同上 uint8_t;db - 死区工程量(V/A/Hz,≥0) float
|
||
* 返 回 值:0 成功;-1 越界/越程/NaN(副本不动) int
|
||
* 限定条件:**iec104Task 上下文**(104 执行段 / 卡 11 后的整定路径;UI 若整定
|
||
* 需另行走配置引擎属主路径,勿跨任务直写)
|
||
* 函数说明:合法域按点型分档——电压 0~50 V、电流 0~1 A、频率 0~5 Hz(上限 =
|
||
* 额定 × 二档裕量,守卫目的是挡误写不是限工况;见 .c 常量段)。
|
||
* 成功即置脏(落盘请求,见文件头持久化契约)。
|
||
*/
|
||
int run_par_deadband_set(uint8_t idx, float db);
|
||
|
||
/*
|
||
* 函数功能:104 运行参数地址读(C_RD 路由,先于 prot_set 扫描)
|
||
* 入口参数:addr - 通讯地址(0x8020~0x8058 段内) uint32_t;out - 工程量浮点
|
||
* (死区 V/A/Hz;k 覆盖 µV/码;b 覆盖 码值) float *
|
||
* 返 回 值:0 命中并写出;-1 地址不归本段(调用方继续走 prot_set) int
|
||
* 限定条件:iec104Task 上下文
|
||
* 函数说明:命中集 = 0x8030~0x8038 / 0x8040~0x8047 / 0x8048~0x804F 精确匹配;
|
||
* k/b 读回 = adc_cal **当前生效值**(与折算同视图:文件坏值被合法带
|
||
* 哨兵回退 ROM 时,回显的就是 ROM——主站看到的即下游实际吃到的)。
|
||
*/
|
||
int run_par_104_read(uint32_t addr, float *out);
|
||
|
||
/*
|
||
* 函数功能:104 运行参数地址写(C_SE 两段式路由,先于 prot_set 扫描)
|
||
* 入口参数:addr - 通讯地址 uint32_t;v - 工程量浮点 float;
|
||
* select - 1 = 选择段(只校验不落副本)/ 0 = 执行段 uint8_t
|
||
* 返 回 值:0 接受;-1 拒绝(越程/NaN/合法带外/非本段可写地址命中守卫);
|
||
* -2 地址不归本段(调用方继续走 prot_set) int
|
||
* 限定条件:iec104Task 上下文;执行段成功即置脏
|
||
* 函数说明:k/b 覆盖经 adc_cal_set() 合法带哨兵(µV/码 ×[0.5,2.0]、|b|≤8192,
|
||
* 越带 -1 → 104 侧 PN 否定确认,adc_cal 不留痕由**其自身**越带 [ERR]
|
||
* 机制负责——本模块直通不重复留痕);两段式与 prot_set 定值写同构。
|
||
*/
|
||
int run_par_104_write(uint32_t addr, float v, uint8_t select);
|
||
|
||
/*
|
||
* 函数功能:落盘脏标志探查(非消费)
|
||
* 入口参数:无
|
||
* 返 回 值:1 = 有已整定未落盘的改动;0 = 干净 uint8_t
|
||
* 限定条件:任意上下文(单字节);iec104_serv 主循环 peek 后投递事件(B7 同款)
|
||
*/
|
||
uint8_t run_par_dirty_peek(void);
|
||
|
||
/*
|
||
* 函数功能:执行落盘请求(cfg_file_save 整档外科保存 + 成功清脏)
|
||
* 入口参数:无
|
||
* 返 回 值:0 成功(或无脏可存);-1 写盘失败(脏保持,下轮重试) int
|
||
* 限定条件:**defaultTask(配置引擎属主)上下文**,由 SYS_EVT_RUN_PAR_SAVE 驱动
|
||
* 函数说明:save 走引擎唯一写闸(超长拒写/原子改名);本函数不清
|
||
* 引擎以外模块的脏语义([adc_cal] 副本值已由写路径就位)。
|
||
*/
|
||
int run_par_store_save(void);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif /* RUN_PAR_H */
|