4、BACnet对象模型:对象与属性的核心概念

各位同学,今天我们聊聊BACnet里最基础、也最重要的东西——对象模型。说实话,很多刚接触BACnet的人都会被这一堆术语搞晕。什么对象、属性、实例号……听着像编程,又像自动化,还有点像数据库。别急,我慢慢给你捋清楚。

4.1 对象(Object)到底是什么?

简单说,对象就是BACnet世界里的一切“东西”。你想想看,一个楼宇自控系统里有什么?温度传感器、风机、阀门、控制器、报警记录……这些在BACnet里都被抽象成了“对象”。

我个人习惯把对象理解成“一个带身份证的数据容器”。每个对象都有一组属性,属性里存着这个对象的真实信息。比如一个温度传感器对象,它的属性里就存着当前温度值、单位、报警阈值等等。

核心要点:对象是BACnet通信的最小单元。设备之间不直接传“温度值”,而是传“某个对象的某个属性值”。

我在项目中遇到过一件事:有个同事调试时一直读不到数据,折腾了半天才发现——他搞错了对象类型。他把一个模拟输入对象当成了模拟输出对象来读。嗯,这里要注意:对象类型错了,通信就全乱套了。

4.2 属性(Property)——对象的“五脏六腑”

对象是容器,属性就是容器里的内容。每个对象都有多个属性,有些是必须的,有些是可选的。

举个例子,一个模拟输入对象(Analog Input),它至少要有这些属性:

  • 对象标识符(Object_Identifier):对象的唯一ID
  • 对象名称(Object_Name):给人看的名字,比如“Room101_Temp”
  • 对象类型(Object_Type):告诉别人这是个模拟输入
  • 当前值(Present_Value):实时数据,比如25.3℃
  • 状态标志(Status_Flags):表示是否正常、是否报警等
  • 事件状态(Event_State):当前事件状态
  • 量程(Out_Of_Service):是否被强制离线
  • 单位(Units):比如摄氏度、帕斯卡

你看,一个简单的温度传感器,在BACnet里就有这么多属性。每个属性都有固定的属性ID(Property Identifier),比如当前值的ID是85(十六进制0x55)。

我的经验:调试时最常用的属性就是Present_Value(属性ID 85)。但别忘了检查Status_Flags(属性ID 111),如果这个属性显示“故障”,那读到的当前值就是不可信的。我曾经被这个坑过——读到一个温度值以为是正常的,结果传感器早就坏了,只是没报警而已。

4.3 标准对象类型——BACnet的“基本零件”

BACnet标准定义了多种对象类型,就像乐高积木有不同的形状。最常用的有这些:

对象类型 用途 典型例子
Analog Input (AI) 模拟量输入 温度传感器、压力传感器
Analog Output (AO) 模拟量输出 阀门开度控制、变频器频率
Analog Value (AV) 模拟量数值 设定值、计算中间值
Binary Input (BI) 数字量输入 开关状态、水流开关
Binary Output (BO) 数字量输出 继电器控制、风机启停
Binary Value (BV) 数字量数值 模式选择、使能标志
Device (设备) 设备自身信息 每个BACnet设备必须有且只有一个

为什么要有这么多类型?说白了就是为了语义清晰。你看到AI就知道它是从物理世界采集来的真实信号;看到AO就知道它是去控制执行机构的。这种分类让不同厂家的设备能互相理解。

我记得有一次做集成项目,甲方要求把所有传感器都做成AV类型。我说不行,AI和AV虽然都是模拟量,但AI代表“真实世界的输入”,AV代表“软件里的数值”。混用了以后,别人看你的系统根本分不清哪个是真实传感器,哪个是计算值。后来他们还是按标准改了。

4.4 对象标识符与实例号——BACnet的“身份证”

每个对象在BACnet网络里都必须有唯一的标识符。这个标识符由两部分组成:

  • 对象类型:10位二进制,表示是AI、AO还是别的
  • 实例号(Instance Number):22位二进制,范围0~4194303

合起来就是32位的对象标识符(Object_Identifier)。比如:

对象类型:Analog Input (0)
实例号:101
对象标识符:0x00000065(十六进制)

这里有个关键点:实例号在同一设备内必须唯一。你不能在一个控制器里有两个实例号都是101的AI对象。

避坑指南:我曾经遇到一个项目,两个不同厂家的设备集成在一起。A厂家的AI对象实例号从1开始,B厂家的也从1开始。结果在BACnet网络里,虽然它们在不同设备里,但某些网关工具会把它们混淆。后来我们统一规划了实例号范围——A厂家用1-1000,B厂家用1001-2000。这个问题才解决。

另外,设备对象(Device Object)的实例号是整个BACnet网络里唯一的。这个叫设备实例号(Device Instance),范围也是0~4194303。每个BACnet设备必须有一个唯一的设备实例号,就像IP地址一样。

4.5 对象模型的实际应用

理解了对象和属性,你就能看懂BACnet通信的本质了。比如你要读取一个温度值:

  1. 找到目标设备(通过设备实例号)
  2. 找到目标对象(通过对象类型+实例号)
  3. 读取目标属性(比如Present_Value)

就这么三步。BACnet的所有通信,本质上都是在做“读属性”或“写属性”的操作。

总结一下:

  • 对象 = 现实世界设备的抽象
  • 属性 = 对象的具体数据和配置
  • 对象标识符 = 对象类型 + 实例号
  • 标准对象类型 = 大家约定好的“积木形状”

下一章我们会深入讲服务(Services),也就是怎么用这些对象和属性来干活。到时候你会发现,对象模型就像房子的地基,服务就是水管电线——地基打好了,后面的事情就顺了。

好,今天就到这里。有问题随时问我。