You are on page 1of 13

DNP3.

0 快速入门
白银魁 2002-04-15
一、学习 DNP 规约的必要性
Distributed Network Protocol 由 Harris 公司提出,于 1993 年开始应用。近一段时间,
DNP 规约在国内的应用有上升的趋势,特别是大型综合自动化变电站采用的国外的智能设
备,有很多都要求采用 DNP 规约。目前,与我们三部相关的产品
主要是 DF1700 及 DF1331。

二、培训目标
通过学习,使大家都达到能够分析报文的水平。

三、DNP 规约的分层结构
DNP 规约虽然很庞大,但它层次清晰,只要掌握好 DNP 的分层结构,DNP 规约就非
常好理解了。
DNP 规约共分为 3 层:链路层、传输层和应用层。以下面的一包报文为例(16 进制显示,
下同):
05 64 FE 44 03 00 03 00 CE 52
F1 A5 81 00 00 01 02 01 00 00 EC 00 01 01 01 01 6D DB
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 BB C3
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 BB C3
01 01 01 01 01 01 01 01 01 01 81 81 81 81 81 01 18 F1
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 BB C3
01 01 01 01 01 01 01 01 01 01 01 01 81 01 81 81 F4 72
81 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 B7 F4
81 01 01 01 81 01 01 01 01 01 01 01 01 01 01 01 F0 FF
01 01 01 01 81 01 81 81 01 01 01 01 01 01 81 01 06 11
01 01 81 01 01 01 01 01 01 01 01 01 01 01 01 01 9A 4A
01 01 81 01 01 01 81 01 01 01 01 01 01 01 01 01 46 83
01 01 01 01 01 01 01 81 81 81 01 81 01 01 01 81 84 DC
81 01 01 01 81 81 01 01 01 81 81 01 01 01 81 81 1E CE
01 01 01 81 81 01 01 01 81 81 01 01 01 81 81 01 45 85
01 01 81 01 01 01 01 01 81 01 01 01 81 81 01 01 50 3C
01 81 81 01 01 01 81 81 01 99 25
报文例(1)
上面是一包完整报文的分行显示。整个这一包报文我们称之为链路层报文。其中的粉红
色部分为 16 位的 CRC 校验码,上面这条报文的第一行共 10 个字节,我们称之为链路报文
头,其中含 2 个字节的 CRC 校验码,所有的 DNP 链路层报文都有一个这样的链路报文头。
链路报文头以外的部分每 18 个字节为一组,其中用户数据为 16 个字节,最后 2 个字节为
CRC 校验码,最后一组最少为 3 个字节,其中最后的 2 个字节仍为 CRC 校验码。
链路层报文中,去掉 CRC 校验码及链路报文头,剩下的部分为传输层报文,也就是桔
黄色部分加上一个字节的蓝色部分。这个蓝色字节称为传输层报文头字节。
传输层报文中,去掉传输层报文头字节,剩下的部分为应用层报文,也就是桔黄色部
分(在以后的学习中我们将认识到,这一部分不一定是一条完整的应用层报文,有时,它
只是一条应用层报文的一个块)。
链路报文头是所有的 DNP 报文都有的,但并不是所有的 DNP 报文都有传输层报文及
应用层报文。而在 DNP 报文中传输层报文与应用层报文是同时存在或同时不存在的。各层
报文间的关系为:链路层报文中可以封装有传输层报文,也可以没有传输层报文;传输层
报文内封装了应用层报文。各层之间除了封装与被封装关系外,没有其它的关系。
举例:

主站发给 RTU 报文:


05 64 14 C4 04 00 03 00 C7 17
D6 C8 01 3C 02 06 3C 03 06 3C 04 06 3C 01 06 B5 C1
RTU 发给主站报文:
05 64 FF 44 03 00 04 00 48 60
41 F1 82 80 00 20 08 28 01 00 00 00 01 00 00 00 5A D4
80 52 76 DC 40 2A 94 BC 07 5F 01 33 01 07 01 2A F6 9C
94 BC 07 5F 01 02 03 28 01 00 00 00 81 00 00 20 07 24
08 28 01 00 01 00 01 00 00 00 20 06 6A C3 40 2A 75 59
94 BC 07 5F 01 33 01 07 01 2A 94 BC 07 5F 01 02 BD 46
03 28 01 00 01 00 81 00 00 20 08 28 01 00 02 00 63 95
01 00 00 00 40 41 19 D5 40 2A 94 BC 07 5F 01 33 A4 0B
01 07 01 2A 94 BC 07 5F 01 02 03 28 01 00 02 00 7F E4
01 00 00 20 08 28 01 00 03 00 01 00 00 00 20 BB 47 63
E7 BD 40 2A 94 BC 07 5F 01 33 01 07 01 2A 94 BC F5 A0
07 5F 01 02 03 28 01 00 03 00 81 00 00 20 08 28 96 BD
01 00 04 00 01 00 00 00 60 D8 E8 C3 40 2A 94 BC 05 DA
07 5F 01 33 01 07 01 2A 94 BC 07 5F 01 02 03 28 8D 0D
01 00 04 00 81 00 00 20 08 28 01 00 05 00 01 00 66 E4
00 00 80 2A 19 AF 40 2A 94 BC 07 5F 01 33 01 07 0A 4C
01 2A 94 BC 07 5F 01 02 03 28 0C 19
整条 DNP3 报文:链路层报文
第一行 10 字节:链路层报文头
每行最后 2 字节:每行的 CRC 校验码
除去第一行链路层报文头外:传输层报文(不包括 CRC 校验码,每行
16 字节用户数据加 2 字节 CRC 校验码,最后一行至少 1 字节用户数据
加 2 字节 CRC 校验码)
传输层报文第一字节(如 41):传输层报文头字节
再除去传输层报文头字节和 CRC 校验码外:应用层报文

第一行头两字节 05 64:起始标志字
第一行第 3 字节(如 FF): 链路层报文长度(范围 5~255 字节),包括
链路层报文头中 5 字节和传输层报文用户数据字节数,即不包括校验码
字节。整条报文最大长度 10+(250/16)×18+(250%16+2)=292 字节
第一行第 4 字节(如 44)
:链路控制字节,指示链路层功能。
第一行第 5、6 字节(如 03 00):目的地址(LL HH 低高位)
第一行第 7、8 字节(如 04 00):源地址 (LL HH 低高位)

四、链路层报文结构
以报文例(1)为例,粉红色部分为 16 位的 CRC 校验码,这条报文的第一行共 10 个
字节,我们称之为链路报文头,其中最后 2 个字节为 CRC 校验码,所有的 DNP 报文都有
这样一个链路报文头。链路报文头以外的部分每 18 个字节为一组,其中用户数据为 16 个字
节,最后 2 个字节为 CRC 校验码,最后一组最少为 3 个字节,其中最后的 2 个字节仍为
CRC 校验码。这就是链路层报文的框架。其中关键的部分就是链路报文头。
链路报文头的结构
05 64 05 00 03 00 03 00 5D D1
报文例(2)
05 64 5F 44 03 00 03 00 28 07
报文例(3)
05 64 为起始标志字,类似于 CDT92 规约中的 EB 90。
05 及 5F 为链路层报文长度,为 1 个字节,它包括链路报文头中的 5 个字节,超出 5 个
字节的部分为传输层报文的长度,也就是说,链路层报文长度计数中不含 CRC 校验码字节。
链路层报文长度的最小值为 5,最大值为 255。一条 DNP 链路层报文的最短长度为链路报文
头 的 长 度 : 10 个 字 节 。 一 条 DNP 链 路 层 报 文 的 最 大 长 度 为
10+(250/16)×18+(250%16+2)=292 字节。
00 及 44 为链路控制字节,它用来指出本条链路层报文要实现的链路层功能。对于封装
有应用层报文的链路层报文来说,根据链路控制字节并不能判断出应用层要实现的功能。
应用层报文的含义要根据应用控制字节及应用层功能码等信息共同判断。链路控制字节的
具体定义,将在下面讲解。
两个 03 00 为目的地址。
两个 03 00 为源地址。
粉红色部分为 16 位的 CRC 校验码。
综上所述,链路报文头的结构为:(注:每格为 1 个字节)

05H 64H XX XX XX XX XX XX XX XX
起始 起始 链路 链路 目的 目的 源地 源地 CRC CRC
字节 1 字节 2 报文 控制 地址 L 地址 址L 址H 校验 L 校验
长度 字节 H H

链路控制字节定义
链路控制字节是链路层中的难点,不过看过之后你就会觉得非常简单。
首 先 , 我 们 先 来 了 解 一 下 源 方 站 ( 发 启 站 , Primary Station ) 与 副 方 站 ( 响 应 站 ,
Secondary Station)的概念。源方站与副方站仅仅是相对于一次通讯过程而言,我们不能说
主站就是源方站,子站就是副方站,反过来,我们也不能说子站就是源方站,主站就是副
方站。实际上,主站和子站都是既可以作为源方站也可以作为副方站。但在一次通讯过程中,
主站和子站中只能有一个作为源方站,另一个作为副方站。在一次通讯过程中,源方站处
于主导地位,源方站实现的功能有:检测副方链路层是否在线,复位副方链路,向副方发
送应用层数据、应用层命令以及实现应用层的其它功能;副方站在通讯过程中处于被动响
应地位,副方站实现的功能有:处理收到的数据及命令,在需要的时候给出对源方站链路
层报文的链路层响应。下面,以主站向子站召唤变化遥测为例,说明一下源方、副方的交替。
①.主站作为源方站,向子站召唤变化遥测数据。 →
← 此时子站作为副方站,正确接收到这条命令后,发出链路层肯定确认给主站。②
本次通讯过程结束。
← 子站作为源方站,向主站发送变化遥测数据。③
④.此时主站作为副方站,在正确接收到这些数据后,发出链路层肯定确认给子站 →
本次通讯过程结束。
⑤.主站作为源方站,向子站发出变化遥测已正确接收的应用层确认 →
← 此时子站作为副方站,正确接收到这条命令后,发出链路层肯定确认给主站。⑥
召唤变化遥测过程结束。
在实际的通讯过程中,①、③这两条报文是肯定要有的,有时②、④这两条报文并不出
现,这取决于①、③这两条报文是否需要链路层的确认。⑤这条报文是否存在,取决于③这
条报文是否需要应用层的确认。⑥这条报文只有当⑤这条报文存在并且需要链路层确认时
才会存在。
源方站的链路控制字节结构
D7 D6 D5 D4 D3 D2 D1 D0
DIR PRM FCB FCV 链路层功能码

副方站的链路控制字节结构
D7 D6 D5 D4 D3 D2 D1 D0
DIR PRM RES DFC 链路层功能码

DIR:方向位,1:本条报文为主站到子站的报文;0:本条报文为子站到主站的报文。
PRM:源方站标志位,1:本条报文为源方站报文;0:本条报文为副方站报文。
FCV:帧计数有效位,1:接收方收到本报文后,应检查 FCB 位的正确性。
0:接收方收到本报文后,不检查 FCB 位的正确性。
FCB:帧计数位,只有当 FCV=1 时,FCB 才有意义。对于发送方而言,如果本条报文
的 FCV=1,那么 FCB 位的状态应为上次 FCV=1 时 FCB 位状态的翻转。
RES:保留位。
DFC:数据流控制位,1:发出此报文的一方接收缓冲区已满,不能再接收数据了。
链路层功能码:要结合 PRM 位进行分析。
源方站链路层功能码(PRM=1)
功能码 帧类型 服务功能 FCV 位
0 SEND/期待 CONFIRM 使远方链路复位 0
1 SEND/期待 CONFIRM 使用户过程复位 0
2 SEND/期待 CONFIRM 对链路的测试功能 1
3 SEND/期待 CONFIRM 用户数据 1
4 SEND/不期待回信 非确认的用户数据 0
9 查询/期待响应 查询链路状态 0
5-8 未用
10-15 未用
副方站链路层功能码(PRM=0)
功能码 帧类型 服务功能
0 肯定确认 ACK=肯定的确认
1 否定确认 NACK=报文未收到;链路忙
11 响应 链路的状态(DFC=0 或 DFC=1)
2-10 未用
12-13 未用
14 链路服务不工作了
15 未用链路服务,或未实现链路服务

思考题:分析下面这条报文,并回答下列问题:
05 64 14 F3 03 00 03 00 70 9A D9 C5 01 3C 02 06 3C 03 06 3C 04 06 3C 01 06
06 5E
1、 请列出本条报文中的应用层报文
2、 本条报文是发向主站的还是发向子站的?
3、 本条报文需要接收方给出链路层确认吗?

五、应用层报文结构

应用层报文的结构可以分为应用层报文头和数据对象两部分。
应用层报文头 数据对象部分
对于所有的应用层报文而言,应用层报文头是必需的,而数据对象部分是否存在是与
应用层报文头的内容相关的。主站发出的应用层报文与子站发出的应用层报文在结构上总
体上是一致的,其中,数据对象部分完全一致,而在应用层报文头部分,子站比主站多了
2 个字节的内部信号标志(Internal Indication,简称 IIN)。下面以子站发出的应用层报文的
报文头为例,讲一下应用层报文头的结构。(1 格表示 1 字节)
ApplicationControl ApplicationFunCode IIN_L IIN_H
应用控制字节 应用层 IIN IIN
功能码 低字节 高字节

应用控制字节的结构
D7 D6 D5 D4 D3 D2 D1 D0
FIR FIN CON 应用层报文序号
FIR:首包标志。1:本条应用层报文为完成某应用层功能或传送某些应用层数据的所
有报文中的第一包。 0:本条应用层报文不是第一包。
FIN:尾包标志。1:本条应用层报文为完成某应用层功能或传送某些应用层数据的所
有报文中的最后一包。0:本条应用层报文不是最后一包。
如果某包应用层报文的 FIR=1 并且 FIN=1,则表示完成此应用层功能只需 1 包报文就
够了。
应用层报文序号:对于普通报文,值的范围为 0~15,对于主动上送报文,值的范围为
16~31。发送方每发出一包应用层报文后,此值就加 1,当计满 15 后就归 0(或计满 31 后就
从 16 继续计起)。如果本包报文是完成某应用层功能的第一包报文(FIR=1),那么应用
层报文序号采用 0~15(或 16~31)中的任何一个值都是合法的,其余的包要在第一包序号
的基础上依次加 1,并且仍要遵循计满 15 后归 0(或计满 31 后就从 16 继续计起)原则。
引入 FIR、FIN 标志及应用层报文序号的目的:对于所有的主站或子站而言,应用层的
收、发缓冲区是有限的,它的典型大小为 2048 字节。我们就以 2048 字节为例,2048 字节只
能传输 16 位的遥测量 1024 个或带品质描述的遥信量 2048 个等等。这些数据量在大型综合
自动化系统中还远远不够。当 2048 字节的容量不能满足要求时,我们就要用多条应用层的
报文来实现同一个应用层的功能。为了让接收方能够区分出实现同一个应用层功能的多包
报文的起、止以及报文是否有重复或丢失现象,就引入了 FIR、FIN 标志,它们与应用层报
文序号配合,就可以使接收方很容易的判断出报文的起、止以及报文是否有重复或丢失现
象。
CON:需要应用层确认标志。1:本条报文需要接收方给出对这条报文的应用层确认。
0:本条报文不需要接收方给出对这条报文的应用层确认。

应用层功能码
子站到主站方向的应用层功能码如下表:
功能码值 功能解释
0 对收到的应用层报文的肯定确认,此报文不需要应用层响应。
129 响应主站请求的报文。
130 非请求响应(主动上送)报文。

主站到子站方向的应用层功能码比较多,最常用的部分如下表:
功能码值 功能解释
0 对收到的应用层报文的肯定确认,此报文不需要应用层响应。
1 读命令,请求子站上送所指定的数据项
2 写命令,赋予子站的指定数据项以指定的值
3 输出选择命令(遥控预置)
4 输出先前已选择了的控制点(遥控执行)
5 直接输出,不需要有先前的选择命令(遥控直接执行)
想要了解全部的应用层功能码,可参阅马君华等人翻译的《Dnpv30 应用层.doc》13 页
~14 页。

IIN 标志:
再次重申一下,主站发出的应用层报文中无 IIN 标志。
子站上传的报文中,应该把自身当前的状态在 IIN 标志中体现出来。主站接收到子站的
IIN 标志后,要依据这个标志对子站进行数据召唤或进行其它的操作。IIN 共有 16 位,各位
的含义参阅《Dnpv30 应用层.doc》15 页~16 页。

数据对象部分
前面已经提到过,数据对象部分的存在与否是与应用层报文头的内容相关的,在这里
可以说得确切一些,它实际上是与应用层功能码相关的。最常用的应用层功能码中只有
“0:确认”后面没有数据对象部分。主站发出的报文与子站发出的报文在数据对象部分的
结构是完全相同的。这一部分又分为携带数据元素的情况与不携带数据元素的情况。例如:
主站向子站下发的对钟报文中,就是要向子站中的系统时钟数据项中写入指定的值,这条
报文的数据对象部分就是携带数据元素的;子站为了响应主站的召唤数据命令,向主站传
送的各种数据报文,无疑也是携带数据元素的。而主站下发给子站的召唤数据报文中的数
据对象部分仅仅指定了数据项的范围而已,因此是不携带数据元素的。
先讲一下不携带数据元素的情况。(用于数据召唤命令)
ObjGroup ObjVariation Qualifier Range 附加的点号描述部分
数据对象组别 数据对象变体 限定词 变程 长度不定
1 字节 1 字节 1 字节 0 ~ 8 字节

数据对象组别与数据对象变体的组合,是 DNP 规约特有的数据对象分类的编码方式。


这两者一定要组合使用。需要特别指出的是,DNP 规约中,把系统时钟、分级数据等都当作
是一种数据类型来处理,对于对钟操作,就是向相应的时钟数据项内写入指定的值。还有
对象变体可以为 0,此时数据对象组别与数据对象变体的组合所指的数据类型为从属于此
数据对象组中的所有数据类型。但是,对象变体为 0 的情形只能用于请求报文(即数据召唤
报文)中。DNP 规约对数据对象组别及变体的具体描述,参阅《DNP 对象库.doc》。最常用的
数据类型见下表:(下表为 10 进制编码)
对象组别 对象变体 数据对象描述
1 1 不带品质描述的单点输入,即压缩格式的遥信量,8 点/字节
1 2 带品质描述的单点输入,1 字节/点的遥信量
2 1 带品质描述不带时标的单点变位信息,1 字节/点
2 2 带品质描述带绝对时标的单点变位信息,7 字节/点
12 1 继电器输出控制(遥控)对象,11 字节/点
30 2 16 位带品质描述不带时标的静态当前模拟量,3 字节/点
30 4 16 位不带品质描述不带时标的静态当前模拟量,2 字节/点
32 2 16 位带品质描述不带时标的变化当前模拟量,3 字节/点
20 1 32 位带品质描述不带时标的静态累加脉冲量,5 字节/点
20 5 32 位不带品质描述不带时标的静态累加脉冲量,4 字节/点
22 1 32 位带品质描述不带时标且变化了的累加脉冲量,5 字节/点
50 1 表示日历钟的绝对时间对象,6 字节/点
60 1 0 级数据,即静态数据,仅用于召唤命令,无确切的对象
60 2 1 级数据,优先级最高的变化数据,仅用于召唤命令
60 3 2 级数据,优先级仅次于 1 级数据的变化数据,仅用于召唤命令
60 4 3 级数据,优先级次于 2 级数据的变化数据,仅用于召唤命令

所有数据对象的点号都由 0 点计起。对象类型相近且点号相同的数据点,有时所指的就
是同一数据元素。最常用的数据类型中这样的情形有 [注:下面描述数据对象时采用的格式
为:“(对象组别,对象变体)”] :
 (1,1)、(1,2)、(2,1)、(2,2)这 4 个数据类型当其点号相同时,所指
的为同一个数据元素;
 (30,2)、(30,4)、(32,2)这 3 个数据类型当其点号相同时,所指的为同
一个数据元素。

限定词、变程及附加的点号描述部分是用于描述数据对象的点号的。有时变程部分或附
加的点号描述部分或是其两者是不存在的,这取决于限定词的内容。限定词,简单的说,
就是对变程部分及附加的点号描述部分的限定。现在把最常用的限定词列表解释如下:
限定词表(其中,附加的点号描述部分注释仅适用于不携带数据对象的报文)
限定 变体
变体部分 附加的点号描述部分
词值 类型
起止 2 个字节,第一个字节为起始点号
0x00 模式 (含), 无
第二个字节为终止点号(含)。
起止 4 个字节,前 2 个字节为起始点号
0x01 模式 (含), 无
后 2 个字节为终止点号(含)。
起止 8 个字节,前 4 个字节为起始点号
0x02 模式 (含), 无
后 4 个字节为终止点号(含)。
数量 1 个字节,记其值为 N,所涉及到的点号
0x07 无
模式 为:0 ~ N-1
数量 2 个字节,记其值为 N,所涉及到的点号
0x08 无
模式 为:0 ~ N-1
数量 4 个字节,记其值为 N,所涉及到的点号
0x09 无
模式 为:0 ~ N-1
数量 1 个字节,记其值为 N 为 N 个点号,
0x17
模式 每个点号占 1 个字节
数量 2 个字节,记其值为 N 为 N 个点号,
0x18
模式 每个点号占 1 个字节
数量 4 个字节,记其值为 N 为 N 个点号,
0x19
模式 每个点号占 1 个字节
数量 1 个字节,记其值为 N 为 N 个点号,
0x27
模式 每个点号占 2 个字节
数量 2 个字节,记其值为 N 为 N 个点号,
0x28
模式 每个点号占 2 个字节
数量 4 个字节,记其值为 N 为 N 个点号,
0x29
模式 每个点号占 2 个字节
数量 1 个字节,记其值为 N 为 N 个点号,
0x37
模式 每个点号占 4 个字节
数量 2 个字节,记其值为 N 为 N 个点号,
0x38
模式 每个点号占 4 个字节
数量 4 个字节,记其值为 N 为 N 个点号,
0x39
模式 每个点号占 4 个字节
全部 无。仅用于召唤命令。涉及的点号为接收
0x06 无
模式 方支持的所召唤的数据类型的所有点

对于携带数据元素的情况,其应用层报文的数据对象部分的结构如下:
ObjGroup ObjVariation Qualifier Range 数据元素部分
数据对象组别 数据对象变体 限定词 变程 长度不定
1 字节 1 字节 1 字节 1 ~ 8 字节
在数据对象组别与数据对象变体部分(数据类型部分)与携带数据元素的情况相差无
几。两者在这一部分的区别是:
 携带数据元素的情况必须明确指出所携带的数据类型,因此不能使用数据对象变
体值 0。
 基于与上一条相同的原因,携带数据元素的情况不能使用分级数据对象类型
(60,1)、(60,2)、(60,3)、(60,4)。

在限定词部分,携带数据元素的情况必须明确指出所携带的数据的点号,因此不能使
用限定词 6。

在变程部分,因携带数据元素的情况不能使用限定词 6 了,而只有限定词 6 对应的变


程为 0 字节,所以变程为 0 字节的情况就是非法的了。

不携带数据元素的情况中,变程后面可能跟随有附加的点号描述部分,而携带数据元
素的情况中,变程后面必定要跟随数据元素部分。数据元素部分与附加的点号描述部分虽
说在结构上不一致,但它们之间的关系是非常密切的。下面按附加的点号描述部分的几种
形式分别讨论一下数据元素部分的结构。
1. 没有附加的点号描述部分的情况。
这种情况下,所涉及到的数据元素的点号都是连续的。变体部分为“起止模式”
的不必细说,变体部分为“数量模式”且没有附加的点号描述部分时,其涉及的
数据元素的点号也可以归入起止模式,即:起始点为 0,终止点为 N-1。与之对应
的数据元素部分的结构为:变体中指定的相关点号的数据元素的顺序排列。
2. 附加的点号描述部分为 N 个点号规模为 X 字节/点号的点号描述的情况。(X 取值
为 1、2 或 4)
这种情况下,我们可以把“X 字节/点号”这样的一个点号描述称为一个小组,那
么,附加的点号描述部分就是由 N 个这样的小组组成的。与之对应的数据元素部
分也是由 N 个小组组成的,只不过这时每个小组的结构变成了“X 字节的点号 +
该点号对应的数据元素”了。

不论是否携带数据元素,应用层报文的数据对象部分都可以有多个。结构如下:
应用层报文头 数据对象部分 1 数据对象部分 2 …… 数据对象部分 m

六、传输层报文结构

在主站与子站间传输的任何命令及数据最终都要以链路层报文的面目出现。一条链路
层的报文最多只能携带 250 字节的用户数据,而一条应用层报文超出 1000 字节是很常见的。
怎样才能传输这么大的应用层报文而又能防止出错呢?DNP 规约中采用了下面的方式:
传送应用层报文的一方,先把整条应用层报文分成若干个块,每一块不超过 249 字节
(当然,每块的长度没有过多的限制),然后在每一块的最前面加上一个字节,这个字节
称为传输层报文头。在第一块前面的传输层报文头中有首块标志及起始的块序号,在中间
块前面的传输层报文头中有该块的块序号,在最后一块前面的传输层报文头中有末块标志
及该块的块序号。相邻两个块的块序号是连续的。
接收应用层报文的一方,先把传输层报文取出来,分析传输层报文头,如果先前未收
到过具有首块标志的传输层报文头就先不处理应用层数据块,直到收到了首块标志为止,
收到首块标志后,就记录该块的序号并取出应用层报文块开始组装,当收到下一块时检测
其序号是否与上次收到的序号连续,如果连续就接着组装,并判断它是不是末块,直到收
到末块,才把这些块组装成了一条完整的应用层报文,这时才开始应用层的处理。当然,
在接收时还应考虑应用层报文只分为一块的情况以及传输出错的情况。
传输层报文头的结构
D7 D6 D5 D4 D3 D2 D1 D0
FIN FIR 应用层报文块序号
FIN:首块标志。1:本块为首块;0:本块非首块。
FIR:末块标志。1:本块为末块;0;本块非末块。
注意:传输层报文头的 FIN 及 FIR 标志的位置与应用控制字节中的 FIN 及 FIR 标志的
位置是不同的。
应用层报文块序号:范围为:0 ~ 63,计满 63 后归 0。
传输层报文的结构为:
传输层报文头 应用层报文块
1 字节 1 ~ 249 字节

思考题:分析下面这条报文,并回答下列问题:
05 64 14 F3 03 00 03 00 70 9A D9 C5 01 3C 02 06 3C 03 06 3C 04 06 3C 01 06
06 5E
1、 本条报文中的应用层报文是一条完整的应用层报文呢还是应用层报文的一个块?
2、 本条报文中的应用层报文是应用层报文的首块还是末块?
3、 本条报文要完成的应用层功能是什么?

七、通讯过程描述

注:与顺序有关部分,其先后顺序以前面的序号标注。粉红色为必需过程,蓝色为可
选过程。因 DNP 是一个很灵活的规约,下面的召唤数据部分的顺序仅供参考。
1、 主站作为源方站复位子站的链路。复位子站链路的目的有 2 个:确认子站是否在线、
统一主站到子站方向① 的 FCB 位。
主站发出:05 64 05 C0 05 00 06 00 95 08
如果站号为 5 的子站在线,它正确接收了这条复位命令后,就把自己下次接收到
FCV=1 的报文的 FCB 期望值置为 1,同时返回链路层肯定确认报文给主站:
子站返回:05 64 05 00 06 00 05 00 B1 E3
主站正确接收后,把自己下次发往该站的 FCV=1 的报文时的 FCB 位置为 1。
如果主站接有多个子站,主站就要分别复位各子站的链路,并分别记录发向各子
站的 FCB 位。
2、 子站作为源方站复位主站的链路。复位主站链路是为了统一子站到主站方向的
FCB 位。当子站发往主站的所有报文均不需要主站对其的链路层确认时,可以没
有这一过程。
子站发出:05 64 05 40 06 00 05 00 XX XX

注①:为什么要强调“主站到子站方向”呢?因为主站和子站都可以作为源方站,当源方站发出的
报文中 FCV=1 时,其 FCB 位的状态应为上次 FCV=1 时 FCB 位状态的翻转,副方站当接收到
FCV=1 的报文时就要判断一下 FCB 位的状态与副方站自己存储的 FCB 位期望值是否一致,不一致
就认为传送过程中出现错误。

主站正确接收了这条复位命令后,就把自己下次接收到该站 FCV=1 的报文的 FCB


期望值置为 1。同时返回一条链路层肯定确认报文给该子站。
主站发出:05 64 05 80 05 00 06 00 XX XX
子站正确接收后,把自己下次发送的 FCV=1 的报文时的 FCB 位置为 1。

如果主站不复位子站的链路,子站不响应主站发出的其它任何报文。而如果子站不复
位主站的链路,主站却可以接收该子站的 FCV=0 的报文。双方相互复位链路后,就可以相
互接收 FCV=1 的报文了。正常通讯时,一旦检测出通讯中断,都要重新复位链路。
3、 主站复位子站的用户进程。
主站发出:05 64 05 C1 05 00 06 00 XX XX
子站接收后,进行相应的处理,并返回肯定确认报文给主站。
子站返回:05 64 05 00 06 00 05 00 B1 E3
4、 主站测量通道延时。
主站发出:05 64 08 C4 05 00 06 00 XX XX C0 C0 17 XX XX
5、 主站对子站对时。
对时有两种方式,一种是一一对时方式,另一种是广播对时方式。两者的区别是:
目的站址不同,一一对时方式的地址就是该子站的地址,广播对时要用广播地址:
0xFFFF。下面的报文为一一对时方式,时间为 2002 年 4 月 19 日 15 时 0 分 0 秒 0 毫
秒:
主站发出:05 64 13 C4 05 00 06 00 XX XX
C1 E1 02 32 01 17 01 00 00 E0 D4 5C ED 00 XX XX
子站应答:05 64 0A C4 05 00 06 00 XX XX
C1 C1 00 00 00 XX XX
6、 主站召唤子站的全数据。
这一过程虽然是必定要有的,但不同的主站下发命令时采用的对象组与对象变体
不同。例如,以分级数据召唤的报文:
主站发出:05 64 0B C4 05 00 06 00 XX XX
C2 C2 01 3C 01 06 XX XX
以遥测、遥信的具体对象类型下发的报文:
主站发出:05 64 0E C4 05 00 06 00 XX XX
C2 C2 01 01 00 06 1E 00 06 XX XX
子站在应答时,必需采用确切的对象类型。
05 64 5E 44 06 00 05 00 XX XX
F1 E5 81 00 00 01 02 01 00 00 23 00 01 01 01 01 XX XX
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 BB C3
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 BB C3
1E 04 01 00 00 10 00 00 00 00 00 00 00 00 00 00 XX XX
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF
00 00 00 00 00 00 00 00 00 FF FF
7、 主站召唤子站的变化数据。
这一过程虽然是必定要有的,但不同的主站下发命令时采用的对象组与对象变体
不同。例如,以分级数据召唤的报文:
主站发出:05 64 11 C4 05 00 06 00 XX XX
C2 C2 01 3C 02 06 3C 03 06 3C 04 06 XX XX
以遥测、遥信的具体对象类型下发的报文:
主站发出:05 64 0E C4 05 00 06 00 XX XX
C2 C2 01 02 00 06 20 00 06 XX XX
子站在应答时,必须采用确切的对象类型。
05 64 32 44 06 00 05 00 XX XX
F1 E5 81 00 00 02 02 27 02 05 00 81 00 00 00 00 XX XX
00 00 10 00 01 00 00 00 00 00 00 20 02 27 03 01 XX XX
00 22 00 04 00 01 00 00 11 00 01 12 00 XX XX
一般来讲,全数据是定时召唤的,而平时要一直召唤变化数据,而有时要依据子站上
送的 IIN 标志进行召唤,当 IIN 标志中有关子站有数据需上传的标志清 0 之后,再进行变
化数据的召唤。

八、链路层通讯规则

1、 主站必须在复位了子站的链路之后,才能与该子站进行通讯。当主站检测出与子
站的通讯中断之后,要重新复位该子站的链路。
2、 很多情况下,子站也要复位主站的链路。当通讯中断之后,也要重新复位链路。
3、 当副方站的接收缓冲区将要满了,不能再接收数据(指的是应用层数据)时,就
会把返回给源方站的应答报文(ACK 或 NAK)中的 DFC 位置 1,源方站收到这个标
志 后 , 就 每 隔 一 段 时 间 查 询 一 下 副 方 站 的 链 路 状 态
( PRM=1,FCV=0,FunctionCode=9 ) , 副 方 站 就 以 链 路 状 态 帧 进 行 响 应
(PRM=0,FunctionCode=11,DFC=1 或 0),直到源方站收到的报文中 DFC 位清 0 后,
源方站才能继续向该站发送数据或命令。
4、 当源方站发出的链路层报文要求副方站的链路层响应时,副方站必须发出链路层
响应(它包括链路层的 ACK、NAK、链路状态等),如果该站要作为副方站发出链路
层响应还要作为源方站响应应用层报文时,该站必须先发出链路层响应。否则,
源方站就会认为报文没有顺利到达副方站,超过链路层的等待时间后,源方站就
会重发上次的链路层报文。多次重发后就会认为链路中断,从而导致通讯不正常。
5、 当源方站发出的“CONFIRMED USER DATA”收到了副方站的 NAK 后,一般来说很可
能是 FCB 位不一致,这时源方站就要发出“测试链路状态”报文,以统一双方的
FCB 位。

九、应用层通讯规则

1、 召唤数据或发出控制命令的一方,如果在规定的时间内没有收有预期的应答,就
会重发应用层报文。多次重发后仍未收到,则认为应用层通讯服务失败。
2、 应用层数据召唤采用的应用层报文序号与响应该数据召唤命令的数据包的应用层
报文序号以及对此数据包的应用层确认报文的应用层报文序号应该采用同一个值。
3、 不带品质描述的对象类型一般都有缺省的品质描述,如果以不带品质描述的对象
类型召唤某些数据,但其中有些数据元素的品质描述不是缺省的品质描述时,那
么,这些数据元素将不会上送。

You might also like