Files
STM32F4-Base/IEC60870-Slave/README.md
T
STF e1b0434774
CI / L0 静态门禁 (pre-commit) (push) Failing after 45s
CI / L0.5 主机侧单测 (MSVC) (push) Failing after 43s
补充遥调业务代码
2026-11-01 00:38:09 -07:00

80 lines
6.4 KiB
Markdown
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.
# IEC60870-Slave
IEC 60870 子站协议库,当前提供 IEC104 子站、Windows TCP 后端、总召、计数量召唤、Type 103时钟同步,以及Type 45–51遥控/遥调和Type 58–64带时标命令。101/104 可复用的 ASDU、信息对象、时间工具及子站应答接口集中在公共目录。
## 目录结构
按职责归档,同一模块的 `.c` 和 `.h` 放在一起:
```text
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:
```powershell
./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`。接入约定见[计数量设计](docs/104/IEC104_CounterInterrogation_设计架构.md)、[时钟同步设计](docs/104/IEC104_ClockSynchronization_设计架构.md)和[遥控设计](docs/104/IEC104_Command_设计架构.md)。
子站示例默认使用模拟时钟;收到校时命令只更新模拟值。需要修改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没有选择位,只能直接执行;完整接入与时效边界见[子站示例](docs/examples/IEC104子站示例.md)和[遥控设计](docs/104/IEC104_Command_设计架构.md)。Config已移除select_required_mask,旧调用方须提供points/point_count并与库一起重新编译。
详细资料见[文档索引](docs/README.md)、[模块说明与接入示例](docs/104/README.md)、[子站示例说明](docs/examples/IEC104子站示例.md)和[完整测试命令](docs/test/IEC104测试文档.md#2-编译与运行)。