前言
做工业物联网,Modbus 几乎是所有人的第一站——简单、普及、好上手。但当你的项目涉及电力调度、变电站自动化、配电网监控时,Modbus 就不够用了:它没有时标、没有事件主动上送、没有链路确认、数据类型全靠寄存器地址”约定俗成”。这时候你就会撞上电力行业的事实标准——IEC 60870-5-104。
这篇文章是我从零啃 IEC104 规约 + 实际配通 ECU-1251TL 网关读取 IEC104 从站数据后整理的笔记,力求把规约讲透,不讲废话。
一、IEC104 是什么:101 规约的 TCP 化
IEC 60870-5-104(简称 IEC104)是国际电工委员会(IEC)制定的电力远动通信规约,标准号 IEC 60870-5-104。它的本质是——把原来跑在串口(RS232/RS485)上的 IEC 60870-5-101 规约搬到了 TCP/IP 以太网上。
理解这一点很关键:104 的应用层语义和 101 完全一样(同样的 ASDU、同样的 TI/IOA/COT),区别只在传输层——101 用串口链路层(FT1.2 帧),104 用 TCP。所以你可以把 104 理解成”101 的网络版”。
国内电力调度自动化(主站 ↔ 变电站 RTU/测控装置)几乎清一色用 104,国网南网通用。
1.1 在电力通信体系里的定位
电力系统的通信规约不是只有一个,它们各管一段:
| 链路 | 典型规约 | 说明 |
| 调度中心 ↔ 变电站 RTU | IEC 60870-5-104 | 站到调度的上行通道,本文主角 |
| 调度中心 ↔ 变电站(串口时代) | IEC 60870-5-101 | 104 的串口前身 |
| 变电站内部 IED 之间 | IEC 61850 | 保护、测控互联,比 104 更重更现代 |
| 配电自动化(FTU/DTU ↔ 主站) | IEC 104 / 101 | 也有用 DNP3 的 |
| 工业通用 | Modbus RTU/TCP | 简单但弱,电力外设备常用 |
别搞混:104 管”站到调度”这条链路;变电站内部 IED 互联用的是 61850,不是 104。
二、通信架构:主站是客户端,从站是服务端
这是 IEC104 和 Modbus RTU 一个很大的不同点。
2.1 角色与端口
- 主站(Master,调度中心/SCADA) = TCP 客户端,主动发起连接
- 从站(Slave,RTU/测控装置/模拟器) = TCP 服务端,监听端口
- 标准端口:2404
注意角色是反过来的——主站反而要主动连从站。这点和 Modbus RTU 的”主问从答”轮询模型不同,更接近 Modbus TCP 的连接模型,但语义更丰富。
2.2 平衡传输:104 的核心优势
Modbus 是纯轮询——主站不问,从站永远不说话。这意味着开关变位、故障跳闸这种突发事件,最坏要等一个轮询周期才能被主站发现。
IEC104 支持平衡传输:从站不必等主站问,突发事件(开关变位、SOE 事件)可以主动上送。主站照样能发总召、遥控、设定命令。实时性比 Modbus 强一个量级。
这是电力调度选 104 而不是 Modbus 的核心原因之一——保护动作、开关跳闸这种事件,必须秒级甚至毫秒级上送,不能等轮询。
2.3 链路建立流程
一次完整的 IEC104 链路建立是这样的:
STARTDT 是关键:TCP 连上不代表数据就开始传,主站必须发 STARTDT act(启动数据传输),从站回 STARTDT con,数据传输才算真正启动。很多人配完连接发现”链路通了但没数据”,八成是 STARTDT 没发或被关了。
三、链路上的三种帧
IEC104 的链路层帧分三种,靠控制域的头两位区分:
3.1 U 帧(控制帧)—— 管理链路
不携带用户数据,只管链路状态。三种用途:
| 命令 | 含义 |
| STARTDT act / con | 启动数据传输(激活/确认) |
| STOPDT act / con | 停止数据传输 |
| TESTFR act / con | 心跳测试(链路保活) |
空闲时主从双方靠 TESTFR 互相探测链路是否活着,超时由 t3 参数控制。
3.2 S 帧(监视帧)—— 接收确认
只回接收序号,不带用户数据,做流控和窗口确认。当收到未确认的 I 帧达到 w 个(默认 8)时,就要发 S 帧确认对方。
3.3 I 帧(信息帧)—— 承载业务
带发送序号 + 接收序号 + ASDU(应用服务数据单元)。真正的遥测、遥信、遥控、SOE 全在 I 帧里。
三种帧的区别总结:
| 帧 | 作用 | 带用户数据 | 带序号 |
| U 帧 | 链路管理(启动/停止/心跳) | ❌ | ❌ |
| S 帧 | 接收确认(流控) | ❌ | 只接收序号 |
| I 帧 | 业务数据 | ✅ ASDU | 发送+接收序号 |
序号机制是 IEC104 比 Modbus 强的地方——每一帧都有序号,丢了能发现,没确认会重传,可靠性高。
四、ASDU:I 帧里真正承载业务的部分
I 帧的控制域之后就是 ASDU(Application Service Data Unit,应用服务数据单元)。理解 ASDU 的内部结构,是理解 IEC104 的核心。
4.1 ASDU 的字节布局
4.2 各字段含义
公共头部(6 字节):
- TI(类型标识,Type Identification):1 字节,决定这条数据是什么类型。这是 IEC104 类型化的核心——不像 Modbus 全是寄存器,104 用 TI 明确区分遥信、遥测、遥控、遥脉、SOE。常见值见下表。
- VSQ(可变结构限定词):1 字节。最高位 SQ 决定信息对象是顺序排列还是非顺序排列,低 7 位是对象个数。一条 ASDU 可以打包多个同类型点,省带宽。
- COT(传送原因,Cause Of Transmission):2 字节,说明”为啥传这条”——是突发?是响应总召?是遥控激活?这个字段是 Modbus 完全没有的概念,让主站能区分数据的来由。
- CA(公共地址,Common Address):2 字节,定位是哪个子站装置。相当于”站号”。
信息对象区:
- IOA(信息对象地址,Information Object Address):3 字节,定位装置内具体哪个点。
- 信息体数据:长度由 TI 决定(单点 1B、浮点 4B 等)。
- CP56Time2a 时标:7 字节,可选。带时标的用于 SOE(事件顺序记录)。
4.3 两级寻址
IEC104 是两级寻址:CA 找装置,IOA 找装置内的点。
这比 Modbus 的单一寄存器地址灵活得多——Modbus 只有一级地址,站号 + 寄存器号是两个独立维度;104 的 CA + IOA 是真正的两级语义寻址。
五、常用 TI 类型标识表
TI 是 IEC104 的灵魂——它把数据类型化。下面是工程中最常用的一批:
5.1 遥信类(单点/双点)
| TI | 名称 | 说明 | 数据长度 |
| 1 | M_SP_NA_1 | 单点遥信 | 1B (0/1) |
| 2 | M_SP_TA_1 | 单点遥信(带时标) | 1B + 7B 时标 |
| 3 | M_DP_NA_1 | 双点遥信 | 1B (0~3) |
| 30 | M_SP_TB_1 | SOE 带时标单点 | 1B + 7B 时标 |
| 31 | M_DP_TB_1 | SOE 带时标双点 | 1B + 7B 时标 |
单点 vs 双点:单点就是 0/1(通/断);双点是 0~3(0=中间态、1=OFF、2=ON、3=中间态),用于断路器这种需要体现”分/合/中间态”的设备。双点是 104 比 Modbus 表达力强的一个体现。
5.2 遥测类
| TI | 名称 | 说明 | 数据长度 |
| 9 | M_ME_NA_1 | 归一化遥测 | 2B (-1.0~1.0) |
| 11 | M_ME_NB_1 | 标度化遥测 | 2B (-32768~32767) |
| 13 | M_ME_NC_1 | 短浮点遥测 | 4B (IEEE754) |
三种遥测的区别在数值表示方式:
- 归一化(NA):值域 -1.0~1.0,需要主站配合量程换算
- 标度化(NB):16 位有符号整数,工程上最常用
- 短浮点(NC):32 位 IEEE754 浮点,精度最高
5.3 遥脉类
| TI | 名称 | 说明 |
| 15 | M_IT_NA_1 | 累计量(电度) |
电度表读数,累加值。
5.4 遥控/设定类
| TI | 名称 | 说明 |
| 45 | C_SC_NA_1 | 单点遥控 |
| 46 | C_DC_NA_1 | 双点遥控 |
| 50 | C_SE_NC_1 | 短浮点设定值命令 |
遥控是 104 区别于 Modbus 的另一大亮点——它有完整的选择-执行(Select-Execute)两步握手机制,防止误操作。这个后面单独讲。
六、传送原因 COT
COT 让主站知道”这条数据为什么传过来”。常用值:
| COT 值 | 含义 |
| 3 | 突发/自发(事件主动上送) |
| 6 | 激活(主站发命令时) |
| 7 | 激活确认(从站收到命令确认) |
| 10 | 激活终止(命令执行完毕) |
| 20 | 响应总召 |
| 37 | 响应计数召唤 |
举个例子:开关变位时,从站主动上送,COT=3(突发);主站发总召请求,从站把所有点回一遍,COT=20(响应总召)。主站靠 COT 区分”这是事件”还是”这是全量扫描结果”。
七、遥控的 Select-Execute 两步握手
这是 IEC104 安全性的核心设计。Modbus 写线圈就是直接写,写错就写错了。IEC104 的遥控分两步:
先选择(Select)确认对象正确,再执行(Execute)。两步之间如果选错了对象,可以不发 Execute 中止。电力遥控误操作的后果很严重(带负荷拉刀闸、误跳开关),这个机制是保命用的。
在研华 EdgeLink 的 IEC104 驱动里,这个机制用地址格式的 /SE 后缀开关——加了 /SE 就是选择执行,不加就是直接执行(Direct Execute,一般不建议用于实际遥控)。
八、与 Modbus / IEC61850 对比
| 维度 | Modbus RTU/TCP | IEC 60870-5-104 | IEC 61850 |
| 传输 | 串口 / TCP | TCP(端口 2404) | 以太网(MMS/GOOSE/SV) |
| 寻址 | 单一寄存器地址 | CA + IOA 两级 | LD/LN/DO 三级语义 |
| 数据类型 | 无(全是寄存器) | TI 明确分类 | 面向对象 |
| 时标 | 无 | CP56Time2a,支持 SOE | 有,更完整 |
| 传送原因 | 无 | 有 COT | 有 |
| 传输模式 | 纯轮询 | 平衡式,事件主动上送 | 事件+报告 |
| 链路确认 | 无 | 有序号确认 | 有 |
| 遥控安全 | 直接写 | Select-Execute 两步 | Select-Execute |
| 复杂度 | 低 | 中 | 高 |
| 典型场景 | 通用工业 | 电力调度(站到调度) | 变电站内部 IED 互联 |
一句话总结三者关系:
- Modbus:笨但简单,通用工业
- IEC104:重但强,电力站到调度的事实标准
- IEC61850:更重更现代,变电站内部面向对象互联
九、IEC104 的协议参数(t1~t3, k, w)
配置 IEC104 主从站时,会遇到这几个超时和窗口参数,都是协议规定的:
| 参数 | 含义 | 典型值 |
| t0 | 连接建立超时 | 30s |
| t1 | 发送方等待确认超时(发出后多久没 ACK 就重传/断链) | 15s |
| t2 | 接收方确认超时(收到后多久内必须回 ACK) | 10s |
| t3 | 空闲测试超时(多久没数据就发 TESTFR 心跳) | 20s |
| k | 最大未确认 I 帧数(发送窗口) | 12 |
| w | 触发 S 帧确认的阈值(收到 w 帧就回 ACK) | 8 |
这几个参数主从站要匹配,尤其是 t1/t2/t3。t1 必须大于 t2,否则接收方还没来得及确认,发送方就超时重传了。
十、小结
| 特性 | 说明 |
| 本质 | 101 规约的 TCP 网络化 |
| 角色 | 主站=TCP客户端,从站=TCP服务端,端口 2404 |
| 三种帧 | U(链路管理)/ S(确认)/ I(业务数据) |
| ASDU | TI + VSQ + COT + CA + IOA + 数据 + 时标 |
| 两级寻址 | CA 找装置,IOA 找点 |
| 平衡传输 | 事件主动上送,不等轮询 |
| 类型化 | TI 区分遥信/遥测/遥控/遥脉/SOE |
| 时标 | CP56Time2a,支持 SOE 事件顺序记录 |
| 遥控安全 | Select-Execute 两步握手 |
IEC104 = 101 的 TCP 化 + 平衡传输 + 类型化数据 + SOE 时标 + 链路序号确认。它是电力 SCADA 上行通道的事实标准,做电力物联网绕不开。
系列文章导航
- 第一篇:IEC 60870-5-104 电力远动规约详解(本文)
- 第二篇:IEC104 模拟器仿真环境搭建与 110kV 变电站点位设计
- 第三篇:研华 ECU-1251TL 配置 IEC104 主站实战
- 第四篇:研华 IEC104 驱动 Tag 地址格式详解与 70 点配置表
我是散客,工业物联网一线实践者。个人网站 sanker.top,专注通信协议、边缘计算、AIoT。
