一、BACnet協議概述
BACnet協議(A Data Communication Protocol for Building Automation and Control Networks),是由美國采暖、制冷和空調工程師協會(ASHRAE)制定的一個樓宇自動控制技術標準文件,BACnet協議最根本的目的是提供一種樓宇自動控制系統實現互操作的方法。BACnet協議并不能簡單的認為是一種應用層的協議,而是包含四個層次的簡化分層體系結構,這四層相當于OSI模型中的物理層、數據鏈路層、網絡層和應用層。
BACnet中有很多專業術語,解釋如下:
1、服務原語
與ISO服務中的約定用法一致,BACnet中兩個對等應用進程間的信息交換,被表示成抽象服務原語的交換。這些服務原語用來傳遞一些特定的服務參數,本協議定義了四種服務原語:請求(request)、指示(indication)、響應(response)和證實(confirm)。
同樣,本協議定義了下列幾種服務:
有證實(confirmed)服務:用CONF_SERV標記,表示客戶方通過具體的服務請求實例向服務器方請求服務,服務器方通過響應請求來為客戶方提供服務。存在客戶/服務器模型、區分“請求方BACnet用戶”和“響應方BACnet用戶”等。
無證實(unconfirmed)服務:用UNCONF_SERV標記,只有“發送方BACnet用戶”和“接收方BACnet用戶”的概念,不存在客戶/服務器模型,只有發送方和接收方,而不是請求-響應對。
分段確認(segment acknowledge)服務:用SEGMENT_ACK標記,為了實現長報文(長度大于通信網絡、收/發設備所支持的長度)的傳輸,BACnet采取了應用層報文分段的機制來對報文進行分段。在BACnet中只有有證實請求(Confirmed-Request)和復雜確認(Complex-ACK)報文可能需要分段,因此分段還是BACnet的一個可選特性。
另外,還有差錯(ERROR)服務,拒絕(REJECT)服務,中止(ABORT)服務。
因此,根據不同的服務類型和原語類型,據有下表所示的服務原語。這些原語中的信息,由各種協議數據單元(PDU:Protocol Data Unit)傳遞。
2、PDU類型
BACnet協議定義了七種不同的PDU,用以傳遞原語信息。
2.1 BACnet有證實請求PDU
用于傳送包含在有證實服務請求原語中的信息。
2.2 BACnet無證實請求PDU
用于傳送包含在無證實服務請求原語中的信息。
2.3 BACnet 簡單確認PDU
傳送包含在一個服務響應原語中的信息,這個信息是服務請求已經成功執行。
2.4 BACnet復雜確認PDU
用于傳送包含在一個服務響應原語中的信息,這個信息除了包含服務請求已經成功執行之外,還有其它一些信息。
2.5 BACnet 分段確認PDU
用于對收到一個或者多個PDU進行確認,這些PDU包含一個分段報文的分段。BACnet 分段確認PDU也用于對分段報文的下一個或者幾個分段的請求。
2.6 BACnet差錯PDU
用于傳送包含在一個服務響應原語中的信息,這個信息指出前一個服務請求完全失敗的原因。
2.7 BACnet拒絕PDU
用于對一個有證實請求PDU的拒絕接收,其原因是這個被拒絕的PDU具有句法結構錯誤或者其它的協議錯誤,使得不能對這個PDU進行解讀,或者不能夠提供請求的服務。只能對有證實請求PDU進行拒絕。
2.8 BACnet 中止PDU
用于結束兩個對等實體之間的事務處理。
3 服務選擇
BACnet定義了以下幾類可選擇的服務,用于兩個對等實體之間的交互。
3.1 文件訪問服務
定義一組訪問和操作在BACnet設備中的文件的服務。文件只是一個抽象的概念,表示一個任意長度和意義的字節集合的網絡可見形式。
基本讀文件(AtomicReadFile)服務:一個客戶端的BACnet用戶使用基本讀文件服務對某個文件進行一個“打開-讀出-關閉”的操作。
基本寫文件(AtomicWriteFile)服務:一個客戶端的BACnet用戶使用基本寫文件服務對某個字節流進行一個“打開-寫入-關閉”的操作,將它寫入到文件的某個位置。
3.2 對象訪問服務
定義九個應用服務,這些服務共同提供一組訪問和操作BACnet對象的方法。
添加列表元素(AddListElement)服務:一個客戶端的BACnet用戶使用添加列表元素服務向一個具有列表的對象的屬性添加一個或者多個列表元素。
刪除列表元素(RemoveListElement)服務:一個客戶端的BACnet用戶使用刪除列表元素服務從一個具有列表的對象的屬性中刪除一個或者多個列表元素。
創建對象(CreateObject)服務:一個客戶端的BACnet用戶使用創建對象服務創建一個對象的新實例。
刪除對象(DeleteObject)服務:一個客戶端的BACnet用戶使用刪除對象服務刪除一個已有的對象。
讀屬性(ReadProperty)服務:一個客戶端的BACnet用戶使用讀屬性服務請求一個BACnet對象的一個屬性值。
條件讀屬性(ReadPropertyConditional)服務:一個客戶端的BACnet用戶使用條件讀屬性服務請求那些滿足一個選擇準則列表的所有BACnet對象的對象標識符和0個或者多個特定屬性的值。
讀多個屬性(ReadPropertyMultiple)服務:一個客戶端的BACnet用戶使用讀多個屬性服務請求一個或者多個BACnet對象的一個或者多個特定屬性的值。
寫屬性(WriteProperty)服務:一個客戶端的BACnet用戶使用寫屬性服務修改一個BACnet對象的一個屬性值。
寫多個屬性(WritePropertyMultiple)服務:一個客戶端的BACnet用戶使用寫多個屬性服務修改一個或者多個BACnet對象的一個或者多個特定屬性的值。
3.3 遠程設備管理服務
定義一組遠程設備管理服務。
設備通信控制(DeviceCommunicationControl)服務。
有證實專有傳輸(ConfirmedPrivateTransfer)服務。
無證實專有傳輸(UnconfirmedPrivateTransfer)服務。
重新初始化設備(ReinitializeDevice)服務。
有證實文本報文(ConfirmedTextMessage)服務。
無證實文本報文(UnconfirmedTextMessage)服務。
時間同步(TimeSynchronization)服務。
3.4 Who-Has和I-Have服務
一個發送的BACnet用戶使用Who-Has服務確定一些其它BACnet設備的設備對象標識符和網絡地址,設備使用I-Hava服務響應Who-Has服務請求,或者通告自己有一個具有給定的對象名稱屬性或者對象標識符屬性的對象。
3.5 Who-Is和I-Am服務
一個發送方BACnet用戶使用Who-Is服務確定在同一個互聯網上的其它BACnet設備的設備對象標識符和網絡地址,Who-Is服務是一個無證實服務。I-Am服務也是一個無證實的服務,這個服務用于響應Who-Is服務請求。
3.6 虛擬終端服務
略。
4 對象
對象是對現實設備中某一特征的抽象。
4.1 模擬輸入對象類型(Analog Input Object Type)
模擬輸入對象類型定義為一個標準對象,其屬性表示一個模擬輸入的外部可見一致性代碼。
4.2 模擬輸出對象類型(Analog Output Object Type)
模擬輸出對象類型定義為一個標準對象,其屬性表示一個模擬輸出的外部可見一致性代碼。
4.3 模擬值對象類型(Analog Value Object Type)
模擬值對象類型定義為一個標準對象,其屬性表示一個模擬值的外部可見一致性代碼。BACnet設備的一個“模擬值”是駐留在這個設備的內存中的一個控制系統參數。
4.4 二進制輸入對象類型(Binary Input Object Type)
二進制輸入對象類型定義為一個標準對象,它的屬性表示二進制輸入的外部可見一致性代碼?!岸M制輸入”是物理設備或硬件的輸入,該輸入只存在兩種狀態,即“活動(ACTIVE)”狀態和“非活動(INACTIVE)”狀態。二進制輸入的主要用途是指明機械設備狀態,如:風機或水泵是否運行?;顒颖硎驹O備開或運轉,非活動表示設備關或未運行。
4.5 二進制輸出對象類型(Binary Output Object Type)
二進制輸出對象類型定義為一個標準對象,它的屬性表示二進制輸出的外部可見一致性代碼?!岸M制輸出”是物理設備或硬件的輸出,該輸出只存在兩種狀態,即“活動”狀態和“非活動”狀態。二進制輸出的主要用途是切換機械設備狀態,如:風機或水泵的開和關?;顒颖硎驹O備開或運轉,非活動表示設備關或未運行。
4.6 二進制值對象類型(Binary Value Object Type)
二進制值對象類型定義為一個標準對象,它的屬性表示二進制值的外部可見一致性代碼?!岸M制值”是駐留在BACnet設備內存中的控制系統參數。這個參數只存在兩種狀態即:“活動”狀態和“非活動”狀態。
4.7 日期表對象類型(Calendar Object Type)
日期表對象類型定義為一個標準對象,用于描述日期列表,例如,“節假日”、“特別日”或簡單的日期列表。
4.8 命令對象類型(Command Object Type)
命令對象類型定義為一個標準對象,其屬性反映了多操作命令過程的外部可見一致性代碼。命令對象的作用是,根據寫入到命令對象自己的當前值屬性中的“操作代碼(action code)”,向一組對象屬性寫入一組值。無論何時,只要命令對象的當前值屬性被寫入,就會觸發命令對象采取一組改變其它對象的屬性值的操作。
4.9 設備對象類型(Device Object Type)
設備對象類型定義為一個標準對象,其屬性表示BACnet設備的外部可見一致性代碼。每個BACnet設備有且只有一個設備對象。每個設備對象由它的對象標識符屬性確定,該屬性在BACnet設備中乃至整個BACnet互聯網中都是唯一的。
4.10 事件登記對象類型(Event Enrollment Object Type)
事件登記對象類型定義為一個標準對象,表示BACnet系統內管理事件的信息?!笆录笔侵笣M足預先規定條件的所有對象的任何屬性值的變化。事件登記對象主要用于定義一個事件和提供在事件發生與通告消息向一個或多個接收者進行傳輸這兩者之間的聯系。
1.4.11 文件對象類型(File Object Type)
文件對象類型定義為一個標準對象,用于定義可以通過文件服務(見第14節)訪問的數據文件的屬性。
4.12 組對象類型(Group Object Type)
組對象類型定義為一個標準對象,其屬性表示一個其它對象的集合以及這些對象的一個或多個屬性。組對象提供一種快速的方式,可以一次確定組的成員,從而簡化BACnet設備間的信息交換。一個組對象可以是任何對象類型的組合。
4.13 環對象類型(Loop Object Type)
環對象類型定義為一個標準對象,其屬性表示任何形式的反饋控制環路的外部可見一致性代碼。環對象通過提供三個獨立的無單位增益常數,可以具有廣泛的適用性。每個增益常數由控制算法具休確定,如何使用不同的算法確定增益常數的方法,由生產商自行確定。
4.14 多態輸入對象類型(Multi-state Input Object Type)
多態輸入對象類型定義了一個標準對象,它的當前值屬性表示對象駐留的BACnet設備內算法處理的結果。
4.15 多態輸出對象類型(Multi-state Output Object Type)
多態輸出對象類型定義了一個標準對象,它的屬性表示這個對象駐留的BACnet設備內的處理程序或一個或多個物理輸出的期望狀態。
4.16 通告類對象類型(Notification Class Object Type)
通告類對象類型定義了一個標準對象,表示在BACnet系統內事件通告發布所需的信息。
4.17 程序對象類型(Program Object Type)
程序對象類型定義了一個標準對象,它的屬性表示應用程序的外部可視一致性代碼。在本協議中,應用程序是指對一個在BACnet設備中的處理過程的抽象表示,這個處理過程執行一個指令集,對某個數據結構集合進行操作。
4.18 時間表對象類型(Schedule Object Type)
時間表對象類型定義了一個標準對象,用于描述一個周期性的時間表。這個時間表中確定了某事件在一個日期范圍內可能重復發生,同時表示有些日期是事件不發生的日期。
5 屬性
上述各對象除了有公有的屬性外,還有自己私有的屬性。
常用的公有屬性有:
對象名稱(Object_Name)
對象類型 (Object_Type)
當前值 (Present_Value)
描述(Description)
通常對象名稱由對象類型和對象實例一起標識。需注意,當前值屬性并不一定為實數,可以為BOOL型、INT型等。
二、TCP/IP組網布署
每個設備有一個唯一的設備地址,在TCP/IP網絡中,就是IP地址。在設備不是一個BACnet路由器的情況下,設備不知道或不需要知道他們BACnet網絡的網絡號。一個或多個子網可以有相同的網絡號。
1 BBMD結構
為了確保廣播消息不會在所有子網中路由,引入了BACnet廣播管理設備(BACnet Broadcast Management Device,BBMD)。很多功能,比如動態name綁定、值改變通知都會廣播,通過BBMD把這些消息限制在各自的網絡中。
1.1 樹形結構
優點:
結構簡單,只有一個parent和幾個child
易增加新設備
消息不會被復制成幾份
缺點:
一條鏈路失敗,整個支路不通
動態TOPO復雜
1.2 環形結構
缺點:一條鏈路壞了,整個環就癱瘓
1.3 B/IP網絡結構
完全連接的星形結構,注意只是邏輯結構而不是物理結構。
2 跨網段之間的定點通信或廣播
如果知道各自的IP和端口,并且具有BBMD設備,則相互之間就能正常通信。注意BBMD和相關的BVLL協議只是用來廣播消息。
3 BBMD本地廣播的接收
BBMD是一個被動設備,幾乎沒有消息主動傳遞給它,通常它僅僅用來監聽本地局域網的廣播消息。
4 廣播消息的轉發
BBMD會根據自身的BBMD表和掩碼,對接收到的消息進行轉發。通過創建Forwarded-NPDU消息,發送到目的地址。