IEC 库CmpBACnet 将 BACnet 协议栈集成到CODESYS IEC 环境中,并提供 BACnet 数据类型和BACstack 方法。仅使用 IEC 库CmpBACnet (没有BACnet 和BACnetDefaultImpl 库)会导致 IEC 应用程序代码复杂冗长。
与仅使用 CmpBACnet 相比,BACnet 库大大简化了 BACnet 应用程序的开发,特别是在以下方面:
-
启动和停止 BACnet 协议栈
-
使用 BACnet 服务器对象及其属性
-
触发异步请求(主要是客户服务请求)并处理请求事务
-
处理来自 BACnet 协议栈的回调(参见
IBACnetEventConsumer),并将回调分配给应用程序中的多个接收器
此外,BACnet 库还提供了一个插件机制(BACnetServerPlugin ),用于扩展BACnet 库的某些方面。BACnetServerPlugin 是BACnetDefaultImpl 库的基础。
BACnetDefaultImpl 库用于进一步简化 BACnet 应用程序开发。BACnet 标准 ASHRAE 135 在 BACnet 的实际使用方面留下了一些空白。最显著的例子如下:
-
服务器对象的持久性
-
Trend Log、Trend Log Multiple和Event Log条目的存储和持久性 -
更新设备对象的日期/时间信息
国际电工委员会库BACnet 是作为国际电工委员会库CmpBACnet 的一层。不过,该层不会隐藏库,因为这需要BACnet 库为CmpBACnet 函数提供 "门面 "函数。这些门面功能会导致应用程序代码量增大,并增加运行时的要求。这是 PLC 难以接受的。因此,有必要了解何时要使用BACnet 库或CmpBACnet 库中的元素。
通用规则:
-
启动和停止 BACnet 协议栈
始终使用
BACnetServer.StartBACnetStack和BACnetServer.StopBACnetStack或AutoStart。切勿直接使用CmpBACnet库的相应函数,如CmpBACnet.BACnetServerInit。 -
使用 BACnet 服务器对象及其属性
始终使用 IEC-lib-BACnet 中指定的功能块,如
BACnetAnalogValue。切勿直接使用BACnet库的相应函数,如CmpBACnet.BACnetStorePropertyInstance。 -
触发异步请求
始终使用
BACnet库的指定客户端功能块,如BACnetClientReadProperty。切勿直接使用CmpBACnet库的相应函数,如CmpBACnet.BACnetReadProperty。CmpBACnet库中所有需要BACnetAsyncTransactionToken的函数都属于这一类,绝对不能直接使用。 -
处理来自 BACnet 协议栈的回调,并将回调分配给应用程序中的多个接收器
始终使用
IBACnetEventConsumer和BACnetServer.RegisterHook/UnregisterHook/RegisterCallback/UnregisterCallback。切勿直接使用CmpBACnet库的相应函数,如CmpBACnet.BACnetSetHook或CmpBACnet.BACnetSetCallback。
什么情况下直接调用CmpBACnet 库的函数是合适和安全的?
基本上,只有当 BACnet 库中没有提供相应功能时,才需要直接调用 CmpBACnet 的函数。在尝试直接使用 CmpBACnet 之前,请先查看 BACnet 库。可以在CmpBACnet 中使用阻塞函数,如BACnet*CbCompletion 、BACnetIam(Ex) 或BACnetIHave(Ex), BACnetUnconf* 。
大多数情况下,您将使用BACnet*CbCompletion 来实现您的特定IBACnetEventConsumer.BACnetEventCallbacks。但首先要检查BACnetDefaultImpl 库是否已经包含适当的标准实现。