BACnet为BuildingAutomation andControlnetworks的简称,台湾通常翻译为“建筑自动化控制网路通讯协定”,而中国大陆则译为“楼宇自动化与控制网络”。 1 前言 BACnet是用于智能建筑的通信协议,是国际标准化组织(ISO)、美国国家标准协会(ANSI)及美国采暖、制冷与空调工程师学会(ASHRAE)定义的通信协议。BACnet针对智能建筑及控制系统的应用所设计的通信,可用在暖通空调系统(HVAC,包括暖气、通风、空气调节),也可以用在照明控制、门禁系统、火警侦测系统及其相关的设备。优点在于能降低维护系统所需成本并且安装比一般工业通信协议更为简易,而且提供有五种业界常用的标准协议,此可防止设备供应商及系统业者的垄断,也因此未来系统扩展性与兼容性大为增加。

2 协议简介 BACnet通信协议中定义了几种不同的数据链接层/物理层,包括: • ARCNET。 • 以太网。 • BACnet/IP。 • RS-232上的点对点通信。 • RS-485上的主站-从站/令牌传递(Master-Slave/Token-Passing,简称MS/TP)通信。 • LonTalk。 BACnet通信协议中定义了许多服务(service),可供各设备之间的通信,服务可以分为五类:有关设备对象管理的服务包括Who-Is、I-Am、Who-Has及I-Have等服务,有关对象访问的服务包括读取属性、写入属性等服务,有关报警与事件的服务包括确认报警、属性改变(change of state)报告等,此外也有有关文件读写及虚拟终端的服务。 BACnet通信协议也定义了许多种类的对象。在每个对象中都有许多属性,可以透过服务来访问对象中的属性。BACnet通信中的设备就是由许多对象组成,其中包括一个设备对象,是每个设备都必需的,其中记录设备相关的数据,其他对象包括模拟输入、模拟输出、模拟值、数字输入、数字输出及数字值等有关数据的对象。 为了提供不同厂商BACnet设备之间的互操作性,BACnet协议也定义了BACnet互操作基本块(BACnet Interoperability Building Block,简称BIBB),BACnet互操作基本块是由一个或多个服务所组成,说明在特定需求下,服务器(server)端及客户(client)端需要支持的服务及程序。BACnet互操作基本块可分为以下的五种: • 数据分享 • 警告及事件管理 • 调度 • 趋势 • 设备及网上管理 每个BACnet设备都会有一份名为“协议实现一致性声明”(Protocol Implementation Conformance Statement,PICS)的文件,其中需说明设备所支持的BACnet互操作基本块、对象种类及定义、使用文字集及通信时需要的数据。

2.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.2 PDU类型 BACnet协议定义了七种不同的PDU,用以传递原语信息。 2.2.1 BACnet有证实请求PDU 用于传送包含在有证实服务请求原语中的信息。 2.2.2 BACnet无证实请求PDU 用于传送包含在无证实服务请求原语中的信息。 2.2.3 BACnet 简单确认PDU 用于传送包含在一个服务响应原语中的信息,这个信息是服务请求已经成功执行。 2.2.4 BACnet复杂确认PDU 用于传送包含在一个服务响应原语中的信息,这个信息除了包含服务请求已经成功执行之外,还有其它一些信息。 2.2.5 BACnet 分段确认PDU 用于对收到一个或者多个PDU进行确认,这些PDU包含一个分段报文的分段。BACnet 分段确认PDU也用于对分段报文的下一个或者几个分段的请求。 2.2.6 BACnet差错PDU 用于传送包含在一个服务响应原语中的信息,这个信息指出前一个服务请求完全失败的原因。 2.2.7 BACnet拒绝PDU 用于对一个有证实请求PDU的拒绝接收,其原因是这个被拒绝的PDU具有句法结构错误或者其它的协议错误,使得不能对这个PDU进行解读,或者不能够提供请求的服务。只能对有证实请求PDU进行拒绝。 2.2.8 BACnet 中止PDU 用于结束两个对等实体之间的事务处理。

2.3 服务选择 BACnet定义了以下几类可选择的服务,用于两个对等实体之间的交互。 2.3.1 文件访问服务 定义一组访问和操作在BACnet设备中的文件的服务。文件只是一个抽象的概念,表示一个任意长度和意义的字节集合的网络可见形式。 基本读文件(AtomicReadFile)服务:一个客户端的BACnet用户使用基本读文件服务对某个文件进行一个“打开-读出-关闭”的操作。 基本写文件(AtomicWriteFile)服务:一个客户端的BACnet用户使用基本写文件服务对某个字节流进行一个“打开-写入-关闭”的操作,将它写入到文件的某个位置。 2.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对象的一个或者多个特定属性的值。 2.3.3 远程设备管理服务 定义一组远程设备管理服务。 设备通信控制(DeviceCommunicationControl)服务。 有证实专有传输(ConfirmedPrivateTransfer)服务。 无证实专有传输(UnconfirmedPrivateTransfer)服务。 重新初始化设备(ReinitializeDevice)服务。 有证实文本报文(ConfirmedTextMessage)服务。 无证实文本报文(UnconfirmedTextMessage)服务。 时间同步(TimeSynchronization)服务。 2.3.4 Who-Has和I-Have服务 一个发送的BACnet用户使用Who-Has服务确定一些其它BACnet设备的设备对象标识符和网络地址,设备使用I-Hava服务响应Who-Has服务请求,或者通告自己有一个具有给定的对象名称属性或者对象标识符属性的对象。 2.3.5 Who-Is和I-Am服务 一个发送方BACnet用户使用Who-Is服务确定在同一个互联网上的其它BACnet设备的设备对象标识符和网络地址,Who-Is服务是一个无证实服务。I-Am服务也是一个无证实的服务,这个服务用于响应Who-Is服务请求。 2.3.6 虚拟终端服务 略。 2.4 对象 对象是对现实设备中某一特征的抽象。 2.4.1 模拟输入对象类型(Analog Input Object Type) 模拟输入对象类型定义为一个标准对象,其属性表示一个模拟输入的外部可见一致性代码。 2.4.2 模拟输出对象类型(Analog Output Object Type) 模拟输出对象类型定义为一个标准对象,其属性表示一个模拟输出的外部可见一致性代码。 2.4.3 模拟值对象类型(Analog Value Object Type) 模拟值对象类型定义为一个标准对象,其属性表示一个模拟值的外部可见一致性代码。BACnet设备的一个“模拟值”是驻留在这个设备的内存中的一个控制系统参数。 2.4.4 二进制输入对象类型(Binary Input Object Type) 二进制输入对象类型定义为一个标准对象,它的属性表示二进制输入的外部可见一致性代码。“二进制输入”是物理设备或硬件的输入,该输入只存在两种状态,即“活动(ACTIVE)”状态和“非活动(INACTIVE)”状态。二进制输入的主要用途是指明机械设备状态,如:风机或水泵是否运行。活动表示设备开或运转,非活动表示设备关或未运行。 2.4.5 二进制输出对象类型(Binary Output Object Type) 二进制输出对象类型定义为一个标准对象,它的属性表示二进制输出的外部可见一致性代码。“二进制输出”是物理设备或硬件的输出,该输出只存在两种状态,即“活动”状态和“非活动”状态。二进制输出的主要用途是切换机械设备状态,如:风机或水泵的开和关。活动表示设备开或运转,非活动表示设备关或未运行。 2.4.6 二进制值对象类型(Binary Value Object Type) 二进制值对象类型定义为一个标准对象,它的属性表示二进制值的外部可见一致性代码。“二进制值”是驻留在BACnet设备内存中的控制系统参数。这个参数只存在两种状态即:“活动”状态和“非活动”状态。 2.4.7 日期表对象类型(Calendar Object Type) 日期表对象类型定义为一个标准对象,用于描述日期列表,例如,“节假日”、“特别日”或简单的日期列表。 2.4.8 命令对象类型(Command Object Type) 命令对象类型定义为一个标准对象,其属性反映了多操作命令过程的外部可见一致性代码。命令对象的作用是,根据写入到命令对象自己的当前值属性中的“操作代码(action code)”,向一组对象属性写入一组值。无论何时,只要命令对象的当前值属性被写入,就会触发命令对象采取一组改变其它对象的属性值的操作。 2.4.9 设备对象类型(Device Object Type) 设备对象类型定义为一个标准对象,其属性表示BACnet设备的外部可见一致性代码。每个BACnet设备有且只有一个设备对象。每个设备对象由它的对象标识符属性确定,该属性在BACnet设备中乃至整个BACnet互联网中都是唯一的。 2.4.10 事件登记对象类型(Event Enrollment Object Type) 事件登记对象类型定义为一个标准对象,表示BACnet系统内管理事件的信息。“事件”是指满足预先规定条件的所有对象的任何属性值的变化。事件登记对象主要用于定义一个事件和提供在事件发生与通告消息向一个或多个接收者进行传输这两者之间的联系。 2.4.11 文件对象类型(File Object Type) 文件对象类型定义为一个标准对象,用于定义可以通过文件服务(见第14节)访问的数据文件的属性。 2.4.12 组对象类型(Group Object Type) 组对象类型定义为一个标准对象,其属性表示一个其它对象的集合以及这些对象的一个或多个属性。组对象提供一种快速的方式,可以一次确定组的成员,从而简化BACnet设备间的信息交换。一个组对象可以是任何对象类型的组合。

1.4.13 环对象类型(Loop Object Type) 环对象类型定义为一个标准对象,其属性表示任何形式的反馈控制环路的外部可见一致性代码。环对象通过提供三个独立的无单位增益常数,可以具有广泛的适用性。每个增益常数由控制算法具休确定,如何使用不同的算法确定增益常数的方法,由生产商自行确定。 2.4.13 多态输入对象类型(Multi-state Input Object Type) 多态输入对象类型定义了一个标准对象,它的当前值属性表示对象驻留的BACnet设备内算法处理的结果。 2.4.14 多态输出对象类型(Multi-state Output Object Type) 多态输出对象类型定义了一个标准对象,它的属性表示这个对象驻留的BACnet设备内的处理程序或一个或多个物理输出的期望状态。 2.4.15 通告类对象类型(Notification Class Object Type) 通告类对象类型定义了一个标准对象,表示在BACnet系统内事件通告发布所需的信息。 2.4.16 程序对象类型(Program Object Type) 程序对象类型定义了一个标准对象,它的属性表示应用程序的外部可视一致性代码。在本协议中,应用程序是指对一个在BACnet设备中的处理过程的抽象表示,这个处理过程执行一个指令集,对某个数据结构集合进行操作。 2.4.17 时间表对象类型(Schedule Object Type) 时间表对象类型定义了一个标准对象,用于描述一个周期性的时间表。这个时间表中确定了某事件在一个日期范围内可能重复发生,同时表示有些日期是事件不发生的日期。 2.5 属性 上述各对象除了有公有的属性外,还有自己私有的属性。 常用的公有属性有: 对象名称(Object_Name) 对象类型 (Object_Type) 当前值 (Present_Value) 描述(Description) 通常对象名称由对象类型和对象实例一起标识。需注意,当前值属性并不一定为实数,可以为BOOL型、INT型等。

3 TCP/IP组网布署 每个设备有一个唯一的设备地址,在TCP/IP网络中,就是IP地址。在设备不是一个BACnet路由器的情况下,设备不知道或不需要知道他们BACnet网络的网络号。一个或多个子网可以有相同的网络号。 3.1 BBMD结构 为了确保广播消息不会在所有子网中路由,引入了BACnet广播管理设备(BACnet Broadcast Management Device,BBMD)。很多功能,比如动态name绑定、值改变通知都会广播,通过BBMD把这些消息限制在各自的网络中。 3.1.1 树形结构 图片.png 优点: 结构简单,只有一个parent和几个child 易增加新设备 消息不会被复制成几份 缺点: 一条链路失败,整个支路不通 动态TOPO复杂 3.1.2 环形结构 图片.png 缺点:一条链路坏了,整个环就瘫痪 3.1.3 B/IP网络结构 图片.png 完全连接的星形结构,注意只是逻辑结构而不是物理结构。 3.2 跨网段之间的定点通信或广播 图片.png 如果知道各自的IP和端口,并且具有BBMD设备,则相互之间就能正常通信。注意BBMD和相关的BVLL协议只是用来广播消息。 3.3 BBMD本地广播的接收 图片.png BBMD是一个被动设备,几乎没有消息主动传递给它,通常它仅仅用来监听本地局域网的广播消息。 3.4 广播消息的转发 图片.png BBMD会根据自身的BBMD表和掩码,对接收到的消息进行转发。通过创建Forwarded-NPDU消息,发送到目的地址。

4 使用Yabe软件读取bacnet设备信息

  1. BACnet设备通过网线连接到电脑。在电脑上打开yabe软件。关闭电脑上的防火墙和退出杀毒软件。
  2. 选择菜单“Functions”下的“添加设备”。 图片.png
  3. BACnet设备通过网线连接电脑,在“BACnet/IP over Udp”字段中进行相应的设置,输入电脑的网卡IP地址(bacent连接的网卡)后点击“Add”按钮。该程序将添加一个Udp连接到“Devices”目录,如果网络中有任何BACnet/IP设备,它们将显示在目录中。 图片.png 图片.png
  4. 点击“Devices”目录中的设备。程序将从设备中获取所有“寄存器”或“节点”,并将它们显示在“地址空间”树中。用鼠标按住某个地址,可以拖到右面的窗口中显示。47808是端口。1712到1716是Bacnet设备ID。Analog_Input是简写AI,地址是5。这些参数需要设置到网关中。 图片.png

5 Vfbox网关配置bacnet的流程

  1. 网关上电,通过网线连接到电脑。打开VS软件,新建工程,然后新建设备,设备的属性如下。网关要采集节点是“1714”的设备数据,则配置如下: 图片.png

  2. 添加一个采集的标签。“5”是寄存器的地址。主要修改“5”位置的地址就可以,其他不用修改。 图片.png 地址说明: 1、Analog Input---模拟输入对象,AnalogOutput--模拟输出对象, AnalogValue--模拟值对象 2、Binary Input--二进制输入对象,Binary Output 二进制输出对象,Binary Value--二进制值对象 3、Multi state 是多态对象。 4、input是只读,outpu读写,value读写

  3. 完成配置后,点击“下载”,点击“查看数据”可以看到采集到的数据 图片.png

  4. 启动modbus slave功能 图片.png

  5. 添加要转发的数据 图片.png

  6. 下载到网关中,就可以通过modbus poll软件读取了网关中的数据了。