一、IEC104 协议概述
1.1 协议简介
IEC 60870-5-104 (简称 IEC104) 是国际电工委员会(IEC)制定的用于电力系统调度自动化的远动通信协议。它是在 IEC 60870-5-101 基础上,通过 TCP/IP 网络传输的扩展协议。
cpp
┌────────────────────────────────────────────────────────────────────┐
│ IEC 60870-5-104 协议栈 │
├────────────────────────────────────────────────────────────────────┤
│ 应用层 ASDU (Application Service Data Unit) │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ 类型标识 | VSQ | 传送原因 | 公共地址 | 信息对象地址 | 数据 │ │
│ └──────────────────────────────────────────────────────────────┘ │
├────────────────────────────────────────────────────────────────────┤
│ APCI (Application Protocol Control Information) │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ 启动字符(0x68) | APDU长度 | 控制域(4字节) │ │
│ └──────────────────────────────────────────────────────────────┘ │
├────────────────────────────────────────────────────────────────────┤
│ 传输层: TCP (端口 2404) │
├────────────────────────────────────────────────────────────────────┤
│ 网络层: IP │
├────────────────────────────────────────────────────────────────────┤
│ 数据链路层 + 物理层: 以太网 │
└────────────────────────────────────────────────────────────────────┘
1.2 帧类型
IEC104 协议定义了三种帧格式:
| 帧类型 | 名称 | 功能 | 控制域特征 |
|---|---|---|---|
| I帧 | 信息帧 | 传输用户数据(ASDU) | 发送序号 + 接收序号 |
| S帧 | 监视帧 | 确认接收、流量控制 | 只有接收序号 |
| U帧 | 无编号帧 | 链路控制(启动/停止/测试) | STARTDT/STOPDT/TESTFR |
cpp
I帧格式 (信息传输):
┌────────┬────────┬────────┬────────┬────────┬─────────────┐
│ 0x68 │ 长度 │ 发送序号(低) │ 发送序号(高) │ 接收序号(低) │ 接收序号(高) │ ASDU... │
└────────┴────────┴────────┴────────┴────────┴─────────────┘
S帧格式 (监视确认):
┌────────┬────────┬────────┬────────┬────────┬────────┐
│ 0x68 │ 0x04 │ 0x01 │ 0x00 │ 接收序号(低) │ 接收序号(高) │
└────────┴────────┴────────┴────────┴────────┴────────┘
U帧格式 (链路控制):
┌────────┬────────┬────────┬────────┬────────┬────────┐
│ 0x68 │ 0x04 │ 控制字 │ 0x00 │ 0x00 │ 0x00 │
└────────┴────────┴────────┴────────┴────────┴────────┘
1.3 核心数据类型
根据代码中的实现,主要支持以下数据类型:
| 数据类型 | 类型标识符 | 说明 |
|---|---|---|
| 遥信(DI) | M_SP_NA (1), M_DP_NA (3) | 单点/双点状态信息 |
| 遥测(AI) | M_ME_NC (13), M_ME_NA (9) | 浮点/归一化测量值 |
| 遥控(DO) | C_SC_NA (45), C_DC_NA (46) | 单点/双点控制命令 |
| 遥调(AO) | C_SE_NA (48), C_SE_NC (50) | 归一化/浮点设定值 |
| SOE | M_SP_TB (30) | 带时标的单点状态变化 |
| 电能量 | M_IT_NA (15) | 累积电能量 |
| 时钟同步 | C_CS_NA (103) | 时钟同步命令 |
二、应用场景
2.1 典型应用领域
cpp
┌────────────────────────────────────────────────────────────────────────────┐
│ IEC104 典型应用架构 │
├────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 调度中心 / SCADA主站系统 │ │
│ │ (IEC104 Client / 控制站) │ │
│ └──────────────────────────┬──────────────────────────────┘ │
│ │ │
│ ┌──────────┴──────────┐ │
│ │ TCP/IP 网络 │ │
│ │ (端口 2404) │ │
│ └──────────┬──────────┘ │
│ ┌──────────────────┼──────────────────┐ │
│ │ │ │ │
│ ┌──────┴──────┐ ┌──────┴──────┐ ┌──────┴──────┐ │
│ │ 变电站RTU │ │ 配电终端DTU │ │ 新能源控制器 │ │
│ │ (Server) │ │ (Server) │ │ (Server) │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │
│ ┌──────┴──────┐ ┌──────┴──────┐ ┌──────┴──────┐ │
│ │ 保护/测控 │ │ 开关设备 │ │光伏/储能系统│ │
│ │ 装置 │ │ │ │ │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
└────────────────────────────────────────────────────────────────────────────┘
2.2 主要应用场景
| 应用场景 | 描述 | 特点 |
|---|---|---|
| 电网调度 | 省/地/县调度中心与变电站通信 | 大规模、高可靠性 |
| 配电自动化 | 配电主站与配电终端通信 | 分布式、实时性 |
| 新能源 | 光伏/风电场与集控中心通信 | 海量数据、变化频繁 |
| 储能系统 | BMS与EMS之间的数据交换 | 双向控制 |
| 工业自动化 | 工厂电力监控系统 | 集成性强 |
三、客户端与服务端架构对比
3.1 该程序在控制器侧的角色
cpp
┌─────────────────────────────────────────────────────────────────────────────┐
│ 控制器侧 IEC104 通信架构 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ MGC V2 控制器 │ │
│ │ ┌─────────────────────────────────────────────────────────────┐ │ │
│ │ │ pro_iec104 模块 │ │ │
│ │ │ ┌─────────────────────┐ ┌─────────────────────────────┐ │ │ │
│ │ │ │ Sub104 (子站) │ │ TerminalMaster (主站) │ │ │ │
│ │ │ │ ┌───────────────┐ │ │ ┌─────────────────────┐ │ │ │ │
│ │ │ │ │ TCP Server │ │ │ │ TCP Client │ │ │ │ │
│ │ │ │ │ 监听端口2404 │ │ │ │ 主动连接主站 │ │ │ │ │
│ │ │ │ │ 被动等待连接 │ │ │ │ 主动发起请求 │ │ │ │ │
│ │ │ │ └───────────────┘ │ │ └─────────────────────┘ │ │ │ │
│ │ │ │ 功能: │ │ 功能: │ │ │ │
│ │ │ │ - 响应总召 │ │ - 发起总召 │ │ │ │
│ │ │ │ - 数据变化上报 │ │ - 接收数据 │ │ │ │
│ │ │ │ - 接收遥控命令 │ │ - 下发遥控命令 │ │ │ │
│ │ │ │ - 执行本地控制 │ │ - 时钟同步 │ │ │ │
│ │ │ └─────────────────────┘ └─────────────────────────────┘ │ │ │
│ │ └─────────────────────────────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ ▲ │ │
│ │ TCP/IP │ TCP/IP │
│ │ ▼ │
│ ┌─────────┴─────────┐ ┌─────────┴─────────┐ │
│ │ 上级调度主站 │ │ 下级子设备RTU │ │
│ │ (SCADA Client) │ │ (IEC104 Server) │ │
│ └───────────────────┘ └───────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
3.2 客户端(Client) vs 服务端(Server) 详细对比
| 特性 | 子站模式 (Sub104/Server) | 主站模式 (TerminalMaster/Client) |
|---|---|---|
| TCP角色 | TCP Server (监听端口) | TCP Client (主动连接) |
| 默认端口 | 2404 (可配置) | 连接远端2404 |
| 连接方式 | 被动等待连接 | 主动发起连接 |
| 数据流向 | 上报数据给主站 | 从子站采集数据 |
| 总召处理 | 响应总召,上传数据 | 发起总召,接收数据 |
| 遥控流程 | 接收并执行遥控命令 | 下发遥控命令 |
| 变化上报 | 主动上报(COS/COT) | 被动接收变化数据 |
| 时钟同步 | 接收对时命令 | 发送对时命令 |
| 典型应用 | 作为被采集设备对接上级调度 | 采集下级子设备数据 |
四、IEC104 vs IEC61850 vs Modbus 协议对比
4.1 综合对比表
| 特性 | IEC 60870-5-104 | IEC 61850 | Modbus TCP |
|---|---|---|---|
| 标准组织 | IEC TC57 | IEC TC57 | Modicon (Schneider) |
| 发布时间 | 2000年 | 2003年 | 1979年(RTU)/1999年(TCP) |
| 传输层 | TCP/IP (端口2404) | TCP/IP + 专用协议 | TCP/IP (端口502) |
| 数据模型 | 平面点表 | 面向对象(IED/LD/LN) | 寄存器/线圈 |
| 应用层 | ASDU | MMS/GOOSE/SMV | 简单请求/响应 |
| 语义描述 | 类型标识符 | SCL语言描述 | 无 |
| 变化上报 | 支持(COT机制) | 支持(Report/GOOSE) | 不支持(需轮询) |
| 事件顺序 | SOE(毫秒级) | 支持(纳秒级) | 不支持 |
| 配置方式 | 手动配置点表 | SCL/ICD/SCD自描述 | 手动配置寄存器 |
| 互操作性 | 良好 | 优秀(自描述) | 一般 |
| 复杂度 | 中等 | 高 | 低 |
| 实施成本 | 中等 | 高 | 低 |
| 主要应用 | 电力调度/配电 | 变电站内部 | 工业自动化 |
4.2 协议栈对比图
cpp
┌──────────────────────────────────────────────────────────────────────────────┐
│ 协议栈架构对比 │
├──────────────────────┬──────────────────────┬──────────────────────┐─────────┤
│ IEC 104 │ IEC 61850 │ Modbus TCP │ OSI层 │
├──────────────────────┼──────────────────────┼──────────────────────┼─────────┤
│ │ SCL 配置语言 │ │ │
│ ASDU 数据单元 ├──────────────────────┤ │ 应用层 │
│ (类型+COT+数据) │ MMS │ GOOSE │ SMV │ Modbus 功能码 │ │
├──────────────────────┼─────┼───────┼────────┼──────────────────────┼─────────┤
│ APCI │ │ │ │ │ 表示层 │
│ (I/S/U帧控制) │ TCP │ 以太网│ 以太网 │ MBAP Header │ │
├──────────────────────┼─────┼───────┼────────┼──────────────────────┼─────────┤
│ TCP │ TCP │ IEEE │ IEEE │ TCP │ 传输层 │
│ (端口2404) │ │802.1Q │802.1Q │ (端口502) │ │
├──────────────────────┼─────┴───────┴────────┼──────────────────────┼─────────┤
│ IP │ IP │ IP │ 网络层 │
├──────────────────────┼──────────────────────┼──────────────────────┼─────────┤
│ Ethernet │ Ethernet │ Ethernet │数据链路 │
└──────────────────────┴──────────────────────┴──────────────────────┴─────────┘
4.3 数据模型对比
cpp
┌─────────────────────────────────────────────────────────────────────────────┐
│ 数据模型对比 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ IEC 104 (平面点表): │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 公共地址 │ 信息对象地址 │ 数据值 │ 品质描述 │ 时标 │ │
│ │ 1 │ 0x0001 │ 1 │ 0x00 │ CP56Time2a │ │
│ │ 1 │ 0x4001 │ 220.5 │ 0x00 │ - │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ IEC 61850 (面向对象): │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ IED: Bay1_Protection │ │
│ │ └─ LD: Protection │ │
│ │ └─ LN: PTOC1 (过流保护) │ │
│ │ ├─ DO: Str (启动) │ │
│ │ │ └─ DA: stVal = true │ │
│ │ │ └─ DA: q = good │ │
│ │ │ └─ DA: t = 2024-01-15T10:30:00.123Z │ │
│ │ └─ DO: Op (动作) │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ Modbus (寄存器模型): │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 线圈 (Coil): 地址 0-65535, 单bit读写 │ │
│ │ 离散输入 (DI): 地址 0-65535, 单bit只读 │ │
│ │ 保持寄存器 (HR): 地址 0-65535, 16bit读写 │ │
│ │ 输入寄存器 (IR): 地址 0-65535, 16bit只读 │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘