BACnet标准与楼宇自控系统技术
上QQ阅读APP看书,第一时间看更新

3.5 应用层

BACnet标准中的第5应用层的部分叙述了:应用层模型、BACnet报文的分段、BACnet AP-DU的传输、应用层协议状态机、应用层协议时序图和应用层服务约定用法。

在BACnet体系结构中应用层处于最高层,因此距用户最近,属于互操作信息处理层。应用层的功能主要有:定义楼宇自控设备的BACnet对象模型;还要定义面向应用的通信服务。对象与服务是标准中定义互操作功能的两个主要内容。

BACnet应用层的通信功能:①定义“证实服务”和“非证实服务;②定义控制和管理与通信报文长度有关的“分段和重组”功能;③检错和纠错机制。因此,面向应用的通信服务包括应用层服务及其类型与结构。

BACnet标准基于BACnet对象和应用层服务定义了事件与报警监控机制和并发事件处理的优先权机制。

3.5.1 应用层的模型

1.应用进程

建立BACnet应用层模型的目的是为了清楚地描述应用层与应用程序之间的交互、应用层与协议栈中下面各层次的关系,以及应用层与远程设备中应用层的对等交互。

在网络通信的过程中,进程是指在系统中正在运行的一个应用程序;进程是处于运行过程中的程序实体,一个通信进程由程序代码、数据和进程控制块3个部分构成。程序代码规定了进程的结构,规定了处理数据的逻辑关系和顺序;数据是计算及数据处理的对象;进程控制块是操作系统内核为了控制进程所建立的数据结构,是操作系统用来管理进程的内核对象。多个进程可以在操作系统的协调下,在内存中平行运行。计算机网络应用程序的运行,是以进程的形式展开的。网络操作系统在运行中,可以同时打开和运行多个不同的应用程序,每一个网络应用程序都是一个网络应用进程。

2.BACnet应用进程的模型

BACnet标准中这样定义一个应用进程:在一个系统中,针对某个应用而进行信息处理的功能模块。在应用进程中有一部分位于应用层之外,它们与通信功能无关,这些部分都不属于BACnet标准的规范范围。我们将应用进程中位于应用层内的部分称为应用实体,即一个应用实体是应用进程中与BACnet通信功能相关的部分。一个应用程序通过应用编程接口(Application Program Interface,API)与应用实体进行交互。BACnet应用进程的模型如图3-13所示,阴影部分是应用进程位于BACnet应用层中的部分。

978-7-111-38144-0-Chapter03-13.jpg

图3-13 BACnet应用进程的模型

图3-13中的应用实体包括:BACnet用户元素(User Element)和BACnet应用层服务元素(Ap-plication Service Element,ASE)。BACnet应用层服务元素描述了应用服务或功能的集合。BACnet用户元素执行多种功能,并且支持本地的API,它描述每个应用服务中“服务过程”的实现。BACnet用户元素负责:保存事务处理的上下文信息,包括产生请求标识符(ID),记录哪个标识符是与哪个设备发出的应用服务响应相对应的;还有一个功能是保存超时重传机制所需的超时计时器;第三个功能是将一个设备的行为映射成为BACnet对象。

两个对等应用进程间的信息交换,被表示成抽象服务原语的交换。这些服务原语用来传递一些特定的服务参数,标准中定义了4种服务原语:请求(request)、指示(indication)、响应(response)和证实(confirm)。包含在这些原语中的信息,由各种协议数据单元(Protocol Data Unit,PDU)传递。

有证实(confirmed)服务的符号标记是CONF_SERV,指明使用BACnet的有证实服务PDU。无证实(unconfirmed)服务的符号标记是UNCONF_SERV,指明使用BACnet的无证实服务PDU。分段确认(segment acknowledge)服务的符号标记是SEGMENT_ACK,指明使用BACnet的分段确认PDU。差错(error)服务的符号标记是ERROR,指明使用BACnet的差错PDU。拒绝(reject)服务的符号标记是REJECT,指明使用BACnet的拒绝PDU。中止(abort)服务的符号标记是A-BORT,指明使用BACnet的中止PDU。

BACnet设备(BACnetDevice)是指任何一种支持用BACnet协议进行数字通信的真实的或者虚拟的设备。每一个BACnet设备必须且只能包含一个设备(Device)对象。每一个BACnet设备都由一个NSAP惟一定位,在NASP中,包含了一个网络编号和一个MAC地址。

在多数情况下,一个BACnet设备就是一个物理设备。然而在某些情况下,一个单一的物理设备也可以形成多个“虚拟的”BACnet设备。

3.BACnet协议栈及数据流

BACnet协议栈及数据流的移动、封装、BACnet协议栈的应用层及各个不同层级的数据单元对应关系如图3-14所示。

978-7-111-38144-0-Chapter03-14.jpg

图3-14 BACnet协议栈及数据流

针对BACnet协议栈应用层提出的具体服务请求,应用程序进行响应:向应用层提供满足特定服务的数据,然后加上应用协议控制信息(APCI)作为应用层协议数据单元(Application Pro-tocol Data Unit,APDU),构成了网络层服务原语的数据部分,并通过网络层服务访问点(Net-work Service Access Point,NSAP)下传到网络层。按照这样的方式,这个请求进一步下传到本地设备协议栈的以下各层。于是,报文就这样被传送到远程的设备,并在远程设备协议栈中逐级上传,最后指示原语看起来似乎是直接从远程的BACnet应用层服务元素上传到远程的BACnet用户元素。同样,任何从远程设备发回的响应,也是以这样的方式回传给请求设备的。

APDU通过NSAP下传到网络层,网络层将整个APDU作为网络层的服务数据单元(NSDU)加上网络层协议的控制信息(NPSI)组成网络层协议数据单元(NPDU);NPDU下传到数据链路层后,类似地组装成数据链路层协议数据单元(LPDU);最后的物理层数据单元是PPDU,图3-14中的LPCI、MPCI和PPCI分别是数据链路层协议控制信息、MAC层协议控制信息和物理层协议控制信息。

应用实体通过API与应用程序除了交换服务原语和服务参数外,还交换接口控制信息(In-terface Control Information,ICI)参数。ICI的具体内容取决于服务原语的类型。应用实体将接收到的ICI参数下传至下面各层,从而使得各层可以构建自己的PDU。而由应用实体回传给应用程序的ICI参数,则包含了下面各层从各自PDU中得到的信息。

3.5.2 有证实的应用层服务和无证实的应用层服务

1.有证实的应用层服务

BACnet基于C/S模式定义了有证实的应用层服务。客户端通过具体的服务请求实例向服务器端请求服务,服务器端通过响应请求来为客户端提供服务,这种关系如图3-15所示。在客户端和服务器端进行数据交互过程中,提出服务请求的BACnet用户,称为请求方BACnet用户;实施响应并担当服务器角色的BACnet用户,称为响应方BACnet用户。

有证实应用层服务的过程是:由请求方BACnet用户发出一个有证实服务请求原语(CONF_SERV.request),形成请求PDU,发送给响应方BACnet用户。当这个请求PDU到达响应方BACnet用户时,响应方BACnet用户则收到一个有证实服务指示原语(CONF_SERV.indication)。同样,由响应方BACnet用户发出的一个有证实服务响应原语(CONF_SERV.response),形成响应PDU回传给请求方BACnet用户。当响应PDU到达请求方BACnet用户时,请求方BACnet用户则收到一个有证实服务证实原语(CONF_SERV.confirm)。无论是请求方BACnet用户还是响应方BACnet用户,在该过程中都进行了PDU的发送和接收。因此,所谓“发送方BACnet用户”指的是发起一个PDU发送的BACnet用户;而“接收方BAC-net用户”指的是接收到PDU到达指示的BACnet用户。

978-7-111-38144-0-Chapter03-15.jpg

图3-15 客户端与服务器端的关系

2.无证实的应用层服务

在无证实应用层服务中,不存在C/S模式,因此也就没有“请求方BACnet用户”和“响应方BACnet用户”的说法了,只有“发送方BACnet用户”和“接收方BACnet用户”,BACnet标准用它们来定义无证实的应用层服务的服务过程。

3.5.3 BACnet报文的分段

为了实现长报文的传输,BACnet采取了应用层报文分段的机制来对报文进行分段。在BAC-net中只有有证实请求(Confirmed-Request)和复杂确认(Complex-ACK)报文可能需要分段。

1.报文分段规则

(1)APDU数据流的分段规则

每个BACnet报文都是一个由标记符和数据组成的序列,这个序列是按照给定编码规则进行编码而形成的。对于APDU数据流进行分段的规则如下:

1)一个完整的报文尽可能作为一个APDU发送。

2)当一个完整的报文不可能作为一个APDU发送时,则应分段成最少个数的多个APDU发送。

3)对报文进行分段时,必须以1B(8bit)作为最小的分割单位。

(2)APDU最大长度的确定

在BACnet报文中,APDU的最大长度不是固定的,其具体值是下列各长度值中的最小值:

1)设备所能发送的APDU的最大长度。这个长度一般与本地设备的缓冲区大小等因素有关。

2)BACnet互联网所能传输到远程设备的APDU的最大长度一般由本地、远程以及中间传输网络的数据链路所允许的网络层协议数据单元(NPDU)的最大长度所决定。

3)远程设备所能接收的APDU的最大长度,其值不能小于50B。

如果报文的发送设备是请求方BACnet用户,也就是说要发送的APDU是BACnet有证实请求PDU(BACnet-Confirmed-Request-PDU)或者是BACnet无证实请求PDU(BACnet-Unconfirmed-Request-PDU),这时远程设备所能接收APDU的最大长度由远程设备对象的最大APDU长度支持属性所确定。或通过向远程设备发送一个Who-Is服务请求,使其回复一个I-Am服务响应,通过读取其中的‘最大APDU长度支持(Max APDU Length Accepted)’参数来获得该属性值。

如果报文的发送设备不是请求方BACnet用户,也就是说要发送的APDU是BACnet复杂确认PDU(BACnet-Complex-ACK-PDU),这时远程设备所能接收的APDU的最大长度由本报文所响应的那个BACnet有证实请求PDU中的‘最大APDU长度支持’参数所确定。

2.分段协议控制信息(PCI)

在BACnet协议栈及数据流流向的分析中知道,上一层的数据单元送到下一层时,整体作为下一层的数据部分,然后再加上改层的控制信息,形成本层数据单元。

如果报文经编码处理后生成的APDU的长度小于或等于允许最大可传输长度的值,则‘报文分段’和‘后继’两个参数都应设置为FALSE。

由有证实请求报文或复杂确认报文的每个分段所生成APDU的头部,还有两个条件参数:第一个条件参数是‘序号’,这个8位二进制无符号整数被报文分段的发送方用来指定当前分段在整个报文分段序列中的位置;另一个条件参数是‘预设窗口尺寸(Proposed Window Size)’,它同样是一个8位二进制无符号整数。报文分段的发送方用该参数来指明,在收到一个分段确认(SegmentAck)报文之前,它预备发送的最大报文分段数。

起始分段中的“序号”参数应设置为0。报文分段接收方在收到一个或一组报文后,会向发送方发送一个包含有“序号”参数的分段确认PDU。序号的大小,等于最近一次成功接收到的分段的“序号”参数值。这样,这个分段确认PDU不但用来请求发送方继续发送后一个或一组分段,还用来对先前一个分段或者是先前所有未被确认的分段(当Window Size值大于1时)确认。

当然,在分段传输交互过程中的任何一方如果想中止交互过程,只要发送一个中止PDU(Abort-PDU)即可。

3.5.4 BACnet APDU的传输

1.有证实请求报文的传输

客户端设备在下列两种情况下将启动一个计时器,用来计量对所关注的报文确认的时间。这两种情况是:①传输了一个完整未分段有证实请求报文后;②在等待接收分段有证实请求报文最后一个分段所对应的分段确认报文的确认信息时。一旦收到了一个关于那个还没有确认的有证实请求报文所发的差错APDU、拒绝APDU、中止APDU、简单确认(SimpleACK)APDU或复杂确认(ComplexACK)APDU,则停止计时,同时通知客户应用程序。如果计时器的时间值超出了客户设备对象的APDU超时(APDU_TimeOut)属性值,则整个有证实请求报文重新发送,计时器重新计时。所有有证实请求报文的超时重发过程都按照上述过程进行,直至重发次数超出了客户端设备对象的APDU重发次数(Number_Of_APDU_Retries)属性所规定的次数。若超出规定值仍未收到响应,该报文将被丢弃,同时通知客户应用程序。

2.分段的有证实请求报文的传输

客户端设备在发送分段的有证实请求PDU的第一个分段之前,首先选择一个预设窗口尺寸值,以表示它在收到一个分段确认报文之前,一次准备发送的报文分段最大个数。预设窗口尺寸值的选取由开发者自己决定,这只与客户端设备有关,但是其取值范围限制在1~127。这个值由有证实请求PDU分段的‘预设窗口尺寸’参数表示,并且同一报文的每个分段该参数值都应该相同。

在发送了有证实请求报文的第一个分段后,客户端设备将启动一个计时器,用来计量对该分段确认的时间。一旦收到了一个关于这个还没有确认的有证实请求报文分段所发的差错APDU、拒绝APDU、中止APDU或分段确认APDU,则停止计时。如果计时器的时间值超出了客户设备对象的APDU分段超时(APDU_Segment_Timeout)属性值,则重发这个分段,并将计时器置零,重新计时。所有分段的超时重发过程都按照上述过程进行,直至重发次数超出了客户端设备对象中APDU重发次数属性所规定的次数。若超出规定值仍未收到响应,整个报文将被丢弃,同时通知客户应用程序。

当服务器端设备收到分段的有证实请求PDU报文的第一个分段后,将会选择一个实际窗口尺寸(Actual Window Size)值,以表示它在发送一个分段确认报文之前,一次准备接收的报文分段最大个数。实际窗口尺寸值的选取由开发者自己决定,这只与服务器设备有关,但是它还不能大于有证实请求PDU中的‘预设窗口尺寸’参数值,而且其取值范围限制在1~127。对同一有证实请求报文所回应的所有分段确认报文,其实际窗口尺寸值都应该相同。需要特别说明的是,不管实际窗口尺寸值是多少,服务器设备在收到有证实请求报文的第一个分段后,应立即响应一个分段确认报文。

在收到第一个分段确认APDU后,客户端设备得到该报文中携带的‘实际窗口尺寸(actual-window-size)’参数值,并将该值设置成客户设备自己的实际窗口尺寸。当客户端设备正在发送一个有证实请求报文分段序列的过程中,即使需要确认的分段数量小于实际窗口尺寸值,都可能会收到拒绝APDU、中止APDU或分段确认APDU。

3.分段的复杂确认报文的传输和分段确认APDU的传输

(1)分段的复杂确认报文的传输

服务器端设备在发送分段复杂确认PDU的第一个分段之前,首先选择一个预设窗口尺寸值,以表示它在收到一个分段确认报文之前,一次准备发送的报文分段最大个数。预设窗口尺寸值的选取由开发者自己决定,这只与服务器端设备有关,但是其取值范围限制在1~127。复杂确认PDU的每一个分段中都有一个‘预设窗口尺寸(proposed-window-size)’参数,携带服务器端设备的预设窗口尺寸值,并且同一报文的每个分段的这个参数值都应该相同。

在传输完第一个分段后,服务器端设备将启动一个计时器,用来计量对该报文分段确认的时间。一旦收到了一个关于这个还没有确认的复杂确认报文分段所发送的中止APDU或分段确认APDU,则停止计时。如果计时器的时间值超出了服务器设备对象的APDU分段超时属性值,则重发这个分段,并将计时器置零,重新计时。所有分段的超时重发过程都按照上述过程进行,直至重发次数超出了服务器端设备对象中APDU重发次数属性所规定的次数。若超出规定值仍未收到响应,整个报文将被丢弃。

当客户端设备收到分段的复杂确认APDU报文的第一个分段后,将会选择一个实际窗口尺寸值,以表示它在发送一个分段确认报文以前,一次准备接收的报文分段最大个数。实际窗口尺寸值的选取由开发者自己确定,这只与客户设备有关,但是它不能大于复杂确认PDU中的‘预设窗口尺寸’参数值,而且其取值范围限制在1~127。对同一复杂确认的所有分段确认,其实际窗口尺寸参数值都应该相同。需要特别说明的是,不管实际窗口尺寸是多少,客户端设备在收到复杂确认报文的第一个分段后,就应立即发送一个分段确认报文。

在收到一个分段确认APDU后,服务器端设备得到该报文中携带的‘实际窗口尺寸’参数值,并将该值设置成服务器设备自己的实际窗口尺寸。服务器端在发送复杂确认报文分段的过程中,即使需要确认的分段数量小于实际窗口尺寸值,都可能会收到中止APDU或分段确认AP-DU。

(2)分段确认APDU的传输

分段确认APDU是分段接收方设备用来确认发送方的信息。在以下4种情况下,设备应传送一个分段确认报文:

1)设备收到分段的报文的第一个分段。

2)设备收到未确认的、有序的、数量为实际窗口尺寸的多个报文分段构成的序列。

3)设备收到一个乱序分段报文(可能表明丢失了某个分段)。

4)设备收到报文的最后一个分段。

4.重复的APDU和报文分段

(1)客户端事务处理状态机的中止

当使用BACnet标准定义的差错重传机制时,在报文传输的交互处理中,必然存在收到重复报文或分段的可能。在客户端,当发送了有证实请求APDU报文(或报文的第一个分段)之后,将创建事务处理状态机,进行事务处理。当出现以下4种情况之一时,客户端的事务处理中止,同时结束该事务处理状态机:

1)当收到服务器端设备发来的、包含有这个事务处理的调用标识符(invokeID)的5种报文时。这5种报文分别是:简单确认APDU、不分段的复杂确认APDU、差错APDU、拒绝APDU和中止APDU。

2)收到服务器发来的分段的复杂确认APDU的最后一个分段,并发送了相应的分段确认APDU后。

3)当超时重传次数用尽后。

4)在向服务器发送了包含有该事务处理的调用标识符的中止APDU后(例如,客户端中止这个事务处理)。

(2)服务器端事务处理状态机的中止

在服务器端,当收到了证实请求APDU报文(或报文的第一个分段)之后,将创建事务处理状态机,进行事务处理。当出现以下4种情况之一时,服务器端的事务处理中止,同时结束该事务处理状态机:

1)当向客户端设备发送完成包含有这个事务处理的调用标识符的5种报文时。这5种报文分别是:简单确认APDU、不分段的复杂确认APDU、差错APDU、拒绝APDU和中止APDU。

2)当收到客户端设备发来的关于分段的复杂确认APDU最后一个分段的分段确认APDU之后。

3)当接收到客户端发来的包含有该事务处理调用标识符的中止APDU后。

4)在传输一个分段的复杂确认APDU的过程中,超时重传次数达到规定值仍未成功时。

(3)重复报文的处理

重复报文或重复报文分段的处理过程如下:

1)当服务器接收到一个重复的有证实请求报文时,如果服务器具有识别重复的有证实请求报文的能力,则该重复的报文将被服务器丢弃。否则,服务器仍然响应这个重复的有证实请求报文,在这种情况下,客户将根据这个服务器响应报文中的调用标识符不与任何一个当前的事务处理状态机绑定这个情况,而丢弃这个响应报文。

2)当服务器接收到一个重复的有证实请求报文分段,即已经收到并针对该分段发送了分段确认报文时,服务器将丢弃这个重复的分段,并回传一个合适的分段确认APDU。

3)当客户接收到一个重复的复杂确认报文分段,即已经收到并针对该分段发送了分段确认报文时,客户将丢弃这个重复的分段,并回传一个合适的分段确认APDU。

4)当一个设备接收到一个重复的分段确认APDU时,该设备将丢弃这个重复的分段确认AP-DU。

3.5.5 应用层协议状态机

1.APDU分类

BACnet的APDU可以分为两种:一种是由请求方BACnet用户(客户)发送的;另一种是由响应方BACnet用户(服务器)发送的。所有的BACnet设备都应能工作在响应方BACnet用户状态,从而能够接收请求方BACnet用户发来的APDU。另一方面,许多设备还可以工作在请求方BACnet用户状态,接收响应方BACnet用户发来的APDU。

(1)请求方BACnet用户(客户)发送的APDU

1)BACnet无证实请求PDU(BACnet-Unconfirmed-Request-PDU);

2)BACnet有证实请求PDU(BACnet-Confirmed-Request-PDU);

3)BACnet分段确认PDU(BACnet-SegmentACK-PDU)(参数‘服务器(server)’=FALSE);

4)BACnet中止PDU(BACnet-Abort-PDU)(参数‘服务器’=FALSE)。

(2)响应方BACnet用户(服务器)发送的APDU

1)BACnet简单确认PDU(BACnet-SimpleACK-PDU);

2)BACnet复杂确认PDU(BACnet-ComplexACK-PDU);

3)BACnet差错PDU(BACnet-Error-PDU);

4)BACnet拒绝PDU(BACnet-Reject-PDU);

5)BACnet分段确认PDU(BACnet-SegmentACK-PDU)(参数‘服务器’=TRUE);

6)BACnet中止PDU(BACnet-Abort-PDU)(参数‘服务器’=TRUE)。

(3)事务处理状态机(TSM)

请求方和响应方BACnet用户为每一个事务处理都要创建并且维护一个TSM。该TSM在事务开始时创建,在事务结束时中止。其过程如下:由空闲(IDLE)状态转变进入到TSM状态,建立TSM;由TSM状态转变到空闲状态,中止TSM。一个事务处理由客户BACnet地址(BACne-tAddress)、服务器BACnet地址和调用标识符(如果存在的话)惟一确定。

当一个PDU从网络层传递给应用层时,应用层软件检查PDU的类型、源BACnet地址、目的BACnet地址、调用标识符(如果存在的话),确定PDU的类型(是请求方还是响应方BACnet用户)以及应送给哪个TSM处理。如果不存在对应的TSM,必须新建一个TSM。

当一个请求从应用程序传递给应用层时,应用层软件检查请求的类型、源BACnet地址、目的BACnet地址、调用标识符(如果存在的话),确定请求的类型(是请求方还是响应方BACnet用户)以及应送给哪个TSM处理。如果不存在对应的TSM,必须新建一个TSM。

为了简化状态机的描述,这里仅给出应用实体所进行分段的情况,应用程序所进行的分段也是存在的。在这种情况下,当前的TSM无论是接收一个分段还是一组分段或是发送分段确认,分段都将通过更新后的TSM传递给应用程序,而分段确认则只沿着从应用程序通过分段确认请求(SEGMENT_ACK.request)原语这个方向传递。当更新的状态机接收到分段确认PDU,就向应用程序传递一个分段确认指示(SEGMENT_ACK.indication)原语。

2.变量、参数与函数

(1)变量

在每个事务处理状态机的实例中,都使用了一些变量,部分变量定义如下:

1)重发计数(RetryCount):用于计数APDU重发的次数。

2)分段重发计数(SegmentRetryCount):用于计数分段重发的次数。

3)分段发送完毕(SentAllSegments):用于控制APDU的重发及接收服务器的响应。

4)最近序号(LastSeqenceNumber):用于保存顺序接收的最近一个分段的序号。

(2)InWindow函数和FillWindow函数

1)InWindow函数:函数“InWindow”用于完成对两个序号(由无符号8位整数构成)的模256运算。所有的计算和比较都是在8位无符号整数基础上模256运算。

对于函数InWindow(seqA,seqB)

① 如果参数seqA减去参数seqB的差再模256,其结果少于实际窗口尺寸,则返回TRUE。

② 否则返回FALSE。

2)FillWindow函数:函数“FillWindow”用于发送一组PDU分段,该PDU分段序列的数目或者正好填充窗口,或者是一个报文的最后部分分段。在收到一个分段确认APDU到发送下一个分段序列,时间间隔不能大于Tseg值。分段序列中两个相邻分段发送的时间间隔,也不能大于Tseg值。

3.请求方BACnet用户(客户)状态机

(1)空闲状态

在空闲状态,设备等待着本地应用程序请求服务。可以发送:

1)发送无证实请求(SendUnconfirmed);

2)发送有证实不分段请求(SendConfirmedUnsegmented);

3)发送有证实分段请求(SendConfirmedSegmented)。

可以接收到:

1)意外分段信息(UnexpectedSegmentInfoReceived);

2)意外PDU(UnexpectedPDU Received)。

(2)分段请求状态

在分段请求状态,设备等待接收针对BACnet有证实请求PDU所发出的一个或几个分段的BACnet分段确认PDU的确认报文。

1)接收到重复确认PDU(DuplicateACK Received);

2)接收到新确认PDU(NewACK Received);

3)接收到最后一个确认PDU(FinalACK Received);

4)分段超时(Timeout);

5)最终超时(FinalTimeout);

6)接收到中止PDU(AbortPDU Received);

7)接收到简单确认PDU(SimpleACK Received);

8)接收到不分段复杂确认PDU(UnsegmentedComplexACK Received);

9)接收到分段复杂确认PDU(SegmentedComplexACK Received);

10)接收到差错PDU(ErrorPDU_Received);

11)接收到拒绝PDU(RejectPDU_Received);

12)接收到意外PDU;

13)发送中止PDU(SendAbort)。

(3)等待证实状态

在等待证实状态,设备等待接收针对BACnet有证实请求PDU所发出的响应。

1)接收到简单确认PDU;

2)接收到不分段复杂确认PDU;

3)接收到分段复杂确认PDU;

4)接收到差错PDU;

5)接收到拒绝PDU;

6)接收到放弃PDU;

7)接收到分段确认PDU;

8)接收到意外PDU;

9)请求超时不分段(TimeoutUnsegmented);

10)请求超时分段(TimeoutSegmented);

11)最终超时;

12)发送放弃PDU。

(4)分段证实状态

在分段证实状态,设备等待接收一个或者几个针对BACnet分段确认PDU的响应分段。

1)接收到新分段但无空间保存(NewSegmentReceived NoSpace);

2)接收到新的分段;

3)接收到一组分段中的最后分段(LastSegmentOfGroupReceived);

4)确认PDU,重启分段计时器,最后进入分段证实状态,等待接收后续分段;

5)接收到复杂确认的最后分段(LastSegmentOfComplexACK Received);

6)接收到乱序分段(SegmentReceivedOutOfOrder);

7)接收到中止PDU;

8)接收到意外PDU;

9)分段超时;

10)发送中止PDU。

4.响应方BACnet用户(服务器)状态机

(1)空闲状态

在空闲状态,设备等待从网络层传递来一个PDU。

1)接收到无证实请求PDU;

2)接收到不分段有证实请求PDU;

3)接收到分段证实请求PDU且不支持;

4)接收到分段证实请求PDU;

5)接收到中止PDU;

6)接收到意外PDU。

(2)分段请求状态

在分段请求状态,设备等待接收BACnet有证实请求PDU的分段。

1)接收到新的分段;

2)接收到一组分段中的最后分段;

3)接收到报文最后分组;

4)接收到乱序分段;

5)接收到中止PDU;

6)接收到意外PDU;

7)分段超时;

8)发送中止PDU。

(3)等待响应状态

在等待响应状态,设备等待本地应用程序针对BACnet有证实请求PDU所做出的响应。

1)发送简单确认PDU;

2)发送不分段复杂确认PDU;

3)无法发送分段复杂确认PDU(CannotSendSegmentedComplexACK);

4)发送分段复杂确认PDU;

5)发送差错PDU;

6)发送中止PDU;

7)发送拒绝PDU;

8)接收到中止PDU;

9)接收到重复的请求PDU;

10)接收到重复分段PDU;

11)接收到意外PDU;

12)分段超时。

(4)分段响应状态

在分段响应状态,设备等待接收一个BACnet分段确认PDU,此PDU用于对BACnet复杂确认PDU中的一个或几个分段进行确认。

1)接收到重复确认PDU;

2)接收到新确认PDU;

3)接收到最后一个确认PDU(FinalACK_Received);

4)分段超时;

5)最终超时;

6)接收到中止PDU;

7)接收到意外PDU;

8)发送放弃PDU。

3.5.6 BACnet对象

1.BACnet的标准对象

BACnet采用面向对象技术,提供一种表示楼宇自控设备的标准。在BACnet体系中,网络设备通过读取、修改封装在应用层APDU中的对象数据结构,实现互操作。BACnet目前定义了23个对象,如图3-16所示,各个对象的说明见表3-1,每个对象都必须有3个属性:对象标志符(Object Identifier)、对象名称(Object Name)和对象类型(Object Type)。其中,对象标志符用来惟一标识对象;BACnet设备可以通过广播自身包含的某个对象的对象名称,与包含相关对象的设备建立联系。BACnet协议要求每个设备都要包含“设备对象”,通过对其属性的读取可以让网络获得设备的全部信息。

978-7-111-38144-0-Chapter03-16.jpg

图3-16 BACnet标准中的23个对象

表3-1 BACnet对象应用举例

978-7-111-38144-0-Chapter03-17.jpg

2.定义BACnet对象的目的

由于在全球范围内由不同厂家开发的BAS多种多样,即面对多种多样的楼宇自控设备,用统一的方法去表示和标识它们,通过楼宇自控网络成为能够互相识别和访问的实体,只有实现了在楼宇自控网络中能够互相准确辨识和访问,才能实现互通信,才能够在互通信的基础上实现互操作。因此进行BACnet对象的定义,解决楼宇自控设备的互相识别、访问是实现楼宇自控设备互操作的关键。

定义了BACnet标准对象以后,就可以用BACnet标准对象的组合来实际模拟代替和表示楼宇自控设备或描述BAS。

3.BACnet对象与楼宇自控设备的对应关系

由于定义了标准BACnet对象,就可以进一步地用标准BACnet对象进行组合来实现对具体楼宇自控设备的代替、描述和表示。例如,一个压差开关就可以由一个DEV(设备)对象和一个DI对象组合而成;一个智能温度传感器就可以简单地用一个DEV对象和一个AI对象组合进行表示,用标准BACnet对象组合模拟描述如图3-17所示。

设定某一楼宇自控设备有3个数字量输入和2个模拟量输入,2个模拟控制输出和1个闭环控制逻辑,如果不考虑其他的BAS功能(如自动报警、联动关系、日程计划等功能),可用图3-18所示的8个标准BACnet对象实例组合进行表示。

978-7-111-38144-0-Chapter03-18.jpg

图3-17 用标准BACnet对象组合模拟器件

978-7-111-38144-0-Chapter03-19.jpg

图3-18 用标准BACnet对象组合一个设备

BACnet标准在利用标准对象组合模拟楼宇自控设备的方式,不必考虑使用BACnet标准对象的顺序,但规定一个BACnet自控网络节点有且仅有一个DEV对象实例。在BACnet标准中,按规则采用BACnet对象表示的设备叫做“BACnet设备”,BACnet楼宇网络自控系统就是由若干个这样的“BACnet设备”组成的系统。

BACnet设备使用相关的对象进行描述,每一对象都有一组属性,设备的特征可以通过属性值表现出来。对象还提供服务,这些服务是与设备通信有关的命令和响应。一个BACnet设备由一组对象表示,尽管BACnet定义了23个对象,但一般情况下一个具体的BACnet设备仅由数个对象进行描述就已经足够了,在中文描述的情况下用一组对象表示一个BACnet设备,如图3-19所示。

978-7-111-38144-0-Chapter03-20.jpg

图3-19 用一组对象表示一个BACnet设备

4.BACnet标准对象定义中的属性

面向对象的程序设计语言中的对象通常由“属性”和“方法”两部分构成,属性描述对象的状态,方法则表示对属性的访问和操作。但是在BACnet标准中,BACnet对象只由属性组成,不包含访问和操作属性的方法,访问和操作属性的方法被定义为应用层服务(Application Service)这种互操作模式。

BACnet标准对BACnet对象定义的表示方法中,每个BACnet对象定义都包括“属性名称”,“属性数据类型”和O、W、R之一的属性“说明标志”。其中:

1)O表示属性在对象定义中是可选择的,应根据实际情况进行选用;

2)R表示属性在对象定义中是必选的,并且是BACnet服务可读的;

3)W表示属性在对象定义中是必选的,并且是BACnet服务可读、可写的。

在BACnet标准中,BACnet标准对象的属性如下:

1)Object-Identifier(对象标识符)属性;

2)Object-Name(对象名称)属性;

3)Object-Type(对象类型)属性;

4)Present-Value(当前值)属性;

5)Description(描述)属性;

6)Device-Type(设备类型)属性;

7)Status-Flags(状态标志位)属性;

8)Event-State(事件状态)属性;

9)Reliability(可靠性)属性;

10)Out-Of-Service(脱离服务)属性;

11)Update-Interval(更新间隔)属性;

12)Unit(单位)属性;

13)Min-Pres-Value(最小值)属性;

14)Max-Pres-Value(最大值)属性;

15)Resolution(分辨率)属性;

16)COV-increase(COV增量)属性;

17)Time_Delay(时间延迟)属性;

18)Notification-Class(通告类)属性;

19)High-Limit(高限值)属性;

20)Low-Limit(低限值)属性;

21)Deadband(限值宽度)属性;

22)Limit-Enable(限值使能)属性;

23)Event-Enable(事件使能)属性;

24)Acked-Transitions(状态变迁确认)属性;

25)Notify-Type(通告类型)属性。

5.BACnet对象的特点和作用

不管是标准BACnet对象,还是非标准BACnet对象,为了使对象成为“BACnet网络上可以标识寻址和可访问的”的实体要素,就要在对象中定义用于“可见标识”的属性项。注意这里标准对象和非标准对象的区别。标准对象是BACnet定义的最常用对象,是表示具体楼宇自控设备的基本元素,而实际具体的楼宇自控设备可以“映射”为不同的BACnet标准对象实例的组合。BACnet标准规定所有对象定义均必须至少包含如下3个可见性的标识属性项:

1)Object-Identifier(对象标识符):面向通信寻址的标识属性项;

2)Object-Name(对象名称):面向人的可读性标识属性项;

3)Object-Type(对象类型):面向互操作过程的标识属性项。

对象是楼宇自控设备的模型化和抽象化的描述,BACnet对象为不同属性(Property)组成的集合,BACnet对象是BACnet协议中最为核心的内容,实质上就是一个由数据项组成的数据结构。对象的属性是楼宇自控设备互操作过程中所表现的外部特性的反映。

对于BACnet对象的特点和作用,一位学者给予了很精彩的叙述:

1)BACnet对象主要用于描述楼宇自控设备互操作过程中所表现的外部互操作特性,不涉及楼宇自控设备的内部配置、内部结构和内部运行过程。

BACnet对象表示楼宇自控设备状态、功能参数,还包含控制楼宇自控设备状态和功能的控制参数,这些参数集合就构成了对象的属性,这样的参数集合可以实现在BACnet网络环境中的互通信和可访问。BACnet对象是描述楼宇自控设备“网络互通信和可访问”的信息模型,“网络互通信和可访问”是实现互操作的基础。

2)BACnet对象是有关状态、功能和控制参数的集合,通过读、写两种方式实现对访问对象的操作。BACnet应用层服务基本上是基于“读/写”操作的内容。BACnet对象定义和使用,实现了网络互通信和可访问,使复杂的互操作行为简化为“读”和“写”两种基本的操作。

3)BACnet对象很好地将互通信和互操作结合起来。互操作语义和过程分别由对象和应用层服务定义后,使用测控网络来实现BACnet对象的互通信过程。具体实现通信的测控网络内容非常丰富,并且能够不断地融入使用最新的通信网络和控制网络技术。

4)BACnet对象使BACnet标准具有良好的扩展机制。BACnet对象提供的扩展机制不仅是通信网络的扩展,而且本身也具有良好的扩展特性。由于BACnet对象实质上只是由多个数据项组成的数据结构,因此既可以很容易地按照对象的基本定义构造各种对象类型,也可以很容易地在已有标准BACnet对象中加入新的属性,从而在“继承”的基础上形成新的对象类型。

3.5.7 BACnet标准的应用层服务

1.BACnet应用层服务的分类

在BACnet标准中,把对象的方法称为服务,对象及其属性提供了对一个楼宇自控设备“网络可见信息”的抽象描述,而服务提供了如何访问和操作这些信息的命令和方法。BACnet设备通过在网络中传递服务请求和服务应答报文实现服务。BACnet定义了35种服务,并将其划分为6个类别:

(1)报警与事件服务(Alarm and Event Services)

包含8种服务,处理环境状态的变化,提供了BACnet设备预设的请求值改变通告、请求报警或事件状态摘要、发送报警或事件通知、收到报警通知确认等方法。

(2)文件访问服务(File Access Services)

包含2种服务,提供读写文件的方法,包括上/下载控制程序和数据库的能力。

(3)对象访问服务(Object Access Services)

包含9种服务,提供了读、修改和写属性值以及增删对象的方法。

(4)远程设备管理服务

包含11种服务,提供对BACnet设备进行维护和故障检测的工具、方法。

(5)虚拟终端服务(Virtual Terminal Services)

包含3种服务,提供了一种面向字符的数据双向交换机制,使其他具有专有特性的楼宇自控设备成为一个BACnet虚拟终端并使BACnet网络能对其进行重构。

(6)网络安全服务

包含2种服务,提供对等实体验证、数据源验证、操作者验证和数据加密等功能。BACnet功能组规定了实现特定控制功能所需的对象和服务的组合。

BACnet已定义了13个功能组,包括时钟功能组、事件响应功能组、文件功能组、虚拟终端功能组、设备通信功能组等。

BACnet将系统中的每个物理点和软件值定义为一个“对象(Object)”。最常用的对象是“模拟输入”、“模拟输出”、“模拟值”、“数字输入”、“数字输出”和“数字值”。所有对象都有与之关联的属性,如当前值、描述、状态、单位等。每个对象都有必备属性和可选属性。每种对象类型的相关要求和定义,在BACnet标准的附录C中有详细说明。

设计文件及相关系统图应该罗列出系统中要实现的每个物理连接,如同传统设计中的列表。这些列表应该包括与物理连接点相关的软件参数,如报警极限、设定值等。列表中的每一项,在BACnet系统中都被视为一个对象,该对象具有与之相关的属性。而且,每个对象的必备属性必须得到包含该对象的BACnet设备的支持。

当连接和集成两个以上的厂家提供的控制器时,对象非常重要的作用就会显现出来。如果BAS要与冷冻机上的BACnet控制器通信,应该首先确定要在冷冻机控制器和BAS之间传送的所有对象。严格确定和设计控制器将要收发的所有对象,可确保系统安装运行顺利实现。相关厂商也会根据系统设计中提出的对象要求,在它们产品的接口中提供相应的对象操作支持。当进行系统级集成时,也应该采取上述步骤和措施。

设计文件可能忽略可选属性的支持。在很多情况下,这样做是合适的,因为被忽略的可选属性并不需要。但是,如果控制功能的实现需要可选属性,则设计文件应将这些可选属性支持纳入每个对象类型的定义中。如果可选属性不是控制功能需要的,但系统中的BACnet设备却支持这些可选属性那也无妨,它们不会降低系统的性能。

2.BACnet系统中的服务

服务是一个BACnet设备从另一个BACnet设备获得信息或命令另一个设备执行某种动作或通知一个或多个设备发生了某种事件的方法和手段。换句话说,服务控制了BACnet局域网中的活动,并保证报文和命令到达预定地点。一个服务可以从一个BACnet设备中读取一条信息,而另一个服务可以指示一个BACnet设备先关闭,然后再启动。

但是,如果一个BACnet设备支持某种服务而另一个设备却不支持这种服务,那么这两个设备就不能使用这种特定的服务进行相互通信。这一点可能很重要,也可能不重要,取决于何种服务不被支持。如果两个设备支持另一种可起到类似作用的服务,就可以使用共同支持的服务实现需要的通信功能。例如,一个设备可能支持“读多个属性”服务,而另一个设备可能不支持(读多个属性服务就是使用一条命令从一个设备中读取多个BACnet对象和属性)。一个设备可以通过多次发送“读属性”服务来实现“读多个属性”服务的功能。可是,由于多次重复“读属性”服务,BACnet局域网上的通信活动会有所增加。

如果要求系统中的每个BACnet设备都支持所有的BACnet服务,那是不可能的。BACnet标准对系统中所有部件,从操作站到控制器甚至智能传感器都进行了阐述。许多服务需要在高层网络实现,但在控制器这一层网络却不必实现这些服务。在底层网络实现某些服务直接关系到CPU处理能力和存储器的选择,因而直接影响到这些产品的成本。

大多数设计需要一个通用的方法,来确定系统每一种所需要的服务。这就是BACnet标准定义了6个通用的一致性等级的原因。每个一致性等级都有一个必须实现的最少的服务数量。

3.BACnet系统中的专用服务与对象

BACnet标准允许生产商定义自己专用的服务和对象,也就是说,各生产商在不影响BACnet标准通信功能的前提下,可以在自己生产的系统内增添特别功能。然而,当某种系统功能依赖专用服务和对象时,就意味着其他生产商不能启用这种功能。

系统设计者必须决定是否将专用服务和对象用于一个工程项目。如果将专用服务和对象用于系统功能的实现,则设计文件应该要求专用服务和专用对象的提供者提交专用功能的设计文档,以便与其他生产商也能在系统中根据该文档实现该专用服务和对象,从而最终实现完全的系统集成。

4.BACnet设备级别和设备等级说明

在实际的BAS中,没有必要也不可能所有的设备都支持、包含上述所有的对象和服务。因此,BACnet定义了6个一致性类别(设备级别)。一致性类别的分级编号为1~6,最低级别是类别l。每个类别都规定了设备要实现的最小服务子集,且包含低级别的所有服务。

为了帮助用户和工程人员确定不同BACnet设备之间的互操作性,需要厂商为每个设备提供标准格式文件以标识设备中己实现的BACnet标准的内容,即文件需包括的设备符合BACnet等级的说明。这个文件就是PICS(Protocol Implementation Conformance Statement,协议实现一致性声明),它包括:

1)标识厂商和描述设备的基本信息;

2)设备符合BACnet的级别;

3)设备所支持的功能组;

4)设备所支持的基于标准或专有的服务,设备启动或响应服务请求的能力;

5)设备所支持的基于标准或专有的对象类型及其属性描述;

6)设备支持的数据链路技术;

7)设备支持的分段请求和响应。

3.5.8 应用层协议时序图

对应用层的服务语义定义后,接下来就要对服务原语具体传递的过程及报文格式进行说明。服务原语具体传递的过程可以通过时序图来说明。每个时序图可以分为3个或者4个区域。标注为“提供方”的区域代表了服务提供者,标注为“用户”的区域代表了服务使用者。如果还存在第4个区域,则代表的是应用程序。其中位于“提供者”与“用户”之间的竖线,对于应用层而言,指的是BACnet用户元素与BACnet应用层服务元素之间的接口。对于下面各层而言,这些竖线表示的则是处于服务提供者与服务使用者之间的服务访问点(service-access-point)。在应用层协议时序图中,由上到下是时间流逝的方向。处于服务使用者区域中的箭头,指明了在事务处理过程中由服务原语所表示的信息的流动方向(即从服务使用者流入或流出)。

1.证实与非证实服务报文时序图

图3-20给出了正常非证实报文的时序图,图3-21给出了非正常非证实服务报文的时序图。

978-7-111-38144-0-Chapter03-21.jpg

图3-20 正常非证实报文的时序图

978-7-111-38144-0-Chapter03-22.jpg

图3-21 非正常非证实服务报文的时序图

对于非证实报文的服务,不论客户端所要求的服务是否能够正确执行,用到的报文格式就是BACnet-Unconfirmed-Request-PDU(Type=1)一种。对于出现差错的非正常无证实服务请求报文,被接受用户丢弃。

2.正常有证实服务报文

(1)正常有证实服务报文(不分段)

BACnet标准定义的证实服务所涉及的情况比非证实服务要复杂得多。在证实服务中,必须实现控制和管理与报文长度有关的“分段和重组”功能、流量控制以及分段报文差错检测与恢复功能。

证实服务经历“请求”、“指示”、“响应”和“证实”不同的阶段,因此要分别采用不同格式的报文,以满足不同阶段中的数据通信。如果证实服务所涉及的报文长度不分段,此时的证实服务的报文传输过程如图3-22所示。当响应为Result(+)时,响应报文为BACnet-SimpleACK-PDU(BACnet简单确认PDU)或BACnet-ComplexACK-PDU(BACnet复杂确认PDU);而当响应为Result(-)时,响应报文为BACnet-Error-PDU(BACnet出错PDU)。

978-7-111-38144-0-Chapter03-23.jpg

图3-22 正常有证实服务(不分段)报文时序图

(2)正常有证实服务(有分段请求)报文

对证实型服务传输的报文出现报文长度超过网络层协议数据单元(NPDU)时,就必须对报文进行分段传输。如前所述,对于有证实请求(Confirmed-Request)和复杂确认(Complex-ACK)报文才可能需要分段。

报文分段遵循如下规则:

1)每一个报文尽可能只用一个APDU发送。

2)当一个报文的长度超过APDU的允许最大长度时,则应分段成最少个数的多个APDU发送。

3)对报文进行分段时,以1B作为最小分段(分割)单位。

对报文进行分段,还应注意3个方面:

1)APDU最大长度还与信源节点设备的发送缓冲区大小有关。不同BACnet设备发送缓冲区大小可以不同,但不能小于50B。

2)BACnet互联网中各网段所能传输APDU的最大长度不是一个常数。此时的长度由本地、远程以及中间传输网络的网络层协议数据单元(NPDU)最大长度所决定。

3)远程信宿设备节点接收APDU的最大长度不能小于50B,即信宿设备节点的接收缓冲区最小长度必须大于50B。

正常有证实服务(有分段请求)报文时序图如图3-23所示。

从图3-23中知道,一个交换是使用有证实的服务请求、指示、响应以及证实。有些请求需要分段,因此需要使用几个CONF_SERV.request原语来传递整个请求。分段确认服务原语是另一个独立的交换,它用来通知客户,服务器已准备接收下一分段了。

(3)其他的正常有证实服务的报文时序图

1)正常有证实服务(有分段响应)的报文时序图如图3-24所示。

2)具有应用程序流程控制的正常有证实服务时序图如图3-25所示。

978-7-111-38144-0-Chapter03-24.jpg

图3-23 正常有证实服务(有分段请求)报文时序图

978-7-111-38144-0-Chapter03-25.jpg

图3-24 正常有证实服务(有分段响应)的报文时序图

3)具有分段请求、应用程序流程控制和取消响应的正常有证实服务时序图如图3-26所示。

4)几种情况下非正常有证实服务的时序图如下:

有分段的响应和请求方中止的非正常有证实服务时序图如图3-27所示。

不分段,有服务误差发生情况下的非正常有证实服务时序图和协议差错发生的有证实服务时序图分别为图3-28和图3-29所示。

978-7-111-38144-0-Chapter03-26.jpg

图3-25 具有应用程序流程控制的正常有证实服务时序图

978-7-111-38144-0-Chapter03-27.jpg

图3-26 具有分段请求、应用程序流程控制和取消响应的正常有证实服务时序图

978-7-111-38144-0-Chapter03-28.jpg

图3-27 非正常有证实服务时序图

978-7-111-38144-0-Chapter03-29.jpg

图3-29 具有协议错误的非正常有证实服务请求或相应时序图