DNP3.0快速入门

来源:互联网 发布:数据脱敏方式 编辑:程序博客网 时间:2024/06/05 20:43


DNP3.0快速入门

白银魁 2002-04-15

一、学习DNP规约的必要性

DistributedNetwork Protocol由Harris公司提出,于1993年开始应用。近一段时间,DNP规约在国内的应用有上升的趋势,特别是大型综合自动化变电站采用的国外的智能设备,有很多都要求采用DNP规约。目前,与我们三部相关的产品主要是DF1700及DF1331。

二、培训目标

通过学习,使大家都达到能够分析报文的水平。

三、DNP规约的分层结构

DNP规约虽然很庞大,但它层次清晰,只要掌握好DNP的分层结构,DNP规约就非常好理解了。

DNP规约共分为3层:链路层、传输层和应用层。以下面的一包报文为例(16进制显示,下同):

05 64 FE44 03 00 03 00 CE 52

F1 A5 8100 00 01 02 01 00 00 EC 00 01 01 01 01 6D DB 01 01 01 01 01 01 01 01 01 01 0101 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 0101 01 01 01 01 01 01 01 81 81 81 81 81 01 18 F1 01 01 01 01 01 01 01 01 01 0101 01 01 01 01 01 BB C3 01 01 01 01 01 01 01 01 01 01 01 01 81 01 81 81 F4 7281 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 B7 F4 81 01 01 01 81 01 01 0101 01 01 01 01 01 01 01 F0 FF 01 01 01 01 81 01 81 81 01 01 01 01 01 01 81 0106 11 01 01 81 01 01 01 01 01 01 01 01 01 01 01 01 01 9A 4A 01 01 81 01 01 0181 01 01 01 01 01 01 01 01 01 46 83 01 01 01 01 01 01 01 81 81 81 01 81 01 0101 81 84 DC 81 01 01 01 81 81 01 01 01 81 81 01 01 01 81 81 1E CE 01 01 01 8181 01 01 01 81 81 01 01 01 81 81 01 45 85 01 01 81 01 01 01 01 01 81 01 01 0181 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报文中传输层报文与应用层报文是同时存在或同时不存在的。各层报文间的关系为:链路层报文中可以封装有传输层报文,也可以没有传输层报文;传输层报文内封装了应用层报文。各层之间除了封装与被封装关系外,没有其它的关系。

四、链路层报文结构

以报文例(1)为例,粉红色部分为16位的CRC校验码,这条报文的第一行共10个字节,我们称之为链路报文头,其中最后2个字节为CRC校验码,所有的DNP报文都有这样一个链路报文头。链路报文头以外的部分每18个字节为一组,其中用户数据为16个字节,最后2个字节为CRC校验码,最后一组最少为3个字节,其中最后的2个字节仍为CRC校验码。这就是链路层报文的框架。其中关键的部分就是链路报文头。

链路报文头的结构

05 64 0500 03 00 03 00 5D D1 报文例(2)

05 64 5F44 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+2)=292字节。

00及44为链路控制字节,它用来指出本条链路层报文要实现的链路层功能。对于封装有应用层报文的链路层报文来说,根据链路控制字节并不能判断出应用层要实现的功能。应用层报文的含义要根据应用控制字节及应用层功能码等信息共同判断。链路控制字节的具体定义,将在下面讲解。

两个03 00为目的地址。 两个03 00为源地址。

粉红色部分为16位的CRC校验码。 综上所述,链路报文头的结构为:(注:每格为1个字节) 05H 64H XX XX XX XX XX XX XX XX CRCCRC起始字起始字链路报链路控目的地目的地源地址源地址

L H 节1 节2 文长度制字节 址L 址H 校验L 校验H

链路控制字节定义

链路控制字节是链路层中的难点,不过看过之后你就会觉得非常简单。首先,我们先来了解一下源方站(发启站,Primary Station)与副方站(响应站,Secondary Station)的概念。源方站与副方站仅仅是相对于一次通讯过程而言,我们不能说主站就是源方站,子站就是副方站,反过来,我们也不能说子站就是源方站,主站就是副方站。实际上,主站和子站都是既可以作为源方站也可以作为副方站。但在一次通讯过程中,主站和子站中只能有一个作为源方站,另一个作为副方站。在一次通讯过程中,源方站处于主导地位,源方站实现的功能有:检测副方链路层是否在线,复位副方链路,向副方发送应用层数据、应用层命令以及实现应用层的其它功能;副方站在通讯过程中处于被动响应地位,副方站实现

的功能有:处理收到的数据及命令,在需要的时候给出对源方站链路层报文的链路层响应。下面,以主站向子站召唤变化遥测为例,说明一下源方、副方的交替。

①.主站作为源方站,向子站召唤变化遥测数据。→

← 此时子站作为副方站,正确接收到这条命令后,发出链路层肯定确认给主站。②本次通讯过程结束。

← 子站作为源方站,向主站发送变化遥测数据。③

④.此时主站作为副方站,在正确接收到这些数据后,发出链路层肯定确认给子站→ 本次通讯过程结束。

⑤.主站作为源方站,向子站发出变化遥测已正确接收的应用层确认→

← 此时子站作为副方站,正确接收到这条命令后,发出链路层肯定确认给主站。⑥召唤变化遥测过程结束。

在实际的通讯过程中,①、③这两条报文是肯定要有的,有时②、④这两条报文并不出现,这取决于①、③这两条报文是否需要链路层的确认。⑤这条报文是否存在,取决于③这条报文是否需要应用层的确认。⑥这条报文只有当⑤这条报文存在并且需要链路层确认时才会存在。

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

副方站的链路控制字节结构 D7 D6 D5 DIR PRM RES D4 DFC D3 D2 D1 D0 链路层功能码 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 14F3 03 00 03 00 70 9A D9 C5 01 3C 02 06 3C 03 06 3C 04 06 3C 01 06 06 5E

①、请列出本条报文中的应用层报文

②、本条报文是发向主站的还是发向子站的?③、本条报文需要接收方给出链路层确认吗?

五、应用层报文结构

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

应用控制字节的结构 D7 D6 D5 FIR FIN CON D4 D3 D2 应用层报文序号 D1 D0ApplicationFunCode 应用层

功能码

IIN_L IIN低字节

IIN_H IIN高字节

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:确认”后面没有数据对象部分。主站发出的报文与子站发出的报文在数据对象部分的结构是完全相同的。这一部分又分为携带数据元素的情况与不携带数据元素的情况。例如:主站向子站下发的对钟报文中,就是要向子站中的系统时钟数据项中写入指定的值,这条报文的数据对象部分就是携带数据元素的;子站为了响应主站的召唤数据命令,向主站传送的各种数据报文,无疑也是携带数据元素的。而主站下发给子站的召唤数据报文中的数据对象部分仅仅指定了数据项的范围而已,因此是不携带数据元素的。

先讲一下不携带数据元素的情况。(用于数据召唤命令)


原创粉丝点击