一、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只读 │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘