2. IEC60870-5-101规约基础:帧格式详解(FT1.2)、链路层结构、控制域与地址域解析
2.1 为什么先讲帧格式?
说实话,我见过不少工程师一上来就抱着报文解析工具看十六进制,结果越看越懵。为什么?因为你不懂帧的骨架。
IEC 101 用的是 FT1.2 帧格式。这名字听着挺唬人,其实说白了就是一套「怎么把数据打包成二进制串」的规则。我当年在变电站调试时,第一次抓包看到一堆 0x68 0x68 开头,还以为设备坏了——后来才知道,哦,这是固定帧头。
所以这一节,咱们就把 FT1.2 的底裤扒干净。
2.2 FT1.2 帧格式概览
FT1.2 定义了两种帧:固定帧长和可变帧长。你想想看,遥控命令通常就几个字节,用固定帧就够了;但遥测数据量大,就得用可变帧。
核心要点:FT1.2 是 IEC 101 的物理层/链路层封装格式。它负责把应用层数据包上「帧头」和「帧尾」,确保传输过程中不出错。
下面这张图是我自己画的 FT1.2 帧结构逻辑图,你看一眼就能记住。
2.3 链路层结构——谁在跟谁说话?
链路层解决的是「谁发给谁」的问题。IEC 101 的链路层有两种角色:主站和从站。主站发命令,从站回响应。就这么简单。
但有个坑——链路层地址。我记得有一次在现场,主站怎么都召测不到数据,折腾了两小时。最后发现是从站的地址配错了,差了一个字节。嗯,这里要注意:地址域在固定帧里是 1 字节,在可变帧里可以是 1 或 2 字节,取决于你的系统参数。
我的习惯:只要设备支持,我统一用 2 字节地址。为什么?因为 1 字节最多 255 个设备,大型变电站根本不够用。提前留好余量,后面少折腾。
2.4 控制域(C)——帧的「指挥中心」
控制域是帧里最重要的一个字节。它决定了:
- 这是主站发的还是从站发的?
- 这是命令还是响应?
- 要不要确认?
- 有没有后续帧?
控制域的位定义如下:
| Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
|---|---|---|---|---|---|---|---|
| RES | PRM | FCB | FCV | 功能码 (FUNCTION CODE) | |||
我来拆解一下:
- PRM (Bit 6):1 表示主站→从站,0 表示从站→主站。说白了就是「谁先开口」。
- FCB (Bit 5):帧计数位。主站每发一帧,FCB 翻转一次。从站用这个来检测是不是重复帧。我遇到过一种情况:通信干扰导致主站重发了同一帧,从站如果没检查 FCB,就会重复执行一次遥控——这在变电站里可是大忌!
- FCV (Bit 4):帧计数有效位。1 表示 FCB 有效,0 表示无效(比如复位命令就不需要计数)。
- 功能码 (Bit 3-0):具体干啥事。比如 0x03 是「召唤链路状态」,0x0A 是「请求数据」。
我曾经踩过的坑:有一次调试,主站一直发复位命令(功能码 0x00),从站也正常回复。但就是召测不到数据。后来发现——复位命令的 FCV=0,但主站忘了把 FCB 置 0。从站收到后认为 FCB 无效,但内部状态机乱了。所以复位后一定要把 FCB 初始化成 0,这是规约里明确写的,但很多人忽略。
2.5 地址域(A)——你是谁?
地址域标识通信的双方。在 IEC 101 里,地址域可以指:
- 链路地址:标识从站设备。比如 0x01 表示 1 号 RTU。
- ASDU 地址:在可变帧的用户数据里,还会再带一个地址,用来区分同一个设备里的不同数据点。
地址域的长度由系统参数决定。常见的有:
| 地址长度 | 取值范围 | 适用场景 |
|---|---|---|
| 1 字节 | 0 - 255 | 小型系统,设备少于 255 个 |
| 2 字节 | 0 - 65535 | 中大型系统,我推荐用这个 |
| 结构化地址 | 站地址 + 链路地址 | 复杂网络,比如光纤环网 |
你想想看,如果一个变电站有 200 个间隔,每个间隔又有 10 个设备,1 字节地址根本不够用。所以我个人习惯:只要协议栈支持,一律配 2 字节地址。省得以后扩容时还要改配置。
2.6 校验和(CS)——别让噪声毁了数据
校验和的计算很简单:把控制域、地址域、用户数据(如果有)的所有字节加起来,取低 8 位(不考虑进位)。
举个例子:
控制域 = 0x53
地址域 = 0x01 0x00
用户数据 = 0x64 0x01 0x00 0x00
校验和 = (0x53 + 0x01 + 0x00 + 0x64 + 0x01 + 0x00 + 0x00) & 0xFF
= 0xB9
接收方收到后,用同样的方式算一遍,如果结果不一致,说明帧被破坏了,直接丢弃。我在现场见过因为屏蔽层接地不良导致的偶发校验错误——查了三天才找到原因。所以通信线缆的屏蔽层一定要单端接地,别偷懒。
2.7 实际报文解析示例
咱们来看一个真实的固定帧报文:
10 53 01 54 16
我来逐字节拆解:
- 10:起始字符,固定帧标志
- 53:控制域。二进制是 0101 0011。PRM=1(主站→从站),FCB=0,FCV=1,功能码=0011(0x03,召唤链路状态)
- 01:地址域,表示从站地址为 1
- 54:校验和。0x53 + 0x01 = 0x54,正确
- 16:结束字符
再看一个可变帧的例子:
68 0B 0B 68 73 01 00 64 01 00 00 00 D9 16
- 68 0B 0B 68:可变帧头,长度 0x0B(11 字节,不含起始和长度本身)
- 73:控制域。PRM=1,FCB=1,FCV=1,功能码=0x03(召唤数据)
- 01 00:2 字节地址,从站地址 1
- 64 01 00 00 00:用户数据(ASDU),这里是一个遥测值
- D9:校验和
- 16:结束字符
小技巧:刚开始学的时候,你可以用 Wireshark 抓 IEC 101 报文,然后对照着规约文档逐字节看。我当年就是这么练出来的。看多了,一眼就能看出帧类型对不对。
2.8 本章小结
这一节咱们把 FT1.2 的帧格式、链路层结构、控制域和地址域都过了一遍。说白了,IEC 101 的帧就是一套「信封」——控制域告诉对方「我要干嘛」,地址域告诉对方「我是谁」,校验和保证「信没被撕坏」。
下一节咱们会深入链路层的状态机,看看主站和从站之间是怎么「握手」的。嗯,那才是真正有意思的地方。
公众号:蓝海资料掘金营,微信deep3321