一、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)
二进制输入对象类型定义为一个标准对象,它的属性表示二进制输入的外部可见一致性代码。“二进制输入”是物理设备或硬件的输入,该输入只存在两种状态,即“活动(ACTIVE)”状态和“非活动(INACTIVE)”状态。二进制输入的主要用途是指明机械设备状态,如:风机或水泵是否运行。活动表示设备开或运转,非活动表示设备关或未运行。
4.5 二进制输出对象类型(Binary Output Object Type)
二进制输出对象类型定义为一个标准对象,它的属性表示二进制输出的外部可见一致性代码。“二进制输出”是物理设备或硬件的输出,该输出只存在两种状态,即“活动”状态和“非活动”状态。二进制输出的主要用途是切换机械设备状态,如:风机或水泵的开和关。活动表示设备开或运转,非活动表示设备关或未运行。
4.6 二进制值对象类型(Binary Value Object Type)
二进制值对象类型定义为一个标准对象,它的属性表示二进制值的外部可见一致性代码。“二进制值”是驻留在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系统内管理事件的信息。“事件”是指满足预先规定条件的所有对象的任何属性值的变化。事件登记对象主要用于定义一个事件和提供在事件发生与通告消息向一个或多个接收者进行传输这两者之间的联系。
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消息,发送到目的地址。