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通信的本质了。比如你要读取一个温度值:
- 找到目标设备(通过设备实例号)
- 找到目标对象(通过对象类型+实例号)
- 读取目标属性(比如Present_Value)
就这么三步。BACnet的所有通信,本质上都是在做“读属性”或“写属性”的操作。
总结一下:
- 对象 = 现实世界设备的抽象
- 属性 = 对象的具体数据和配置
- 对象标识符 = 对象类型 + 实例号
- 标准对象类型 = 大家约定好的“积木形状”
下一章我们会深入讲服务(Services),也就是怎么用这些对象和属性来干活。到时候你会发现,对象模型就像房子的地基,服务就是水管电线——地基打好了,后面的事情就顺了。
好,今天就到这里。有问题随时问我。