4. IEC60870-5-101 应用层 ASDU:结构解析、类型标识、可变结构限定词、传送原因
好,咱们今天来聊聊 ASDU。很多刚接触 101 协议的朋友,一看到 ASDU 的报文就头大。一堆十六进制数,完全不知道在说什么。其实说白了,ASDU 就是 101 协议里真正干活的数据单元。它告诉主站:谁的数据?什么数据?为什么发这个数据?
我个人习惯把 ASDU 比作一个信封。信封外面写着收件人、发件人、信件类型。信封里面才是真正的数据内容。咱们今天就把这个信封拆开,看看每一部分到底是什么意思。
4.1 ASDU 的整体结构
先看一个标准的 ASDU 结构。它由两部分组成:数据单元标识符和信息体。
ASDU = 数据单元标识符 + 一个或多个信息体
数据单元标识符是固定的 6 个字节。信息体则根据类型不同,长度可变。我画了一张图,帮你直观理解这个结构。
4.2 类型标识(Type Identification)
类型标识占 1 个字节。它告诉接收方:这个 ASDU 里装的是什么类型的数据。比如是遥测、遥信、还是遥控命令。
101 协议里定义了上百种类型标识。但实际项目中常用的也就那么十几种。我整理了一张表,把最常见的列出来。
| 类型标识(十进制) | 类型标识(十六进制) | 含义 | 典型应用 |
|---|---|---|---|
| 1 | 0x01 | 单点遥信(带品质描述) | 开关位置、刀闸状态 |
| 3 | 0x03 | 双点遥信(带品质描述) | 断路器分/合状态 |
| 9 | 0x09 | 归一化遥测值 | 电流、电压、功率 |
| 11 | 0x0B | 标度化遥测值 | 带符号的测量值 |
| 13 | 0x0D | 浮点型遥测值 | 精确测量数据 |
| 30 | 0x1E | 单点遥控命令 | 合闸、分闸命令 |
| 45 | 0x2D | 单点遥信(带时标) | SOE事件记录 |
| 100 | 0x64 | 总召唤命令 | 主站请求全部数据 |
4.3 可变结构限定词(Variable Structure Qualifier, VSQ)
VSQ 占 1 个字节。它描述的是:信息体是怎么排列的。说白了,就是告诉接收方:这个 ASDU 里有多少个信息体,它们是顺序排列的还是按地址排列的。
VSQ 的字节结构如下:
Bit 7 | Bit 6 - Bit 0
SQ 位 | 信息体数目 N
SQ = 0:信息体按顺序排列(地址连续)
SQ = 1:信息体按地址指定(地址不连续)
举个例子你就明白了:
- SQ = 0,N = 5:表示有 5 个信息体,它们的地址是连续的。比如地址从 100 到 104。你只需要知道第一个地址,后面的依次加 1 就行。
- SQ = 1,N = 3:表示有 3 个信息体,每个信息体都带自己的地址。地址可能是 100、200、300,完全不连续。
你想想看,如果我要读取一个开关柜里 10 个遥测值,它们的地址是连续的 1 到 10。用 SQ=0 的方式,只需要发一个地址,后面自动加 1。多省带宽!
但如果我要读取 3 个不同开关柜的遥测值,地址分别是 101、205、312。那就只能用 SQ=1,每个信息体都带上自己的地址。
4.4 传送原因(Cause of Transmission, COT)
传送原因占 2 个字节。它回答了一个问题:这个数据为什么会被发送?
是主动上报的?还是响应主站召唤的?是初始化后的数据?还是测试数据?传送原因就是干这个的。
常见的传送原因如下:
| 传送原因(十进制) | 传送原因(十六进制) | 含义 |
|---|---|---|
| 1 | 0x01 | 周期/循环 |
| 2 | 0x02 | 背景扫描 |
| 3 | 0x03 | 突发(自发) |
| 5 | 0x05 | 请求/被请求 |
| 6 | 0x06 | 激活 |
| 7 | 0x07 | 激活确认 |
| 8 | 0x08 | 停止激活 |
| 9 | 0x09 | 停止激活确认 |
| 10 | 0x0A | 激活终止 |
| 20 | 0x14 | 站初始化 |
| 21 | 0x15 | 设备初始化 |
嗯,这里要特别说一下。传送原因的第 2 个字节(高字节)通常为 0。但有些特殊情况下会用。比如源发地址(Originator Address)可能会放在这里。不过大部分项目里,传送原因就只用低字节。
4.5 实战解析:一个完整的 ASDU 例子
光说不练假把式。咱们来看一个真实的报文。假设收到这样一串数据:
0x01 0x03 0x03 0x00 0x01 0x00 0x64 0x00 0x00 0x01
咱们一步步拆解:
- 0x01:类型标识 = 1,表示单点遥信(带品质描述)。
- 0x03:VSQ = 0x03。SQ=0,N=3。表示有 3 个连续地址的信息体。
- 0x03 0x00:传送原因 = 3,表示突发(自发)数据。也就是设备主动上报的。
- 0x01 0x00:公共地址 = 1,表示这个数据来自地址为 1 的设备。
- 0x64 0x00 0x00:信息体地址 = 100(0x000064)。这是第一个信息体的地址。
- 0x01:信息元素 = 0x01。对于单点遥信,0x01 表示合闸/闭合状态。
因为 SQ=0,N=3,所以后面还有两个信息体。它们的地址自动加 1:101 和 102。每个信息体都占 1 个字节(信息元素)+ 1 个字节(品质描述)。
4.6 常见问题与避坑指南
做 101 协议解析,有几个坑是新手必踩的。我分享一下我的经验:
- 类型标识搞混:单点遥信是 1,双点遥信是 3。别搞反了。我见过有人把双点遥信当成单点来解析,结果状态永远不对。
- VSQ 的 SQ 位没检查:如果 SQ=1 你却按 SQ=0 的方式解析,地址全乱。反过来也一样。
- 传送原因的 T 位没处理:测试数据当成真实数据,后果很严重。尤其是做遥控的时候,测试命令发出去,设备动作了,那就出大事了。
- 公共地址的字节序:101 协议里公共地址是低字节在前。比如 0x01 0x00 表示地址 1,不是 0x0100=256。这个坑我踩过不止一次。
好了,ASDU 的核心内容就这些。类型标识告诉你是什么数据,VSQ 告诉你数据怎么排列,传送原因告诉你数据为什么来。这三个字段搞明白了,101 协议的 ASDU 解析就掌握了 80%。剩下的就是具体的数据格式了,咱们后面再细聊。
公众号:蓝海资料掘金营,微信deep3321