
1. 协议概述工业通信的“普通话”在工业自动化领域尤其是电力、能源、轨道交通这些对可靠性和实时性要求极高的行业设备之间如何高效、准确地“对话”是一个核心问题。想象一下一个大型变电站里有成百上千台智能设备比如保护装置、测控单元、智能电表它们需要将采集到的电压、电流、开关状态、告警信息等数据实时上报给远方的调度中心同时调度中心也需要下发遥控、遥调命令远程操作现场的开关。这个过程就需要一套标准化的“语言”和“语法”而IEC 60870-5-104协议简称IEC104协议就是这套在电力系统远动通信中应用最广泛的“普通话”。IEC104协议并不是凭空出现的它是在国际电工委员会IEC制定的IEC 60870-5系列标准基础上发展而来的。简单来说它定义了如何利用标准的网络TCP/IP来传输电力系统监控所需的“四遥”数据遥测YC模拟量如电压值、遥信YX开关状态、遥控YK开关分合命令和遥调YT设定值调整。在协议栈中它位于应用层其下依赖于可靠的TCP传输这使得它能够穿越现代企业网络和广域网实现调度主站与众多厂站子站之间的长距离通信。为什么是它成为了主流在它之前更常见的是基于串行链路的IEC 101协议。但随着以太网技术的普及和网络覆盖的完善基于TCP/IP的IEC104协议展现出了巨大优势连接稳定、传输效率高、易于穿越复杂网络、支持多点通信。现在当你听到“电力远动协议”、“调度自动化通信”十有八九指的就是IEC104。它不仅是一个技术标准更是电力系统实现“无人值班、少人值守”和智能电网调度自动化的关键信息纽带。对于从事电力自动化、SCADA系统开发、工业数据采集的工程师来说深入理解IEC104协议就如同掌握了与电力设备“对话”的核心密码。2. 核心架构与报文解析拆解通信的“基因序列”要真正弄懂IEC104不能停留在概念上必须深入到它的报文结构里去看。它的每一帧数据都像是一段精心编排的“基因序列”承载着特定的信息和指令。IEC104协议帧主要分为三种类型I格式帧信息传输帧、S格式帧确认帧和U格式帧控制帧。这三种帧各司其职共同保证了通信的有序和可靠。2.1 报文结构APCI与ASDU的嵌套一个完整的IEC104应用层报文由两部分组成应用协议控制信息APCI和应用服务数据单元ASDU。你可以把APCI看作是信封负责通信过程的控制比如这封信的序号、是否需要确认而ASDU则是信纸里面装着实际要传递的数据内容。APCI信封固定为6个字节或4个字节。对于I格式和S格式它是6字节对于U格式它是4字节。它的开头两个字节是固定的起始字符0x68接着一个字节指明后续APDUAPCIASDU的长度。最关键的是控制域I格式帧控制域包含发送序号N(S)和接收序号N(R)。N(S)表示“我发送的第几帧”N(R)表示“我期望收到的下一帧序号”。这是一种标准的滑动窗口确认机制是保证数据可靠、有序传输的核心。S格式帧控制域只包含接收序号N(R)。它不携带数据ASDU纯粹用于确认已经成功收到了对方发来的、序号在N(R)之前的所有I格式帧。这是一种累积确认能有效减少网络上的确认报文数量。U格式帧控制域包含3种类型的控制功能STARTDT启动数据传输、STOPDT停止数据传输和TESTFR测试帧。它用于链路的建立、拆除和保活测试同样不携带ASDU。ASDU信纸的结构则复杂得多它定义了数据的具体含义。一个ASDU由数据单元标识符和一个或多个信息对象组成。数据单元标识符相当于信纸的抬头包含了类型标识Type ID, 1字节这是最重要的字段直接决定了这帧ASDU携带的是什么类型的数据。例如0x01表示不带时标的单点遥信0x09表示测量值归一化值0x2E表示双点遥控命令。可变结构限定词VSQ, 1字节最高位指示信息对象的地址是顺序排列还是单个低7位指明本ASDU中包含的信息对象数量。传送原因COT, 1或2字节说明这帧数据是因何产生的。常见的有周期扫描0x01、背景扫描0x02、突发0x03、遥控命令0x06、激活确认0x07等。理解COT对于解析数据流向和意图至关重要。公共地址CA, 1或2字节通常指厂站地址用于在一个物理链路上区分不同的子站。信息对象这是数据的主体每个信息对象至少包含信息对象地址IOA, 1-3字节和信息元素。IOA是设备内部某个数据点的唯一标识比如“1号线路的A相电流”。信息元素则是该点的具体值或状态。注意IEC104协议中许多字段的长度如COT、CA、IOA是可配置的常见的有1字节或2字节。在开发或调试时主站和子站的这些参数必须完全一致否则会导致解析失败这是初期联调中最常见的问题之一。2.2 典型报文实例解析让我们通过一个具体的例子来加深理解。假设主站收到子站发来的一帧报文十六进制68 14 00 00 00 00 01 03 03 00 01 00 01 00 00 00 81 00 00 00 00 00拆解APCI68是起始符。14十进制20表示APDU总长度从68之后开始算为20字节。接着4个00是控制域两个00是发送序号N(S)0两个00是接收序号N(R)0。这是一个刚刚建立连接后的第一帧I格式报文。拆解ASDU从第7个字节开始是ASDU。类型标识01- 单点遥信信息不带时标。可变结构限定词03- 最高位为0表示信息对象地址连续低7位为3表示有3个信息对象。传送原因03 00假设2字节小端序-0x0003表示突发。公共地址01 00-0x0001表示1号站。解析信息对象接下来是3个信息对象。第一个对象地址01 00 00(IOA1)信息元素81。81的二进制是1000 0001最高位bit7为1表示该遥信点状态为“合/开”单点遥信中1合0分。低7位通常为品质描述这里000 0001可能表示未屏蔽、有效等。第二个对象地址02 00 00(IOA2)信息元素01- 状态为“分”。第三个对象地址03 00 00(IOA3)信息元素80- 状态为“合”品质描述略有不同。这帧报文的含义就很清晰了1号子站突发上送了3个遥信点的状态其中IOA1和3的点为“合”IOA2的点为“分”。主站解析后就可以在监控画面上更新对应开关的图标状态。3. 通信过程与状态机主从站间的“握手”与“对话”IEC104通信不是简单的数据乱发它遵循一套严谨的状态机流程就像两个人打电话需要先拨号、接通、问候、交谈、再见一样。理解这个过程对于开发、调试和故障排查都至关重要。通信双方主站和子站各自维护一个连接状态机。3.1 连接建立与数据传输启停通信总是由主站主动发起TCP连接。连接建立后双方首先进入“未初始化”状态。此时应用层通信并未开始。启动数据传输STARTDT主站发送一个U格式帧STARTDT激活控制域为0x07。子站收到后回复一个U格式帧STARTDT确认控制域为0x0B。至此双方进入“已初始化”状态只有在这个状态下I格式和S格式帧的交换才被允许。这个过程相当于双方握手说“好了电话通了我们可以开始谈正事了。”正常数据交换在“已初始化”状态下主站可以发送总召唤命令类型标识0x64COT为激活0x06请求子站上送所有静态数据全遥信、全遥测。子站则通过一系列I格式帧将数据分批上送每帧都带有递增的发送序号N(S)。主站每收到一帧其接收状态就前进一步并适时通过S格式帧或带确认的I格式帧进行确认。同时子站发生变位或周期到点时也会主动以突发COT0x03形式上送变化数据。停止数据传输STOPDT当主站需要暂停应用层数据交换但不断开TCP连接时发送U格式帧STOPDT激活控制域0x13。子站确认后STOPDT确认控制域0x23双方回到“未初始化”状态停止I/S格式帧的传输。这相当于说“我们先暂停一下别挂电话。”测试帧TESTFR在无数据交互的空闲时段为了防止中间网络设备如防火墙因连接长时间无流量而断开TCP会话协议规定了链路测试机制。任何一方都可以发送U格式的TESTFR激活帧控制域0x43对方必须回复TESTFR确认帧控制域0x83。这相当于一个“心跳包”告诉对方和网络“我们还在线。”3.2 平衡与非平衡传输模式这是IEC104中一个非常重要的概念决定了通信的发起方式。非平衡传输模式这是最经典、应用最广的模式。在这种模式下主站是唯一的主动方。所有的数据请求总召、组召、遥控选择等都由主站发起子站只是被动响应。子站只有在发生事件如遥信变位时才能主动发起传输但这也是在协议规则内允许的。这种模式逻辑清晰主站控制力强。平衡传输模式在这种模式下通信双方在逻辑上是对等的任何一方都可以主动发起传输过程。这意味着子站也可以主动发起总召唤请求给主站。这种模式在分布式系统、对等通信中更有优势但在传统的主从式电力调度自动化系统中使用较少。实操心得绝大多数国内的电力调度自动化系统都采用非平衡传输模式。在开发子站如保护装置、RTU时务必确认主站系统期望的模式。如果模式不匹配通信可能根本无法建立。一个常见的调试步骤就是检查双方配置的传输模式是否一致。3.3 超时与重传机制可靠的通信离不开超时管理。IEC104协议定义了几个关键的超时参数t0连接建立超时。主站发起TCP连接后等待STARTDT完成的超时时间。通常设为30秒。t1发送或测试超时。发送一个I格式帧或U格式帧TESTFR激活后等待确认的超时时间。如果超时未收到确认则需要重发或判定为链路故障。典型值为15秒。t2无数据确认超时。当收到对方I格式帧但暂时没有本方I格式帧需要发送时不能无限期等待必须在t2时间内发送一个S格式帧进行确认以避免对方因t1超时而重发。t2应小于t1通常设为10秒。t3链路空闲测试周期。当链路长时间无I格式帧传输时每隔t3时间应发起一次TESTFR测试。通常设为20秒。窗口大小k, w是另一个关键参数。发送窗口k例如12表示在未收到对方确认的情况下最多能连续发送的I格式帧数量。接收窗口w是期望接收的最大未确认帧数。合理的窗口大小能在网络延迟和吞吐量之间取得平衡。设置过小会降低效率设置过大在丢包时重传数据量会增多。4. 关键功能实现与数据分类IEC104协议承载的具体业务数据是通过ASDU中的类型标识来区分的。掌握这些数据类型是进行数据点表配置和解析的基础。4.1 遥信与遥测状态的监视与测量的上传这是最基本也是最频繁的数据流。遥信YX表示开关、刀闸、保护信号等双态或单态信息。单点遥信类型标识0x01不带时标0x1E带时标。信息元素为一个字节最高位表示状态1合/开0分/闭低7位为品质描述如是否有效、是否被取代、是否闭锁等。双点遥信类型标识0x03不带时标0x1F带时标。用两个比特位表示状态01分10合00/11不确定或中间状态可靠性更高。遥信变位是最高优先级的数据之一子站通常以“突发”原因COT0x03立即上送主站需要快速响应并更新画面、产生告警。遥测YC表示模拟量测量值如电压、电流、功率、频率。归一化值类型标识0x09不带时标0x22带时标。信息元素为一个16位整数2字节其实际物理值 归一化值 * 额定因子。这是最常用的格式。标度化值类型标识0x0B。使用浮点数如IEEE 754短浮点数直接传输精度高但字节数较多。短浮点数类型标识0x0D。传输标准的32位单精度浮点数。每个遥测值也附带品质描述字节指示其是否有效、是否溢出、是否被人工置数等。4.2 遥控与遥调远程的控制与调节这是体现“远动”控制功能的关键部分流程比单纯的数据上送要复杂因为它涉及安全性和可靠性。遥控YK远程控制开关的分、合操作。这是一个两步确认的流程选择SELECT主站发送遥控选择命令类型标识0x2E双点遥控或0x2D单点遥控COT为激活0x06。命令中指定对象地址和期望状态分/合。子站收到后进行内部校验如地址是否有效、对象是否可操作、就地/远方开关位置等。如果校验通过子站回复一个镜像报文该报文的类型标识、地址、状态与主站命令完全一致但COT改为激活确认0x07。这表示“命令已收到校验通过等待执行。”执行EXECUTE主站收到激活确认后再发送一个遥控执行命令。这个命令的COT为激活0x06但通常信息体地址部分可能只包含公共地址或一个特殊的执行标识。子站收到执行命令后才真正驱动继电器输出改变开关状态然后上送一个遥控执行确认COT为激活终止0x0A。同时开关状态变化会触发一个遥信变位报文。遥调YT远程设定模拟量的目标值如调节发电机出力设定值。流程与遥控类似也是“选择-执行”两步式使用类型标识如0x30设定值命令归一化值。注意事项遥控的安全性是设计的重中之重。两步式操作有效防止了误操作。在调试时务必确认子站是否正确实现了选择确认逻辑。有时子站会因为“对象不可操作”如就地状态而回复否定确认COT0x47激活终止主站需要能正确处理这种反馈并在界面上给出明确提示。4.3 其他高级功能除了基本的“四遥”IEC104还支持一些高级功能时钟同步主站可以向子站下发时钟同步命令类型标识0x67使分散的各子站与主站时间保持一致这对于事件顺序记录SOE至关重要。总召唤与分组召唤主站通过发送总召唤命令0x64来初始化或定期刷新子站的完整数据视图。对于数据量很大的子站也可以使用分组召唤0x65分批获取数据。电能脉冲计数类型标识如0x0F用于传输电能量累计值。文件传输支持故障录波文件、配置文件等较大数据块的传输过程较为复杂涉及目录查询、文件召唤、节传输等。5. 开发、调试与故障排查实战理解了原理最终要落到实操上。无论是开发一个IEC104主站/子站库还是进行系统联调都会遇到各种问题。5.1 主站/子站库开发要点如果你需要从零开始或基于某个框架实现IEC104协议栈以下几点是关键状态机是核心严格按照协议标准实现连接建立、STARTDT/STOPDT、数据传输、TESTFR、连接断开等状态转换。状态机的实现要健壮能处理各种异常报文和网络中断。序号管理与窗口控制可靠实现I格式帧的发送序号N(S)和接收序号N(R)的维护、确认和窗口滑动逻辑。这是保证数据不丢、不重、有序的基石。定时器管理实现t0, t1, t2, t3等多个定时器并处理好它们的启动、停止和超时回调。定时器管理混乱是很多自制协议栈不稳定的根源。ASDU的灵活构建与解析设计良好的数据结构来表示类型标识、传送原因、信息对象地址和信息元素。要能灵活应对不同长度1/2/3字节IOA的配置。线程安全与性能网络接收、协议解析、应用层数据处理、定时器触发、网络发送可能分布在不同的线程中需要做好数据同步避免竞态条件。对于高密度子站的主站要考虑IO多路复用和连接池管理。5.2 联调与测试常见问题排查在实际项目现场通信不通或数据异常是家常便饭。以下是一个排查清单问题现象可能原因排查步骤与解决方法TCP连接无法建立网络不通、IP/端口错误、子站服务未启动、防火墙拦截1. 用ping/telnet检查网络连通性。2. 确认子站设备IP和端口号通常是2404配置正确。3. 检查子站程序是否正常运行并监听端口。4. 关闭防火墙或添加出入站规则。连接建立后立即断开或没有数据STARTDT过程失败、传输模式不匹配1. 抓包分析看主站是否发送了U格式STARTDT激活0x07。2. 看子站是否回复了STARTDT确认0x0B。3. 检查主站和子站配置的“平衡/非平衡”模式是否一致。主站收不到数据子站未正确响应总召唤、公共地址不匹配、数据未刷新1. 抓包确认主站是否发送了总召唤类型标识0x64。2. 确认子站回复的总召唤确认0x64COT激活确认和后续数据帧的公共地址是否与主站配置一致。3. 检查子站数据点是否已激活并周期上送或变位。数据点值错误或乱码点表配置不一致、系数/死区设置错误、数据类型解析错误1.这是最高频问题逐点核对主站和子站的信息对象地址IOA、类型标识、数据格式如归一化值还是浮点数。2. 核对遥测的变化系数如额定值、标度变换。3. 检查字节序大端/小端IEC104默认是小端序低位在前。遥控不成功选择失败、执行超时、对象不可操作、返校逻辑错误1. 抓包分析遥控全过程。确认主站发出的“选择”命令子站是否回复了“激活确认”。2. 检查子站返校条件对象地址有效性、就地/远方开关位置、闭锁信号等。3. 确认主站在收到“激活确认”后是否发出了“执行”命令。通信时断时续网络质量差、超时参数设置不合理、防火墙杀连接1. 检查网络延迟和丢包率。2. 调整t1、t3等超时参数适当增大以应对网络波动。3. 检查中间防火墙或会话保持设备的空闲超时时间确保t3小于该时间。抓包工具如Wireshark是调试IEC104的终极利器。Wireshark内置了IEC104协议解析器可以直接将十六进制报文解析为易懂的字段。通过抓包你可以清晰地看到每一帧报文的类型、序号、ASDU内容从而快速定位是哪个环节出了问题。5.3 与SCADA系统的集成像FreyrSCADA这类开源或商业SCADA软件通常都内置了IEC104的驱动。集成工作的重点不在于编写协议栈而在于配置通道配置在SCADA中建立一个IEC104驱动通道填写子站的IP地址、端口号、公共地址、平衡/非平衡模式等。设备配置在通道下添加设备通常对应一个子站。点表配置这是工作量最大的部分。需要根据子站提供的点表信息通常是一份Excel或Word文档在SCADA中逐个创建数据点Tag。每个点都需要准确配置点名、IOA地址、数据类型如BOOL对应遥信FLOAT对应遥测、数据转换系数、死区等。画面组态将配置好的数据点与画面上的图形元素开关、仪表、数值显示进行关联。实操心得点表配置务必“三头对案”——子站装置的点表、主站/SCADA系统的点表配置、设计院的原始设计清册三者必须完全一致。建议在调试前由双方工程师共同签署一份最终版的点表配置文件作为调试和验收的依据可以避免大量的反复修改和扯皮。6. 协议扩展与行业实践标准的IEC104协议已经非常强大但在实际应用中为了满足特定需求产生了一些扩展和行业实践。扩展与规约在一些特定行业或国家会在IEC104标准基础上制定更具体的实施规约。例如在中国电力行业DL/T 634.5104标准就是基于IEC 60870-5-104制定的行业标准它对一些可选字段的长度、某些类型标识的使用做了更明确的规定。在轨道交通等领域也可能有基于IEC104的特定应用扩展。在项目开始时明确遵循的是纯IEC104标准还是某个特定的行业规约非常重要。安全考虑标准的IEC104协议本身没有加密和强认证机制其安全性依赖于网络层的隔离如电力专用调度数据网。在网络安全要求日益提高的今天这是一个弱点。因此在实践中通常通过以下方式增强安全物理隔离使用独立的电力调度数据网与办公网、互联网完全隔离。纵向加密在厂站和主站之间部署纵向加密认证装置对TCP报文进行加密和认证。防火墙策略在边界部署工业防火墙严格限制访问的IP和端口。协议自身扩展有些厂商或标准组织也在研究在应用层增加安全字段但尚未大规模普及。性能优化对于需要接入成千上万个数据点的大型厂站通信性能是关键。压缩报文将多个变化缓慢的遥测点打包在一帧ASDU中发送减少报文头开销。合理设置扫描周期对重要、快速的信号如保护信号设置较短的扫描周期对慢变化信号如温度设置较长的周期。使用带时标的报文对于SOE事件顺序记录信息使用带时标的遥信报文如0x1E,0x1F时标精度通常到毫秒便于主站分析事件的先后顺序。我个人在多年的项目实践中发现IEC104协议的精髓在于其严谨和稳定。它可能不像一些现代协议那样“花哨”但它在电力这种对可靠性和实时性有苛刻要求的领域经受住了时间的考验。调试IEC104通信三分靠技术七分靠耐心和细心尤其是点表的核对往往需要反复多次才能完全正确。一旦调通它通常能非常稳定地运行数年。最后一个小技巧建立一个自己的“协议分析小工具”或熟练使用Wireshark的过滤和着色规则能极大提升调试效率让你在纷繁的报文海洋中快速锁定问题所在。