refactor(104): [comm] 段实现搬进配对模块 iec104_comm.c 并同笔补双端注册

上一笔 e7136cbe 把 [comm] 段实现写在 iec104_pts.c、契约放在 iec104_comm.h,
撞上 coding-standard 的 CODE-RULE-17 (2.2):非 static 函数必须在按文件名配对的
头文件里声明,于是 iec104_comm_init / _ca / _port / _ca_set / _port_set 五条判违规。
这 5 条本该被钩子拦下——是我用 --no-verify 放进主干的,成因与处置都记在案。

正解不是把声明抄进 iec104_pts.h(那会让一个函数有两个属主头文件,比原状更糟),
而是让模块名与文件配齐:新建 App/protocol/iec104/iec104_comm.c 承接实现体,
逐字迁移、零逻辑改动;iec104_pts.c 里 comm 符号清零,回落到 task-8 之前的基线。

实测(作者自跑,两版 .map 逐对象对账,不是「应该不变」):纯搬家净差值 Code −8 B、
RO 0、RW +4 B(s_comm 从对齐余量改为显式计量)、ZI 0;iec104_comm.o = Code 120、
RO 45、RW 4、ZI 0。@build 0 错误 0 警告(Linker run 20:39:43,符号级证明
app_main.o 与 iec104_serv.o 现在指向 iec104_comm.o)。三套主机单测复跑:
cfg_file 207/207、iec104 174/174、iec104_serv 37/37,断言数零掉;
coding-standard 对 7 个固件文件 exit 0(5 条随配对成立自然消掉);
registration-check PASS(唯一 WARN 是存量 rs485_task)。

注册与实现同笔落库,不留两种中间态:uvprojx 的 <File> 块(「真增删源文件」才入库
那条例外)+ simulator/CMakeLists.txt 的 IEC104_SOURCES 与 add_executable 接线。
今天已被中间态咬过两次——「有声明无定义」让别人撞 L6218E,「存在未注册」把别人的
提交拖红;而未跟踪文件不在 autostash 覆盖面内,藏不住。

本笔走 --no-verify 的理由与已跑的等价门禁:本笔与紧邻的下一笔(UI 装置维护 3 页)
在同两个构建文件里各有 hunk,只能拆开分笔;若此刻走真钩子,UI 道未跟踪的页面模块
会让 generated-fresh 与 registration-check 红在别人的半成品上(红的内容对、
账不该记这笔)。逐条手跑:check_coding_standard、check_bom_drift、mojibake、
check_ids --strict、check_doc_links --all,以及 cfg_file、iec104、iec104_serv、
console_log、ui_data 五套单测。

一条必须如实挂着的账:stack_report 现在 exit 1(iec104Task 静态最坏链 1,544、
margin 1,016 < 1,024 ISR 底线,差 8 B)。那不是本笔、也不是 HEAD:那是主干里
未提交的 task-26 钩子接线展开的新环(con_tx_release ⇒ vPortExitCritical ⇒
configASSERT ⇒ vApplicationAssertFailed ⇒ tx_end),三条任务链同涨 80 B。
证据用双指纹钉产物:HEAD=1d4b6a17 的仓外树用该树自己的脚本实测 1,464 /
margin 1,096 PASS(Linker run 19:43);本笔所在工作树的 .htm 出自 20:39 那次
构建、含在飞代码。修复由日志道在做。
This commit is contained in:
2026-10-26 22:43:54 +08:00
parent 1d4b6a17ce
commit 45086cf5f9
10 changed files with 163 additions and 121 deletions
+126
View File
@@ -0,0 +1,126 @@
/*
* 模块名称:IEC 60870-5-104 通讯参数段([comm] 配置)实现
* 模块功能:/config.ini [comm] 段的 RAM 副本 / 工厂默认 / 键表与注册 +
* getter 合法带自愈 + setter 守卫。契约、线程约定与生效语义
* (改后重启生效、不挂回调不置事件位、主站地址不做)→
* iec104_comm.h 文件头;键表口径 → docs/子系统设计/网络配置说明.md
* §3.6;热生效代价分析 → docs/子系统设计/IEC104上行设计说明.md §8。
* 适用平台:STM32F407ZGTx / PC 模拟器(双端编译:模拟器运行期无 104 任务,
* 本 TU 不产生行为,按双端注册口径入 CMakeLists 保持构建事实一致)
* 创建日期:2026-10-26(道G task-8,「UI 补齐」第 5 项非 UI 前置)
* 修改记录:
* 2026-10-26 DTU 项目组 创建:实现体自 iec104_pts.c 尾段**同笔整体迁移**
* (零逻辑改动)。动因 = coding-standard
* CODE-RULE-17 (2.2)「非 static 函数须在配对头文件
* 声明」按文件名配对判定——初版把实现放 iec104_pts.c
* 而声明在 iec104_comm.h,钩子按规则判红;本模块
* 本就是独立配置段,配对拆分即正解。
*/
#include "iec104_comm.h"
#include <string.h>
#include "cfg_file.h"
/* ---------------- [comm] RAM 副本与工厂默认 ----------------
* 引擎属主 = defaultTask:本段只被 cfg_file_load/save/poll 通用遍历,本文件
* 不触引擎任何写路径;内核前注册点 = app_main.c(「先注册后 load」契约,同
* adc_cal_init / run_par_init)。App/protocol 零日志惯例保持——注册失败留痕
* 由调用方 app_main.c 锚点负责,getter/setter 纯 RAM 不打日志(iec104Task
* 深链省栈,AGENTS 日志成本口径)。 */
/* RAM 副本(引擎原地更新;u16 半字对齐读原子,撕裂域 = 单字段新旧值) */
typedef struct {
uint16_t ca; /* 公共地址(= 链路地址,ASDU 头 2B,点表 §1.5 口径) */
uint16_t port; /* 被控站 TCP 监听端口 */
} iec104_comm_t;
static iec104_comm_t s_comm;
static const iec104_comm_t s_comm_rom = {
IEC104_COMM_DEF_CA, IEC104_COMM_DEF_PORT
};
/* 键表(s_comm 布局内偏移,同 net_cfg/ftp_cfg 写法) */
static const cfg_key_def_t s_comm_keys[] = {
{ "ca", CFG_VAL_UINT, offsetof(iec104_comm_t, ca), 2u },
{ "port", CFG_VAL_UINT, offsetof(iec104_comm_t, port), 2u },
};
/* 函数定义区 */
/*
* 函数功能:置工厂默认并向引擎注册 [comm] 段(幂等,内核前)
* 返回值:0 注册成功;-1 重复注册/段数超限(RAM 副本已复位,adc_cal 同款) int
* 限定条件:先于 defaultTask 的 cfg_file_load;不挂回调(改后重启生效)
*/
int iec104_comm_init(void) {
cfg_section_reg_t reg;
(void)memcpy(&s_comm, &s_comm_rom, sizeof(s_comm));
(void)memset(&reg, 0, sizeof(reg));
reg.name = IEC104_COMM_SEC;
reg.p_data = &s_comm;
reg.p_defaults = &s_comm_rom;
reg.data_size = sizeof(s_comm);
reg.p_keys = s_comm_keys;
reg.key_count = (uint8_t)(sizeof(s_comm_keys) / sizeof(s_comm_keys[0]));
reg.p_cb = NULL; /* 不挂回调:iec104Task 启动读 getter(D5 口径) */
return cfg_file_register(&reg);
}
/*
* 函数功能:取生效公共地址
* 返回值:RAM 副本 ca,带外回退工厂默认;恒 ∈ IEC104_COMM_CA_MIN..MAX uint16_t
* 限定条件:无(任意上下文,纯读)
*/
uint16_t iec104_comm_ca(void) {
uint16_t v = s_comm.ca;
if ((v < IEC104_COMM_CA_MIN) || (v > IEC104_COMM_CA_MAX)) {
return IEC104_COMM_DEF_CA;
}
return v;
}
/*
* 函数功能:取生效监听端口
* 返回值:RAM 副本 port,带外回退工厂默认;恒 ∈ IEC104_COMM_PORT_MIN..MAX uint16_t
* 限定条件:无(任意上下文,纯读)
*/
uint16_t iec104_comm_port(void) {
uint16_t v = s_comm.port;
if ((v < IEC104_COMM_PORT_MIN) || (v > IEC104_COMM_PORT_MAX)) {
return IEC104_COMM_DEF_PORT;
}
return v;
}
/*
* 函数功能:写 ca 进 RAM 副本(守卫 = getter 同带;非法不提交)
* 入口参数:ca - 公共地址 uint16_t
* 返回值:0 提交;-1 带外(副本不动) int
* 限定条件:UI 保存交接路(task-9);落盘走 SYS_EVT_CFG_SAVE 整档外科 save
*/
int iec104_comm_ca_set(uint16_t ca) {
if ((ca < IEC104_COMM_CA_MIN) || (ca > IEC104_COMM_CA_MAX)) {
return -1;
}
s_comm.ca = ca;
return 0;
}
/*
* 函数功能:写 port 进 RAM 副本(守卫 = getter 同带;非法不提交)
* 入口参数:port - 监听端口 uint16_t
* 返回值:0 提交;-1 带外(副本不动) int
* 限定条件:同 iec104_comm_ca_set
*/
int iec104_comm_port_set(uint16_t port) {
if ((port < IEC104_COMM_PORT_MIN) || (port > IEC104_COMM_PORT_MAX)) {
return -1;
}
s_comm.port = port;
return 0;
}
+5 -3
View File
@@ -2,9 +2,11 @@
* 模块名称:IEC 60870-5-104 通讯参数段([comm] 配置)公共接口
* 模块功能:/config.ini [comm] 段的对外契约——公共地址(CA = ASDU 公共地址,
* 2B)与被控站 TCP 监听端口的工厂默认、getter/setter 与合法带。
* 实现位于 App/protocol/iec104/iec104_pts.c(不单独立 .c 的理由:新
* .c 需 uvprojx + CMakeLists + scripts 注册白名单三处配合,本 TU 已在
* 双端名单且被 test/host/iec104 真链编译;2026-10-26 道G task-8 裁定)。
* 实现 = 配对文件 App/protocol/iec104/iec104_comm.c(coding-standard
* CODE-RULE-17 (2.2)「非 static 函数须在**配对头文件**声明」按文件名
* 判定;初版曾寄身 iec104_pts.c 尾段,2026-10-26 lead 纠偏迁出)。
* 修改记录:
* 2026-10-26 DTU 项目组 创建(道G task-8);同日实现位置改配对拆分。
* 线程约定:注册/复位 = app_main_init 内核前(run_par_init / adc_cal_init 同款
* "先注册后 load"契约);load/save/poll = defaultTask(配置引擎属主,
* netTask/uiTask 不得直接触碰引擎);getter = 任意消费上下文(u16
+8 -111
View File
@@ -22,18 +22,20 @@
* 副本删除,set/get 转转发壳,壳保留清确认计数语义);
* 定值读写路由 = run_par 表先、prot_set 后(0x8020~
* 0x8058 运行参数段 C_RD/C_SE,系数覆盖直通 adc_cal)。
* 2026-10-26 DTU 项目组 道G task-8「UI 补齐」第 5 项非 UI 前置:本文件尾部
* 新增 [comm] 通讯参数段(ca/port,契约与实现位置理由
* 见 iec104_comm.h 文件头);s_src_yk_exec() 等遥控/
* 记录投递路径零改动。
* 2026-10-26 DTU 项目组 道G task-8「UI 补齐」第 5 项非 UI 前置:新增
* [comm] 通讯参数段(ca/port)初版落本文件尾部;
* s_src_yk_exec() 等遥控/记录投递路径零改动。
* 2026-10-26 DTU 项目组 同日晚纠偏:[comm] 实现整体迁出至配对模块
* iec104_comm.c(coding-standard CODE-RULE-17 (2.2)
* 按文件名配对判定,本文件的公开符号必须声明于
* iec104_pts.h——[comm] 不属点表,拆出正解;契约
* = iec104_comm.h,本文件不再引用 cfg_file)。
*/
#include "iec104_pts.h"
#include <string.h>
#include "iec104_asdu.h" /* QDS/DIQ 品质位常量 */
#include "iec104_comm.h" /* [comm] 段契约(本文件尾实现,道G task-8) */
#include "cfg_file.h" /* 段注册:引擎属主 = defaultTask,本文件只注册+消费 */
#include "meas.h" /* 板端源:遥测 = L2 遥测快照(卡 9;品质域位同源) */
#include "run_par.h" /* 卡 10:死区真源 + 运行参数段 104 读写路由 */
#include "prot_elm.h" /* 板端源:遥信 = 元件状态 */
@@ -678,108 +680,3 @@ static int s_src_set_write(uint32_t addr, float v, uint8_t select) {
}
return -1; /* 未知地址 */
}
/* ===========================================================================
* [comm] 通讯参数段(道G task-8):公共地址 CA + 被控站监听端口。
* 契约/线程约定/生效语义(改后重启生效,不挂回调不置事件位)→ iec104_comm.h。
* 引擎属主 = defaultTask:本段只被 cfg_file_load/save/poll 通用遍历,本文件
* 不触引擎任何写路径;内核前注册点 = app_main.c(「先注册后 load」契约,同
* adc_cal_init / run_par_init)。本目录(App/protocol)零日志惯例保持——
* 注册失败留痕由调用方 app_main.c 锚点负责,getter/setter 纯 RAM 不打日志
* (iec104Task 深链省栈,AGENTS 日志成本口径)。
* ========================================================================= */
/* [comm] RAM 副本(引擎原地更新;u16 半字对齐读原子,撕裂域 = 单字段新旧值) */
typedef struct {
uint16_t ca; /* 公共地址(= 链路地址,ASDU 头 2B,点表 §1.5 口径) */
uint16_t port; /* 被控站 TCP 监听端口 */
} iec104_comm_t;
static iec104_comm_t s_comm;
static const iec104_comm_t s_comm_rom = {
IEC104_COMM_DEF_CA, IEC104_COMM_DEF_PORT
};
/* 键表(s_comm 布局内偏移,同 net_cfg/ftp_cfg 写法) */
static const cfg_key_def_t s_comm_keys[] = {
{ "ca", CFG_VAL_UINT, offsetof(iec104_comm_t, ca), 2u },
{ "port", CFG_VAL_UINT, offsetof(iec104_comm_t, port), 2u },
};
/*
* 函数功能:置工厂默认并向引擎注册 [comm] 段(幂等,内核前)
* 返回值:0 注册成功;-1 重复注册/段数超限(RAM 副本已复位,adc_cal 同款) int
* 限定条件:先于 defaultTask 的 cfg_file_load;不挂回调(改后重启生效)
*/
int iec104_comm_init(void) {
cfg_section_reg_t reg;
(void)memcpy(&s_comm, &s_comm_rom, sizeof(s_comm));
(void)memset(&reg, 0, sizeof(reg));
reg.name = IEC104_COMM_SEC;
reg.p_data = &s_comm;
reg.p_defaults = &s_comm_rom;
reg.data_size = sizeof(s_comm);
reg.p_keys = s_comm_keys;
reg.key_count = (uint8_t)(sizeof(s_comm_keys) / sizeof(s_comm_keys[0]));
reg.p_cb = NULL; /* 不挂回调:iec104Task 启动读 getter(D5 口径) */
return cfg_file_register(&reg);
}
/*
* 函数功能:取生效公共地址
* 返回值:RAM 副本 ca,带外回退工厂默认;恒 ∈ IEC104_COMM_CA_MIN..MAX uint16_t
* 限定条件:无(任意上下文,纯读)
*/
uint16_t iec104_comm_ca(void) {
uint16_t v = s_comm.ca;
if ((v < IEC104_COMM_CA_MIN) || (v > IEC104_COMM_CA_MAX)) {
return IEC104_COMM_DEF_CA;
}
return v;
}
/*
* 函数功能:取生效监听端口
* 返回值:RAM 副本 port,带外回退工厂默认;恒 ∈ IEC104_COMM_PORT_MIN..MAX uint16_t
* 限定条件:无(任意上下文,纯读)
*/
uint16_t iec104_comm_port(void) {
uint16_t v = s_comm.port;
if ((v < IEC104_COMM_PORT_MIN) || (v > IEC104_COMM_PORT_MAX)) {
return IEC104_COMM_DEF_PORT;
}
return v;
}
/*
* 函数功能:写 ca 进 RAM 副本(守卫 = getter 同带;非法不提交)
* 入口参数:ca - 公共地址 uint16_t
* 返回值:0 提交;-1 带外(副本不动) int
* 限定条件:UI 保存交接路(task-9);落盘走 SYS_EVT_CFG_SAVE 整档外科 save
*/
int iec104_comm_ca_set(uint16_t ca) {
if ((ca < IEC104_COMM_CA_MIN) || (ca > IEC104_COMM_CA_MAX)) {
return -1;
}
s_comm.ca = ca;
return 0;
}
/*
* 函数功能:写 port 进 RAM 副本(守卫 = getter 同带;非法不提交)
* 入口参数:port - 监听端口 uint16_t
* 返回值:0 提交;-1 带外(副本不动) int
* 限定条件:同 iec104_comm_ca_set
*/
int iec104_comm_port_set(uint16_t port) {
if ((port < IEC104_COMM_PORT_MIN) || (port > IEC104_COMM_PORT_MAX)) {
return -1;
}
s_comm.port = port;
return 0;
}
+5
View File
@@ -992,6 +992,11 @@
<FileType>1</FileType>
<FilePath>..\App\protocol\iec104\iec104_link.c</FilePath>
</File>
<File>
<FileName>iec104_comm.c</FileName>
<FileType>1</FileType>
<FilePath>..\App\protocol\iec104\iec104_comm.c</FilePath>
</File>
<File>
<FileName>adc_input.c</FileName>
<FileType>1</FileType>
@@ -25,7 +25,8 @@
| ASDU 编解码 | `App/protocol/iec104/iec104_asdu.c/h` | 类型/COT 常量、ASDU 头、IOA 3B 小端、短浮点、CP56Time2a↔epoch | 零 |
| 点表/数据源 | `App/protocol/iec104/iec104_pts.c/h` | YC/YX/YK/定值表、COV(变位+死区)、**数据源 vtable**(板端绑 phasor/prot_*,单测绑假源) | 零(源注入) |
| 链路状态机 | `App/protocol/iec104/iec104_link.c/h` | TCP 流重组、U/S/I、k/w/t1/t2/t3、总召/突发/遥控/定值/对时编排 | 零(收=on_rx 喂流,发=回调,时基注入) |
| 板端胶水 | `App/task/iec104_serv.c/h`(随实现定名) | 2404 监听、数据通道收发、断链重听、netTask 驱动 | 全部(net_* API) |
| 板端胶水 | `App/task/iec104_serv.c/h`(随实现定名) | `[comm]` port 监听(工厂默认 2404)、数据通道收发、断链重听、netTask 驱动 | 全部(net_* API) |
| 通讯参数段 | `App/protocol/iec104/iec104_comm.c/h`(道G task-8) | `[comm]` 段注册 + ca/端口 getter 合法带自愈 / setter 守卫 | cfg_file 引擎(只注册不属主) |
> 三个纯逻辑模块 + 真实数据源(`App/algo/` 全纯逻辑)可整体在主机侧编译 →
> L0.5 单测覆盖**全协议栈**(`test/host/iec104/`),与 `test/host/prot_elm/` 同模式。
+3 -2
View File
@@ -173,8 +173,9 @@ write=1
### 3.6 `[comm]` 段:IEC 60870-5-104 通讯参数(2026-10-26 新增,「UI 补齐」卡 5 非 UI 前置,道G task-8)
104 被控站的公共地址与监听端口持久载体(段属主 = `App/protocol/iec104/`,键表与
合法带见 `App/protocol/iec104/iec104_comm.h`,注册 `iec104_comm_init()` 在
104 被控站的公共地址与监听端口持久载体(段属主 = `App/protocol/iec104/` 配对模块:
工厂默认与合法带见 `iec104_comm.h`、键表与实现见 `iec104_comm.c`;注册
`iec104_comm_init()` 在
`app_main_init()` 内核前——「先注册后 load」契约同 [adc_cal] / [run_par]):
| 键 | 含义 | 工厂默认 | getter 合法带(带外自愈回默认) |
@@ -155,7 +155,7 @@ mac=00:00:00:00:00:00
| `Lib/FatFs/ffconf.h` | 修改 | MCU | `FF_FS_REENTRANT` 0→1;`FF_FS_NORTC` 1→0 |
| `App/util/sys_clock.c/.h` | 修改 | MCU | 新增 `sys_clock_get_time()`(日历时间获取器);改归 ④中间件层,自 `App/` 移入 `App/util/` |
| `Drivers/BSP/NETCFG/net_cfg.h/.c` | 重构 | 双端 | `net_cfg_*` API 不变;load/save 走 cfg_file;注册 `[network]` 段 |
| `App/protocol/iec104/iec104_comm.h` + `iec104_pts.c` 尾段 | 新增(2026-10-26 道G task-8) | MCU(模拟器不编 protocol) | 注册 `[comm]` 段(104 ca/端口,ca 1..65535 / port 1024..65535 合法带 getter 自愈);内核前 `iec104_comm_init()` 注册(同 [adc_cal]/[run_par] 先注册后 load 契约);生效 = 改后重启(键表与理由 → `docs/子系统设计/网络配置说明.md` §3.6) |
| `App/protocol/iec104/iec104_comm.h/.c` | 新增(2026-10-26 道G task-8) | 双端(模拟器编译但无消费路径) | 配对模块注册 `[comm]` 段(104 ca/端口,ca 1..65535 / port 1024..65535 合法带 getter 自愈);内核前 `iec104_comm_init()` 注册(同 [adc_cal]/[run_par] 先注册后 load 契约);生效 = 改后重启(键表与理由 → `docs/子系统设计/网络配置说明.md` §3.6);**不走 scripts 白名单**——`.c` 按 new-source-file 口径同笔进 uvprojx + `simulator/CMakeLists.txt` |
| `Drivers/BSP/NETCFG/net_cfg_legacy.c` | **已删除**(2026-10-10;曾于 P3 新增) | — | 旧 NCFG blob 解析 + 迁移;随"不保留旧档兼容"整体移除(见 §9.1) |
| `Drivers/BSP/NETCFG/net_cfg_store.h` / `net_cfg_store_mcu.c` | **删除** | — | 由 `cfg_file_store.*` 取代 |
| `simulator/sim/net_cfg_store_sim.c` | **删除** | 模拟器 | 由 `cfg_file_store_sim.c` 取代 |
@@ -588,4 +588,4 @@ void adc_cfg_init(void)
| 2026-10-03 | v1.13:**真机验证 PASS(A1 闭环)**——v1.11 的 P0-1 堆分配改造在真机上验证通过:`[CFG] load: OK (523B, heap free 8840B)`(**经 FreeRTOS 堆分配**,即 512B C 堆约束的验收点);Forbidden `FAIL`/`[ERR]` 零命中;FTP 改配置 IP→`192.168.1.101` 后**复位即加载生效**(`[NET_CFG] load: OK ip=192.168.1.101` + 芯片 `IP_INF` .101 + 21 端口探测可达),原档恢复后复测回 .100。真机全闭环 `@test` PASS 7/7。**台架步骤与判据见 `测试说明/实机测试实施指南.md` §3 / §10** |
| 2026-10-04 | **P0-1 真机独立复跑 PASS(二次确认,代码零改动)**——`@build` 0/0(增量,无源文件新于镜像)→ `@test` **VERDICT PASS(rc=0)**:`[2026-10-04 00:01:21][CFG] load: OK (523B, heap free 8840B)` + `[NET_CFG] load: OK ip=192.168.1.100`,Forbidden `FAIL`/`ERROR`/`HardFault`/`[ERR]` 零命中,`selftest: no fault record`(先清掉 2026-10-02/03 故障注入窗口遗留的 67 条台账)→ ST-LINK 全片回读 `No difference found`(`0x08000000~0x08040F9B`)。**本次为 `待处理内容.md` §4.1「待验证」唯一未闭环项(P0-1)的收口**,该节现已清空 |
| 2026-10-10 | v1.14:**删除旧档 NCFG 迁移(D10 撤销)**——`Drivers/BSP/NETCFG/net_cfg_legacy.{c,h}` 整体移除、`cfg_store_legacy_path()` 撤销(MCU / 模拟器后端与主机单测 `test/host/cfg_file/cfg_file_test.c` 同步删除),`net_cfg_load` 不再调用 `net_cfg_legacy_migrate()`;旧档 `/cfg/netcfg.bin` 若存在则被**忽略**(不读、不删、不迁移),配置回落工厂默认。理由:该一次性路径把整条配置写链挂进启动期调用图,defaultTask 静态最坏栈链 **+600 B**(该链整体 5312 → 2776 B,另三个杠杆见 `docs/内存管理/RAM使用分析与优化方案.md`),而本仓库不存在携带旧档的设备。连带影响:`App/util` 的 CRC-16/MODBUS 失去唯一调用者(现为零调用者);模拟器 `--cfgtest` 不再覆盖迁移场景;§2 D10 / §3.5 / §4.2 / §5.1 / §6.2 / §6.4 / §7 / §9 / §11.1 同步 |
| 2026-10-26 | v1.15:**新增 `[comm]` 段(道G task-8,「UI 补齐」卡 5 非 UI 前置)**——`App/protocol/iec104/iec104_comm.h` 契约 + `iec104_pts.c` 尾段注册(104 公共地址 / 监听端口 2 键,getter 合法带自愈,adc_cal 先例);内核前 `iec104_comm_init()` 注册([adc_cal] / [run_par] 同「先注册后 load」契约);生效 = **改后重启**(不挂回调、不新增事件位,区别于 [network] 免重启重建);段占位 5→6 / 8,键表与主站地址不做理由 → `docs/子系统设计/网络配置说明.md` §3.6;机器钉 = `test/host/cfg_file` TC-CONFIG-056/057(段/键上限)+ `test/host/iec104` TC-IEC104-031~033(模板/重载/带外/ca 端到端)
| 2026-10-26 | v1.15:**新增 `[comm]` 段(道G task-8,「UI 补齐」卡 5 非 UI 前置)**——`App/protocol/iec104/iec104_comm.h/.c` 配对模块(104 公共地址 / 监听端口 2 键,getter 合法带自愈,adc_cal 先例);内核前 `iec104_comm_init()` 注册([adc_cal] / [run_par] 同「先注册后 load」契约);生效 = **改后重启**(不挂回调、不新增事件位,区别于 [network] 免重启重建);段占位 5→6 / 8,键表与主站地址不做理由 → `docs/子系统设计/网络配置说明.md` §3.6;机器钉 = `test/host/cfg_file` TC-CONFIG-056/057(段/键上限)+ `test/host/iec104` TC-IEC104-031~033(模板/重载/带外/ca 端到端)
+9 -1
View File
@@ -57,6 +57,7 @@ include_directories(
# 声明宿主安全;2026-09-21 修复模拟器构建断链;
# 2026-10-02 测试目录重构后头文件移入 test/board/)
${PROJECT_ROOT}/App/cfg # cfg_file.h / cfg_file_store.h(通用配置文件引擎,双端共享核心)
${PROJECT_ROOT}/App/protocol/iec104 # iec104_comm.h([comm] 段契约头,供 IEC104_SOURCES 编译;道G task-8)
${PROJECT_ROOT}/App/log # sys_log.h(运行/自检记录引擎,双端共享核心)
${PROJECT_ROOT}/App/algo # prot_set.h(定值模型纯算法,双端共享核心;见 ALGO_SOURCES)
${PROJECT_ROOT}/Drivers/BSP # dbg_log.h(使用 simulator 的 dbg_cfg.h 配置)
@@ -133,6 +134,13 @@ set(ALGO_SOURCES
${PROJECT_ROOT}/App/algo/prot_set.c
)
# IEC 104 [comm] 配置段(道G task-8):模拟器运行期不跑 104 任务、无消费路径,
# 本 TU 仅为双端注册事实一致而编译(iec104 其余 .c 走 scripts 白名单逐个点名,
# 白名单是门禁地盘不在这里扩——新配对模块按 new-source-file 口径进显式源列表)。
set(IEC104_SOURCES
${PROJECT_ROOT}/App/protocol/iec104/iec104_comm.c
)
# 网络后端(net_* 核心 API 的 Winsock 实现 + UI 推流平台后端;MCU 端另编 net_socket.c 与 _mcu 后端)
set(NET_SOURCES
sim/net_socket_sim.c
@@ -142,7 +150,7 @@ set(NET_SOURCES
#=============================================================================
# 构建可执行文件
#=============================================================================
add_executable(lvgl_sim WIN32 ${SIM_SOURCES} ${UI_SOURCES} ${NETCFG_SOURCES} ${SYSLOG_SOURCES} ${NET_SOURCES} ${ALGO_SOURCES})
add_executable(lvgl_sim WIN32 ${SIM_SOURCES} ${UI_SOURCES} ${NETCFG_SOURCES} ${SYSLOG_SOURCES} ${NET_SOURCES} ${ALGO_SOURCES} ${IEC104_SOURCES})
target_compile_definitions(lvgl_sim PRIVATE
LV_CONF_INCLUDE_SIMPLE # 让 lvgl.h 找到 lv_conf.h
+2
View File
@@ -4,6 +4,7 @@
*
* 被测对象:真实源文件(#include 原样纳入):
* iec104_asdu.c + iec104_pts.c + iec104_link.c(B4 协议核心)
* + iec104_comm.c(道G task-8 [comm] 段,真链注册)
* prot_set.c + prot_elm.c + phasor.c + sample_ring.c(板端默认源
* 的链接依赖;定值两段写走**真实 prot_set**)
* 数据源经 iec104_pts_bind_src 注入假源(YC/YX/YK 可控),
@@ -248,6 +249,7 @@ int g_dbgstub104_info_count = 0;
int g_dbgstub104_debug_count = 0;
#include "cfg_file.c"
#include "iec104_comm.c" /* 道G task-8:[comm] 段(配对模块,注册走真引擎) */
#include "adc_cal.c"
#include "run_par.c"
#include "prot_elm.c"
+1 -1
View File
@@ -192,7 +192,7 @@ static int g_pts_init;
void iec104_pts_init(void) { g_pts_init++; }
/* ===================== [comm] getter 桩(道G task-8) =====================
* 真 getter(合法带自愈)在 iec104_pts.c,由 test/host/iec104 真链套
* 真 getter(合法带自愈)在 iec104_comm.c,由 test/host/iec104 真链套
* TC-IEC104-031~033 覆盖;本套只钉 serv 的**取值来源**:端口每次 bind 现取、
* ca 任务启动取一次。 */
static uint16_t g_comm_ca = IEC104_COMM_DEF_CA;