BacNet开发入门2
???????
BACnet 說明1?????? BACnet含義
A Data Communication Protocol for Building Automation and Control Network的簡稱,是一種為樓宇自控網絡制定的數據通訊協議。
2?????? BACnet技術特點
BACnet采用了面向對象的技術,它定義了一組具有屬性的對象(Object)來表示任意的樓宇自控設備的功能,從而提供了一種標準的表示樓宇自控設備的方式。同時BACnet定義了四種服務原語來傳遞某些特定的服務參數。目前BACnet共定義了18個對象,123 個屬性和35個服務。對象的方法稱為服務,由于一個樓宇自控系統中并不是所有的設備都要有必要支持BACnet所有的功能,BACnet協議還定義了6個性能級別和13個功能組。
6個性能級別,每個級別規定了設備要是先的最小服務子集,且包含級別低的服務,最小級別1.
表1 BACnet對象
|
| 對 象 名 稱 | 應? 用? 舉? 例 |
| 01 | 模擬輸入Analog Input | 模擬傳感器輸入如機械開關On/Off輸入 |
| 02 | 模擬輸出Analog Output | 模擬控制量輸出 |
| 03 | 模擬值Analog Value | 模擬控制設備參數如設備閥值 |
| 04 | 數字輸入Binary Input | 數字傳感器輸入如電子開關On/Off輸入 |
| 05 | 數字輸出Binary Output | 繼電器輸出 |
| 06 | 數字值Binary Value | 數字控制系統參數 |
| 07 | 命令Command | 向多設備多對象寫多值如日期設置 |
| 08 | 日歷表Calender | 程序定義的事件執行日期列表 |
| 09 | 時間表Schedule | 周期操作時間表 |
| 10 | 事件登記Event Enrollment | 描述錯誤狀態事件如輸入值超界或報警事件。通知一個設備對象,也可通過“通知類”對象通知多設備對象 |
| 11 | 文件File | 允許訪問(讀/寫)設備支持的數據文件 |
| 12 | 組Group | 提供單一操作下訪問多對象多屬性 |
| 13 | 環Loop | 提供訪問一個“控制環”的標準化操作 |
| 14 | 多態輸入Multi-state Output | 表述多狀態處理程序的狀況,如制冷設備開、關和除霜循環 |
| 15 | 多態輸出Multi-state Output | 表述多狀態處理程序的期望狀態,如制冷設備開始冷卻、除霜的時間 |
| 16 | 通知類Notification Class | 包含一個設備列表,配合“事件登記”對象將報警報文發送給多設備 |
| 17 | 程序Program | 允許設備應用程序開始和停止、裝載和卸載,并報告程序當前狀態 |
| 18 | 設備Device | 其屬性表示設備支持的對象和服務以及設備商和固件版本等信息 |
?
BACnet應用層提供證實和非證實兩種類型的服務。BACnet定義了四種服務原語:請求、指示、響應和證實,它們通過應用層協議數據單元(APDU)傳遞。由于BACnet建立在無連接的通信模式上,所以OSI模型提供端到端服務的傳輸層部分簡
化功能也由應用層實現,分別為:可靠的端到端傳輸和差錯校驗;報文分段和流量控制;報重組和序列控制。
3?????? BACnet優點
1)具有良好的互連特性和擴展性。BACnet標準雖然從體系結構上定義了不同的局域網絡,但BACnet標準可以擴展到其他任意通信網絡。例如,BACnet/IP標準可以實現與Internet的無縫互連。
2)具有良好的伸縮性。BACnet標準沒有限制BACnet系統中設備節點的數量,BACnet集成系統可以由幾個設備節點構成一個極小的自控系統,也可以形成一個規模極大的超級大系統。
4?????? BACnet體系結構
(1)OSI/RM模型的實現需要很高的費用,實際上在絕大部分樓宇自控系統應用中也并不需要這么多的層次,事實上BACnet只包含OSI模型中被選擇的層次,其它各層則去掉,這樣減少了報文長度,降低了通信處理開銷,同時也節約了樓宇自控工業的生產成本。
(2)BACnet應充分利用現有的廣泛使用的局域網技術,如Ethernet、ARCNET和LonTalk,因此成本進一步降低,同時也有利于技術的推廣和性能的提高。
在考慮了樓宇設備監控網絡的特征和要求以及盡可能少的協議開銷原則后,BACnet協議提出了一種簡化的四層體系結構,相當于OSI/RM模型中的物理層、數據鏈路層、網絡層和應用層。
支持五種組合類型的數據鏈路/物理層規范。其中主從/令牌傳遞(MS/TP)協議是專門針對樓宇自控設備設計的數據鏈路規范。BACnet在物理介質上,支持雙絞線、同軸電纜和光纜,在拓撲結構上,支持星型和總線拓撲。
5?????? BACnet網絡結構
BACnet沒有嚴格規定網絡拓撲結構。其中:網段(Segment)是多個物理網段通過中繼器(R)連接形成的段落區間;網絡是多個網段通過網橋(B)連接而成的,每個網絡都形成一個MAC地址域;BACnet/Internet網絡是將使用不同局域網技術的多個網絡用路由器(RT)互聯起來形成的網際網。
目前,BACnet標準使用兩種技術實現與Internet的互聯。第一種技術附件H中稱之為“隧道”技術,并將其設備稱之為分組封裝/拆裝設備,簡稱PAD。其作用就像一個網關/路由器,這在圖2中兩個半路由器連接廣域網形成一個完全的BACnet路由器有所體現。第二種技術附件J中稱之為BACnet/IP,設備直接封裝IP幀/包在BACnet網絡和Internet上傳輸。PAD將BACnet報文數據封裝在IP協議數據包內傳輸,在目的BACnet網絡解封。因此每個連接Internet的BACnet網絡都要配置PAD網關/路由器。它可以是一個單獨的設備,也可以是某種樓宇控制設備功能的一部分。
在BACnet拓撲中設備之間只存在一條邏輯通路,無需廣域網的最優路由算法;其次,BACnet具有單一的局部地址空間,所以BACnet參照OSI模型制定了簡化的網絡層協議,向應用層提供不確認無連接的數據單元傳送服務。每個BACnet設備都被一個網絡號碼和一個MAC地址唯一確定。
網絡層通過“路由器”實現兩個或多個異類BACnet局域網(不同的數鏈層)的連接,并通過協議報文進行“路由器”的自動配置、路由表維護和擁塞控制。BACnet路由器與每個網絡的連接處稱為一個“端口”。路由表中包含端口的下列項目:(1)端口所連接網絡的MAC地址和網絡號;(2)端口可到達網絡的網絡號列表及與這些網絡的連接狀態。圖2中,“1/2RT”是半路由器,由PTP連接形成一個完整的BACnet路由器,即BACnet網際網將廣域網技術向應用層屏蔽。
BACnet應用層即BACnet應用實體,通過API(應用編程接口)為上層應用程序服務,并與對等應用層實體通信。應用實體由兩部分組成:用戶單元和應用服務單元(ASE)。ASE是一組特定內容的應用服務。而用戶單元支持本地API、保存事務處理上下文信息、產生請求ID、記錄ID對應的應用服務響應、維護超時重傳機制所需的計數器以及將設備行為要求映射為對象。
BACnet應用層提供證實和非證實兩種類型的服務。BACnet定義了四種服務原語:請求、指示、響應和證實,它們通過應用層協議數據單元(APDU)傳遞。由于BACnet建立在無連接的通信模式上,所以OSI模型提供端到端服務的傳輸層部分簡化功能也由應用層實現,分別為:可靠的端到端傳輸和差錯校驗;報文分段和流量控制;報文重組和序列控制。
?
6?????? BACnet協議實現
6.1??? BACnet/IP的報文結構
在網絡上傳輸的物理幀格式如圖2所示。
?
?
PCI:協議控制單元。
APDU = APCI+ DATA
NPDU = NPCI+ NSDU
LPDU = LPCI+? LSDU
MPDU = MPCI+ MSDU
PPDU = PPCI+ PSDU
?
圖2? 物理幀的格式
6.2????? 報文實現過程
?????? 數據
+
APCI(應用層協議控制單元)
+
NPCI(網絡層協議控制單元)
+
BVLLPCI(BACnet 虛擬鏈路層協議控制單元)
?
然后將所得的BVLL 報文整體交給網絡層,這里采用UDP(用戶數據報)協議,指定接收端的IP地址和端口‘0xBAC0’發送。
客戶端發送ReadProperty-Request(讀屬性請求)報文,而服務器端在正確接收報文并解碼成功后,如果存在該屬性(Property),則返回Result(+)正響應ReadProperty-ACK(讀屬性響應)報文,如果不存在該屬性,則返回Result(-)負響應報文,并返回相應的錯誤代碼。解碼過程只是編碼過程的逆過程。
6.3????? 編碼過程
5.3.1 ?ASN(Abstract Syntax Notation One)
是一種 ISO/ITU-T 標準,描述了一種對數據進行表示、編碼、傳輸和解碼的數據格式。它提供了一整套正規的格式用于描述對象的結構,而不管語言上如何執行及這些數據的具體指代,也不用去管到底是什么樣的應用程序。
TLV編碼是指先對Tag編碼,再對Length編碼,最后對Value編碼。
編碼方式
BACnet協議采用混合編碼方式,其APDU編碼分為兩部分。第一部分是數據部分也就是APDU部分,采用ASN.1基本編碼規則,即TLV編碼,它把各種數據表示為三部分:標識符字節(T),長度字節(L),內容字節(V),來明確標識每個數據。這一部分是難點和重點,不僅需要完成對數據的編解碼,而且需要編解碼其相應的標記。
第二部分控制信息部分,由于PCI部分格式固定,具有固定的位置和長度所以可以不使用標記和長度字段直接編碼,所以可以通過參數的賦值直接完成。BACnet采用混合編碼的方法既不失靈活性又節省了開銷。
首先是對數據部分的編碼,也就是標記及各類數據的編解碼
BACnet標記編碼:BACnet的標記主要有一般標記、開始標記和結束標記。所有的標記均被封裝成一個類,其第一字節為固定的TLV格式,BACnet里以TCL表示即Tag Number(4位),Class(1位,表示上下文標記或者應用標記)和Length/Value/Type(3位),如果出現Tag Number 和Length/Value/Type 有超過第一字節規定的數據的,就在其后加上擴展的字節。
標記的類定義如下,其中TCL以結構體field來定義完成位操作,并定義了擴展字節externnum作為后續的擴展標記字節,以及extra1,2,3作為擴展長度字節。同時定義了三種標記的編解碼函數來通過參數傳遞完成相應的操作。
class tag
{
public:
??? struct
??? {
??????? unsigned int l:3;
??????? unsigned int c:1;
??????? unsigned int n:4;
??? }field;
??? short externnum;??
??? short extra1;
??? short extra2;
??? int extra3;
?
??? tag();
??? void TagEncode(char *p,int number,int class_t,int len);
??? void TagDiscode(char *p,int *pnum,int *pclass_t,int *plen);
??? int StartTagE(char *p,int number);
??? int EndTagE(char *p,int number);
int StartTagD(char *p,int *number);
??? int EndTagD(char *p,int *number);
private:
??? int temp;
};
具體賦值遵循如下原則:對于一般標記來說,標記編號域(T):當標記編號為0~14(包含0 和14)時,用該域直接進行編碼。當標記編號為15~254(包含15 和254)時,則該域編碼為‘B 1111’,并在該標記字段之后用一個字節對標記編號進行編碼。但標記編碼號根據目前應用需要不得大于254,因而標記編碼擴展字節只有一個字節就可以滿足實際應用。長度/值/類型域(L):該域所表示的內容較為復雜,一是用于區分簡單(Primitive)類型編碼和構造(Constructed)類型編碼。二是用于表示簡單編碼中簡單類型數據的長度和值。具體的表示方法參加BACnet協議。
?對于開始標記,該標記標識構造編碼開始。其標記字節的Class域為‘B 1’,Length/Value/Type 域為‘B 110’。相應的結束標記的標記字節的Class域為‘B 1’,Length/Value/Type 域為‘B 111’。所以這兩個標記的編解碼只需簡單的傳遞number參數。開始標記和結束標記用于構造類型數據的編碼。
讀屬性服務是構造類型數據。構造類型數據是簡單類型經過復雜組合而形成的具有一定結構的復合數據,構造類型可以嵌套。該類型由兩個必須包括的項:objectIdentifier 、propertyIdentifier 和一個可選的項: propertyArrayIndex 分別描述讀請求所要讀的對象,屬性和是否存在數據類型組。
6.4????? 地址碼設定
BACnet參照OSI模型制定了簡化的網絡層協議,向應用層提供不確認無連接的數據單元傳送服務。每個BACnet設備都被一個網絡號碼和一個MAC地址唯一確定。
可信自控的控制器(DDC)在BACnet網絡中遵循以下簡單的地址設置方法,來保證在多種廠商設備聯網的BACnet網絡中地址的唯一性。這里,Device# 是BACnet地址碼,RCC#是可信自控的地址碼。
主網: Device# = 主網控制器RCC# *1000
子網SubA: Device# = 主網控制器RCC# *1000 + SubA控制器RCC#
子網SubB: Device# = 主網控制器RCC# *1000 + SubB控制器RCC# + 200
下面說明可信自控的地址碼(RCC#)與BACnet地址碼(BACnet#)在一個網絡系統中共存和相互之間的關系。
在主網上,有控制器MACH1、MACH-Zone、ETHRT-Link和MACH-Global,其RCC#分別為1、2、3和4,其Device#分別為1000,2000,3000,4000。在MACH-Global(RCC#=4)
上有2個子網SubA和SubB。SubA上MACH2和MACH-Air控制器,其RCC#為4A1和4A2,其BACnet地址碼Device#為4001和4002。SubB上有MACH-Air和MACH-Zone控制器,其RCC#為4B1和4B2,其BACnet地址碼Device#為4201和4202。同理,ETHER-Link(Device#=3)下掛一個子網,有MACH-Air和MACH-Zone控制器,其RCC#為3A1和3A2,其BACnet地址碼Device#為3001和3002。
7?????? BACnet協議摘錄
1.?????? 應用層模型:
應用程序,應用程序接口API,下面是BACnet的應用層,由BACnet 用戶元素和BACnet ASE組成,ASEl“application service element”。對等的應用層之間采用抽象服務原語進行信息交互。
四服務原語的定義:請求,指示,響應和確認。原語通過PDUS協議數據單元進行表達,(protocol data units)
通過應用程序接口,用戶實現遠程訪問。接口控制信息包括ICI(interface control information)服務原語和服務的具體參數,
?
ICI接口參數:DA,SA, NP, DER
DA: destination_address:欲接收設備的地址。
SA: source_address: 服務原語發出的設備地址.?格式(設備名稱,網絡地址)
NP: network_priotiry: 四層網絡優先參數。
DER: data_expecting_reply: 服務發出后是否期待返回,TRUE OR FALSE.
?
BACnet定義了客戶端和服務器通信模型的應用服務
APDU長度:
本地BUFFER, NPDU, 50字節,三者中的最小者。
?
2.?????? 網絡層
BACnet網絡層提供由一個BAC到另一個的網絡連接而,不管各自網絡采用了怎樣的數據鏈路層技術。一個BACnet設備地址由網絡地址和MAC地址唯一確定。
?
NPDU長度最大值列表:
?
網絡層交互提供的數據原語:
??
????? NPDU中的第一個字節是版本信息,第二個字節是控制信息,只是當前或存在的NPCI。
一個控制字節中的位信息表示如下:
Bit7: 1: NSDU是一個消息類型字段 0:NSDU是一個BACnet 的APDU。
Bit6:? ?保留信息 0 。
Bit5: ??目的地址符
Bit4:? 保留信息 0.
Bit3:? 源地址符。
Bit2:? 返回原語中data_expecting_reply參數的含義
Bit1: Bit0: 網絡優先權。
?
NPDU格式:
DNET: 2:? 目的網絡地址號
DLEN: 1:? 目的MAC層地址長
DADR: V:? 目的MAC地址
DA:??????? 本地網絡MAC地址
SNET:? 2 :源網絡網絡號
SLEN:?? 1?? 源MAC地址長
SADR:? V: 源MAC地址
SA:???????? ?? 本地網絡MAC地址
Hop Count:? 跳躍次數,避免循環路徑。
Message type:?消息類型,00- 0A, +80?? ,P62
?
?
?
?
?
?
?
3.?????? 數據鏈路層和物理層
DATALINK 、logical link control
?
Format of an MPDU on an ISP8802-3LAN
尋找創業合作伙伴, 加QQ 404536204
總結
以上是生活随笔為你收集整理的BacNet开发入门2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用C++访问OPC Server的简单
- 下一篇: 好记性不如烂笔头,记录几个常用的Linu