简介:电力远动通信是变电站自动化与调度主站之间的信息桥梁,而IEC-101作为国际电工委员会制定的远动配套标准,定义了串口链路上数据交换的帧格式与传输规则。理解其固定帧长与可变帧长结构,掌握控制域、校验和及ASDU各字段含义,是进行电力监控系统调试和规约转换开发的必备基础。该协议广泛应用于变电站远动装置、RTU与调度端之间的遥信、遥测、遥控及SOE事件上报场景,具有极强的工程实践价值。本文从链路层帧结构切入,逐步拆解应用层ASDU组成,并结合总召唤、变位上报、遥控选择执行等典型报文流程,梳理常见调试问题与排查思路,为从事电力远动、变电站自动化及规约调试的工程师提供一份可直接落地的参考指南。 刚接触电力远动的人,十有八九会被IEC-101报文里那一串十六进制字节搞得头疼。明明是一堆0x68、0x53、0x64开头的数据,却要从中读出断路器位置、遥测值、遥控命令,甚至还要判断是哪台设备、哪个间隔、什么时间发生的。这篇文章就把电力系统IEC-101报文里最常用的帧格式、ASDU结构、典型流程和调试经验一次性讲清楚,适合变电站自动化调试人员、电力监控系统工程师、规约转换开发者和刚入行的远动新人参考。
1. 先搞清楚IEC-101在电力系统里扮演什么角色
1.1 从一次设备到调度主站,IEC-101解决什么问题
IEC-101是IEC 60870-5-101标准的简称,全称是“基本远动任务配套标准”,专门用于电力系统调度自动化中的远动通信。你可以把它理解成变电站和调度主站之间的“普通话”——站内的测控装置、保护装置、RTU把断路器位置、刀闸状态、电流电压、有功无功、电度量等数据,通过串口通道或者网络透传方式送到调度端,同时接收调度下发的遥控、遥调命令。
这个协议对应的是IEC/OSI七层模型中的增强性能体系结构(EPA),只包含物理层、链路层和应用层。实际工程中物理层大多是串口RS-232/RS-485,或者通过光纤Modem转换,波特率常用9600bps,数据位8位,偶校验,1位停止位。链路层采用IEC 60870-5-1规定的FT1.2帧格式,应用层就是ASDU(应用服务数据单元)。这套组合虽然看起来“老”,但在电力系统里极其稳定可靠,至今仍是国内绝大多数地调、县调与变电站之间的主力通信方式之一。
1.2 非平衡式传输:一问一答的通信模型
IEC-101有两种传输模式:平衡式和非平衡式。国内变电站到调度主站的场景,绝大多数采用非平衡式传输,也就是“主站问、子站答”。主站是链路层的主站端,子站是从站端,只有主站可以主动发起链路请求,从站只能被动响应。这样做的好处是避免多个子站同时抢占总线造成冲突,尤其适合一对多的串口轮询场景。
调试时可以记住这个特点:如果主站不发任何帧,从站是绝对不会主动上送数据的。很多刚接触的人把串口线接上、打开调试工具,发现没有任何报文,以为是设备坏了,其实是因为主站还没发起总召唤或链路请求。这个模型理解透了,后续所有报文流程都能顺下来。
1.3 帧格式选择:固定帧长与可变帧长的区别
FT1.2帧格式一共有三种形式:单个字符E5H、固定帧长帧、可变帧长帧。单个字符E5H用于从站确认主站召唤链路状态时的“无数据可发”响应;固定帧长帧以10H开头,常用于链路控制命令和确认;可变帧长帧以68H开头,用于承载带ASDU的业务数据。
简记就是:链路层控制用固定帧长,业务数据传输用可变帧长。后面两节分别拆开讲。
2. 两类帧结构:解析IEC-101报文的底层基础
2.1 固定帧长(10H)——短小精悍的链路控制
固定帧长帧的结构如下:
| 字段 | 字节数 | 说明 |
|---|---|---|
| 启动字符 | 1 | 固定10H |
| 控制域 | 1 | 包含传输方向、请求/响应标志、功能码 |
| 链路地址 | 1或2 | 子站地址,常见为2字节低字节在前 |
| 帧校验和 | 1 | 控制域与链路地址字节的算术和,取低8位 |
| 结束字符 | 1 | 固定16H |
以主站复位链路命令为例,如果链路地址为2字节,报文是:
10 07 00 00 07 16其中10H是启动字符,07H是控制域,00 00是链路地址,07H是校验和(07+00+00=07),16H是结束字符。从站收到后回确认:
10 00 00 00 00 16控制域从站回00H,表示链路确认,功能码为0。这组报文是IEC-101链路建立的第一个握手动作,串口调试工具里每天都能看到它们刷屏。
2.2 可变帧长(68H)——承载业务数据的载体
可变帧长帧在固定帧长的基础上增加了长度字段和ASDU区,结构如下:
| 字段 | 字节数 | 说明 |
|---|---|---|
| 启动字符 | 1 | 固定68H |
| 长度L | 1 | 从控制域开始到ASDU结束的字节数 |
| 长度L重复 | 1 | 与L相同 |
| 控制域 | 1 | 同上 |
| 链路地址 | 1或2 | 子站地址 |
| ASDU | L-控制域-地址长度 | 应用服务数据单元 |
| 帧校验和 | 1 | 控制域、链路地址、ASDU字节的算术和 |
| 结束字符 | 1 | 固定16H |
长度字段最大的意义是让接收方知道“还要收多少个字节才能凑成一帧”,接收方按长度收完数据后,先校验和,再解析ASDU。实际抓包时如果发现长度L和实际ASDU长度对不上,大概率是链路层错位或者程序拼接缓存出了问题。
2.3 控制域里藏着哪些状态位
控制域是IEC-101链路层最容易看晕的地方,但其实拆成位来看并不复杂。主站向从站发送时,控制域高位置1;从站向主站响应时,高位置0。
以主站发送总召唤的常见控制域53H为例,二进制是0101 0011,拆分如下:
- PRM位=1,表示这是主站发往从站的帧
- FCB位=1,帧计数位
- FCV位=1,帧计数有效位
- 功能码=3,表示“向从站发送数据”
从站响应的控制域通常是08H(PRM=0、ACD=0、DFC=0、功能码8),表示“以数据响应请求”。如果从站有1级用户数据等待上送,会把ACD位置1,主站看到ACD=1后会额外发送召唤1级数据的请求。这个机制是IEC-101非平衡方式下从站主动上送变位信息的关键,后面讲遥信变位时还会涉及。
2.4 校验和必须会算
IEC-101的帧校验和CS计算方式很简单:从控制域开始,到ASDU最后一个字节为止,所有字节做二进制算术累加,只保留低8位。固定帧长帧则是控制域加链路地址的累加。
调试时可以自己手算一遍验证:比如固定帧长帧10 07 00 00 07 16,07+00+00=07,校验和就是07H;可变帧长帧里要把ASDU所有字节也加进去。很多排查到最后发现是设备间校验算法不一致,其实基本都是对“校验范围”理解不同,并不是算法本身有差异。
3. ASDU应用层:报文内容的核心拆解
3.1 ASDU八个字段的构成
ASDU是整个IEC-101报文里真正承载业务含义的部分,结构固定如下:
- 类型标识(TI):1字节,说明这条报文是遥信、遥测、遥控还是其他功能
- 可变结构限定词(VSQ):1字节,说明信息对象的个数和信息元素的排列方式
- 传送原因(COT):2字节,说明这是激活、确认、突发还是周期上传
- 公共地址:1或2字节,通常是站地址或装置地址
- 信息对象地址(IOA):3字节(常用),定位到具体间隔和测点
- 信息元素集:具体的数据值、状态、时标等
- 时标(可选):7字节,毫秒、分钟、小时、日期等
一个典型的单点遥信ASDU长这样:
01 01 06 00 01 00 01 00 00 01拆开看就是:类型标识01H表示单点遥信;VSQ=01H表示1个信息对象;传送原因=06H 00H表示激活;公共地址=01H 00H表示装置地址1;信息对象地址=01H 00H 00H表示第1个测点;信息元素=01H表示开关状态为合。
3.2 常用类型标识(TI)速查
| 类型标识 | 含义 | 典型用途 |
|---|---|---|
| 01H | 单点遥信 | 断路器、刀闸位置 |
| 02H | 单点遥信带时标 | SOE事件记录 |
| 03H | 双点遥信 | 双位置开关状态 |
| 09H | 测量值(归一化值) | 遥测数据 |
| 2DH | 单点命令 | 遥控选择 |
| 2EH | 单点命令 | 遥控执行 |
| 64H | 总召唤 | 主站请求全数据 |
| 67H | 时钟同步 | 对时命令 |
调试时最常打交道的就是总召唤64H、单点遥控2DH/2EH、单点遥信01H、SOE 02H。看到类型标识基本就知道这条报文是干什么的。
3.3 传送原因(COT)和可变结构限定词(VSQ)怎么读
传送原因也是2字节,低字节表示具体原因,高字节一般为0。常见值:
- 06H:激活(主站下发命令)
- 07H:激活确认(从站确认收到命令)
- 08H:停止激活
- 09H:停止激活确认
- 0AH:激活终止
- 14H:响应总召唤
- 03H:突发(从站主动上送变位)
举个实际场景:主站下总召唤时,COT=06H;从站回确认时,COT=07H;随后从站把全站遥信遥测数据上送,COT=14H(响应总召唤)或0AH。如果你发现从站响应总召唤时COT用了07H而不是14H,说明从站可能把确认和数据混在一起了,数据完整性会受影响。
VSQ是单字节,bit7表示信息元素的排列方式:0表示顺序排列,1表示信息对象地址连续递增只给首地址。低7位表示信息对象个数。比如VSQ=81H表示“地址连续,共1个对象”?不对,81H的bit7=1、低7位=1,表示地址连续、共2个对象?这里要注意:低7位是实际个数,81H低7位是1,所以共1个对象,但因为bit7=1,表示后续信息元素地址连续递增。之所以要设置这个字段,是为了压缩报文长度——遥测批量上送时,如果地址连续,只需给首地址后面依次排列数据即可,不用每个对象都带完整3字节地址。
4. 实战报文:从十六进制还原业务场景
4.1 链路建立与总召唤流程
站端设备上电后,主站和从站的第一件事是建立链路。整个过程是固定的“四步握手”:
第一步,主站发送复位链路命令。常见的固定帧长报文:
10 07 00 00 07 16第二步,从站回复确认:
10 00 00 00 00 16第三步,主站发送总召唤请求。这是一个可变帧长报文:
68 0D 0D 53 00 00 64 01 06 00 01 00 01 00 00 00 00 C0 16逐字节拆开:68H是启动符;0DH是长度(控制域1字节+链路地址2字节+ASDU 10字节=13字节,即0DH);53H是控制域;00 00是链路地址;64H是总召唤类型标识;01H是VSQ;06H 00H是传送原因“激活”;01H 00H是公共地址;01H 00H 00H是信息对象地址;00H是总召唤限定词QOI,QOI=00H表示全数据召唤。
第四步,从站先回激活确认,然后开始上送遥信、遥测数据。确认报文一般是:
10 00 00 00 00 16后续数据报文则以68H开头,类型标识可能是01H(遥信)、09H(遥测)等,传送原因通常为14H。
这里有个容易踩的坑:总召唤的ASDU里信息对象地址一般用01 00 00H,但有些老设备用00 00 00H,主站侧如果对IOA做了严格过滤,会漏掉这批数据。我在现场遇到过好几次,最后都是把主站的点表起始地址改成和从站一致才解决。
4.2 遥信变位(SOE)报文怎么看
遥信变位是变电站最重要的实时信号,比如断路器跳闸、保护动作。当从站检测到开关量变化时,会生成带时标的SOE报文。非平衡方式下,从站不能随便主动发数据,它会把ACD位置1,主站轮询到该站时发现ACD=1,就会发“召唤1级数据”请求,从站再把SOE报文上送。
一个单点遥信SOE报文字节流大致是:
68 12 12 08 00 00 02 01 03 00 01 00 01 00 00 00 01 00 00 00 00 00 16关键字段拆解:TI=02H(单点遥信带时标);VSQ=01H(1个对象);COT=03H 00H(突发);公共地址=01H 00H;IOA=01H 00H 00H;信息元素=01H(变位后状态为合);后面7字节是时标,包含毫秒、分钟、小时、日、月、年等。
SOE报文的时标是现场追事故的关键,调试时要把主站和从站的时钟先对好。如果发现SOE时间比实际时间慢了几分钟,基本可以断定是时钟同步没做或对时周期太长。IEC-101的时钟同步命令类型标识是67H,主站下发的对时报文里携带标准时间,从站收到后据此校准自身RTC。
4.3 遥控选择与执行:最应该小心的报文
遥控是调度员在远方直接控制断路器分合闸的操作,一旦报文出错可能造成误动,所以IEC-101采用“选择-执行”两步机制。
第一步,主站下发遥控选择命令,TI=2DH。选择合闸的报文中信息元素S/E位置1,SCS位置1,常见字节为81H。完整报文类似:
68 0C 0C 53 00 00 2D 01 06 00 01 00 01 00 00 00 81 16第二步,从站收到选择命令后校验遥控点号和控制性质,如果合法则回激活确认,TI=2DH、COT=07H,信息元素原样返回。此时主站确认选择成功,再下发遥控执行命令,TI=2EH,信息元素S/E位清0,SCS保持原值,常见字节为01H。
第三步,从站收到执行命令后再次校验,然后驱动出口继电器动作,完成后回执行确认,TI=2EH、COT=07H。
整个过程中最容易出的问题是选择确认和执行确认的COT都写成06H(激活),而不是07H(激活确认)。这在标准里是明确不允许的,因为06H表示新激活,07H才是对已接收激活的确认,很多规约检测工具会直接判错。
另外,遥控对象地址、命令性质必须和点表严格对应。我曾经遇到一个变电站,调度端下拉的遥控点号和站内实际IOA错位一个点,结果选择命令下到了相邻间隔,幸亏现场有防误闭锁逻辑,没有实际出口。从那以后我每次调遥控前都会先用测试工具逐个点做选择测试,确认IOA映射无误后再上真值。
4.4 时钟同步与对时
时钟同步命令是主站定期下发的广播式报文,TI=67H,ASDU中包含7字节的标准时标。变电站内所有从站收到后,用这个时间校准自己的RTC。对时周期一般设置为1分钟或5分钟,太短了增加总线负担,太长了SOE时标误差会变大。
对时报文的公共地址一般是全站广播地址,比如公共地址=FFH FFH,或者用01H 00H再配合全站广播标志。调试时可以通过修改从站本地时间后等待一个对时周期,观察从站的时间是否被“拉回来”。如果对时后时间反而跳变异常,优先检查主站时钟源(GPS/北斗对时装置)是否正常,再看ASDU里时标字段的字节序有没有搞反。
5. 调试中的常见坑与排查思路
5.1 链路建立不了,先查物理层
IEC-101通信不上,第一反应不要直接抓报文,先按“物理层→链路层→应用层”的顺序排查。
物理层最常出问题的几个点:
- RS-232的收发线接反,表现为完全收不到任何数据
- RS-485的A/B线接反,或者未共地,表现为波形异常、偶发乱码
- 波特率、校验位、停止位和主站侧不一致,表现为抓到帧但校验和全错
- 光纤Modem的收发纤接反,或光衰过大,表现为时通时断
现场最快的方法是用串口调试助手在两个方向分别自发自收测试,排除线路问题后再接设备抓报文。链路层的标志就是能不能看到10H开头的固定帧长帧和对应的确认帧。如果只看得到主站下发帧而从站永远没响应,绝大多数是物理层或从站地址配置问题。
5.2 报文能通但数据不刷新
如果链路已经建立,主站总召唤也发出去了,但遥测遥信不刷新或刷新不全,常见原因有三类。
第一类是公共地址不匹配。IEC-101里主站和从站的公共地址必须一致,但链路地址和公共地址是两个概念:链路地址是链路层的路由地址,公共地址是应用层的站地址。两个都对应同一台设备,但程序里分开处理,调试时容易漏改其中一个。
第二类是VSQ解析错误。有的从站上送多组数据时VSQ置1,表示地址连续,如果主站侧把这个标志忽略,把后续每个信息元素都当成独立IOA,数据就全错位了。排查方法是抓一条完整的批量遥测报文,按VSQ规则手算一遍地址,对比主站收到的点号。
第三类是总召唤响应不完整。有些从站把总召唤的数据分成多帧上送,每帧的COT都是14H,主站如果只处理了第一帧就结束,后面的数据全部丢失。主站程序需要根据VSQ和对象计数判断是否收齐,不要以帧数判断。
5.3 遥控失败的原因
遥控失败一般分两个层面:报文层失败和出口层失败。
报文层失败的表现是主站发出选择命令后,从站不回确认或回错误确认。这时抓报文看COT是否为07H、信息元素是否原样返回,如果从站返回的TI不同或者COT变成0AH(激活终止),说明从站内部校验没通过。常见原因包括:遥控点号不在允许列表、SCS状态和当前设备状态不一致、防抖时间设置过长、遥控压板未投入。
出口层失败表现为报文交互完全正常,选择确认、执行确认都回了,但断路器没有动作。这种情况优先检查从站装置的遥控出口继电器、操作回路和机构箱电源。报文层没有问题,问题就在二次回路上。我的习惯是调试时先用万用表在装置出口端子测量是否有脉冲输出,判断是装置没出口还是回路断了。
5.4 抓包工具与报文记录技巧
IEC-101是串口协议,调试工具选择比较灵活。工程上常用的有:
- 串口调试助手加十六进制显示,适合快速看报文
- 支持脚本的串口工具,可以用于模拟主站或从站
- 规约分析仪,适合复杂故障定位,能自动解析ASDU并提示校验错误
我的习惯是调试前先配置好两套工具:一套挂在串口上实时监视主站和从站之间的报文,另一套在从站侧用调试软件查看站内规约处理和出口日志。两边对照,能快速定位问题是出在通信过程还是站内逻辑。
报文记录时建议打上时间戳,至少精确到毫秒。排查SOE时标不对、偶发通信中断等间歇性问题时,时间戳的作用非常大。我在现场调试时会把抓到的原始报文直接保存成txt或csv,再用脚本批量解析成可读的点表格式,效率比肉眼逐帧看高得多。
5.5 一个完整的现场调试参考流程
最后整理一个我自己常用的调试流程,供参考:
- 确认串口参数:9600bps、偶校验、8数据位、1停止位(按工程实际)
- 用串口调试助手自发自收,确认物理链路正常
- 接上设备,观察是否有10H开头的链路帧交互
- 查看复位链路和总召唤完整交互流程是否正常
- 核对主站和从站的链路地址、公共地址是否一致
- 召唤全数据,检查遥信遥测点数量和地址映射
- 做单点遥控选择测试,验证IOA和命令性质
- 核对SOE时标与主站时钟差,必要时调整对时周期
- 连续运行24小时以上,观察丢帧率和周期性异常
这套流程走下来,绝大多数IEC-101通信问题都能定位。我做远动调试这些年,最深的体会是:IEC-101协议本身并不复杂,复杂的是现场环境——老旧设备的私有实现差异、点表不一致、时钟偏差、串口干扰,每一个都可能让两套“标准”设备对不上话。调试时多一点耐心,先看物理层再看协议层,把报文逐字节拆开核对,问题往往很快就能浮出水面。遇到实在啃不动的场景,拿一条正常报文和一条异常报文做逐字节对比,是最有效的手段。
本文还有配套的精品资源,点击获取