/* * 模块名称:IEC 60870-5-104 通讯参数段([comm] 配置)公共接口 * 模块功能:/config.ini [comm] 段的对外契约——公共地址(CA = ASDU 公共地址, * 2B)与被控站 TCP 监听端口的工厂默认、getter/setter 与合法带。 * 实现 = 配对文件 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 * 半字对齐读天然原子,重载瞬间最坏 = 单字段新旧值之一);setter = * UI 保存交接路(task-9,net_cfg_set_* 先例)。 * 生效语义:**改后重启生效**(docs/任务规划/UI补齐.md §2 第 5 行验收口径)—— * iec104Task 启动时取一次 getter 填 link cfg;端口另在下次重 bind * (拆链/网络代次重建)自然生效,不必整机重启。不挂段回调、不新增 * 事件位、不走 SYS_EVT_NET_RECONFIG(网络代次链语义不同;且 CH395F * 单连接 socket 上"换端口/拒绝重听"= close + re-listen,扫描主机 * 可打成风暴,详见 docs/子系统设计/IEC104上行设计说明.md §8)。 * 主站地址(accept 过滤)本卡**不做**:现无既有消费点,理由同上 §8。 * 创建日期:2026-10-26(道G task-8,「UI 补齐」第 5 项非 UI 前置) */ #ifndef IEC104_COMM_H #define IEC104_COMM_H #ifdef __cplusplus extern "C" { #endif #include /* 段名(cfg_file 引擎注册用;≤ CFG_FILE_MAX_NAME_LEN) */ #define IEC104_COMM_SEC "comm" /* 工厂默认:CA = 1(点表口径,V0.1 沿用);端口 = 2404(DL/T 634.5104 标准, * 与 App/task/iec104_serv.h 的 IEC104_SERV_PORT 同值——该宏现仅作 * ui_data_feed 快照兼容出口保留,运行期真源 = 本段 getter) */ #define IEC104_COMM_DEF_CA 1u #define IEC104_COMM_DEF_PORT 2404u /* getter 合法带(带外 = RAM 副本被直写/手改时的自愈回退,adc_cal「合法带哨兵」 * 同款先例): * ca 1..65535:0 为非法公共地址(104 半字地址域,点表无 0 号站) * port 1024..65535:拒绝把监听端口配到 1..1023 系统保留段,避免误配顶掉 * 系统服务;与 8888/7003 带内相撞属配置者责任(启动锚点 * "i104: listening on %u" 打印实际端口,可核) */ #define IEC104_COMM_CA_MIN 1u #define IEC104_COMM_CA_MAX 65535u #define IEC104_COMM_PORT_MIN 1024u #define IEC104_COMM_PORT_MAX 65535u /* * 函数功能:置工厂默认并向配置引擎注册 [comm] 段(幂等,内核前调用) * 返回值:0 - 注册成功;-1 - 重复注册/段名冲突/段数超限(RAM 副本已复位 * 工厂默认,引擎侧仍按既有注册表工作) int * 限定条件:必须先于 defaultTask 的 cfg_file_load(net_cfg_load 内); * 重复调用 = 仅复位 RAM 副本(单测复位依赖此语义,adc_cal 同款) * 函数说明:不挂变更回调(改后重启生效口径,见文件头) */ int iec104_comm_init(void); /* * 函数功能:取生效公共地址(消费点 = iec104Task 启动填 link cfg) * 返回值:RAM 副本 ca,带外回退 IEC104_COMM_DEF_CA;恒 ∈ 1..65535 uint16_t * 限定条件:无(任意上下文,纯读) */ uint16_t iec104_comm_ca(void); /* * 函数功能:取生效监听端口(消费点 = iec104_serv s_bind_listen + 启动日志) * 返回值:RAM 副本 port,带外回退 IEC104_COMM_DEF_PORT;恒 ∈ 1024..65535 uint16_t * 限定条件:无(任意上下文,纯读) */ uint16_t iec104_comm_port(void); /* * 函数功能:写 ca 到 RAM 副本(守卫 = getter 合法带;非法值不提交) * 入口参数:ca - 公共地址 1..65535 uint16_t * 返回值:0 - 提交;-1 - 带外(副本不动) int * 限定条件:调用方 = UI 保存交接路(task-9);落盘经 SYS_EVT_CFG_SAVE * 整档外科 save(net_cfg_save_request 同款交接,本模块不写盘) */ int iec104_comm_ca_set(uint16_t ca); /* * 函数功能:写 port 到 RAM 副本(守卫 = getter 合法带;非法值不提交) * 入口参数:port - 监听端口 1024..65535 uint16_t * 返回值:0 - 提交;-1 - 带外(副本不动) int * 限定条件:同 iec104_comm_ca_set */ int iec104_comm_port_set(uint16_t port); #ifdef __cplusplus } #endif #endif /* IEC104_COMM_H */