首页 理论教育应用层协议状态机:BACnet标准与楼宇自控系统技术

应用层协议状态机:BACnet标准与楼宇自控系统技术

【摘要】:所有的BACnet设备都应能工作在响应方BACnet用户状态,从而能够接收请求方BACnet用户发来的APDU。事务处理状态机请求方和响应方BACnet用户为每一个事务处理都要创建并且维护一个TSM。为了简化状态机的描述,这里仅给出应用实体所进行分段的情况,应用程序所进行的分段也是存在的。当更新的状态机接收到分段确认PDU,就向应用程序传递一个分段确认指示原语。

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。