4、数据采集协议(IEC 101):IEC 60870-5-101规约解析、链路层与应用层帧结构、平衡式与非平衡式传输、遥测/遥信/遥控报文实例
各位同学,今天我们来啃一块硬骨头——IEC 60870-5-101规约。
说实话,我刚入行那会儿,看到101规约的报文头都大了。一堆十六进制数,什么启动字符、长度、控制域……完全不知道在干嘛。后来在台区现场调设备,被一个老前辈带着抓包分析,才慢慢摸到门道。
其实101规约没那么神秘。它就是电力系统里,用来让主站和终端(比如TTU)对话的一套规则。说白了,就是规定好“你说一句,我回一句”,谁先说、说什么、怎么说,都得按规矩来。
4.1 101规约到底在解决什么问题?
你想想看,一个台区下面挂了几十台TTU,主站要轮询采集数据。如果没有统一标准,A厂家的TTU说“我电压是220V”,B厂家的说“电压220”,主站怎么识别?
101规约就是干这个的。它定义了:
- 物理层:怎么连?RS-232还是RS-485?波特率多少?
- 链路层:怎么传?帧结构长啥样?怎么保证不丢包?
- 应用层:传什么?遥测数据、遥信状态、遥控命令,各自长啥样?
我在一个老旧台区改造项目里遇到过,某厂家TTU的101实现不规范,主站发个遥控命令下去,终端没响应。最后抓包一看,链路层的地址字段少了一位。嗯,这种坑踩过一次就记住了。
4.2 链路层帧结构——报文长啥样?
101规约的链路层,帧结构分两种:固定帧长和可变帧长。
固定帧长用于简单的确认/否认应答,比如主站发个“召唤链路”,终端回个“确认”。可变帧长用于传输实际数据,比如遥测值、遥信状态。
4.2.1 固定帧长格式
固定帧长就10个字节,结构如下:
启动字符(68H) | 长度(4) | 控制域(C) | 链路地址域(A) | 帧校验和(CS) | 结束字符(16H)
注意:这里的长度固定为4,指的是控制域、地址域、校验和这三个字节的长度之和。我刚开始学的时候,老觉得这个长度定义很奇怪,后来才明白,这是为了接收端能快速判断帧是否完整。
4.2.2 可变帧长格式
可变帧长用于传输应用层数据,结构稍微复杂点:
启动字符(68H) | 长度(L) | 长度(L重复) | 启动字符(68H) | 控制域(C) | 链路地址域(A) | 链路用户数据(可变) | 帧校验和(CS) | 结束字符(16H)
这里有个细节:长度L出现了两次。为什么?为了冗余校验。接收端收到后,会对比两个L是否一致,不一致就说明传输有误,直接丢弃。我在现场调试时,就靠这个机制抓出过好几回串口干扰导致的数据错位。
核心要点:链路层的核心任务就是“可靠传输”。通过启动字符、长度校验、帧校验和,确保应用层数据能完整无误地从A点传到B点。
4.3 应用层帧结构——数据怎么组织?
链路层把数据包完整传过去了,接下来应用层就要解析里面的内容。应用层的结构,我习惯把它想象成一个“信封”:
- 数据单元标识:告诉接收方,这包数据是什么类型(遥测?遥信?遥控?)
- 信息体:具体的数据内容,比如遥测值、遥信状态、遥控命令等
4.3.1 数据单元标识
它包含三个关键字段:
| 字段 | 长度 | 说明 |
|---|---|---|
| 类型标识 | 1字节 | 比如0x09表示遥测,0x01表示遥信,0x2D表示遥控 |
| 可变结构限定词 | 1字节 | 表示后面有几个信息体,以及是否连续 |
| 传送原因 | 2字节 | 比如0x03表示“突发”,0x06表示“激活” |
我记得有一次,主站一直收不到某台TTU的遥测数据。排查了半天,发现是类型标识填错了。TTU发的是0x09(遥测),但主站期望的是0x0A(带品质描述的遥测)。这种小细节,文档里不写清楚,现场就得折腾半天。
4.4 平衡式与非平衡式传输
这个知识点,说白了就是“谁先说话”的问题。
- 非平衡式:主站说了算。主站问,终端答。主站不问,终端不能主动说。这种模式简单,适合轮询采集。
- 平衡式:双方都能主动发起通信。终端有突发数据(比如遥信变位),可以主动上报。这种模式效率高,但实现复杂。
我在一个大型台区项目里,用的是非平衡式。因为终端数量多(上百台),主站轮询一圈下来,周期已经很长了。如果再用平衡式,终端同时上报,冲突概率大增。你想想看,串口是半双工的,同时发数据不就乱套了?
我的建议:终端数量少(比如10台以内),可以用平衡式,实时性好。终端数量多,老老实实用非平衡式,稳定第一。
4.5 遥测/遥信/遥控报文实例
光讲理论没意思,咱们直接看报文。下面是我从一个实际项目中抓到的报文,我做了脱敏处理。
4.5.1 遥测报文(主站召唤,终端应答)
主站发送(召唤遥测):
68 04 07 01 0C 16
解析:
- 68:启动字符
- 04:长度(固定帧长)
- 07:控制域(召唤命令)
- 01:链路地址(终端地址)
- 0C:帧校验和
- 16:结束字符
终端应答(遥测数据):
68 0E 0E 68 08 01 09 01 03 01 01 00 00 00 D8 16
解析:
- 68 0E 0E 68:可变帧长头部,长度0E(14字节)
- 08:控制域(确认应答)
- 01:链路地址
- 09:类型标识(遥测)
- 01:可变结构限定词(1个信息体)
- 03 01:传送原因(突发)
- 01 01:信息体地址(遥测点号1)
- 00 00:遥测值(这里为0,实际项目中可能是电压、电流等)
- D8:帧校验和
- 16:结束字符
4.5.2 遥信报文(变位主动上报)
终端主动上报(遥信变位):
68 0C 0C 68 53 01 01 01 03 06 01 01 01 16
解析:
- 53:控制域(平衡式下,终端主动上报)
- 01:类型标识(遥信)
- 01:可变结构限定词(1个信息体)
- 06 01:传送原因(激活确认)
- 01 01:信息体地址(遥信点号1)
- 01:遥信值(1表示合闸,0表示分闸)
注意:遥信变位报文,传送原因通常是“突发”(0x03)或“激活确认”(0x06)。如果主站没收到这个报文,终端可能会重发。我曾经遇到过终端重发次数设置不合理,导致主站收到重复报文,误判为多次变位。解决方案是主站做去重处理,或者终端设置合理的重发次数。
4.5.3 遥控报文(主站下发,终端执行)
主站下发(遥控选择):
68 0C 0C 68 07 01 2D 01 06 01 01 01 81 16
解析:
- 2D:类型标识(遥控)
- 06:传送原因(激活)
- 01 01:信息体地址(遥控点号1)
- 81:遥控命令(0x81表示“合”,0x01表示“分”)
终端应答(遥控确认):
68 0C 0C 68 08 01 2D 01 07 01 01 01 81 16
解析:
- 07:传送原因(激活确认)
- 其他字段与主站下发一致
这里有个关键点:遥控必须“先选择,后执行”。主站先发一个“选择”命令,终端确认后,主站再发“执行”命令。这是为了防止误操作。我在一个变电站调试时,就因为跳过了“选择”步骤,直接发“执行”,结果终端直接拒收。嗯,安全机制,必须遵守。
4.6 避坑指南
最后,分享几个我踩过的坑:
- 链路地址别搞错:主站和终端的链路地址必须一致。我曾经因为地址写错,折腾了一下午才发现。
- 帧校验和要算对:101规约的校验和是从控制域开始,到链路用户数据结束,所有字节累加,取低8位。别漏了。
- 超时时间要合理:主站发完命令后,要等终端应答。超时时间设太短,终端还没处理完,主站就重发了,导致重复报文。我一般设500ms到1s。
- 平衡式慎用:平衡式虽然效率高,但实现复杂。如果终端数量多,建议用非平衡式,稳定压倒一切。
好了,101规约的核心内容就这些。下一章我们讲104规约,它是101的网络版,应用更广泛。但101的基础打牢了,104学起来就轻松多了。