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.BACnetEventCallback
s。但首先要检查BACnetDefaultImpl
库是否已经包含适当的标准实现。