Files
STM32F4-Base/App/task/iec104_serv.h
T
wandering1 728d60675f feat(UI/采集/104): 通讯设置页 + 开机账本 + adc_cal 可诊断化——三车道同树一次构建入库
三条道在同一棵树上交付,故合并成**一次权威构建**(@build 0 错 0 警,Code=235236 RO=26308 RW=1572
ZI=136924)后同笔入库;台账已按该构建回填(`ram_baseline.py --update` + `--write`、`chec
k_mem_numbers.py
 --write`),凭证与实际 .map 同源。归属如下:

· **通讯设置页**(道G task-9):新增 `Drivers/BSP/UI/ui_page_comm.{c,h}`(通道六注入,与死
区页同骨架同纪
  律),`#page=comm` 绑定使 bound **21 → 22**、内容页黄金 **47 → 53**(旧 47 页字节零变化,
新增六态含
  WAIT/OK 两张);`iec104_comm` 脏位 + store_save(**无事件位**)挂 defaultTask 同点位
轮询;`port_104` 由
  宏改走 getter、`IEC104_SERV_PORT` 删除;字体 +听/监(185 字全覆)。**实机链已闭环**:FTP 外改
[comm]
  的 ca/port → 复位 → 串口出现 `section 'comm' (2 keys)` 与 `i104: listening o
n 9004` → 还原 2404,全程无
  FAIL ⇒「重启即生效 + 端口真值」不是推断是实测。上限核对 6/8 段、2/16 键,超限现象由 TC-CONFIG-056/057
  钉死(注册 -1 + `comm init: FAIL` 锚 + getter 回 ROM),**不抬宏**。
· **开机账本**(道F task-12):新增 `App/util/boot_stats.{c,h}`——上电次数落 SD2506 用户
 SRAM(magic +
  小端计数 + 版本 + 异或校验),一次上电 = 1 读 + ≤1 写,**零 NAND、零卷锁、零配置段**;四态互斥
  UNKNOWN / FRESH / CONTINUED / RESTARTED(BLF=1 才算电池域掉过电),**读失败绝不回写**;
文案口径「自 RTC
  电池周期起」,**禁写终身次数**。复位原因优先级链从 `app_main.c` 的 if-else 收进一份真源(串口与屏幕同
  源);104 四个只增不清计数 + `iec104_serv_get_stats()` 留在 serv、未塞进 link(会被 open
/close 洗掉)。
  运行时长按用户裁定 = **只报本次开机以来**,零新增代码。新套件 `test/host/boot_stats` 21/21,五处注入
  **全部有牙**(含「漂一字节被校验和挡下而不是报 256 倍错账」)。
· **adc_cal 可诊断化**(道E task-43):三个 volatile 计数 + `adc_cal_get_stats()`
/ `adc_cal_note_persisted()`
  (水位**盖写非自增**,因为一次 save 覆盖整档,数 save 会留假未落盘);「差额 × 脏位」三态语义唯一落在
  `adc_cal.h`,其中「差额 > 0 且脏位恒 0」= 绕过语义 setter 的静默丢失;TC-ADCCAL-019~023。

三条**必须留档的自纠**(都是执行道自己报的,我不替他们润色):
① stdint 那条断链是**宿主套件抓到、通讯道先修**,采集道承认自己是重复添加者并删掉自己那份;
② 「exit 2 不是证据,断言变红才是」——采集道第一版反证注入了未声明标识符导致编译错,差点当成功;
③ 套件汇总行原写 `s_total/s_total`,失败时会打印「21/21 PASSED (failed=1)」这种自相矛盾的行,已改。

另修:`check_registration.py` 的 `SIM_EXEMPT` 加一行豁免 `App/util/boot_stats.c
`(依赖 I2C 与 RCC 位掩码,
MCU 专属;核过 `sys_clock.c`/`sha256.c` 同形态先例),注册反向校验 exit 1 → 0。发号 TC-IEC1
04-034、
TC-UIDATA-029 已实抬游标(`TC-IEC104-033→034`、`TC-UIDATA-026→029`)。

门禁:id-check --strict 与 plain 均 rc=0、doc-links --all rc=0、注册校验 0、cppche
ck / coding-standard /
bom-drift 0;iec104 179/179、ui_data 295/295、boot_stats 21/21、adc_cal 11
7/117、run_par 67/67;菜单 8 状态
池 5368 不变、内容页 53/53。**已知遗留**:内容页数 47 → 53 的全仓文本同步尚未做(另卡跟踪),本笔只保
证代码与黄金一致;面板注键真机那一腿缺 CLI,交台架道补。
2026-10-27 11:29:23 +08:00

56 lines
2.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 模块名称:IEC 60870-5-104 被控站服务(对外接口)
* 模块功能:声明 iec104Task 任务体与监听端口;协议实现在 App/protocol/iec104/,
* 本接口仅供 Src/freertos.c 创建任务使用。
* 创建日期:2026-10-12(B4)
*/
#ifndef IEC104_SERV_H
#define IEC104_SERV_H
#include <stdint.h> /* uint32_t(观测计数声明):头文件自含——2026-10-27 @build 实测
* 本头此前全靠包含者先带 stdint,feed 换 include 即断链报 #20 */
/* 监听端口的宏出口已删除(道G task-9 收口 task-8 交接痕):运行期真源 =
* [comm] 段 getter(App/protocol/iec104/iec104_comm.h 的 iec104_comm_port(),
* 工厂默认 IEC104_COMM_DEF_PORT = 2404 = DL/T 634.5104 标准端口)。 */
/*
* 函数功能:iec104Task 任务体(在 Src/freertos.c USER CODE 区 osThreadNew 创建)
* 入口参数:argument - 未用
* 返回值:无(任务不返回)
*/
void iec104_serv_task(void *argument);
/*
* 104 只读观测计数(道G task-12):四个数都是**上电以来**、跨重连不清零,语义各自
* 独立、不得互相换算:
* conn_up = 主站接入次数(accept 成功并建立协议层链路)
* apdu_tx = 成功发出的 APDU 帧数(短写算 tx_fail,不算这里)
* tx_fail = 发送短写/失败次数(含拆链前那几次连败)
* rx_bytes = 收到的**字节**数(不是帧数:帧边界在 link 层重组,serv 看不见)
* ⚠ 与 App/task/iec104_serv.c 里 s_liveness_ctr / s_send_fail_run / s_conn_dead 三枚
* **控制量**无关:那三枚会被复位、只有 8 位,为"要不要拆链"服务,拿来当统计必错。
* 到顶饱和在 0xFFFFFFF0,不回绕(回绕成个位数会被读成"刚上电")。
* 页面这一栏要写「本次开机以来」,与运行时长同一类,别让人读成终身值。
*/
typedef struct {
uint32_t conn_up;
uint32_t apdu_tx;
uint32_t tx_fail;
uint32_t rx_bytes;
} iec104_serv_stats_t;
/*
* 函数功能:读 104 观测计数(纯拷字段)
* 入口参数:p_out - 输出缓冲;NULL 时无害返回 iec104_serv_stats_t *
* 返 回 值:无 void
* 限定条件:**任意上下文可读**——不取锁、不读时刻、不碰 socket、不阻塞(照
* adc_cal_get_stats() / boot_stats_get() 的形态:观测口一旦去抢总线或等锁,
* 观测就成了故障的一部分)
* 函数说明:写者 = iec104Task,读者 = uiTask/喂数据侧;u32 单字读写原子,跨字段
* **不保证同一瞬间**——四枚之间没有"合起来才成立"的判据,混窗对显示无害。
* 本函数无任何清零能力(能清零的统计口不是统计口)。
*/
void iec104_serv_get_stats(iec104_serv_stats_t *p_out);
#endif /* IEC104_SERV_H */