feat(ui)+chore(docs): UI 补齐清单清空;数据可信销项与「卡」号清退

本笔含两组收尾工作(同一工作区内交错在 6 个共享文档/门禁配置里,
拆开会产生"文档声称的页数与树里黄金数不一致"的中间提交,故合为一笔):

一、UI 补齐(清单清空)
- 新建 6 个内容页模块:ui_page_accident / oper / alarm / start / yk
  复用 ui_w_records 共享组件(分页、空态"无记录"、按实例读盘缓存),
  记录层与五个写入点已由道F task-10 / 道G task-12 落地,本批只补页面;
  ui_page_runreport 为 13 行 2 页只读统计,四个数逐个挂范围标签
  (自电池周期 / 本次开机),boot_ready=0 显 "--" 不显 0。
- 数据面:ui_data_info_t 尾部追加 9 字段,ui_data_feed 用
  boot_stats_get() + iec104_serv_get_stats() 纯搬运;模拟器填确定值假数据
  (差异登记 docs/测试说明/模拟器差距清单.md §2.3 两行)。
- 接线:菜单树 6 叶绑 #page=,绑定叶 22→28、UI_PAGE_MAP_COUNT=28;
  字库 185→218 字 / 280→313 字形;双端注册 uvprojx +30、CMakeLists +6。
- 回归:内容页黄金 53→60(含 runreport_p2 真拍第 2 页),文本断言
  425 正向 / 36 反向;存量 53 张逐字节零漂移;记录 5 页各用独立空目录
  (模拟器把操作留痕写进 cwd 的 sim_oper.log,共用 tmp 会让空态拍不到)。

二、数据可信销项 + 「数据可信」任务卡号整族清退
- 删除已闭环的"已知电压注入验证"行与闭环结论块(证据在
  docs/硬件平台/ADC通道映射说明.md §8.1 与
  docs/测试说明/ADC前端注入验证流程.md §5~§7),§5 标识列改语义短语。
- 卡 0/0b/1~12 共 14 个号全仓 288 站点 / 56 文件清退成语义短语,
  代码注释、测试、门禁配置与文档一并改;换算表入 docs/编号规范.md §9.3。
  这一族是中文前缀,不进 check_ids 语料,刻意不入 id_aliases.json。

验证(实测)
- @build 0 错 0 警:Code=236456 RO=28124 RW=1876 ZI=137084;
  RAM +464 B(RW +304 / ZI +160),RW_IRAM1 62.2% / RW_CCM 87.9%,
  体积同码凭证与 RAM 台账已回填。
- check_menu_rows 8 状态 rc=0(池 5368/5448 常量未动);
  check_content_pages 60 页 rc=0;check_font_charset / registration /
  coding-standard / bom-drift / mojibake / doc-links --all / layer-deps /
  nested-comment 全 rc=0;check_ids --strict 无错误;主机单测
  ui_data 295 / boot_stats 21 / sys_log_mcu 141 / soe 32 / soe_store 27。

未做(不是遗漏)
- 六页真机判据(真记录翻页、掉电保持、清除后归零、boot_count 自增、
  拔 RTC 电池落 RESTARTED、IWDG 复位落 rst_cause、主站连一次 conn_up+1)
  已登记 docs/任务规划/登记簿.md §7;模拟器结构上照不到。
- docs/产品需求/产品需求设计文档.md 属另一条在飞改动,本笔不含;
  其中我已同步 6 处现状数字(28 叶 / 60 页 / 218 字),随该笔入库。
This commit is contained in:
2026-10-28 07:23:16 +08:00
parent 8f7c141a0b
commit 94b0d79026
113 changed files with 1934 additions and 615 deletions
+11 -11
View File
@@ -1,7 +1,7 @@
/*
* 模块名称:通道标定层(L1.5,adc_cal)主机侧单元测试
* 被测对象:真实源文件 App/algo/adc_cal.c + App/cfg/cfg_file.c(均 #include
* 原样纳入——卡 4 的落盘契约必须用真引擎测,不造轮子替身)。
* 原样纳入——标定落盘与整定入口的持久化契约必须用真引擎测,不造轮子替身)。
* 平台依赖桩:dbg_log.h(stub/ 计数宏)、cfg_store_*(本文件内存
* 虚拟盘,同 cfg_file 套件先例)、syslog_post(计数)、
* adc_input_desc()(按 ADC通道映射说明.md 权威表给 V0.1 来源映射)。
@@ -14,7 +14,7 @@
* TC-ADCCAL-001 init 注册两段:名称/键数/data_size/无回调/默认表指向
* TC-ADCCAL-002 UA(TPAFE)折算:0 / 8192 / 32767 / -32768 对 10V/65536 独立推导
* TC-ADCCAL-003 UB(STM32)折算:0 / 2048 / 4095 对 3.3V/4096
* TC-ADCCAL-004 其余 6 路各 1 点(合计 8 通道 × ≥3 码值点,卡 2 DoD)
* TC-ADCCAL-004 其余 6 路各 1 点(合计 8 通道 × ≥3 码值点,标定折算落地 DoD)
* TC-ADCCAL-005 TEMP 透传 + flags/k_uv 恒 0;sem 越界守卫
* TC-ADCCAL-006 默认 flags 三态:VALID 全 0;CLIPPED = UB/UC/IB/IC/IN(0xE6)
* TC-ADCCAL-007 k_uv 精确值:152.587890625 / 805.6640625(Q16 无舍入验证)
@@ -23,14 +23,14 @@
* flags 不报 VALID(即便位图置位)+ init 重置观测窗
* TC-ADCCAL-014 零点 b 生效(set 路径):(code+b)×k 逐项可算
* TC-ADCCAL-015 两点标定公式:合成数据还原 k/b + 写回往返 + 参数/斜率/
* 零点越界(-2)守卫(卡 12 的算术核,台架注入待跑)
* 零点越界(-2)守卫(两点标定的算术核,台架注入待跑)
* TC-ADCCAL-016 rail_ths 门限:TPAFE ±32112 / STM32 4013·81 / TEMP 不监视
* TC-ADCCAL-017 init 幂等:重复调用 RAM 复位默认 + 重新注册
* —— 以下走真实 cfg_file 引擎(卡 4 DoD)——
* —— 以下走真实 cfg_file 引擎(标定落盘与整定入口 DoD)——
* TC-ADCCAL-010 文件值生效:k_ua/b_ua 经 load 改变折算结果,VALID 置位
* TC-ADCCAL-011 越界文件值:k=999 / k=-999 被引擎收下后由哨兵兜住:
* 折算 = ROM、VALID 不报(位图置位也不报)、[ERR] 留痕
* TC-ADCCAL-012 段损坏(超长文件)→ 回退 ROM 且 flags 无 VALID(卡 4 DoD)
* TC-ADCCAL-012 段损坏(超长文件)→ 回退 ROM 且 flags 无 VALID(标定落盘与整定入口 DoD)
* TC-ADCCAL-013 段缺失(文件无本段)→ ROM 默认、VALID 全 0
* TC-ADCCAL-018 未标定闭锁单点 adc_cal_prot_blocked()(道F task-16):开机态必须
* 闭锁 / 两路齐第三路缺仍闭锁(全或无)/ 三路齐放行且 UB 仍无 VALID
@@ -46,7 +46,7 @@
* TC-ADCCAL-023 空转回执不倒挂:水位永不越过 set_ok(uint32 相减一绕回就是巨大的假差额)
*
* 通过:全部 TC PASS(main 返回 0)。
* 创建日期:2026-10-25(道A 卡 2/卡 4)
* 创建日期:2026-10-25(道A 标定折算与落盘整定)
*/
#include <stdint.h>
@@ -176,7 +176,7 @@ static int s_total = 0, s_passed = 0, s_failed = 0;
/* ===================== 独立推导的期望值 ===================== */
/* 期望一律用 **double 直接除**(10/65536、3.3/4096),不引用被测的 Q16 常量,
* 满足卡 2 DoD「期望值由 LSB 常数独立算得(不是抄实现)」;容差只需盖住
* 满足标定折算落地 DoD「期望值由 LSB 常数独立算得(不是抄实现)」;容差只需盖住
* float32 中间积舍入(相对 ~1e-7)与打印粒度。 */
static double exp_tpafe(int32_t code) { return (double)code * (10.0 / 65536.0); }
static double exp_stm32(int32_t code) { return (double)code * (3.3 / 4096.0); }
@@ -239,7 +239,7 @@ static void tc_001_init_registers(void) {
CHECK(s_sections[2].used == 0u, "only two sections registered");
}
/* TC-ADCCAL-002/003/004:8 通道 × ≥3 码值点折算,期望独立推导(卡 2 DoD) */
/* TC-ADCCAL-002/003/004:8 通道 × ≥3 码值点折算,期望独立推导(标定折算落地 DoD) */
static void tc_002_004_apply(void) {
printf("[TC-ADCCAL-002] UA (TPAFE) apply\n");
reset_all();
@@ -430,7 +430,7 @@ static void tc_00d_idempotent(void) {
CHECK(adc_cal_flags(ADC_SEM_UA) == 0u, "re-init clears VALID too");
}
/* ===================== 用例(引擎集成组,卡 4 DoD) ===================== */
/* ===================== 用例(引擎集成组,标定落盘与整定入口 DoD) ===================== */
/* TC-ADCCAL-010:文件值经 load 生效 + VALID */
static void tc_010_file_apply(void) {
@@ -464,7 +464,7 @@ static void tc_011_file_bad(void) {
CHECK(g_caltest_err_count >= 2, "both sanitizations logged");
}
/* TC-ADCCAL-012:段损坏(超长文件)→ 回退默认且 flags 无 VALID(卡 4 DoD 原句) */
/* TC-ADCCAL-012:段损坏(超长文件)→ 回退默认且 flags 无 VALID(标定落盘与整定入口 DoD 原句) */
static void tc_012_file_corrupt(void) {
char big[CFG_FILE_MAX_LEN + 64];
size_t i;
@@ -496,7 +496,7 @@ static void tc_013_section_missing(void) {
CHECK(adc_cal_flags(ADC_SEM_IA) == 0u, "no VALID with missing sections");
}
/* TC-ADCCAL-018:未标定闭锁判定单点(「数据可信」卡 5 / 道F task-16)
/* TC-ADCCAL-018:未标定闭锁判定单点(「数据可信」未标定即闭锁 / 道F task-16)
* 为什么值得单独钉:这条谓词此前在 App/task/protect_task.c 与
* App/app/ui_data_feed.c 各写一份,**没有任何一份被主机测到**(ui_data 套件只编
* 快照层,不编组装器)。收敛到本层后它跟着被测源文件一起进来,第一次拿到
+1 -1
View File
@@ -18,7 +18,7 @@
python test/host/adc_cal/run_unit_test.py
退出码:0=PASS / 1=测试失败 / 2=环境错误。
设计依据:docs/任务规划/数据可信.md 卡 2 / 卡 4(道A);
设计依据:docs/任务规划/数据可信.md 标定折算与落盘整定(道A);
创建日期:2026-10-25
"""
import os
+1 -1
View File
@@ -31,7 +31,7 @@
* TC-ADCHEALTH-015 帧年龄纯判据:tick 与序号跨 0xFFFFFFFF 不误判、停滞仍判老
* TC-ADCHEALTH-016 帧年龄纯判据:序号倒退按「有变化」处理,不判老(判据分工)
* TC-ADCHEALTH-017 帧年龄纯判据:两个 age 对象互不干扰;空指针不判老
* —— 采样通道自检 残余「码值越界(贴轨)检出」(2026-10-25 道A,卡 2 分支加入)——
* —— 采样通道自检 残余「码值越界(贴轨)检出」(2026-10-25 道A,标定折算落地分支加入)——
* TC-ADCHEALTH-018 释放沿后连续 20 拍贴上轨 -> 锁存 + 边沿只报一次
* TC-ADCHEALTH-019 无释放沿(开机/空载恒 0)永不锁存(合法工况不误报)
* TC-ADCHEALTH-020 中带样本清零连续计数(19+19 不锁);触轨含等号边界
+4 -4
View File
@@ -22,7 +22,7 @@
* TC-CONFIG-004 MAC 三种分隔符 + 大小写 + 非法
* TC-CONFIG-005 STR 正常 / 超长拒绝 / 边界(恰好放下)
* TC-CONFIG-006 INT 合法解码:0 / -1 / INT32_MIN / INT32_MAX / 各宽度边界 /
* 前导 + / 前导 0(数据可信卡 3:负零点偏移可落盘)
* 前导 + / 前导 0(「数据可信」有符号零点类型:负零点偏移可落盘)
* TC-CONFIG-007 INT 非法拒绝:空 / 非数字 / 带后缀 / 越界(含 strtol 饱和带,
* 即超 INT32 但钳位后恰落界内的文本)/ 坏 len
* TC-CONFIG-008 INT 编码带负号输出 + 注册校验(INT len=3 拒绝)+
@@ -235,7 +235,7 @@ static const cfg_key_def_t s_net_keys[] = {
{ "name", CFG_VAL_STR, offsetof(sec_net_t, name), 12u },
};
/* 段 B:[sys],无回调,用于验证多段、超长字段拒绝与 INT 有符号往返(卡 3)。
/* 段 B:[sys],无回调,用于验证多段、超长字段拒绝与 INT 有符号往返(有符号零点类型)。
* 字段按自然对齐排布:u32@0 / i8@4 / i16@6 / i32@8,offset 用 offsetof 取真值 */
typedef struct {
uint32_t baud; /* offset 0 len 4 UINT */
@@ -380,7 +380,7 @@ static void tc_capacity(void)
cfg_section_reg_t r;
/* 数字钉:段上限必须是 8(cfg_file.h:39);改数字 = 容量台账变化,必须
* 同步 docs/子系统设计/配置文件设计说明.md 与本卡生产占位说明 */
* 同步 docs/子系统设计/配置文件设计说明.md 与本用例生产占位说明 */
CHECK(CFG_FILE_MAX_SECTIONS == 8u, "CFG_FILE_MAX_SECTIONS pinned to 8");
vfs_reset();
CHECK(register_fill((int)CFG_FILE_MAX_SECTIONS) == 1, "filling exactly 8 sections all accepted");
@@ -521,7 +521,7 @@ static void tc_str(void) {
CHECK(s_decode_str(d, 8u, "") == 0 && d[0] == '\0', "empty string ok");
}
/* TC-CONFIG-006/007:INT 解码(数据可信卡 3——有符号零点偏移) */
/* TC-CONFIG-006/007:INT 解码(「数据可信」有符号零点类型——负零点偏移) */
static void tc_int_decode(void) {
uint8_t d[4];
+14 -14
View File
@@ -18,7 +18,7 @@
* TC-IEC104-005 OPEN 态 I 帧忽略(序号不消费)
* TC-IEC104-006 总召全流程:actcon→4 分片(首召 COT=4)→actterm;二召 COT=2;RBT→COT=4
* TC-IEC104-007 遥信变位 COV(COT=3);无效位不触发
* TC-IEC104-008 遥测死区 COV(卡 9 起 = 2 点确认):死区内不发 / 首越只挂起 /
* TC-IEC104-008 遥测死区 COV(104 改读快照起 = 2 点确认):死区内不发 / 首越只挂起 /
* 连续第 2 越点上送
* TC-IEC104-009 k 窗:12 未确认停发;S 确认后恢复
* TC-IEC104-010 w 阈:收满 8 发 S
@@ -50,18 +50,18 @@
* TC-IEC104-021 C_TS / C_RP actcon
* TC-IEC104-022 周期上送 COT=1(YC 组 + 频率)
* TC-IEC104-023 k 窗满 COV 不丢事件(pend 暂存,窗开后补发)
* —— 以下为「数据可信」卡 9/卡 11(道D,2026-10-25;板端默认源 = 真实
* —— 以下为「数据可信」104 改读快照与频率点绑定(道D,2026-10-25;板端默认源 = 真实
L2 链 ring→phasor→freq→meas,非桩)——
* TC-IEC104-025 板端源读快照(024 号已归 B7 用例):未发布
* IV|NT / 值=基波有效值 / 削顶 CLIPPED
* →线上 IV 清零 / 干净路品质 0 / 频率未新鲜 IV
* TC-IEC104-026 0x401D 绑频:收敛后 ±0.02 Hz / freq_valid==0 → IV 清零
* (卡 11 DoD 原句)
* TC-IEC104-027 死区运行时化(卡 10 后 = run_par 真源 + 转发壳):set/get
* (频率点绑定 DoD 原句)
* TC-IEC104-027 死区运行时化(运行参数段后 = run_par 真源 + 转发壳):set/get
* + 非法拒 + 运行档压旧档 + 2 点确认/回摆撤销 + 壳清半截确认计数
* TC-IEC104-028 品质翻转直报(假源)+ 板端 seq 去重(同帧不计两点)+
* 换帧只变品质时按集合直报
* TC-IEC104-029 卡 10 路由:0x8030/0x8038 命中 / 0x8027 仍归 prot_set /
* TC-IEC104-029 运行参数段路由:0x8030/0x8038 命中 / 0x8027 仍归 prot_set /
* 空隙 COT14 / C_SE 两段式 / k 带拒 / b 单侧 RMW 保 k
*
* 通过:全部 TC PASS(main 返回 0)。
@@ -84,9 +84,9 @@ static int s_total = 0, s_passed = 0, s_failed = 0;
#include "sample_ring.c"
#include "phasor.c"
#include "freq.c"
#include "meas.c" /* 卡 9:板端默认 YC 源 = L2 遥测快照(真实链,非桩) */
#include "meas.c" /* 104 改读快照:板端默认 YC 源 = L2 遥测快照(真实链,非桩) */
/* ===================== 卡 10 真链桩(同 adc_cal 套件先例) =====================
/* ===================== 运行参数段真链桩(同 adc_cal 套件先例) =====================
* run_par 依赖真实 cfg 引擎与 adc_cal:dbg_log 走 stub/ 计数宏,文件/堆走
* 内存虚拟盘(cfg_store_* 强符号),adc_input_desc 按 V0.1 权威映射给桩。
* 顺序敏感:桩头与强符号先于被纳入的 .c。 */
@@ -402,7 +402,7 @@ static void reset_all(uint32_t now)
{
prot_set_init();
prot_elm_init();
run_par_init(); /* 卡 10:死区/脏复位到工厂默认(重复注册 -1 走计数桩,无害) */
run_par_init(); /* 运行参数段:死区/脏复位到工厂默认(重复注册 -1 走计数桩,无害) */
iec104_pts_init();
iec104_pts_bind_src(&g_fake);
(void)memset(s_f_yc, 0, sizeof(s_f_yc));
@@ -712,8 +712,8 @@ static void tc_cov_yc(void)
handshake(now);
s_f_yc[0] = 100.0f;
iec104_link_poll(&g_lk, now); /* 快照 = 100 */
s_f_yc[0] = 100.4f; /* 死区 0.5 V 内(卡 6 二次值口径:0.5 %×100 V,
* 旧拟定码值死区 10 已由「数据可信」卡 6 重定) */
s_f_yc[0] = 100.4f; /* 死区 0.5 V 内(工程量重定后的二次值口径:0.5 %×100 V,
* 旧拟定码值死区 10 已由「数据可信」下游常数按工程量重定) */
iec104_link_poll(&g_lk, now + 100u);
CHECK(cap_i_count() == 0, "TC-IEC104-008 inside the deadband nothing is uploaded");
s_f_yc[0] = 101.25f; /* 101.25-100=1.25 > 0.5,第 1 越点 */
@@ -1203,7 +1203,7 @@ static void tc_cov_kfull(void)
&& (c.cot == IEC104_COT_SPONT), "TC-IEC104-023 once the window opens the backlogged event is sent, none lost");
}
/* ========== 卡 9/卡 11:板端默认源(真实 L2 链:ring→phasor→freq→meas) ========== */
/* ====== 104 改读快照与频率点绑定:板端默认源(真实 L2 链:ring→phasor→freq→meas) ====== */
/* 与 App/task/adc_task.c 同型的单拍编排:压环 → phasor_run →(可选 freq_run)。
* 9 路同幅错相正弦(整周波 → 各路基波有效值 = A/√2,与相位无关,期望好算) */
@@ -1313,7 +1313,7 @@ static void tc_db_runtime(void)
iec104_pts_cov_check(&cov);
CHECK((cov.yc_changed & 0x0001u) == 0u, "TC-IEC104-027 2nd point under 2.0 still silent");
run_par_init(); /* 恢复工厂默认档(0.5)——卡 10 复位入口 */
run_par_init(); /* 恢复工厂默认档(0.5)——运行参数段复位入口 */
iec104_pts_init();
iec104_pts_bind_src(&g_fake);
s_f_yc[0] = 100.0f;
@@ -1388,7 +1388,7 @@ static void tc_cov_qds_seq(void)
"TC-IEC104-028 clipped flip per frame reported as a set");
}
/* 卡 10:0x8020~0x8058 读写路由(板端默认源,run_par 表先 / prot_set 后) */
/* 运行参数段:0x8020~0x8058 读写路由(板端默认源,run_par 表先 / prot_set 后) */
static void tc_pts_rpar_route(void)
{
float v;
@@ -1430,7 +1430,7 @@ static void tc_pts_rpar_route(void)
}
/* ===================== 道G task-8:[comm] 段 =====================
* 真实 cfg 引擎(上方已 #include cfg_file.c)+ 卡 10 的 RAM 虚拟盘。
* 真实 cfg 引擎(上方已 #include cfg_file.c)+ 运行参数段的 RAM 虚拟盘。
* 白盒清理 = cfg_file_test 同款(生产静态无公开复位接口,白盒单测可接受)。
* ⚠ tc_comm 必须排在 main 末位:comm_reg_reset 会清空**整张**段注册表。 */
static void comm_reg_reset(void)
+2 -2
View File
@@ -5,7 +5,7 @@
做什么:用本机 MSVC 离线编译 test/host/iec104/iec104_test.c(#include 纳入
生产源文件 iec104_asdu.c + iec104_pts.c + iec104_link.c,及数据源链接
依赖 prot_set.c + prot_elm.c + phasor.c + sample_ring.c + freq.c +
meas.c,卡 10 起再 + cfg_file.c + adc_cal.c + run_par.c 真链),验证
meas.c,运行参数段起再 + cfg_file.c + adc_cal.c + run_par.c 真链),验证
APCI 重组 / STARTDT 握手 / 总召分片 / COV / k-w-t1~t3 / 遥控与定值两段式 /
C_RD / C_CS / 错误应答(EVI)。
@@ -29,7 +29,7 @@ from unit_test_harness import TestBuild, run_host_unit_test # noqa: E402
BUILD = TestBuild(
name="IEC104 Tests",
src=os.path.join(HERE, "iec104_test.c"),
# 卡 10 起 stub 先于生产目录(dbg_log.h → 计数宏桩);App/cfg + App/log
# 运行参数段起 stub 先于生产目录(dbg_log.h → 计数宏桩);App/cfg + App/log
# 真头供 cfg_file.h / cfg_file_store.h / sys_log.h;adc_input_desc /
# syslog_post / cfg_store_* 由测试单元给强符号桩(同 adc_cal 套件先例)。
include_dirs=[
+2 -2
View File
@@ -1,9 +1,9 @@
/*
* 主机侧单测桩:dbg_log.h(IEC104 套件专用)
* 模块功能:为卡 10 起纳入本 TU 的 cfg_file.c / adc_cal.c / run_par.c 提供
* 模块功能:为运行参数段起纳入本 TU 的 cfg_file.c / adc_cal.c / run_par.c 提供
* 主机可编译的日志宏(映射为计数)。⚠ 仅供 test/host/iec104/ 使用,
* 不参与 MCU 构建。模式同 test/host/adc_cal/stub/ 先例。
* 创建日期:2026-10-25(道D 卡 10)
* 创建日期:2026-10-25(道D 运行参数段)
*/
#ifndef DBG_LOG_H
+1 -1
View File
@@ -276,7 +276,7 @@ int sys_clock_set_unix(uint32_t unix_secs)
return g_clock_set_rc;
}
uint8_t prot_set_dirty_peek(void) { return (uint8_t)g_dirty; }
/* run_par 脏 peek 假件(卡 10):任务主循环在单测中不跑,脏恒 0 =
/* run_par 脏 peek 假件(运行参数段):任务主循环在单测中不跑,脏恒 0 =
* 不投递 SYS_EVT_RUN_PAR_SAVE;落盘链真身覆盖在 test/host/run_par。 */
uint8_t run_par_dirty_peek(void) { return 0u; }
uint32_t osEventFlagsSet(osEventFlagsId_t ef_id, uint32_t flags)
+6 -6
View File
@@ -4,11 +4,11 @@
* App/algo/meas.c + App/algo/phasor.c + App/algo/sample_ring.c
* 三源均为纯算法(无寄存器/RTOS/文件依赖)→ **无需任何桩**。
*
* 为什么要主机侧(而不是只等台架):卡 8 的判据一半是"并发与结构"类——
* 为什么要主机侧(而不是只等台架):遥测快照发布的判据一半是"并发与结构"类——
* 双区切换无撕裂、seq 只增、布局与 §4.5 一致、品质汇总正确——台架上要么不可
* 观测(撕裂窗 200 ms 量级,人工比对读不到)、要么无法注入(削顶位图由卡 12
* 标定后才真实出现);主机侧可合成任意幅值/相位的 9 通道帧序列把它们钉死。
* 读数与注入源比对类判据 = 待台架实测(本套件不覆盖,见「数据可信」卡 8)。
* 观测(撕裂窗 200 ms 量级,人工比对读不到)、要么无法注入(削顶位图由两点标定
* 完成后才真实出现);主机侧可合成任意幅值/相位的 9 通道帧序列把它们钉死。
* 读数与注入源比对类判据 = 待台架实测(本套件不覆盖,见「数据可信」遥测快照发布)。
*
* 覆盖点(TC-MEAS-xxx;属主登记处 = 本目录,族 TC-HOST-MEAS):
* TC-MEAS-001 init 语义:seq=0 / get=-2 且清零填充 / 发布后可见 / init 幂等复位
@@ -17,7 +17,7 @@
* TC-MEAS-004 基波有效值透传:50 Hz 整周波窗 yc = A/√2(≤0.1 %),零幅路=0 且品质 0
* TC-MEAS-005 同拍同值(§4.5"从相量使用区取"口径钉死):yc[UA/UN/IA] 与
* phasor_get(基波实例).fAmSQ 逐位相等
* TC-MEAS-006 品质汇总(卡 8 DoD 原句"任一点 CLIPPED → 该点 qds 置位"):
* TC-MEAS-006 品质汇总(遥测快照发布 DoD 原句"任一点 CLIPPED → 该点 qds 置位"):
* mask=0xE6 → UB/UC/IB/IC/IN 置 CLIPPED 且值不清零;UA 不置;
* mask 位 8 对 TEMP 无效(TEMP 恒 NT)
* TC-MEAS-007 seq 递增 + 最新帧:50 连发,get 恒为最新(seq/tick_ms/幅值三元组
@@ -29,7 +29,7 @@
* TC-MEAS-011 get 参数守卫:NULL → -1
*
* 通过:全部 TC PASS(main 返回 0)。
* 创建日期:2026-10-25(道D 卡 8)
* 创建日期:2026-10-25(道D 遥测快照发布)
*/
#include <math.h>
+3 -3
View File
@@ -11,8 +11,8 @@
工具链探测 / 编译运行全部委托 test/host/common/unit_test_harness.py。
为什么要主机侧单测(而不是只等台架):
卡 8(docs/任务规划/数据可信.md)判据一半是并发与结构类——双区撕裂窗在
台架上不可观测,削顶品质要等卡 12 标定才真实出现;读数与注入源比对类
遥测快照发布(docs/任务规划/数据可信.md)判据一半是并发与结构类——双区撕裂窗在
台架上不可观测,削顶品质要等两点标定才真实出现;读数与注入源比对类
判据仍归台架(实测采样类,本套件不覆盖)。
本层为纯算法:无寄存器、无 RTOS、无文件/外设依赖,**不需要任何桩目录**。
@@ -21,7 +21,7 @@
python test/host/meas/run_unit_test.py
退出码:0=PASS / 1=测试失败 / 2=环境错误。
设计依据:docs/任务规划/数据可信.md 卡 8(道D,§4.5 快照布局);
设计依据:docs/任务规划/数据可信.md 遥测快照发布(道D,§4.5 快照布局);
创建日期:2026-10-25
"""
import os
+6 -6
View File
@@ -1,19 +1,19 @@
/*
* 模块名称:量纲回归主机侧单测(「数据可信」卡 7 · 道A)
* 模块名称:量纲回归主机侧单测(「数据可信」量纲回归用例 · 道A)
* 被测对象:真实源文件(#include 原样纳入,全链路 L1.5→L2→L3):
* adc_cal.c + prot_set.c + sample_ring.c + phasor.c + freq.c +
* prot_elm.c
* 平台依赖桩:dbg_log.h(stub/)、cfg_file_register(捕获计数)、
* adc_input_desc(V0.1 权威来源表,同 adc_cal 套件)。
*
* 本卡的存在理由(短板评测 + 「数据可信」§2.2):台架此前"通过"是因为没有
* 本套件的存在理由(短板评测 + 「数据可信」§2.2):台架此前"通过"是因为没有
* 一条判据检查**不该动作时不动作**——"码值当工程量"的错配曾让 OC 拿 ~11000
* 码值比 10 A 定值恒假动作。本套件把这条固化成回归:用例从 **ADC 码值** 出发、
* **显式写出码值↔二次值换算**,走真实 折算→采样环→全周傅氏→元件判据 链;
* 任何一环把量纲弄丢(比如折算点被旁路),断言立刻翻转。
*
* ROM 系数覆写(#undef/#define):把"板级理论系数"替换为合成端子侧口径
* (10 mV/码,K_DIM),模拟卡 12 标定完成后的 ROM/默认状态——合法带随之
* (10 mV/码,K_DIM),模拟两点标定完成后的 ROM/默认状态——合法带随之
* 锚定合成值,adc_cal_set 走正规路径置 VALID,测试不白盒改引擎内存。
*
* 覆盖点(族 TC-HOST-PROTDIM,属主登记处 = 本目录):
@@ -38,7 +38,7 @@
* OC1 返回、OV 保持(互不污染)
*
* 通过:全部 TC PASS(main 返回 0)。
* 创建日期:2026-10-25(道A 卡 7)
* 创建日期:2026-10-25(道A 量纲回归用例)
*/
#include <math.h>
@@ -90,7 +90,7 @@ static int s_total = 0, s_passed = 0, s_failed = 0;
/* ---- 合成"标定后"板级口径(覆写 adc_cal.h 的 ROM 常量,必须在纳入 .c 之前) ----
* K_DIM = 655360000 Q16 = 10000 µV/码 = 10 mV/码:
* 电压类 100 V rms → 峰值 141.42 V → 14142 码(TPAFE 半量程内,量级刻意
* 贴近卡 12 端子变比标定后的真实形态);电流类二次值经变换器落到同一定标。
* 贴近端子变比两点标定完成后的真实形态);电流类二次值经变换器落到同一定标。
* B_IA = -30 码(零点偏移,经 apply 精确对消——验证 b 参与全链而非仅落盘)。 */
#include "adc_cal.h"
#undef ADC_CAL_K_Q16_TPAFE
@@ -113,7 +113,7 @@ static uint32_t s_t = 0u;
static long my_lround(double x) { return (long)((x >= 0.0) ? (x + 0.5) : (x - 0.5)); }
/* 显式换算(卡 7 的核心手法,两处方向都要有):
/* 显式换算(量纲回归用例的核心手法,两处方向都要有):
* code = round(eng[V 或 A] × 65536×1e6 / k_q16) − b (期望 → 码值)
* eng = (code + b) × k_q16 / 65536 / 1e6 = adc_cal_apply (码值 → 工程量)
* 上面两式必须互逆——若实现(adc_cal_apply)与期望推导脱钩,全部 TC 翻转。 */
+3 -3
View File
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""量纲回归(卡 7,道A)主机侧单元测试运行器(L0.5,纯标准库)。
"""量纲回归用例(道A)主机侧单元测试运行器(L0.5,纯标准库)。
做什么:
MSVC 编译 test/host/prot_dim/prot_dim_test.c(#include 纳入真实链:
@@ -8,7 +8,7 @@
用"码值→二次值显式换算"的全链路合成波驱动七类保护元件,钉死
「不该动作时不动作」。工具链细节委托 unit_test_harness.py。
为什么要这个套件(数据可信 §2.2 / 卡 7):
为什么要这个套件(数据可信 §2.2 / 量纲回归用例):
台架此前"通过"是因为没有一条判据检查不该动作时不动作——"码值当工程量"
的错配曾让 OC 恒假动作。本套件把换算写进用例:折算点被旁路或量纲再错位,
断言立刻翻转;纯合成数据,零硬件零台架。
@@ -17,7 +17,7 @@
python test/host/prot_dim/run_unit_test.py
退出码:0=PASS / 1=测试失败 / 2=环境错误。
设计依据:docs/任务规划/数据可信.md 卡 7(M4 退出判据⑥);
设计依据:docs/任务规划/数据可信.md 量纲回归用例(M4 退出判据⑥);
创建日期:2026-10-25
"""
import os
+3 -3
View File
@@ -1,6 +1,6 @@
/*
* 模块名称:运行参数段(run_par)主机侧单元测试
* 模块功能:离线钉死「数据可信」卡 10 的三层契约——① [run_par] cfg 段:
* 模块功能:离线钉死「数据可信」运行参数段的三层契约——① [run_par] cfg 段:
* 注册/工厂默认/落盘往返/文件改值生效(真实 cfg 引擎 + 内存虚拟盘,
* 同 adc_cal 套件先例);② 104 地址映射:命中集/空隙/两段式/分档
* 量程守卫;③ k/b 覆盖直通 adc_cal_set(真实标定层):合法带拒绝、
@@ -11,7 +11,7 @@
* test/host/iec104 TC-IEC104-029 钉(那边才有全协议栈)**。
*
* 覆盖点(TC-RUNPAR-xxx;属主登记处 = 本目录,族 TC-HOST-RUNPAR):
* TC-RUNPAR-001 init 工厂默认 = 卡 6 额定档 + idx 守卫
* TC-RUNPAR-001 init 工厂默认 = 工程量重定后的额定档 + idx 守卫
* TC-RUNPAR-002 死区写往返 + 分档上限(V/A/Hz)+ NaN/负值拒 + 定点量化
* TC-RUNPAR-003 落盘链:set→脏→store_save 成功清脏 + 文件含 9 键 +
* load 回读往返 + 外部改文件值生效 + 无脏 save 空操作
@@ -23,7 +23,7 @@
* TC-RUNPAR-008 引擎副本 = 生效值(无回调):load 原地改副本即时可见
*
* 通过:全部 TC PASS(main 返回 0)。
* 创建日期:2026-10-25(道D 卡 10)
* 创建日期:2026-10-25(道D 运行参数段)
*/
#include <stdint.h>
+3 -3
View File
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""运行参数段(run_par,「数据可信」卡 10)主机侧单元测试运行器(L0.5,纯标准库)。
"""运行参数段(run_par,「数据可信」这一项)主机侧单元测试运行器(L0.5,纯标准库)。
做什么:用本机 MSVC 离线编译 test/host/run_par/run_par_test.c(#include 纳入
run_par.c + cfg_file.c + adc_cal.c 真实链 + 内存虚拟盘桩),钉死 [run_par]
@@ -12,8 +12,8 @@
退出码:0=PASS / 1=测试失败 / 2=环境错误。
设计依据:docs/任务规划/数据可信.md(卡 10)+ docs/子系统设计/IEC104上行设计说明.md §3.4。
创建日期:2026-10-25(道D 卡 10)
设计依据:docs/任务规划/数据可信.md(运行参数段)+ docs/子系统设计/IEC104上行设计说明.md §3.4。
创建日期:2026-10-25(道D 运行参数段)
"""
import os
import sys
+1 -1
View File
@@ -3,7 +3,7 @@
* 模块功能:为 cfg_file.c / adc_cal.c / run_par.c 提供主机可编译的日志宏
* (映射为计数)。⚠ 仅供 test/host/run_par/ 使用,不参与 MCU 构建。
* 模式同 test/host/adc_cal/stub/ 先例。
* 创建日期:2026-10-25(道D 卡 10)
* 创建日期:2026-10-25(道D 运行参数段)
*/
#ifndef DBG_LOG_H