RTU_ALL_AI/docs/system/libiec/API-libiec.md

9.6 KiB
Raw Permalink Blame History

API-libiec — IEC 60870-5-104 服务端模块

版本: v1.0 日期: 2026-07-10 来源: 基于原工程 12 个 IEC 子文件聚合重构 状态: 已实现x86 + ARM 双平台编译通过(零警告)


1. 模块概述

libiec 是 RTU 通讯装置的 IEC 60870-5-104 服务端(从站)模块,作为 X-Macro 框架的线程模块运行。通过 com_routerbind_app="iec" 机制接收 TCP :2404 端口的主站连接数据,底层协议栈复用 lib60870 自研库。

功能 说明
IEC-104 从站协议 支持 CS101 / CS104 两种链路类型
并发连接管理 最多 3 路并发主站连接 (MAX_IEC_NUM=3),槽位复用
超时回收 链路 600s 无活动自动回收 slot
XML 点表解析 config/IEC60870/iec1014.xml 解析 St/Mx/Co/Dd/Ao/Param 六类信号
数据中心桥接 信号变更回调自动写入 SOE/扰动遥测/故障/电度环形缓冲区
多主站分发 环形缓冲区多出指针 (out_ptrs),每路连接独立消费位置
MQ 桥接 COM_TO_IEC / IEC_TO_COM 双队列,通过 com_router 转发
26 个 CS10x 回调 完整实现总召、遥测、遥控、电度、参数、定值、文件传输、扰动

架构

com_router (bind_app=iec)
    │
    ▼  MQ_COM_TO_IEC
iec104_data_rx()
    │
    ▼
CS10x_104Init / CS10x_DoRecv
    │
    ▼  ┌──────────────────────────────────────────┐
    │  │  26 个回调 (protocol_register_callbacks)  │
    │  │  ┌──────────┐ ┌──────────┐ ┌──────────┐  │
    │  │  │总召/遥信 │ │遥测/电度 │ │遥控/参数 │  │
    │  │  │定值/对时 │ │故障/扰动 │ │文件传输  │  │
    │  │  └──────────┘ └──────────┘ └──────────┘  │
    │  └──────────────────────────────────────────┘
    │
    ▼  MQ_IEC_TO_COM → com_router → TCP → 主站

与原工程对比

维度 原工程 (12 文件) 重构后 (3 文件)
文件数 12 3 (~75% 减少)
代码行数 ~2500+ 1474
槽位管理 分散在多文件 统一 g_iec[MAX_IEC_NUM]
环形缓冲区 5 个独立结构体 4 个模板化 ring_*_t (sem + out_ptrs)
回调注册 分散初始化 protocol_register_callbacks() 集中
命令支持 CMD_REGISTER_C 测试命令
EV_STOP 支持优雅退出

2. 文件结构

src/system/libiec/
├── inc/
│   ├── iec104.h          # 公共头: stru_iec, iec_soe_info_t, iec_yc_info_t, API 声明
│   └── iec104_cfg.h      # 点表配置: stru_iec_sig, stru_iec_cfg
└── src/
    ├── iec104.cpp         # CS10x 初始化 + slot 管理 + 26 回调 + 收发桥接 (1252行)
    ├── iec104_cfg.cpp     # XML 点表解析 (148行)
    └── iec104_point.cpp   # 数据中心桥接 — 信号变更回调 → 环形缓冲区 (290行)

release/
└── {x86,arm}/lib/
    └── libiec.a           # 编译产物

3. 核心数据结构

3.1 槽位结构 (stru_iec)

每路并发连接占用一个槽位,全局数组 g_iec[MAX_IEC_NUM] (MAX_IEC_NUM=3)

字段 类型 说明
is_busy uint8_t 槽位占用标志0=空闲
iec_type CS10x_Type CS104_TYPE_S / CS101_TYPE_S
interface uint32_t 通道唯一标识 (ch_id<<16 | fd)
tm_out uint32_t 超时计数器 (ms),超过 600s 自动回收
rx[IEC_BUF_SIZE] uint8_t[1024] 接收缓冲区
tx[IEC_BUF_SIZE] uint8_t[1024] 发送缓冲区
pub[IEC_BUF_SIZE] uint8_t[1024] 自主上传缓冲区 (总召/扰动)
bak[IEC_BUF_SIZE] uint8_t[1024] 备用缓冲区
cs10x CS10x lib60870 协议栈句柄

3.2 环形缓冲区

4 个环形缓冲区均带独立信号量 (sem_t) 和多出指针 (out_ptrs),支持多主站并发消费:

缓冲区 容量 记录类型 用途
g_soe_ring 300 SOE (时标+状态) 遥信变位事件
g_yc_ring 200 扰动遥测 (idx+val) 遥测越限扰动
g_fault_ring 200 故障 (SOE+遥测) 故障录波事件
g_dd_ring 50 电度 (CP56Time2a+val) 电度累计

3.3 点表配置 (stru_iec_cfg)

config/IEC60870/iec1014.xml 解析6 类信号向量:

向量 信号类型 IOA 起始 默认类型
vec_st 遥信 (St) 0x0001 DATA_TYPE_U8
vec_mx 遥测 (Mx) 0x4001 DATA_TYPE_F32
vec_co 遥控 (Co) DATA_TYPE_U8
vec_dd 电度 (Dd) 0x6401 DATA_TYPE_F32
vec_ao 参数 (Ao) 无默认 (XML 必须指定)
vec_param 定值 (Param) 无默认 (XML 必须指定)

每条信号 (stru_iec_sig) 含: link (数据中心路径), desc (描述), inf (IOA), type (数据类型), invert (遥信取反), factor/offset (遥测系数偏移), p_data (数据指针)。


4. API 参考

4.1 公共头 API (iec104.h)

函数 功能 参数 返回值
iec104_get_by_interface() 按 interface 查找 IEC 实例 uint32_t interface stru_iec * 或 NULL
iec104_data_rx() MQ 数据入口 (从 com_router 接收) uint8_t *msg 0=成功, -1=失败
iec104_task() 10ms 定时器处理 uint16_t gap (恒10) void

4.2 线程入口

函数 功能 说明
app_iec_init1() 第一阶段初始化 解析 XML 点表 (iec_cfg_parse)
app_iec_init2() 第二阶段初始化 注册数据中心回调 (iec104_point_init)
app_iec() 主循环 while(1) 收 MQ_COM_TO_IEC + 10ms 定时处理

4.3 点表 API (iec104_cfg.h)

函数 功能 参数 返回值
iec_cfg_ptr_get() 获取全局配置指针 void stru_iec_cfg *
iec_cfg_parse() 解析 XML 点表文件 const char *xml_path 0=成功, -1=失败

4.4 环形缓冲区回调 (iec104_point.cpp → iec104.cpp)

函数 功能
cb_soe_write() 写入 SOE 记录 (遥信变位)
cb_yc_disturb_write() 写入扰动遥测记录
cb_dd_disturb_write() 写入电度记录
cb_fault_write() 写入故障事件记录

5. CS10x 回调清单 (26 个)

5.1 时间 & 初始化 (4)

回调 功能 CS10x 注册
cb_get_time 获取当前时间 (CP56Time2a) 时钟回调
cb_set_time 设置系统时间 (对时) 时钟回调
cb_104init_callback 接收 CS104 初始化完成通知 104 专用
cb_tm_send_result 对时报文发送结果通知 COI 回调

5.2 总召 (3)

回调 功能
cb_st 遥信总召 — 遍历 vec_st 打包 SQ=1 报文
cb_mx 遥测总召 — 遍历 vec_mx 打包浮点报文
cb_dd 电度总召 — 遍历 vec_dd 打包 CP56Time2a 报文

5.3 遥控 (5)

回调 功能
cb_yk_set 遥控选择/执行 — 遍历 vec_co 查找 IOA, 写入 datacenter
cb_yk_confirm_func 遥控确认回调
cb_yk_termination_func 遥控终止回调
cb_yk_order_func 遥控命令通知
cb_yx_over_time_confirm_func 遥信超时确认

5.4 参数 & 定值 (4)

回调 功能
cb_param_get_func 参数 (Ao) 读取 — 遍历 vec_ao
cb_param_set_func 参数 (Ao) 设置 — 写 datacenter
cb_offset_get_func 定值 (Param) 读取 — 遍历 vec_param
cb_offset_set_func 定值 (Param) 设置 — 写 datacenter

5.5 扰动 & 故障 (5)

回调 功能
cb_dir_num 目录数量查询
cb_soe_ring_get_one 从 SOE 环形缓冲区读取一条
cb_yc_ring_get_one 从扰动遥测环形缓冲区读取一条
cb_fault_ring_get_one 从故障环形缓冲区读取一条
cb_dd_ring_get_one 从电度环形缓冲区读取一条

5.6 文件传输 (5)

回调 功能
cb_file_read 文件读回调
cb_file_write 文件写回调
cb_file_wr_finish 文件写入完成回调
cb_file_call_func 文件服务调用
cb_dir_num 目录服务 (与扰动共用)

6. MQ 消息流

主站 → TCP :2404 → com_router (bind_app=iec)
  → MQ_COM_TO_IEC
    → app_iec() 主循环收
      → CS10x_DoRecv()
        → 对应回调 → datacenter

datacenter 信号变更 (St/Mx)
  → on_st_change / on_mx_change 回调
    → cb_soe_write / cb_yc_disturb_write → 环形缓冲区

总召/扰动触发:
  → iec104_data_tx() → MQ_IEC_TO_COM
    → com_router → TCP → 主站

7. 配置依赖

配置文件 用途
config/CHANNEL/channel_cfg.json TCP :2404 配置 bind_app="iec"
config/IEC60870/iec1014.xml IEC 点表 (St/Mx/Co/Dd/Ao/Param)
config/SYSTEM/app_config.json X-Macro 框架启停控制

8. 已知限制

  • 扰动文件 (COMTRADE) 上传/下载: 回调已注册但无实际文件系统实现
  • 遥控执行超时: 使用固定 30s 超时,不支持配置
  • 缓冲区满: 环形缓冲写满后丢弃最早记录 (无 overflow 告警回调)
  • 只有 IEC-104 从站模式,未实现主站模式 (CS10x_Type 预留 CS104_TYPE_M/CS101_TYPE_M)