1.4 COMWATCH 这个工具是把好剑,不过是一把双刃剑,不便的原因是他在DOS下运行,要求笔者有两台电脑才适用,不过往往越简单越能见真理,分析起数据包的时序来,感觉还真是非它莫属。在后期调时序阶段必不可少,由于版权问题,该软件咱不提供下载服务。 2 数据包仿真软件 什么样的BACnet MS/TP数据包是准确的符合BACnet MS/TP协议标准的数据包,这个是初级开发人员时常困惑的问题,笔者在初步接触BACnet的时候,也是无从下手,好在笔者开发的条件比较充足,手上不 仅有一个标准的BACnet MS/TP DDC,还有一些前辈已经摸着石头趟了一番BACnet MS/TP开发的浑水,并且留下了一批枪支弹药。 2.1 VTS
VTS是BACnet开发认证的官方测试工具,功能很好很强大,但是由于文档有限,很多功能都需要慢慢挖掘,不过在后续章节中,笔者会给大家详细介绍 VTS,并以图式的方式给大家一个VTS使用的快速入门。注:在BACnet官方认证阶段,BACnet是否符合BACnet BTL认证标准,也需要提供一个预先在VTS中Pre-Scan的PICS脚本文档,该文档是BTL认证的重要组成部分。
2.2 BACbeat BACbeat也是笔者开发中经常用到的一款很不错的BACnet开发工具,他的数据包和数据分发方式,笔者认为借鉴作用很大,不过也有一些弊端,后续会和大家分享。 在本章节中,给大家介绍BACnet MS/TP开发经验分享--BACnet MS/TP数据包篇。
在BACnet中国技术联盟的BACnet开发讨论栏目中,已经介绍了相关的数据包格式,这里主要是分享一下,BACnet MS/TP数据包Encoding Decoding中的注意事项。 其网站链接如下:BACnet协议 BACnet标准中文资料中关于BACnet MS/TP部分详细解析 (3) BACnet MS/TP的实现,按照实现的硬件平台,可以分为设备级(在楼宇自动化行业中主要是在DDC上以Firmware的方式实现)和PC级实现(主要是作为 BACnet MS/TP的配置工具或仿真、调试工具在个人电脑上以执行文件EXE的方式实现),在后续的章节中,我们都假设为后面的这种实现方式,即在PC上以配置、 调试工具的方式在Windows上的实现。 1 BACnet MS/TP数据包的接收 按照BACnet MS/TP协议的规则,要有一个5ms或精度更高的Timer,这个条件在Windows下实现,的确有些不太容易,原因是Windows是一个分时处理 的多任务操作系统,系统的标
准Timer精度都在12-15ms左右,精度不会太高,即使在实时性好的WinCE5.0上,笔者测试的结果也是在 3-5ms左右,如果真是提供如此高精度的Timer的话,Windows操作系统就会很卡,没有机会再去处理其他任务了,CPU基本上被占用到99%以 上了。 读者很疑问了,真是这样那BACnet MS/TP的状态机如何在Windows这样的非实时操作系统下实现呢。且听笔者慢慢道来。 这个5ms的Timer只是为了达到后面将要讲到的BACnet MS/TP状态机的实现过程中的各个关键时间点的Check精度,并不是要求BACnet MS/TP接收状态机和主状态机的循环时间控制在5ms,而且仔细想想,这个实现在BACnet MS/TP要求的9600Baud波特率下也是无法实现的,发送完一个Token令牌的过程,时间大约就会是8ms左右了(每个字节大约1ms,一个令牌 在8-9个字节,如果有Padding字符为9个字节,其余情况为8个字节)。所以这个5ms Timer只是要求的Timer的精度,也就是系统的配置状况,就像按照某些软件,都会在User Manual中给一个系统的最低配置一样,其实他的最低配置一般PC或DDC早就达到了,他这样的规定只是让大家知道,如果您真是提供了一个配置超低的平 台,而运行该软件又是老出问题,那责任就不是软件的事情了,问题已经是您的硬件平台的责任了。话糙理不糙,BACnet MS/TP的5ms Timer的规定也是这个道理。 言归正传,那数据包如何接收合适呢,最简单的解释就是只要不影响您的OS系统的其他任务的运行,采样越快越好,这样才不会造成通讯过程中数据包的丢失。如果读者还是无法理解,可以到Bacnet技术交流QQ群:121189657,中和相关的专家请教一下。 2 BACnet MS/TP数据包的发送 数据包的发送小节,主要是介绍BACnet MS/TP的广播过程。按照BACnet MS/TP的协议规定,当目标地址设定为0xFF,就是发送的为广播数据包。有些设备为了断线侦测的需要,可能会每隔一定的时间间隔就会发送一个IAM的 广播数据包,告诉BACnet MS/TP 令牌环网自己的状况。有人可能会问了,RS-485的数据线上,大家都发广播,那不就造成数据包碰撞,数据包乱成一团的状况吗?这个就要归功于令牌环网的 令牌的作用,令牌简单理解就是不管您要说什么话,只有得到令牌环网的允许,也就是只有手掌令牌的人才可以发号施令。但这个和古代皇帝和军机大臣议事又不太 一样,皇帝和军机大臣议事,基本上是皇帝一个人说了算,就是说令牌一直在他手中掌握,他一直有话语优先权。而令牌环网就民主的太多了,基本上每个人都有轮 流坐庄的机会,每个人都会按照Station ID的顺序拿到令牌,只要拿到令牌,不管你是发号施令给其他任何人还是敞开嗓门发广播,那就是随您高兴的事情了。 BACnet MS/TP协议定义了3个有限状态机。 1 一个是接收数据帧状态机(BACnet Receive Frame Finite State Machine), 2 一个是Master节点状态机(BACnet Master Node Finite State Machine),
3 一个是Slave节点状态机(BACnet Slave Node State Machine)。 Slave节点状态机比较简单,是Master节点状态机的一个子集SubSet,Slave节点状态机主要用来处理不需要维护令牌环的设备,像I/O模块、BACnet传感器、BACnet执行器等,主要做为其他设备请求的一个应答设备。 这里重点给大家解释BACnet MS/TP的接收数据帧状态机(BACnet Receive Frame Finite State Machine)和Master节点状态机(BACnet Master Node Finite State Machine)。 在BACnet MS/TP的接收数据帧状态机(BACnet Receive Frame Finite State Machine)中,如果按照协议规定,接收程序要一个字节一个字节的接收并解析,在Firmware级别的设备中,UART会产生硬件中断,CPU要处 理的逻辑比较简单,处理起来没有大的问题。但是在像Windows这样的平台上,如果单个字节去解析,时间上就无法满足BACnet MS/TP接收状态机的时序要求,造成和其他设备通讯上的异常。如何解决这个问题,就要在串口接收上做文章,提前进行数据处理,详细实现内容会在以后的咨 询服务中给大家做详细解答。
在BACnet MS/TP的主程序中,当主程序处理完接收数据帧状态机(BACnet Receive Frame Finite State Machine),就会进入BACnet MS/TP的Master节点状态机(BACnet Master Node Finite State Machine)中,在接收数据帧状态机(BACnet Receive Frame Finite State Machine)中会反馈接收状态,该状态会在Master节点状态机(BACnet Master Node Finite State Machine)中做为函数执行的一个判断条件,然后在安装BACnet协议第9章节中的状态机各个分状态进行解析。 此处要提醒开发人员的是,一定要严格按照Master节点状态机(BACnet Master Node Finite State Machine)要求的时序进行处理,否则和其他标准BACnet设备的通讯会出现严重的问题,甚至于完全无法通讯。 在BACnet MS/TP的Master节点状态机(BACnet Master Node Finite State Machine)的开发中,令牌Token的维护是开发工作的重中之重,衡量BACnet MS/TP的Master节点状态机(BACnet Master Node Finite State Machine)是否开发成功的关键也是看是否该状态机和其他的标准BACnet设备是否通讯顺畅,令牌Token 维护稳健,不造成令牌Token的频繁丢失。 在本章节中,给大家介绍BACnet MS/TP开发经验分享--串口传输篇。 在BACnet串口传输这个章节中,重点给大家介绍两部分内容。
1 BACnet数据包的接收部分
在BACnet数据包的接收部分,要在串口配置参数时,优化读写串口的Timeout参数,并且对于串口的异常,应用串口清理API PurgeComm(),及时进行串口清理动作,在数据处理过程中,无效的信息和运行时间都要监控,依照当前的系统波特率去动态调整各个参数的最佳配置。 该部分内容的详细代码实现部分,将会在后面的BACnet培训认证环节给大家重点讲解。
2 BACnet数据包的发送部分
在BACnet数据包的发送部分,如果BACnet数据包字节个数不是很多的话,最好一次性的输出,防止BACnet接收设备在BACnet数据帧接收时序比较严格的情况下,认为该数据包无效而丢弃不处理的状况发生。
BACnet开发注意事项:在BACnet MS/TP的串口传输过程中,数据的处理要进行预期的筛选和判断,防止无效的数据过多的影响后面的BACnet状态机状态,造成BACnet设备CPU的Loading过高,影响其他事务的处理过程。 在BACnet MS/TP开发经验分享的本章节中,给大家介绍BACnet开发的优化处理部分。 1 在Windows操作系统中,如何给BACnet MS/TP状态机提供高精度的Timer 在BACnet MS/TP的开发过程中,大家很关注的一点就是BACnet MS/TP的各个状态机都规定了严格的时序,并且各个时间参数的精度都是很高,有几个BACnet的时序参数都是毫秒级别的,而且BACnet时序之间啮 合很紧密,所以笔者给BACnet开发人员的建议是尽量不去用系统的ms级别的时间函数去处理,如GetTickCount(),这类常用的API,而是 使用两个高精度的系统时间参数QueryPerformanceCounter()和QueryPerformanceFrequency(),这组函数 来判断系统执行时序状况,经验表明,这对函数的时间精度很高,很精确。 2 如何提高BACnet设备的数据访问速度 由于BACnet MS/TP采用的是令牌环网的机制,这就造成BACnet设备访问上在特定时间内有RS-485总线被占用的状况。如何实现设备之间的快速访问呢,尽量让 令牌环网高效率的运
行。这里笔者介绍的BACnet MS/TP环网高效运行的机制就是尽量把设备的Station ID设定为连续的,并且主要的令牌使用设备,如所有BACnet设备的参数配置、数据采集设备的Station ID设定为0,这样就会得到一个高效的令牌环网。还有一个重要参数就是Nmax_master参数,如果BACnet MS/TP令牌环网的设备个数比较固定,设备网络规划已经稳定,则建议用户把该Nmax_master参数设定为该BACnet令牌环网的最大设备 Station ID值,也就是该令牌环网中的设备个数。
1 BACnet MS/TP的状态机按照BACnet协议的标准文档开发就能够实现 也许很多资深技术人员会给出绝对可以的答案,但是笔者的经验是最好有一份BACnet MS/TP接收状态机和Master节点状态机的源代码,这样开发起来才不会走太多的冤枉路,拖延宝贵的BACnet产品开发周期,并且请资深的 BAcnet开发咨询师或开发咨询机构进行指导,起到事倍功半的效果,而且如果BACnet产品要进行国际化拓展的话,即要求进行BACnet认证BTL 测试的话,一份有参考价值的BACnet MS/TP源代码的贡献度会很高。
2 BACnet MS/TP设备开发只要肯下工夫就可以通过BTL认证 BACnet标准的确是楼宇自动化领域第一份公开免费的行业准标准。但是天下没有免费的午餐,就像OPC开发一样,都是有一定的技术门槛和难点,若想通过 BACnet BTL认证,一份BACnet源代码的确必不可少,至少笔者多年的楼宇自动化开发经验提醒BACnet开发者,BACnet协议开放的背后是有很大的技术 开发难度的,尤其是BACnet MS/TP的时序调整优化的部分,更需要BACnet专家的指点迷津和必要的技术指导。
因篇幅问题不能全部显示,请点此查看更多更全内容