BACnet device对象详解以及协议栈相关代码

BACnet 设备对象device详细介绍和应用场景

BACnet(Building Automation and Control Networks)是一种用于建筑自动化和控制系统的通信协议。BACnet设备对象是BACnet协议中的一个重要概念,用于表示建筑自动化系统中的设备。

BACnet设备对象(Device Object)是BACnet网络中的主要实体,代表了一个物理设备或网络上的虚拟设备。每个BACnet设备对象都有一个唯一的标识符,称为设备实例号(Device Instance)。

BACnet设备对象具有以下属性:

设备标识(Device Identifier):一个唯一的标识符,用于区分BACnet网络中的不同设备。

设备类型(Device Type):指定设备的类型,例如控制器、传感器、执行器等。

设备名称(Device Name):设备的人类可读名称,用于标识设备。

设备描述(Description):对设备的描述信息,用于提供有关设备的详细说明。

系统状态(System Status):表示设备当前的状态,例如正常、故障、离线等。

支持的对象类型(Supported Object Types):列出设备支持的其他BACnet对象类型,例如输入对象、输出对象、变量对象等。

BACnet设备对象的主要应用场景是建筑自动化和控制系统,其中包括楼宇管理系统、智能家居系统、工业控制系统等。通过BACnet设备对象,可以实现以下功能:

监测和控制:BACnet设备对象允许监测和控制建筑自动化系统中的各种设备,例如传感器、执行器、控制器等。通过读取和写入设备对象的属性,可以获取传感器的测量值、控制执行器的操作等。

系统管理:BACnet设备对象提供了管理设备和网络的功能。可以通过设备对象的属性设置设备的参数、配置网络设置、监控设备状态等。

通信和集成:BACnet设备对象作为BACnet网络中的实体,可以与其他设备进行通信和集成。通过BACnet协议的通信机制,设备对象之间可以交换数据、发送命令和通知等。

事件和报警:BACnet设备对象可以生成事件和报警,用于监测系统中的异常情况。例如,当温度传感器检测到过高的温度时,设备对象可以生成一个报警,并通知相关的设备或操作人员。

BACnet设备对象是BACnet协议中的核心概念,用于表示建筑自动化系统中的设备,并提供了监测、控制、管理和通信等功能。它在楼宇管理、智能家居、工业控制等领域都有广泛的应用。

BACnet设备对象类型及其相关的函数

static object_functions_t My_Object_Table[] = {
   
{
    OBJECT_DEVICE, NULL /* Init - don't init Device or it will recourse! /,
Device_Count, Device_Index_To_Instance,
Device_Valid_Object_Instance_Number, Device_Object_Name,
Device_Read_Property_Local, Device_Write_Property_Local,
Device_Property_Lists, DeviceGetRRInfo, NULL / Iterator /,
NULL / Value_Lists /, NULL / COV /, NULL / COV Clear /,
NULL / Intrinsic Reporting / },
#if (BACNET_PROTOCOL_REVISION >= 17)
{ OBJECT_NETWORK_PORT, Network_Port_Init, Network_Port_Count,
Network_Port_Index_To_Instance, Network_Port_Valid_Instance,
Network_Port_Object_Name, Network_Port_Read_Property,
Network_Port_Write_Property, Network_Port_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
#endif
{ OBJECT_ANALOG_INPUT, Analog_Input_Init, Analog_Input_Count,
Analog_Input_Index_To_Instance, Analog_Input_Valid_Instance,
Analog_Input_Object_Name, Analog_Input_Read_Property,
Analog_Input_Write_Property, Analog_Input_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /,
Analog_Input_Encode_Value_List, Analog_Input_Change_Of_Value,
Analog_Input_Change_Of_Value_Clear, Analog_Input_Intrinsic_Reporting },
{ OBJECT_ANALOG_OUTPUT, Analog_Output_Init, Analog_Output_Count,
Analog_Output_Index_To_Instance, Analog_Output_Valid_Instance,
Analog_Output_Object_Name, Analog_Output_Read_Property,
Analog_Output_Write_Property, Analog_Output_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_ANALOG_VALUE, Analog_Value_Init, Analog_Value_Count,
Analog_Value_Index_To_Instance, Analog_Value_Valid_Instance,
Analog_Value_Object_Name, Analog_Value_Read_Property,
Analog_Value_Write_Property, Analog_Value_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /,
Analog_Value_Encode_Value_List, Analog_Value_Change_Of_Value,
Analog_Value_Change_Of_Value_Clear, Analog_Value_Intrinsic_Reporting },
{ OBJECT_BINARY_INPUT, Binary_Input_Init, Binary_Input_Count,
Binary_Input_Index_To_Instance, Binary_Input_Valid_Instance,
Binary_Input_Object_Name, Binary_Input_Read_Property,
Binary_Input_Write_Property, Binary_Input_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /,
Binary_Input_Encode_Value_List, Binary_Input_Change_Of_Value,
Binary_Input_Change_Of_Value_Clear, NULL / Intrinsic Reporting / },
{ OBJECT_BINARY_OUTPUT, Binary_Output_Init, Binary_Output_Count,
Binary_Output_Index_To_Instance, Binary_Output_Valid_Instance,
Binary_Output_Object_Name, Binary_Output_Read_Property,
Binary_Output_Write_Property, Binary_Output_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_BINARY_VALUE, Binary_Value_Init, Binary_Value_Count,
Binary_Value_Index_To_Instance, Binary_Value_Valid_Instance,
Binary_Value_Object_Name, Binary_Value_Read_Property,
Binary_Value_Write_Property, Binary_Value_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_CHARACTERSTRING_VALUE, CharacterString_Value_Init,
CharacterString_Value_Count, CharacterString_Value_Index_To_Instance,
CharacterString_Value_Valid_Instance, CharacterString_Value_Object_Name,
CharacterString_Value_Read_Property,
CharacterString_Value_Write_Property,
CharacterString_Value_Property_Lists, NULL / ReadRangeInfo /,
NULL / Iterator /, NULL / Value_Lists /, NULL / COV /,
NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_COMMAND, Command_Init, Command_Count, Command_Index_To_Instance,
Command_Valid_Instance, Command_Object_Name, Command_Read_Property,
Command_Write_Property, Command_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_INTEGER_VALUE, Integer_Value_Init, Integer_Value_Count,
Integer_Value_Index_To_Instance, Integer_Value_Valid_Instance,
Integer_Value_Object_Name, Integer_Value_Read_Property,
Integer_Value_Write_Property, Integer_Value_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
#if defined(INTRINSIC_REPORTING)
{ OBJECT_NOTIFICATION_CLASS, Notification_Class_Init,
Notification_Class_Count, Notification_Class_Index_To_Instance,
Notification_Class_Valid_Instance, Notification_Class_Object_Name,
Notification_Class_Read_Property, Notification_Class_Write_Property,
Notification_Class_Property_Lists, NULL / ReadRangeInfo /,
NULL / Iterator /, NULL / Value_Lists /, NULL / COV /,
NULL / COV Clear /, NULL / Intrinsic Reporting / },
#endif
{ OBJECT_LIFE_SAFETY_POINT, Life_Safety_Point_Init, Life_Safety_Point_Count,
Life_Safety_Point_Index_To_Instance, Life_Safety_Point_Valid_Instance,
Life_Safety_Point_Object_Name, Life_Safety_Point_Read_Property,
Life_Safety_Point_Write_Property, Life_Safety_Point_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_LOAD_CONTROL, Load_Control_Init, Load_Control_Count,
Load_Control_Index_To_Instance, Load_Control_Valid_Instance,
Load_Control_Object_Name, Load_Control_Read_Property,
Load_Control_Write_Property, Load_Control_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_MULTI_STATE_INPUT, Multistate_Input_Init, Multistate_Input_Count,
Multistate_Input_Index_To_Instance, Multistate_Input_Valid_Instance,
Multistate_Input_Object_Name, Multistate_Input_Read_Property,
Multistate_Input_Write_Property, Multistate_Input_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_MULTI_STATE_OUTPUT, Multistate_Output_Init,
Multistate_Output_Count, Multistate_Output_Index_To_Instance,
Multistate_Output_Valid_Instance, Multistate_Output_Object_Name,
Multistate_Output_Read_Property, Multistate_Output_Write_Property,
Multistate_Output_Property_Lists, NULL / ReadRangeInfo /,
NULL / Iterator /, NULL / Value_Lists /, NULL / COV /,
NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_MULTI_STATE_VALUE, Multistate_Value_Init, Multistate_Value_Count,
Multistate_Value_Index_To_Instance, Multistate_Value_Valid_Instance,
Multistate_Value_Object_Name, Multistate_Value_Read_Property,
Multistate_Value_Write_Property, Multistate_Value_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /,
Multistate_Value_Encode_Value_List, Multistate_Value_Change_Of_Value,
Multistate_Value_Change_Of_Value_Clear,
NULL / Intrinsic Reporting / },
{ OBJECT_TRENDLOG, Trend_Log_Init, Trend_Log_Count,
Trend_Log_Index_To_Instance, Trend_Log_Valid_Instance,
Trend_Log_Object_Name, Trend_Log_Read_Property,
Trend_Log_Write_Property, Trend_Log_Property_Lists, TrendLogGetRRInfo,
NULL / Iterator /, NULL / Value_Lists /, NULL / COV /,
NULL / COV Clear /, NULL / Intrinsic Reporting / },
#if (BACNET_PROTOCOL_REVISION >= 14) && defined(BACAPP_LIGHTING_COMMAND)
{ OBJECT_LIGHTING_OUTPUT, Lighting_Output_Init, Lighting_Output_Count,
Lighting_Output_Index_To_Instance, Lighting_Output_Valid_Instance,
Lighting_Output_Object_Name, Lighting_Output_Read_Property,
Lighting_Output_Write_Property, Lighting_Output_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_CHANNEL, Channel_Init, Channel_Count, Channel_Index_To_Instance,
Channel_Valid_Instance, Channel_Object_Name, Channel_Read_Property,
Channel_Write_Property, Channel_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting */ },
#endif

#if defined(BACFILE)
{
    OBJECT_FILE, bacfile_init, bacfile_count, bacfile_index_to_instance,
bacfile_valid_instance, bacfile_object_name, bacfile_read_property,
bacfile_write_property, BACfile_Property_Lists,
NULL /* ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
#endif
{ OBJECT_OCTETSTRING_VALUE, OctetString_Value_Init, OctetString_Value_Count,
OctetString_Value_Index_To_Instance, OctetString_Value_Valid_Instance,
OctetString_Value_Object_Name, OctetString_Value_Read_Property,
OctetString_Value_Write_Property, OctetString_Value_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_POSITIVE_INTEGER_VALUE, PositiveInteger_Value_Init,
PositiveInteger_Value_Count, PositiveInteger_Value_Index_To_Instance,
PositiveInteger_Value_Valid_Instance, PositiveInteger_Value_Object_Name,
PositiveInteger_Value_Read_Property,
PositiveInteger_Value_Write_Property,
PositiveInteger_Value_Property_Lists, NULL / ReadRangeInfo /,
NULL / Iterator /, NULL / Value_Lists /, NULL / COV /,
NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_SCHEDULE, Schedule_Init, Schedule_Count,
Schedule_Index_To_Instance, Schedule_Valid_Instance,
Schedule_Object_Name, Schedule_Read_Property, Schedule_Write_Property,
Schedule_Property_Lists, NULL / ReadRangeInfo /, NULL / Iterator /,
NULL / Value_Lists /, NULL / COV /, NULL / COV Clear /,
NULL / Intrinsic Reporting / },
{ OBJECT_ACCUMULATOR, Accumulator_Init, Accumulator_Count,
Accumulator_Index_To_Instance, Accumulator_Valid_Instance,
Accumulator_Object_Name, Accumulator_Read_Property,
Accumulator_Write_Property, Accumulator_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ MAX_BACNET_OBJECT_TYPE, NULL / Init /, NULL / Count /,
NULL / Index_To_Instance /, NULL / Valid_Instance /,
NULL / Object_Name /, NULL / Read_Property /,
NULL / Write_Property /, NULL / Property_Lists /,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /,
NULL / Intrinsic Reporting */ }
};

这段代码定义了一个名为My_Object_Table的静态数组,该数组存储了一系列object_functions_t类型的结构体对象。

每个结构体对象表示一个BACnet设备对象类型及其相关的函数和属性列表。每个结构体对象包含以下字段:

type:对象类型,这里是BACnet设备对象类型。
Init:初始化函数指针,用于初始化该BACnet设备对象类型的实例。
Count:计数函数指针,用于获取该BACnet设备对象类型的实例数量。
Index_To_Instance:索引转实例函数指针,用于将索引转换为BACnet设备对象的实例号。
Valid_Instance:验证实例函数指针,用于验证给定的BACnet设备对象实例号是否有效。
Object_Name:对象名称函数指针,用于获取BACnet设备对象的名称。
Read_Property:读取属性函数指针,用于读取BACnet设备对象的属性值。
Write_Property:写入属性函数指针,用于写入BACnet设备对象的属性值。
Property_Lists:属性列表函数指针,用于获取BACnet设备对象支持的属性列表。
ReadRangeInfo:读取范围信息函数指针,用于获取BACnet设备对象属性的范围信息。
Iterator:迭代器函数指针,用于在BACnet设备对象实例之间进行迭代。
Value_Lists:值列表函数指针,用于获取BACnet设备对象属性的值列表。
COV:COV(Change Of Value)函数指针,用于处理BACnet设备对象属性值的变化。
COV_Clear:COV清除函数指针,用于清除BACnet设备对象属性值的变化标志。
Intrinsic_Reporting:内在报告函数指针,用于处理BACnet设备对象的内在报告。

查找BACnet设备对象类型的辅助函数

/**
 * 辅助函数,用于让Device对象在被处理程序调用时查找需要调用的对象类型。
 * @ingroup ObjHelpers
 * @param Object_Type [in] 处理程序希望访问的BACnet对象类型。
 * @return 指向实现此类型对象的对象辅助函数组的指针。
 */
static struct object_functions *Device_Objects_Find_Functions(
    BACNET_OBJECT_TYPE Object_Type)
{
   
    struct object_functions *pObject = NULL;

    // 将pObject指向对象表的起始位置
    pObject = Object_Table;
    
    // 遍历对象表中的每个对象类型
    while (pObject->Object_Type < MAX_BACNET_OBJECT_TYPE) {
   
        /* 处理每个对象类型 */
        
        // 如果找到与传入的Object_Type相匹配的对象类型
        if (pObject->Object_Type == Object_Type) {
   
            // 返回该对象类型的对象辅助函数组
            return (pObject);
        }
        
        // 指向下一个对象类型
        pObject++;
    }

    // 如果没有找到匹配的对象类型,则返回NULL
    return (NULL);
}
该函数通过遍历Object_Table数组中的对象辅助函数组,将pObject指针逐个与传入的Object_Type进行比较,直到找到匹配的对象类型为止。如果找到了匹配的对象类型,则返回该对象类型的对象辅助函数组的指针;如果没有找到匹配的对象类型,则返回NULL。

这个辅助函数在处理BACnet设备对象时非常有用,它允许根据需要动态查找和调用不同类型的对象辅助函数。

/**
 * 辅助函数,尝试查找所请求对象类型的rr_info_function辅助函数。
 * @ingroup ObjIntf
 *
 * @param object_type [in] 处理程序希望访问的BACnet对象类型。
 * @return 指向实现该对象类型的ReadRangeInfo函数(Object_RR_Info)的对象辅助函数指针,
 *         如果不支持该对象类型或该对象类型没有ReadRangeInfo函数,则返回空指针(NULL)。
 */
rr_info_function Device_Objects_RR_Info(BACNET_OBJECT_TYPE object_type)
{
   
    struct object_functions *pObject = NULL;

    // 查找对象类型对应的对象辅助函数组
    pObject = Device_Objects_Find_Functions(object_type);
    
    // 如果找到对应的对象辅助函数组
    return (pObject != NULL ? pObject->Object_RR_Info : NULL);
}

这段代码是一个用于查找BACnet对象类型的ReadRangeInfo函数辅助函数。它尝试查找所请求的对象类型的rr_info_function辅助函数。该函数首先调用Device_Objects_Find_Functions函数,通过传入的object_type参数查找并返回相应BACnet对象类型的对象辅助函数组。然后,它返回对象辅助函数组中的Object_RR_Info函数指针作为ReadRangeInfo函数的实现。

如果找到了支持ReadRangeInfo函数的对象类型的对象辅助函数组,则返回该函数指针;如果不支持该对象类型或该对象类型没有ReadRangeInfo函数,则返回空指针(NULL)。

这个辅助函数在处理BACnet对象时有用,它允许根据对象类型动态获取和调用相应的ReadRangeInfo函数,以实现对对象属性范围信息的读取操作。

获取特定对象类型的特殊属性列表Device_Objects_Property_List

这段代码是一个用于获取特定对象类型的特殊属性列表的函数。该函数用于处理ReadPropertyMultiple调用,该调用只需要必需属性、可选属性或所有属性。
/**

  • 对于给定的对象类型,返回特殊属性列表。

  • 此函数用于ReadPropertyMultiple调用,它只需要必需属性、可选属性或所有属性。

  • @ingroup ObjIntf

  • @param object_type [in] 所需的BACNET_OBJECT_TYPE,其属性将被列出。

  • @param pPropertyList [out] 引用结构的指针,该结构将在返回时分别列出必需、可选和专有对象属性及其计数。
    */
    void Device_Objects_Property_List(BACNET_OBJECT_TYPE object_type,
    uint32_t object_instance,
    struct special_property_list_t *pPropertyList)
    {
    struct object_functions *pObject = NULL;

    (void)object_instance;

  • 47
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
BACnet(Building Automation and Control Networks)协议是一种通信协议,用于建筑自动化和控制系统。它是一种开放的、厂商中立的协议,被广泛应用于建筑物的自动化和控制领域。 BACnet协议的源码是指实现BACnet协议的软件代码。该源码是建立BACnet通信的基础,可以在各种设备上运行,包括传感器、执行器、控制器和监测设备等。BACnet协议的源码提供了一种灵活、可扩展和互操作的解决方案,可以满足不同厂商的需求。 BACnet协议的源码通常由专业的软件工程师编写和维护。这些源码包括了实现BACnet协议所需的各种功能,如数据传输、设备发现、数据解析和处理等。此外,源码还包括了各种BACnet网络的实现,如乙太网、RS-485、LonWorks和BACnet/IP等。这些功能和网络实现使得BACnet协议在建筑自动化和控制系统中具备了强大的通信能力。 对于建筑自动化和控制系统的厂商和开发者来说,BACnet协议的源码是一种宝贵的资源。通过研究和使用这些源码,他们可以快速、方便地实现BACnet协议,构建符合标准的、高效可靠的通信系统。此外,源码还可以用于协议栈的移植和定制,满足特定应用场景的需求。 总之,BACnet协议的源码是一项重要的技术资源,对于建筑自动化和控制系统的开发和应用具有重要意义。它提供了一种开放、互操作的通信解决方案,促进了建筑设备之间的互联和数据交换,提高了建筑自动化和控制系统的效率和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

章鱼哥嵌入式开发

坚持不易,你们的鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值