feat(运行参数): 卡10 run_par真源收编+104段0x8020~0x8058读写映射(道D M6-①)
新增 App/algo/run_par.c/h(「数据可信」卡 10,lead 四裁落地): - [run_par] cfg 段:遥测死区 9 键 int32 毫单位(db_ua…db_freq),工厂默认 = 卡 6 额定 0.5% 档(500mV×4 / 5mA×4 / 500mHz);注册走 adc_cal 同款内核前 契约(app_main_init),不挂回调 = 引擎副本即生效值;键数 9≤16 不拆段 - 真源收编(裁③):pts 层 s_yc_db 运行时副本删除,COV 每拍实时读 run_par (协议→算法向下依赖,同 meas 先例;无投递无缓存 = 顺序/幂等平凡成立); iec104_pts_yc_set_deadband()/deadband() 保留为转发壳,壳内保留"成功清 半截确认计数"语义并由 TC-IEC104-027 追加断言钉住(裁⑤) - 104 地址映射(裁①):0x8030~0x8038 死区 9 点 / 0x8040~0x8047 k 覆盖 / 0x8048~0x804F b 覆盖(逐项地址本仓自定——复现规划 §5.4 权威表不在仓, 送检点表到位后替换 run_par.c 顶部常量段一处;已在 IEC104 §3.4 表头挂账); 路由顺序 = run_par 表先、未命中落 prot_set——0x8027~0x802A 属 prot_set 告警段永不覆盖,TC-IEC104-029 双向往返钉死;空隙地址自然 COT14/PN - 通道系数覆盖 = adc_cal_set 代理(裁②a):合法带/越带 [ERR] 留痕全复用, run_par 不存第二份系数(防双真源);单侧写 RMW 用另一侧当前生效值; 回显 = 生效值视图(文件坏值被哨兵回退 ROM 时主站看到的就是下游吃到的); adc_cal 配套:+adc_cal_b_codes() 读取口(回显/RMW 用)+ set() 授权写者 注记扩至 iec104Task 直通路径(单字原子契约同「数据可信」§4.4) - 持久化(裁②b):新事件位 SYS_EVT_RUN_PAR_SAVE(1<<8);iec104Task 主循环 peek 投递 → defaultTask run_par_store_save() 一条事件一趟 cfg_file_save 整档外科(覆盖 [run_par] 9 键 + 联动 [adc_cal] 两段);失败脏保留 = 天然 重试(B7 prot_set 同款)。C_SE 现行无"暂停/测试态"门控——文档现行如此 不造新语义,送检若要求接线点已写进 §3.4 注(裁④) 测试:新建 test/host/run_par(TC-RUNPAR-001~008,67 断言,真实 cfg 引擎 + 真实 adc_cal + 内存虚拟盘同 adc_cal 套件先例;[run_par] 注册契约/落盘往返/ 外改文件即副本生效/两段式不提交不置脏/合法带拒+RMW+生效值回显/init 幂等 重注册留痕);iec104 套扩真链 TU(cfg_file+adc_cal+run_par 非桩,141 断言: +TC-IEC104-029 路由 + 壳清确认计数 3 断言);meas 套静态更名 s_snap*→ s_ms_snap*(与 cfg_file.c s_snap 同 TU 相撞,D1 同款改名法,226 断言不变); iec104_serv 套补 run_par_dirty_peek 假件。id_registry 建族 TC-HOST-RUNPAR (游标 008)+ TC-HOST-IEC104 游标 028→029;新钩子 run-par-unit-test + iec104 钩子触发面随真链扩;uvprojx +run_par.c(合法入库)+ SIM_EXEMPT 登记 (模拟器不编 104 协议,已核实 CMake 面)。 文档:IEC104 §3.4 运行参数段表(含送检替换账/门控未来条件/代理声明)、§7、 §8 第 4 条、变更记录;网络配置说明新增 §3.5 [run_par] 键表;复现规划 §5.4 补运行参数段落实进度。**遗留(交 lead)**:数据可信 §4.4 "引擎 RAM 副本" 一节当时的措辞对象含 pts 侧副本,s_yc_db 删除后该句过时(裁③b 点名,§4.4 在写域外未动)。 gate:@build 0/0(Code=219620 RO=22036 RW=1280 ZI=132864);vs 0cbae7d: Flash +1912B、RAM(RW+ZI) +8B(37B 新静态被链接器并洞吸收);iec104Task 栈 1456B/margin 43%、defaultTask 3032B 不变;id-check/doc-links/cppcheck/ coding-standard 实跑过;--all-files 全量 45 钩子实跑(43 绿 + 仅 mem-budget / mem-numbers 两红 = 台账受管区 vs .map 漂移,回填属 lead 单写者区,批 1/道D-1 /D2 同口径):gate: only mem-budget/mem-numbers pending lead ledger backfill BOM/CR/U+FFFD/字面量 ASCII 逐文件自查通过。
This commit is contained in:
@@ -18,13 +18,18 @@
|
||||
* 死区改运行时副本 + set/get 入口;COV 遥测腿 = 死区
|
||||
* 连续 2 点确认(板端按快照 seq 去重)+ 品质翻转即报。
|
||||
* 单测 = test/host/iec104 TC-IEC104-025~028。
|
||||
* 卡 10 2026-10-25 DTU 项目组 死区真源收编 App/algo/run_par.c(本层 s_yc_db
|
||||
* 副本删除,set/get 转转发壳,壳保留清确认计数语义);
|
||||
* 定值读写路由 = run_par 表先、prot_set 后(0x8020~
|
||||
* 0x8058 运行参数段 C_RD/C_SE,系数覆盖直通 adc_cal)。
|
||||
*/
|
||||
#include "iec104_pts.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "iec104_asdu.h" /* QDS/DIQ 品质位常量 */
|
||||
#include "meas.h" /* 板端源:遥测 = L2 遥测快照(卡 9;品质域位同源) */
|
||||
#include "meas.h" /* 板端源:遥测 = L2 遥测快照(卡 9;品质域位同源) */
|
||||
#include "run_par.h" /* 卡 10:死区真源 + 运行参数段 104 读写路由 */
|
||||
#include "prot_elm.h" /* 板端源:遥信 = 元件状态 */
|
||||
#include "prot_set.h" /* 板端源:定值 + 闭锁 */
|
||||
#include "adc_input.h" /* adc_semantic_t(phasor 实例按语义绑定) */
|
||||
@@ -37,7 +42,7 @@
|
||||
typedef struct {
|
||||
uint32_t ioa;
|
||||
int8_t sem; /* 快照 yc 槽 = 语义通道(-1 = 非测量量点,当前仅频率) */
|
||||
float db_default; /* 死区 ROM 默认(运行时生效值 = s_yc_db,卡 10 覆盖) */
|
||||
float db_default; /* 死区工厂默认(生效真源 = run_par [run_par] 段,卡 10) */
|
||||
uint8_t src; /* PTS_SRC_* 源类型 */
|
||||
} pts_yc_def_t;
|
||||
|
||||
@@ -45,8 +50,8 @@ typedef struct {
|
||||
* 额定基准 100 V / 1 A 与 App/algo/prot_set.c 头部同源,勿在此另立口径):
|
||||
* 电压类 0.5 % × 100 V = 0.5 V 电流类 0.5 % × 1 A = 0.005 A
|
||||
* 频率点不适用"额定百分比"(额定附近 0.5 Hz 与旧值同量级,维持 0.5 并随
|
||||
* 卡 10 运行参数段可调)。自卡 9 起本表**只作 ROM 默认载体**:运行时死区 =
|
||||
* s_yc_db 副本;削顶五路不再 sem=-1 绑死,而是绑快照槽、由品质 CLIPPED
|
||||
* 卡 10 运行参数段可调)。自卡 9 起本表**只作工厂默认载体**:生效死区 =
|
||||
* App/algo/run_par.c 的 [run_par] 引擎副本(卡 10 真源收编,本层不再存副本);削顶五路不再 sem=-1 绑死,而是绑快照槽、由品质 CLIPPED
|
||||
* 驱动线上 IV——V0.2(N-18)削顶消失后点位零改动自动启用(docs/任务规划/
|
||||
* 数据可信.md §10 的 N-18 行)。
|
||||
* ⚠ 过渡期(eng=0 引脚电压域,卡 12 标定前):上送值本身非二次值,死区
|
||||
@@ -70,7 +75,6 @@ static const pts_yc_def_t k_yc[] = {
|
||||
* 判据链:新测量点 → |v − 上次上送值| > 死区?→ 连续 2 点确认 → 置变化位。
|
||||
* 基准 = **上次上送值**(非上次读值——否则慢漂移永不出死区,参考系统同款);
|
||||
* 品质(线上 qds)翻转 = 事件:不参与 2 点计数、当拍直报。 */
|
||||
static float s_yc_db[YC_N]; /* 死区运行时副本(ROM 默认 = k_yc 列) */
|
||||
static float s_yc_rep[YC_N]; /* 上次上送值(建线/确认上送时更新) */
|
||||
static uint8_t s_yc_repq[YC_N]; /* 上次上送的线上 qds */
|
||||
static uint8_t s_yc_cnf[YC_N]; /* 越死区连续计数(1 = 待确认;2 = 确认) */
|
||||
@@ -115,11 +119,8 @@ static uint8_t s_yx_snap_ok;
|
||||
* 直接可定);重复调用 = 全状态复位(单测 reset 依赖此语义)。
|
||||
*/
|
||||
void iec104_pts_init(void) {
|
||||
uint8_t i;
|
||||
|
||||
for (i = 0u; i < YC_N; i++) {
|
||||
s_yc_db[i] = k_yc[i].db_default;
|
||||
}
|
||||
/* 死区不在本层复位——真源 = run_par(cfg 引擎副本),复位入口唯一
|
||||
* run_par_init();本函数只复位 COV 状态(单测 reset 依赖此语义) */
|
||||
(void)memset(s_yc_rep, 0, sizeof(s_yc_rep));
|
||||
(void)memset(s_yc_repq, 0, sizeof(s_yc_repq));
|
||||
(void)memset(s_yc_cnf, 0, sizeof(s_yc_cnf));
|
||||
@@ -235,32 +236,35 @@ int iec104_pts_yc_read(uint8_t idx, float *v, uint8_t *qds) {
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:写死区运行时值(「数据可信」卡 9;卡 10 运行参数段的落点入口)
|
||||
* 入口参数:idx - YC 表下标 db - 工程量绝对死区(≥0) float
|
||||
* 返 回 值:0 成功;-1 越界/负值/NaN(RAM 不动) int
|
||||
* 限定条件:**iec104Task 上下文**(配置属主 = defaultTask,卡 10 接线时经
|
||||
* 104 任务落地本调用,勿跨任务直调——本表状态无锁)
|
||||
* 函数功能:写死区(卡 9 API 壳,转发 run_par 真源 + 清本层确认计数)
|
||||
* 入口参数:idx - YC 表下标 db - 工程量绝对死区(≥0,分档上限见 run_par)
|
||||
* 返 回 值:0 成功;-1 越界/负值/NaN/越程(run_par 副本不动) int
|
||||
* 限定条件:**iec104Task 上下文**(run_par 副本写 = 引擎对齐 int32 单字,
|
||||
* 104 执行段之外调用需自行避免与 104 写并发)
|
||||
* 函数说明:成功时清零该点待确认计数——跨死区档位不保留半截确认序列;
|
||||
* 不隐式重建基线(上送基准延续,新死区即刻生效)。
|
||||
* 不隐式重建基线(上送基准延续,新死区即刻生效)。落盘由 run_par
|
||||
* 脏标志 + SYS_EVT_RUN_PAR_SAVE 走 defaultTask(卡 10 持久化链)。
|
||||
*/
|
||||
int iec104_pts_yc_set_deadband(uint8_t idx, float db) {
|
||||
if ((idx >= YC_N) || !(db >= 0.0f) || !(db < 1000000.0f)) {
|
||||
return -1; /* NaN 被 !(db>=0) 捕获(比较式写法,防 lint 报恒真) */
|
||||
if (idx >= YC_N) {
|
||||
return -1;
|
||||
}
|
||||
s_yc_db[idx] = db;
|
||||
s_yc_cnf[idx] = 0u;
|
||||
if (run_par_deadband_set(idx, db) != 0) {
|
||||
return -1; /* 守卫(NaN/负/越程分档上限)单一实现,在 run_par */
|
||||
}
|
||||
s_yc_cnf[idx] = 0u; /* 壳语义:跨死区档位不保留半截确认序列 */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:读当前生效死区
|
||||
* 函数功能:读当前生效死区(转发 run_par 真源)
|
||||
* 入口参数:idx - YC 表下标
|
||||
* 返 回 值:运行时死区;idx 越界返 0.0 float
|
||||
* 限定条件:任意上下文(单字 float 读,Cortex-M 原子)
|
||||
* 函数说明:UI 回显 / 卡 10 读写往返校验用;ROM 默认查点表,勿在此反推。
|
||||
* 返 回 值:生效死区;idx 越界返 0.0 float
|
||||
* 限定条件:任意上下文(引擎副本 int32 单字读,Cortex-M 原子)
|
||||
* 函数说明:UI 回显 / 读写往返校验用;工厂默认查点表 db_default 列。
|
||||
*/
|
||||
float iec104_pts_yc_deadband(uint8_t idx) {
|
||||
return (idx < YC_N) ? s_yc_db[idx] : 0.0f;
|
||||
return (idx < YC_N) ? run_par_deadband(idx) : 0.0f;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -389,7 +393,7 @@ void iec104_pts_cov_check(iec104_pts_cov_t *cov) {
|
||||
if (d < 0.0f) {
|
||||
d = -d;
|
||||
}
|
||||
if (d > s_yc_db[i]) {
|
||||
if (d > run_par_deadband(i)) {
|
||||
s_yc_cnf[i]++;
|
||||
if (s_yc_cnf[i] >= 2u) { /* 连续 2 越 → 确认:报 + 移基准 */
|
||||
local.yc_changed |= (uint16_t)(1u << i);
|
||||
@@ -564,7 +568,10 @@ static int s_src_yk_exec(uint32_t ioa, uint8_t dpc, uint8_t select) {
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:板端默认源 - 定值读(扫 g_prot_set_meta 通讯地址映射)
|
||||
* 函数功能:板端默认源 - 定值读(**路由顺序 = run_par 表先、未命中落 prot_set**:
|
||||
* 0x8027~0x802A 属 prot_set 告警段,run_par 命中集为精确地址匹配、
|
||||
* 永不覆盖之;两表共存靠「先专属表、后通用扫」分流,勿反序——反序
|
||||
* 当前无冲突但失去 run_par 守卫先行留痕的意义)
|
||||
* 返 回 值:0 / -1 未知地址(本地项 comm_addr=0 不可寻址,B7 起显式排除)
|
||||
*/
|
||||
static int s_src_set_read(uint32_t addr, float *out) {
|
||||
@@ -573,6 +580,9 @@ static int s_src_set_read(uint32_t addr, float *out) {
|
||||
if (out == NULL) {
|
||||
return -1;
|
||||
}
|
||||
if (run_par_104_read(addr, out) == 0) {
|
||||
return 0; /* 运行参数段命中(卡 10) */
|
||||
}
|
||||
for (i = 0u; i < (uint32_t)PS_ID_COUNT; i++) {
|
||||
if ((g_prot_set_meta[i].comm_addr != 0u)
|
||||
&& (g_prot_set_meta[i].comm_addr == (uint16_t)addr)) {
|
||||
@@ -584,13 +594,22 @@ static int s_src_set_read(uint32_t addr, float *out) {
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:板端默认源 - 定值写(Q10 范围校验;执行段 prot_set_set_sealed
|
||||
* 原子写+封存,B7 收口 B5 竞态窗口;置脏 → 104 任务通知落盘)
|
||||
* 返 回 值:0 / -1 越界或未知地址(本地项 comm_addr=0 不可寻址)
|
||||
* 函数功能:板端默认源 - 定值写(**先 run_par 后 prot_set**,分流理由见
|
||||
* s_src_set_read 头注;prot_set 腿 = Q10 范围校验 + 执行段
|
||||
* prot_set_set_sealed 原子写+封存,B7 收口 B5 竞态窗口)
|
||||
* 返 回 值:0 / -1 越界或未知地址(本地项 comm_addr=0 不可寻址);两条落盘
|
||||
* 链独立:run_par 腿脏 → SYS_EVT_RUN_PAR_SAVE(cfg_file),
|
||||
* prot_set 腿脏 → SYS_EVT_PROT_SET_SAVE(/prot_set.bin)
|
||||
*/
|
||||
static int s_src_set_write(uint32_t addr, float v, uint8_t select) {
|
||||
uint32_t i;
|
||||
int32_t q10;
|
||||
int rp;
|
||||
|
||||
rp = run_par_104_write(addr, v, select);
|
||||
if (rp != -2) {
|
||||
return rp; /* 本段地址:0 接受 / -1 拒绝,不再下探 */
|
||||
}
|
||||
|
||||
for (i = 0u; i < (uint32_t)PS_ID_COUNT; i++) {
|
||||
const prot_set_meta_t *meta = &g_prot_set_meta[i];
|
||||
|
||||
@@ -29,6 +29,8 @@
|
||||
* 快照(削顶路由品质驱动 IV);死区改运行时副本 +
|
||||
* set/get 入口;COV 遥测腿 = 死区 2 点确认(seq 去重)
|
||||
* + 品质变化即报;0x401d 绑频率源(freq_valid → IV)。
|
||||
* 2026-10-25 DTU 项目组 卡 10:死区真源迁 run_par([run_par] cfg 段 +
|
||||
* 0x8020~0x8058 读写映射;本层 set/get 为转发壳)。
|
||||
*/
|
||||
#ifndef IEC104_PTS_H
|
||||
#define IEC104_PTS_H
|
||||
@@ -81,9 +83,11 @@ uint32_t iec104_pts_yc_ioa(uint8_t idx);
|
||||
/* 读 YC:v 有效值(无效时为 0);qds 输出线上品质位(IV/NT/OV,CLIPPED 已映射
|
||||
* 为 IV)。返回 0/无效-1(NT 亦无效,品质位区分) */
|
||||
int iec104_pts_yc_read(uint8_t idx, float *v, uint8_t *qds);
|
||||
/* 死区运行时写(「数据可信」卡 9;卡 10 运行参数段的落点入口):
|
||||
* db = 工程量绝对值 ≥0;越界/负值/NaN → -1 且 RAM 不动;成功时清零该点
|
||||
* 待确认计数(跨死区基线不残留半截确认)。仅 104 服务任务上下文调用。 */
|
||||
/* 死区写(卡 9 API;卡 10 起 = 转发 App/algo/run_par.c 真源 + 清本层确认计数):
|
||||
* db = 工程量绝对值 ≥0(电压 50 V / 电流 1 A / 频率 5 Hz 分档上限);越界/负值/
|
||||
* NaN → -1 且真源不动;成功时清零该点待确认计数(跨档位不残留半截确认——此壳
|
||||
* 行为有单测钉住)。仅 104 服务任务上下文调用。落盘 = run_par 脏 → 事件 →
|
||||
* defaultTask(卡 10 持久化链,docs/子系统设计/IEC104上行设计说明.md §3.4)。 */
|
||||
int iec104_pts_yc_set_deadband(uint8_t idx, float db);
|
||||
/* 读当前生效死区(越界 idx 返 0) */
|
||||
float iec104_pts_yc_deadband(uint8_t idx);
|
||||
|
||||
Reference in New Issue
Block a user