IEC60870-Slave
IEC 60870 子站协议库,当前提供 IEC104 子站、Windows TCP 后端、总召、计数量召唤、Type 103时钟同步,以及Type 45–51遥控/遥调和Type 58–64带时标命令。101/104 可复用的 ASDU、信息对象、时间工具及子站应答接口集中在公共目录。
目录结构
按职责归档,同一模块的 .c 和 .h 放在一起:
IEC60870-Slave/
├── 104/ # IEC104 专用协议代码
│ ├── IEC104_Slave.c/h # 子站统一入口
│ ├── business/ # 104业务模块
│ │ ├── IEC104_Interrogation.c/h # 共用召唤引擎
│ │ ├── IEC104_Interrogation_Internal.h # 引擎与种类规则的私有接口
│ │ ├── IEC104_GeneralInterrogation.c/h # 站总召、分组总召规则
│ │ ├── IEC104_CounterInterrogation.c/h # 计数量读取、冻结与复位
│ │ ├── IEC104_ClockSynchronization.c/h # 校时校验、显式动作与确认
│ │ └── IEC104_Command.c/h # 遥控/遥调、带时标命令、选择执行与返回信息
│ ├── IEC104_TcpServer.c/h # TCP 服务与事件调度
│ ├── IEC104_Connection.c/h # 连接协调
│ ├── IEC104_Link*.c/h # 链路、主站/子站启停
│ ├── IEC104_Send*.c/h # 发送管理与缓冲
│ ├── IEC104_AsduQueue.c/h # ASDU 队列
│ ├── IEC104_Receiver.c/h # 流式接收
│ ├── IEC104_Codec.c/h # APCI 编解码
│ ├── IEC104_Net.h / IEC104_Net_Windows.c # 网络接口与 Windows 后端
│ └── IEC104*.c/h # 类型、容量配置、日志及旧接收入口
├── common/ # 101/104 公共代码
│ ├── IEC60870_Types.h # 公共类型及应用层参数
│ ├── IEC60870_Codec.c/h # ASDU 公共头编解码
│ ├── IEC60870_Asdu.c/h # ASDU 容器
│ ├── IEC60870_InformationObjects*.c/h # 信息对象
│ ├── IEC60870_Slave.c/h # 公共子站应答接口
│ └── IEC60870_Time.c/h / IEC60870_Clock.c/h # 时间工具与时钟接口
├── examples/ # 应用示例
│ └── iec104_slave_example.c # 模拟点表、业务分派与程序入口
├── test/ # 测试源码与主机脚本
│ ├── iec104_*_test.c # 104 传输、调度、子站及业务测试
│ ├── iec60870_*_test.c # 公共 ASDU 与信息对象测试
│ └── slave_example_loopback_test.cjs # 真实 TCP 回环测试
├── docs/ # 设计、接口、示例及测试说明
│ ├── README.md # 文档索引与推荐阅读顺序
│ ├── 104/ # 104 设计及接口说明
│ ├── common/ # 公共模块说明
│ ├── examples/ # 示例使用说明
│ └── test/ # 测试说明与验证记录
├── scripts/ # 构建脚本
│ └── build.ps1 # 构建示例,-Test 运行业务回归、容量矩阵及回环
├── .build/ # 本地构建及验证产物(运行脚本后生成)
└── README.md # 项目总览
构建与测试
在项目根目录的 PowerShell 中执行,需要 MinGW GCC;-Test 还需要 Node.js:
./scripts/build.ps1
./.build/slave-example/iec104_slave_example.exe
# 运行示例业务回归和真实 TCP 回环测试
./scripts/build.ps1 -Test
脚本按自身位置定位项目,可从其他工作目录调用。构建产物统一写入项目根目录的 .build/。
-Test 包含独立的 test/iec104_command_test.c:TCP服务容量1/2与遥控独立应答槽容量1/4组合成四组构建,HIGH容量为251字节。真实TCP回环入口为 test/slave_example_loopback_test.cjs,验证选择、执行、返回信息、撤销及遥控后总召读值。
接入自己的工程时,将 104/ 和 common/ 加入头文件搜索路径,使用总召、计数量、校时或遥控业务时再加入 104/business/;按所用模块选择源文件,仅使用公共模块时只需 common/。Windows 网络后端需链接 Ws2_32。统一入口为 IEC104_Slave.h,总召使用 IEC104_Interrogation.h(编译 104/business/ 下的引擎和GeneralInterrogation.c),计数量使用 IEC104_CounterInterrogation.h,校时使用独立的 IEC104_ClockSynchronization.c/h,遥控使用独立的 IEC104_Command.c/h。接入约定见计数量设计、时钟同步设计和遥控设计。
子站示例默认使用模拟时钟;收到校时命令只更新模拟值。需要修改Windows系统时钟时显式选择--clock system,默认模式及自动测试均不修改系统时间。
命令模块默认全局启用Type 45–51及58–64全部14种类型(type_mask=0x3FFF),但默认点表为空,不会执行任何点。应用通过有序只读点表按CA/IOA配置允许类型和DIRECT或SELECT_EXECUTE模式;51/64只能配置为DIRECT。同一类型的不同点可以采用不同模式,实际允许类型取全局与点掩码的交集。点表从Create借用至Destroy,期间不可修改。
示例显式只启用已接入的45/46/49/58/59/62:45/58的6001..6008控制Type 1遥信1001..1008;46/59的6101..6108控制Type 3双点位置1101..1108,双点初值均为1;49/62的6301..6308写入Type 11遥测2001..2008。24个命令点中,6008、6108、6308直接执行,其余先选择后执行;站总召及对应分组读取更新后的运行值,帧序与初值不变。
带时标激活默认按10秒时差窗口检查,主站时区为UTC+8;校时成功后应用向Command提供UTC/单调时间基准,过期激活默认静默丢弃。示例只更新内存点值,设备输出由应用动作接入。Type 51/64没有选择位,只能直接执行;完整接入与时效边界见子站示例和遥控设计。Config已移除select_required_mask,旧调用方须提供points/point_count并与库一起重新编译。