跳到主要内容

BACnet/IP 主站

BACnet/IP 主站通过标准 UDP 通道采集设备对象属性,提供设备发现、分页对象浏览、ReadProperty、ReadPropertyMultiple(RPM)、优先级写入与 COV。插件名称为“BACnet/IP 主站”,类型标识为 BacnetIpMaster。公共操作见采集配置。当前配置面向 IPv4 BACnet/IP,不使用 MS/TP、BACnet/SC 或 BBMD/Foreign Device 参数。

建立通道和设备​

进入“开发配置 → 采集配置”,先新建 UDP 通道,设置本地绑定和远程 BACnet/IP 地址,通常端口为 47808;再添加 BACnet/IP 主站设备并启用。同一绑定端口由所属通道统一管理。

参数说明
目标设备实例0–4194303,须与远端 I-Am 和变量 deviceInstance 一致。一个设备对应固定通道远端。
广播端点Who-Is 的目标广播地址;默认 255.255.255.255:47808,按实际网段和接口设置。
启用设备发现决定能否在调试中发送 Who-Is。可填写实例范围限制发现。
请求超时毫秒100–120000,默认 3000。
RPM 最大属性数1–32,默认 16;运行时按采集周期分批,远端不支持 RPM 或分段时自动逐点读取。
最大数据报字节数64–1476,默认 1476;包括 BVLL、NPDU 和 APDU。小型设备可设为 64、128 或其它满足其能力的预算;单点请求仍超限时会失败。最小预算需容纳协议要求的 50 字节响应 APDU 及外层头部。
写入优先级1–16,默认 16;值越小优先级越高。
写入应用类型默认 Real,必须与实际 BACnet 属性类型一致。
启用 COV 订阅开启后按对象建立关系;未确认或失效关系继续周期读取。
COV 租约秒数30–3600,默认 300,到期前自动续订。
COV 最大订阅数1–64,默认 32。
使用确认式 COV 通知与设备能力一致;收到有效 confirmed COV 时返回确认。

变量地址​

{"deviceInstance":12,"objectType":2,"objectInstance":4,"propertyIdentifier":85}

示例表示设备 12 的 Analog Value 4 的 Present_Value。数值只是结构示例,应从在线设备复制对象标识。字段均为数字;数组可加 arrayIndex,索引 0 表示数组长度,普通元素从 1 开始。deviceInstance 必须等于设备配置。属性 77 为 Object_Name,117 为 Units,111 为 Status_Flags,使用时须确认对象支持。

  1. 在设备的“实时变量”页新增变量,或点击已有变量的“编辑”。
  2. 点击“变量地址”右侧的“字段编辑”,填写设备实例、对象类型、对象实例、属性编号及可选数组索引。读取普通属性时不勾选数组索引;读取数组长度时明确填写 0。
  3. 点击“确认并回填”,核对生成的 JSON,再点击变量窗口的“确定”。字段窗口的“取消”只放弃本次字段修改。
  4. 重新打开变量及字段编辑器,确认地址已保存。设备实例必须与设备配置一致,对象及属性应使用在线浏览得到的标识。

BACnet/IP 变量地址字段编辑

检查实时变量​

保存并启用变量后,保持当前设备,在采集工作区顶部切换到“实时变量”标签,逐项核对寄存器地址、运行来源地址、当前值和在线状态。连续观察“采集时间”是否推进;值不变时“变化时间”可以保持不变。修改源端值或完成授权写入后,再确认当前值与变化时间更新。

BACnet/IP 周期采集与 COV 实时变量

错误对象、属性或数组索引会在对应变量显示具体错误,不影响同批其他有效点。修正地址或恢复远端后,等待下一次成功读取,确认该点恢复在线且错误信息清除;不能只凭设备整体在线判定每个变量成功。

专属调试操作​

选中设备,打开顶部“协议调试”。内部页签依次为“核心状态”“特殊方法”“发现设备”等;设备能力和报文预算集中显示在第一个“核心状态”页签。

通过工作区顶部“刷新”更新协议状态。发现设备、COV 关系、订阅错误与最近通知分别分页,默认每页 20 项;自动刷新保留当前页。对象列表按所选页读取,单页最多 64 项。显示分页与 RPM 分批、APDU 分段能力分别控制,调整每页数量不会改变设备报文预算。

  1. 在设备发现页按需成对填写实例上下限,均留空时不限制实例范围。执行发现,核对实例、端点、厂商、最大 APDU 和分段能力。发现结果不会自动更改通道远端。
  2. 浏览对象列表;使用页码和每页数量逐页加载,单页最多 64 项。浏览从 Object_List 数量和数组索引读取。
  3. 在属性读取页填写完整地址。批量页每行一个地址,最多 32 项;RPM 的逐属性错误单独显示。
  4. 写入前读取当前值、类型和优先级。填写 JSON 值、应用类型与优先级,确认后执行并读回。
  5. 使用“释放优先级”向指定优先级写 Null。释放不保证 Present_Value 立即变为默认值,其它更高优先级可能仍有效。
  6. 在 COV 页建立对象关系,核对已确认、待建立/重试、待注销、租约与最近通知。改变源值后确认通知和值;测试结束注销单项或全部关系。

分批、分段和小型设备​

采集按同一周期把变量切成 1–32 个属性的 RPM 批次;批次上限不能绕过“最大数据报字节数”。请求声明的最大响应 APDU 也按扣除 BVLL 和 NPDU 后的空间选择标准档位,例如完整数据报预算为 64 字节时声明 50 字节 APDU。设备明确拒绝 RPM、返回分段 ComplexACK,或本地报文无法满足限制时,驱动会保持原顺序逐点发送 ReadProperty;每个点的错误单独回填变量。只有“服务拒绝/不支持分段/报文限制”会触发回退,畸形 ACK、缺项、重复项或来源不匹配会直接失败,避免把不完整结果当成成功。

一次批量读取的所有子批次及逐点回退共用“请求超时毫秒”规定的总期限,不会为每个点重新计时。总期限到达时整次读取超时失败;主动取消会结束剩余读取。远端离线时,增加批量点数不会按点数累加等待时间。

Object_List 不整表读取:先读数量,再按 1–64 项分页读取数组索引。仅支持单点读取的小型设备应把 RPM 最大属性数设为 1;周期采集、对象属性详情、特殊方法和专属调试都会逐点发送 ReadProperty。配置大于 1 时会先尝试受限 RPM,只有满足上述条件才回退。

BACnet/IP 对象浏览和属性详情

在批量读取页同时填写有效地址与一个错误地址,检查每项的 succeeded 和 error。含错误点时,面板整体显示“操作失败”,有效点仍应返回值;错误点之后的有效点也应有结果。下图使用每批 1 项和 64 字节完整数据报预算:

BACnet/IP 小设备单点批读与逐项结果

手工 COV 每条关系保留自己的 process ID、租约和确认模式。注销失败时先停止续订并重试注销;关闭设备时执行有总期限的注销和通道清理。COV 通知需与设备、对象、属性及数组索引匹配才更新变量。

BACnet/IP COV 确认关系与通知

写入支持 Null、Boolean、Unsigned、Signed、Real、Double、OctetString、CharacterString、Enumerated 和 ObjectIdentifier。BitString、Date、Time 当前用于读取;不能据读取结果推定对应类型可写。CharacterString 使用 UTF-8,支持中文字符。

特殊方法​

打开“协议调试”,选择“核心状态”右侧的“特殊方法”,再选择方法并编辑参数;切换协议内部页签时保留当前设备的参数草稿和执行结果。

方法用途与参数
DiscoverDevicesAsync可选 lowLimit、highLimit,发送 Who-Is 并返回有限发现结果。
BrowseObjectsAsyncstartIndex 从 1 开始,pageSize 为 1–64。
ReadPropertyAsync、ReadPropertiesMultipleAsync单个 addressJson;批量 addressesJson 是属性地址 JSON 字符串数组。
WritePropertyAsync、RelinquishPropertyAsync指定属性、应用类型/JSON 值及 priority,等待远端应答。
SubscribeCovObjectAsyncobjectJson 为 {"objectType":2,"objectInstance":4};按界面参数填写 processIdentifier、lifetimeSeconds 与 confirmedNotifications。
CancelCovObjectAsync、CancelAllCovAsync注销指定对象关系或本设备全部关系。

JSON 参数按方法参数顺序填写数组,可省略使用默认值的尾部参数,也可使用“字段编辑”。例如 DiscoverDevicesAsync 的实例范围 12–12:

[12,12]

对象浏览的最后一页可以少于 pageSize。例如 73 个对象从第 65 项读取 16 项时,结果应保留 Total=73 并返回最后 9 项:

[65,16]

BACnet/IP 特殊方法读取对象末页

批量特殊方法返回逐属性结果;“特殊方法执行成功”表示调用完成,还需逐项检查 Error,不能据此判断所有属性读取成功。

ReadPropertyAsync 的地址是字符串参数,需保留 JSON 转义:

["{\"deviceInstance\":12,\"objectType\":2,\"objectInstance\":4,\"propertyIdentifier\":85}"]

故障处理​

现象检查与处理
发现为空检查广播目的网段、网卡、本地 UDP 绑定、防火墙及实例范围;定向读取与广播是不同路径。
错误来源或超时核对通道远端、设备实例及端口,避免两设备共用错误端点。
RPM 某项失败查看具体属性错误;确认对象、属性、数组索引和远端服务支持。
RPM 被拒绝或收到分段 ComplexACK驱动会自动逐点读取;检查每项结果。畸形、缺项或重复 ACK 不会回退,而是直接报错,需修正设备响应。
写成功但值不变读取优先级数组、Present_Value、Out_Of_Service 等实际设备状态,核对更高优先级占用。
COV 无通知检查 COV 支持、租约、confirmed 模式、增量条件和订阅状态;先确认周期读取正常。