4. IEC60870-5-101 应用层 ASDU:结构解析、类型标识、可变结构限定词、传送原因

好,咱们今天来聊聊 ASDU。很多刚接触 101 协议的朋友,一看到 ASDU 的报文就头大。一堆十六进制数,完全不知道在说什么。其实说白了,ASDU 就是 101 协议里真正干活的数据单元。它告诉主站:谁的数据?什么数据?为什么发这个数据?

我个人习惯把 ASDU 比作一个信封。信封外面写着收件人、发件人、信件类型。信封里面才是真正的数据内容。咱们今天就把这个信封拆开,看看每一部分到底是什么意思。

4.1 ASDU 的整体结构

先看一个标准的 ASDU 结构。它由两部分组成:数据单元标识符信息体

ASDU = 数据单元标识符 + 一个或多个信息体

数据单元标识符是固定的 6 个字节。信息体则根据类型不同,长度可变。我画了一张图,帮你直观理解这个结构。

ASDU 结构示意图 数据单元标识符(6 字节) 类型标识 | 可变结构限定词 | 传送原因(2字节)| 公共地址(2字节) 信息体(长度可变) 信息体地址(3字节)| 信息元素(N字节)| 品质描述(1字节,可选)| 时标(7字节,可选) ┌────────────── 可以包含多个信息体 ──────────────┐ 信息体1 | 信息体2 | ... | 信息体N 关键说明 • 类型标识:1字节,告诉你是啥数据 • 可变结构限定词:1字节,描述数据排列 • 传送原因:2字节,为什么发这个数据 • 公共地址:2字节,设备地址 • 信息体地址:3字节,具体数据点 • 信息元素:真正的数据值 • 品质描述:数据质量好不好 • 时标:数据产生的时间

4.2 类型标识(Type Identification)

类型标识占 1 个字节。它告诉接收方:这个 ASDU 里装的是什么类型的数据。比如是遥测、遥信、还是遥控命令。

101 协议里定义了上百种类型标识。但实际项目中常用的也就那么十几种。我整理了一张表,把最常见的列出来。

类型标识(十进制) 类型标识(十六进制) 含义 典型应用
1 0x01 单点遥信(带品质描述) 开关位置、刀闸状态
3 0x03 双点遥信(带品质描述) 断路器分/合状态
9 0x09 归一化遥测值 电流、电压、功率
11 0x0B 标度化遥测值 带符号的测量值
13 0x0D 浮点型遥测值 精确测量数据
30 0x1E 单点遥控命令 合闸、分闸命令
45 0x2D 单点遥信(带时标) SOE事件记录
100 0x64 总召唤命令 主站请求全部数据
我的经验:调试时第一件事就是看类型标识。如果类型标识对不上,后面的解析全是错的。我曾经花了一下午排查一个问题,最后发现是类型标识写成了 0x09 而不是 0x0B。一个字节的差异,数据全乱套了。

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,完全不连续。
重点:SQ 位决定了你解析信息体地址的方式。SQ=0 时节省带宽,适合批量读取连续数据。SQ=1 时灵活,适合读取分散的数据点。

你想想看,如果我要读取一个开关柜里 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 设备初始化
注意:传送原因的 Bit 7 是测试位(T 位)。如果 T=1,表示这个数据是测试数据,不是真实数据。我曾经在调试时发现遥测值一直跳变,查了半天,最后发现是测试位被置 1 了。接收方如果不检查 T 位,就会把测试数据当成真实数据来处理。

嗯,这里要特别说一下。传送原因的第 2 个字节(高字节)通常为 0。但有些特殊情况下会用。比如源发地址(Originator Address)可能会放在这里。不过大部分项目里,传送原因就只用低字节。

4.5 实战解析:一个完整的 ASDU 例子

光说不练假把式。咱们来看一个真实的报文。假设收到这样一串数据:

0x01 0x03 0x03 0x00 0x01 0x00 0x64 0x00 0x00 0x01

咱们一步步拆解:

  1. 0x01:类型标识 = 1,表示单点遥信(带品质描述)。
  2. 0x03:VSQ = 0x03。SQ=0,N=3。表示有 3 个连续地址的信息体。
  3. 0x03 0x00:传送原因 = 3,表示突发(自发)数据。也就是设备主动上报的。
  4. 0x01 0x00:公共地址 = 1,表示这个数据来自地址为 1 的设备。
  5. 0x64 0x00 0x00:信息体地址 = 100(0x000064)。这是第一个信息体的地址。
  6. 0x01:信息元素 = 0x01。对于单点遥信,0x01 表示合闸/闭合状态。

因为 SQ=0,N=3,所以后面还有两个信息体。它们的地址自动加 1:101 和 102。每个信息体都占 1 个字节(信息元素)+ 1 个字节(品质描述)。

我的习惯:解析 ASDU 时,我一般先看类型标识,确定数据格式。再看 VSQ,知道有多少个信息体以及它们的地址排列方式。最后看传送原因,判断数据是主动上报的还是响应召唤的。这个顺序能帮你快速定位问题。

4.6 常见问题与避坑指南

做 101 协议解析,有几个坑是新手必踩的。我分享一下我的经验:

  • 类型标识搞混:单点遥信是 1,双点遥信是 3。别搞反了。我见过有人把双点遥信当成单点来解析,结果状态永远不对。
  • VSQ 的 SQ 位没检查:如果 SQ=1 你却按 SQ=0 的方式解析,地址全乱。反过来也一样。
  • 传送原因的 T 位没处理:测试数据当成真实数据,后果很严重。尤其是做遥控的时候,测试命令发出去,设备动作了,那就出大事了。
  • 公共地址的字节序:101 协议里公共地址是低字节在前。比如 0x01 0x00 表示地址 1,不是 0x0100=256。这个坑我踩过不止一次。
曾经有一次:我在现场调试,主站一直收不到遥信变位。报文抓出来看,类型标识是 1,VSQ 是 0x81(SQ=1,N=1),传送原因是 3。看起来都对。后来发现是信息体地址写错了。设备上报的地址是 100,但主站配置的地址是 200。地址对不上,数据自然收不到。所以,地址映射表一定要核对清楚

好了,ASDU 的核心内容就这些。类型标识告诉你是什么数据,VSQ 告诉你数据怎么排列,传送原因告诉你数据为什么来。这三个字段搞明白了,101 协议的 ASDU 解析就掌握了 80%。剩下的就是具体的数据格式了,咱们后面再细聊。


公众号:蓝海资料掘金营,微信deep3321