一、 数据链路层规约
数据链路层规约文件规定了DNP3.0版的数据链路层,链路规约数据单元(LPDU)以及数据链路服务和传输规程。数据采用一种可变帧长格式:FT3。
FT3 帧长格式:
一个FT3帧被定义为一个固定长度的报头,随后是可以选用的数据块,每个数据块附有一个 l6 位的 CRC 校验码。固定的报头含有2个字节的起始字,一个字节的长度(LENGH),一个字节的链路层控制字 (CONTROL),一个l6位的目的地址,一个16位的源地址和一个l6位的CRC校验码。
起始字(2字节) | 长度(1字节) | 链路层控制字(1字节) | 目的地址(2字节) | 源地址(2字节) | CRC校验码(2字节) | 用户数据块 |
---|---|---|---|---|---|---|
固定:0x0564 | 控制字、目的地址、源地址和用户数据之和,255≥长度≥5 | 通信控制字包含有本帧的传输方向,帧的类型以及数据流的控制信息。 | 低字节在前 | 低字节在前 |
注
用户数据=TH(传输层报头)+数据块
数据块=应用报文头+对象标题+数据
应用报文头分请求报头和响应报头
请求报头= Application Control应用控制(1BYTE)+ Function Code功能码(1BYTE)
响应报头= Application Control应用控制(1BYTE)+ Function Code功能码(1BYTE) + Internal Indication内部信号字(2BYTE)
对象标题=Object对象(2BYTE)+Qualifier限定词(1BYTE)+Range变程(由限定词决定)
Object对象(2BYTE)=Group对象组(1BYTE)+Variation变体(1BYTE)
1.1 链路层控制字
DIR(direction) | PRM(primary) | FCB | FCV | 功能码 |
---|---|---|---|---|
方向位,表示此帧是由主站发出还是从站发向主站。 | 源发标志位,表示此帧是来自原发站还是来自响应站。 | 帧的计数位,0、1交替变化,设计此位的目的是进行简单的纠错。 | 帧的计数位的有效标志,为1时,FCB位有效。 |
- DIR: 方向(DIRECTION)位
-
DIR=1 表示此帧自A发向B(即主站发出方向)
-
DIR=0 表示此帧自B发向A(即发向主站方向)
- PRM: 原发标志位(PRIMARY)
-
PRM=1 表示此帧来自原发站(通信发起站)
-
PRM=0 表示此帧来自响应站(通信应答站)
注意:原发站不一定就是主站,外站也可以是原发站。
-
FCB:帧的计数位(FRAME COUNTBIT)系用以防止对同一个副方站丢失或重复信息帧,每次成功地完成一次发送并确认(SEND-CONFIRM)服务(即由同一个原发站起动,向同一个副方站的发送服务)后该位就翻转一次。
-
FCV:帧计数有效位(frame count valid),它可使FCB位生效。
-
FCV=0 表示FCB位无效。
-
FCV=1 向副方站指示本帧的FCB位状态有效,必须和FCV置位的最近一帧之FCB位状态进行校核。
功能码:
对于原发送方的帧:(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 | 未用链路服务,或未实现链路服务 |
二、传输层规约
伪传输层它可以将一个“传输服务数据单元”(TSDU)拆卸成多个(多于一个)TPDUS(或帧)以及将多个(多于一个)的TPDUS组装成一个TSDU。这种过程的工作如下:
- 伪传输层取一个TSDU(用户数据)并将它分裂成若干个顺序的TPDUS(每个都带有“规约控制信息”(TPCI))。
- 每个TPDU都被传送到数据链路层当“链路服务数据单元”(LSDU)去传输。
- 它也会工作于相反的方式。“伪传输”自数据链路收到多个TPDUS并将它们组装成一个TSDU。
LSDUS都是用户数据的分段,它们都足够地短能够装入已定义了的FT3帧格式。当一个原方站发一份报文给副方站时,传输功能将报文分装成多个LSDUS。这些功能加一个“传输层标题”(TH)字节在用户数据分段的起始处,它包含供副方站重新组建完整报文所需的信息。所有伪传输层的报文都有一个TH。
副方站收到每个LSDU都检查它的TH字节,为了要知道正确的顺序并为上层构建一份TSDU报文。
TH包含的信息可以识别第一帧,最后一帧以及用一个六位的顺序号去识别一个帧。这种信息是重组报文所需的,也防止上层收到误导的或不完整的报文。
TH | USER DATA |
---|---|
传输层包头(单字节) | 用户数据(1-249个字节) |
2.1 传输层报头
FIN | FIR | SEQUENCE |
---|---|---|
此位置“1”,表示最后一帧 | 此位置“1”,表示第一帧 | 表示这一数据帧是用户信息的第几帧,帧号范围为 0~63,每个开始帧可以是 0~63 |
三、应用层规约
应用层规约定义应用层报文(APDU)的格式,在DNP内,只有被指定的主站能够发送应用层的请求报文而外站则只能发送应用层的响应报文。主站对一个外站必须在完成一个请求/响应回合之后才能对此外站发送其它的请求。在请求的回合正在进行之中,主站有可能收到非请求的响应。至于外站,也必须在完成 一个请求/响应的回合之后,才能接受任何其它的请求或发送非请求的响应。非请求的响应只能在请求/响应回合之前或之后发送,而不是在进行之时.一个外站若正处于非请求回合之中(即正在等待确认),它可以有条件地自主站接受一个请求。
此外,每个响应或请求都能包含1个或更多的单个分段。然而每个分段都应是可领悟的(可解析的),因而是可执行的(因为功能码是属于每个分段的)。对于报文存储能力有限的设备,建议应只送单个分段的请求报文而所期望的响应(它是全部分段的发送)则多于一个分段,这样是为了保证那些设备可以处理一个请求并集结起来,然而,更重要的是在接收下一个请求之前发送一个响应。否则,多分段的报文将要多分段的响应,这种响应所要求的报文存储可能大于设备可用的容量。
3.1 应用层报文格式
字段 | 英文名 | 说明 |
---|---|---|
请求/响应报头(APCI) | Request/Response Header | 标识报文的目的并且由APCI(应用规约控制信息)所组成 |
对象标题(ASDU) | Object Header | 标识后随数据对象 |
数据(ASDU) | Data | 对象标题内所指定类型的数据对象 |
3.2 应用报头
应用的报文可以被打包成若干分段,每个分段小到足以配适于应用报文的缓存。对于分段缓存所推荐的规模为2048字节,以便保持与当前DNP设备的兼容性。每个分段有一个应用报头和适当的对象标题,以至每个分段都可以作为独立的报文去处理,处理过后就可丢弃掉让出地方来给下一个分段。
3.2.1 请求报头
字段 | 英文名 |
---|---|
应用控制(AC)1字节 | Application Control |
功能码(FC)1字节 | Function Code |
3.2.2 响应报头
字段 | 英文名 |
---|---|
应用控制(AC)1字节 | Application Control |
功能码(FC)1字节 | Function Code |
内部信号(IIN)2字节 | Internal Indications |
3.2.3 应用控制(AC)
应用控制字段的长度为一个8位字节。它提供构造多分段应用报文所需的信息。应用控制字段的报文如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3nNlkqCt-1604670861281)(D:\note\网络\DNP3\DNP协议.assets\image-20201013101843955.png)]
-
FIR:此位若置“1”,表示本报文分段是整个应用报文的第一个分段。
-
FIN:此位若置“1”,表示本报文分段是整个应用报文的最后一个分段。
-
CON:此位若置“1”,表示应用报文的发送方期待接收该分段的一方在收方的应用报文中给予确认接受方予以确认,且在确认报文内用一个应用功能码(0)。
-
SEQUENCE:表示分段的号码。分段号码0至15是为主站 的请求和全部外站的响应保留的(不是主动上报的响应)。分段号码16至31是为外站来的主动上报的响应保留的。关于主动上报的响应,每个来自或发向同一外站的每个连续的分段也都必需有一个升序的序号(这个号码自15溢出到0)。
-
主站与外站应用的响应逾时。这些逾时规定了一个应用对一个响应必需等待多长时间,或对CONFIRM响应要等待多长时间方才重发或异常地中断通信的回合。
-
主站与外站应用的重发计数。应用可以支持也可以不支持应用层的重发,重发计数规定,如果响应失败,请求可重发几次,或者收不到CONFIRM响应时可将原响应重发多少次。
-
一个外站在开始处理第二个请求之前,必须将前一个请求完全处理好并对它作出响应。它不能同时处理多个请求。
-
主站发到外站的全部请求其序号为0至15。发自外站的非请求的响应其序号则包括在16至31以内。
-
-
注:一个未经请求的响应是外站发出的一个报文,通常它包含着事件数据,它会自动发送给主站,主站无需为这个数据而询问外站。
-
注:建议外站所报告的任何已变化了的数据在发送时均要求在响应中带有确认。
序号工作规则
-
序号自15滚到0或31滚到16。从DNP主站发出的每个连续的请求分段都有一个升序序号。至于请求报文的重发则例外。关于单个分段的请求在重发时其序号是不递增的。至于多分段请求的重发,所重发的请求中第一个分段的序号就是方才失败的请求之最后分段的序号。
-
对于单分段的请求其单分段响应具有与请求相同的序号。
-
对一个单分段请求的多分段响应,它的第一个分段,具有与请求相同的序号。至于多分段响应的后续分段,其序号是递增的
-
对于多分段请求的多分段响应,其第一个分段的序号与多分段请求的最后分段之序号相同
重发处理规则
-
当一个响应在逾越时限之后没有被收到,如果系统使用的是应用层重发,则该请求将仍用同一序号重发。
-
如果所收到的两个报文具有相同的序号,通常意谓着报文的响应未被对方站收到。在这种情况下,就重发响应(不必要重新处理这个报文)。
-
如果所收到的两个CONFIRM响应具有相同的序号,则不理会第二个响应。
3.2.4 主站的请求与非请求响应之冲突
当外站发生了非请求响应时,有一种可能是在外站发送非请求响应的同时,主站也在发送请求。当外站期待收到对其非请求响应的CONFIRM时却收到了主站的请求。主站正期待收到其请求的响应时收到了非请求的响应。
对上述情况以及类似情况的处理取决于主站所发出的请求之类型。
主站永远将立即处理非请求响应,即使主站正在期待先前所发请求之响应时,也要立即处理非请求响应。如果外站要求确认(即CON位置位)主站就要立即发出对非请求响应之CONFIRM。
通常外站将立即处理请求,即使它正在期待先前所发请求响应之CONFIRM。除了对系统数据(例如二进制输入数据,事件计数数据等等)的READ请求以外,所有的请求都按此处理。这种操作模式被称之为立即处理(IMMEDIATE_PROCESS MODE)模式。另一种办法是外站若正在等待先前非请求响应之CONFIRM时,它就不处理主站来的READ请求,在处理请求之前,将先等待CONFIRM.这种功能性的变异,其目的在于防止数据事件之丢失或重复。这种操作的模式被称之为PROCES_AFTER_CONFIRM(确认后处理)模式。
立即处理模式(IMMEDIATE PROCESS)
确认后处理模式(PROCESS AFTER CONFIRM)
当外站收到一个对系统数据的READ请求时,并且先前一个非请求响应也尚未得到CONFIRM时,外站将不处理READ请求,直到非请求响应获得CONFIRM为止。如果外站立即处理了READ请求,就要承担失落数据或数据重复的危险。这是因为有可能READ请求所要的数据对象已经在尚未CONFIRM的非请求响应之中了。
出错后数据恢复
DNP应用层依靠数据链路层作所有报文的发送 接收与检错,应用层不负责对通信问题的恢复。如果一个通信回合的故障被数据链路层报出,应用层应中止应用层的通信回合并向用户报告出错。此外,主站应用层应指示出全部外站响应内的内部信号值。用户层负责启动任何一种出错的恢复步骤,用户层特别应利用自任何外站响应发送回来的内部信号(IIN)。
3.2.5 功能码(FC)
功能码标识着报文的目的.这个字段的长为一个8位字节。有两组功能码;一个用于请求,另一个用于响应。
1. 传输功能码
代码 | 功能 | 说明 |
---|---|---|
0 | 确认 | 用于对请求与响应报文分段之确认。对此报文不要求响应。 |
1 | 读 | 请外站送所指定的对象;以所请求的对象(可用的对象)作响应。 |
2 | 写 | 向外站存入指定的对象;以操作的状态作响应。 |
2. 控制功能码
代码 | 功能 | 说明 |
---|---|---|
3 | 选择 | 选择或打开输出点但不置定或产生任何输出作用(控制,设置数值,模 拟输出);以所选控制点的状态作响应。“操作”功能码被用以激活这些输出。 |
4 | 操作 | 对于由“选择”功能所已选定的点设置或产生输出动作;用控制点的状态作为响应。 |
5 | 直接操作 | 选择并设置或操作指定的输出,用控制点的状态作响应。 |
6 | 直接操作,无确认 | 6 选择并设置或操作指定的输出,但不发送响应给请求方。 |
3.冻结功能码
代码 | 功能 | 说明 |
---|---|---|
7 | 立即冻结 | 复制指定的对象于一个冻结缓存,并以操作的状态作响应。 |
8 | 立即冻结(无确认) | 复制指定的对象于一个冻结缓存,不用报文作响应。 |
4. 传输功能码
代码 | 功能 | 说明 |
---|---|---|
9 | 冻结与清除 | 复制指定的对象于一个冻结缓存,然后清除对象,用操作的状态作响应 |
10 | 冻结与清除(无确认) | 复制指定的对象于一个冻结缓存,然后清除对象,不用报文去响应。 |
11 | 有时间的冻结 | 在指定的时间和时间间隔上,复制指定的对象于一个冻结缓存,用冻结操作的状态作响应。 |
12 | 有时间的冻结(无确认) | 复制指定的对象于冻结缓存,在指定的时间和时间间隔上,不用报文去响应 |
5.应用的控制功能码
代码 | 功能 | 说明 |
---|---|---|
13 | 冷再启动 | 实现所要求的复位顺序;以指示时间的时间对象作响应,直到外站可以工作为止。 |
14 | 热再启动 | 实现所要求的部分复位顺序;以指示时间的时间对象作响应,直到外站可以工作为止。 |
15 | 将数据初始化到缺省值 | 将指定的数据初始化到上电的初始值;以操作的状态作响应。 |
16 | 初始化应用程序 | 使指定的应用程序准备就绪运行;以操作的状态作响应。 |
17 | 启动应用程序 | 启动指定应用程序运行;以操作的状态作响应。 |
18 | 停止应用程序 | 停止指定的应用程序;以操作的状态作响应。 |
6. 组态功能码
代码 | 功能 | 说明 |
---|---|---|
19 | 保存组态 | 将指定的组态数据保存入非易失的存储器用一个指示时间对象作响应直到外站可用为止。 |
20 | 允许非请求报文 | 允许对指定的时间对象自发地报告;以操作的状态作响应。 |
7.传输功能码
代码 | 功能 | 说明 |
---|---|---|
21 | 停用非请求报文 | 停用指定数据对象的自发报告;以操作的状态作响应。 |
22 | 分配等级 | 将指定的数据对象分配给特定的等级(CLASS)。 |
8.时间同步功能码
代码 | 功能 | 说明 |
---|---|---|
23 | 延迟测量 | 允许应用程序为一个特定的外站计算其通路的延迟(或传播延迟)。由此功能码所算出的数值应被用以在设置外站时间时,调节日期的时间 |
9.保留功能码
代码 | 功能 | 说明 |
---|---|---|
23~120 | 保留供今后之用 | |
121~128 | 仅保留供测试之用 |
10.响应功能码
代码 | 功能 | 说明 |
---|---|---|
0 | 确认 | 对报文分段的确认,既用于请求也用于响应,该报文不请求响应。 |
129 | 响应 | 响应于一个请求的报文。 |
128 | 非请求的响应 | 非由请求提示的非请求响应。 |
3.2.6 内部信号(IIN)
内部信号(IIN)字段是一个有两个八位字节的字段,它在所有的响应中跟在功能码之后。当一个请求,由于格式出错或所请求的数据无效而不能处理时,IIN总能以适当的置位作出回报。
位序 | 说明 |
---|---|
1字节bit0 | 所有外站的报文已收到;当收到带有全部站目的站(FFFFH)的请求时,则置位;在下一个响应后被清除(即使是要求对全局请求的响应);用以让主站知道本站收到了广播报文。 |
1字节bit1 | 1级(CLASS)数据有效可用;当已被组态为1级的数据正准备发送给主站时,则置位;当此位在响应中置位时,主站应向外站请求此级数据。 |
1字节bit2 | 2级数据有效可用;当已被组态为2级的数据正准备发送给主站时,则置位;当此位在响应中置位时,主站应向外站请求此级数据。 |
1字节bit3 | 3级数据有效可用;当已被组态为2级的数据正准备发送给主站时,则置位;当此位在响应中置位时,主站应向外站请求此级数据。 |
1字节bit4 | 向主站要求作时间整步,主站以向外站写入“时间与日期”作时间的整步;当时间被主站设定后,这位就被清除。当主站直接地对外站信号对象的这一位 写入“0”时,它也被清除 |
1字节bit5 | 当某些或全部外站的数字输出点处于本地状态时,这位就置位。亦即,外站的控制点不能通过DNP规约访问了。当外站处于远方态,它就被清除,亦即外站的控制输出可通过DNP规约访问了。 |
1字节bit6 | 设备有毛病。外站有异常情况时,它被置位。对于一台给定的设备有一份简要说明讲述影响这一位的条件。仅当不能使一个或几个其它的IIN位的组合来描述这个状态时,才该使用这位。 |
1字节bit7 | 设备再启动。当用户应用程序在外站再启动时它被置位。当主站直率地向外站的内部信号对象的这一位写“0”时,此位即被清除。 |
2字节bit0 | 功能码未被完成。 |
2字节bit1 | 被请求的对象是未知。外站没有这个被指定的对象,或者没有对象被分配在所指定的级中。该信号应该被用于查找故障之用并通常用以指示设备说明(PROFILE)或组态问题失配。 |
2字节bit2 | 在限定词(QUALIFIER),变程或数据场内的参数失效或越出变程。这是对应用请求格式出错的一个总管信号。这个信号应该被用于查找故障之用,并且通常指示组态的问题。 |
2字节bit3 | 事件缓存,或其它应用的缓存已溢出了。例如COS/SOE的缓存已溢出。主机应该努力去恢复尽可能多的数据并向用户指出有可能丢失了数据,用户应启动适当的出错恢复过程。 |
2字节bit4 | 请求已被理解,且所请求的操作已在执行。 |
2字节bit5 | 置位以表明当前外站内的组态已崩溃以及主站应用层应将此种异常通知用户。主站可将另一套组态数据下装至外站。注意,有时一个崩溃的组态会使一个外站不能工作,使它不能将这种情况以通信告知主站。 |
2字节bit6 | 保留按协议使用,当前始终置“0”回送。 |
2字节bit7 | 保留按协议使用,当前始终置“0”回送。 |
3.2.7 对象标题
报文的对象标题指定包含在报文中的数据对象(或I/O)或是被用以响应此报文的数
据对象(或I/O)。在请求与响应中对象标题的格式是相同的,但对标题的解释取决于它是请求还是响应以及与标题伴随的功能码。
字段名 | 字节大小 | 说明 |
---|---|---|
对象(object) | 2字节 | 指定对象组以及跟在标题后面的对象变化。对象段唯一地标识了对象的类(CLASS)与型(TYPE),它给定了数据对象的结 |
限定词(QUALIFIER) | 1字节 | 规定了变程段的意义 |
变程(Range) | 0~8字节 | 表明对象的量,起点与终点的指标或所讨论对象的识别符。唯一地标识出所关心的对象。如果限定词段指出没有变程段,则变程段也可以不存在.这个字段的规模可自零变到八个字节。 |
1. 对象段
对象段规定一个对象组和在该组内的对象变体(VARIATION)。对象的组别与变体结合起来可以唯一地规定报文中所指的对象。
对象可被分配于四级之一,当对象段指定一个对象级而不是一个指定的对象型时,对象段间接地指所有分配于此级的数据对象而不是指任何指定的对象的型式。
对象段为两字节长。第一个8位字节指定数据的基本型式(例如模拟输入),第二个8位字节指定数据型式的变体(例如16位模拟输入或32位模拟输入)。在请求方,若对象变体被指定为零,这表明所有的对象变体属于同一组内(即全部的或任何的模拟输入型)。然而在响应方,变体0不能被用来指定对象。必需指明特定的变体。
2. 限定词段
限定词段规定了变程段的意义。变程段被用以索引数据或作为一个识别符。变程段的使用与结构取决于在指标规模(INDEX SIZE)段和限定词码(QUALIFIER CODE)段内的数值,当变程段值和终点变程值.它们合起来为对象标题后随的数据定义一个对象的变程。每个起始变程和停止变程的分段(SUB_FIELD)被称之为指标(INDEX)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I0l6d6q1-1604670861282)(D:\note\网络\DNP3\DNP协议.assets\image-20201013180024172.png)]
- 指标规模(INDEX SZE)
- 当QUALIFIER码等于11时,在一个请求的对象标题内之(INDEX SIZE)
- 限定词码()
3. 变程
对象。必需指明特定的变体。
2. 限定词段
限定词段规定了变程段的意义。变程段被用以索引数据或作为一个识别符。变程段的使用与结构取决于在指标规模(INDEX SIZE)段和限定词码(QUALIFIER CODE)段内的数值,当变程段值和终点变程值.它们合起来为对象标题后随的数据定义一个对象的变程。每个起始变程和停止变程的分段(SUB_FIELD)被称之为指标(INDEX)。
- 指标规模(INDEX SZE)
- 当QUALIFIER码等于11时,在一个请求的对象标题内之(INDEX SIZE)
- 限定词码()
3. 变程
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/137669.html