1 引言
20世纪90年代,Internet经历了爆炸性发展,成为垄断全球的计算机网络。以Cisco和Sun为代表的一批公司借助这一浪潮发展成为世界上顶尖的大公司。而在智能建筑领域,也正在重现这一过程。上世纪80年代,直接数字控制器(DDC)的出现大大改善了建筑控制系统的精度和灵活性。但随着智能建筑涉及领域的不断延伸,如HVAC、照明、消防、安防等等领域,分立式控制设备已经不能满足设备间互操作和系统间通讯的需求;另一方面,随着建筑控制系统的集成度越来越高,不仅要求一栋楼宇或者一个小区的设备之间可以通讯,甚至地区、国家乃至全球的控制设备之间都可以进行通讯。因此,建立一个可以在异构系统、不同厂商设备之间的通讯机制,成为建筑智能化的迫切需求。BACnet协议就在这样一种情况下应运而生了。
2 BACnet协议介绍
BACnet是专门为建筑自动控制网络制定的一种数据通信协议,最初由美国制冷采暖空调工程师协会(简称ASHRAE)于1995年制定。其最根本的目的是要提供给建筑自动控制系统实现互操作的方法。所谓互操作是指一种能力,可以使得分布的控制系统设备通过相关信息的数字交换,能够协调地工作,从而完成一个共同的目标。BACnet解决了建筑自控系统中存在的多厂商系统和设备不兼容而难以集成的问题,提供了不同建筑自动控制系统实现互操作的方法,有望成为控制网络中的TCP/IP协议。2003年1月,BACnet成为正式的国际标准(ISO 16484标准)。
BACnet有以下特点:
·开放性:是美国现行的国家标准和ISO国际标准。
·面向对象:BACnet协议采用面向对象的技术,因此具有可扩展性和可复用性。
·互操作性:ASHRAE的BACnet委员会提出了一种新的描述自动控制系统功能性的方法,称为“互操作域(Interoperability Areas)”,其中规定了5个互操作域,分别是:数据共享、报警和事件管理、时序安排、趋势记录、设备与网络管理。
2.1 BACnet体系结构
BACnet以OSI模型为参考,结合建筑自动控制领域的实际需求,形成了一个简化模型。BACnet充分利用现有成熟的网络技术,在底层兼容5种网络结构,降低了开发成本,同时也利于系统集成。
2.2 应用层
应用层协议数据单元(APDU)传送包含在应用服务原语和相关参数中的信息。因为BACnet采用简化的OSI体系结构,不包含任何表示层的功能,必须预先定义好通信设备一致遵守的编码规则。BACnet的编码规则设计考虑到了楼宇自动控制体系对简单化、紧凑化的要求。因此,这个编码规则在一些方面与ISO 8825有所不同。但是仍然允许使用ASN.1对BACnet的APDU进行编码。
2.3 网络层
网络层提供网络路由功能,使得报文可以被直接传递到一个远程设备、一个远程网络上的所有设备、或者所有网络上的所有设备。一个BACnet设备由一个网络号码和一个MAC地址唯一确定。由于BACnet协议规定两个BACnet设备之间只能有一条有效路径,这个限制大大降低了网络层的复杂性,简化了路由算法。
2.4 数据链路层(MS/TP)
数据链路层负责将报文从一个设备传送到另一个单独设备,或者所有本地网设备。在本文中,只讨论MS/TP网络。MS/TP使用主/从令牌来控制对总线网络的访问。MS/TP协议向上为网络层提供与ISO 8802-2逻辑链路控制协议一样的服务;向下使用EIA-485物理层提供的服务。
3 程序实现
3.1 协议栈软件结构
在高端机器(如工作站)上,我们可以很好地利用C++语言的面向对象特性,完整实现整个BACnet协议栈。但在低端MCU上,程序空间和数据空间非常有限,因此需要尽可能简化协议栈软件的体系结构。同时根据不同型号的DDC,对协议栈软件进行剪裁配置。图2(略)表示了协议栈软件中各个模块之间的接口关系。在整个结构中最复杂的是应用层模块,包含BACnet对象模块,基本数据类型模块,APDU解析/分发模块和APDU组装模块。
3.2 应用层模块
BACnet协议为了简化其层次结构,使得BACnet应用层涵盖了开放系统互联参考模型(OSI)中会话层、表示层和应用层的功能。BACnet应用层模块是BACnet应用软件的基础,它实现BACnet协议应用层内容,负责提供工作站的各功能模块与物理设备直接的通信服务。根据应用层的功能分析,可以将应用层划分为如下几个模块:对象模块、服务模块、基本数据类型模块。
对象模块定义了BACnet对象。BACnet对象按其功能可分为两类:一类是采集数据的对象,如模拟输入/输出对象,这类对象需要访问设备硬件;另一类对象是在采集的数据基础上完成复杂功能,如环对象以及其他实现报警事件功能的对象,这类对象不需访问硬件。另外,某些对象的属性(如趋势登录对象的缓存器大小属性)需要设备厂商根据DDC型号进行初始配置,协议栈提供对这些属性的配置函数接口。
服务模块用于处理报文的分发、解析和组装。对于从网络层上来的APDU,服务模块根据APDU的类型和服务选择参数,调用相应的服务解析模块。服务解析模块对APDU的信息进行解码,并根据需要与DDC中的BACnet对象进行交互。另一方面,DDC会发出响应报文(如读属性响应),或者主动发出某些报文(如事件与报警服务),因此服务模块还提供服务报文组装的函数接口。
基本数据类型模块是一个工具类库,包含对基本数据类型的定义及其编、解码函数。BACnet包含13种应用数据类型以及其他基本数据类型。BACnet应用数据类型可以直接进行编、解码。BACnet基本数据类型对应着ASN.1中的复合数据类型,它是由BACnet应用数据类型配合标记按照一定的结构组合而成。因此,基本数据类型的编/解码实际上是按一定的规则调用应用数据类型以及标记的编/解码方法来实现的。
3.3 网络层模块
对于DDC来说,网络层向应用层提供一个不确认的无连接数据单元传输服务。网络层与应用层交互的服务原语是网络层数据单元请求(N-UNITDATA.request)和网络层数据单元指示(N-UNITDATA.indication)。其原语参数如下:
N-UNITDATA.request(destination_address, data, network_priority,data_expecting_reply)
N-UNITDATA.indication(source_address, destination_address,data, network_priority,data_expecting_reply)
当DDC收到来自链路层数据,解析出相应的地址信息,并把地址信息和APDU绑定起来存放到一个结构中传送给应用层,这样当应用层需要回复报文时可以得到目标地址。
3.4 数据链路层(MS/TP)模块
MS/TP是一个主从/令牌传递的数据链路协议,物理层采用RS-485半双工通信标准。MS/TP层包含两个状态机,分别是主节点状态机和接收帧状态机;接收帧状态机负责帧的接收,如是数据帧则调用与网络层接口上传给网络层,主节点状态机负责帧(包括数据帧和控制帧)的发送。两个状态机分时实现,根据两者之间的关系,接收帧状态机可放在主节点状态机中统一调度。图3(略) BACnet数据链路层模块结构图,图3显示了BACnet数据链路层的子模块:其中,接收模块实现接收帧状态机;发送模块实现主节点状态机;串口控制模块实现串口驱动与收发控制,串口读写采用中断方式;
网络层接口模块定义接口及接口函数调用模块,使用服务原语DL_UNITDATA.request()和DL_UNITDATA.indication()来实现。
4 结束语
本文提出了BACnet-MS/TP协议在MCU中的软件实现方案,解决了BACnet控制器的通讯功能。如果进一步采用嵌入式操作系统实现多任务处理,配合数据采集、控制和组态模块,就可以开发出实用的BACnet控制器。