主题
2.1 BACnet
把本机寄存器发布成 BACnet 对象,楼宇 BMS 直接来读;反过来也能去轮询其他 BACnet 设备。
只在部分机型出现
「BACnet」子标签只在 ESP32-S3 固件(LP3232 等)和软 PLC 模拟器上显示 —— 只有这两类固件里有 BACnet 协议栈,普通 ESP32 的程序分区放不下。其他机型看不到这一页是固件限制,不是配置问题。
两个角色
怎么配
打开「启用 BACnet」→ 选链路类型 → 在「从站对象」里一行配一个点。
| 字段 | 说明 |
|---|---|
| 链路类型 | BACnet/IP 走网口,MS/TP 走 RS-485 |
| 对象类型 | AI / AV / BI / BV / MSI / MSV… |
| 地址 | 对象实例号,形如 AI:1 |
| 点名 | BMS 里显示的名字,可以写中文 |
| 数据类型 | 寄存器里的存放格式,要和实际存的一致 |
| PLC寄存器 | 值取自哪个寄存器,如 D100 |
| 工程单位 | BACnet 标准单位码,62 = 摄氏度 |

AI、BI、MSI 按标准是只读
BMS 要能写下来,必须用 AV / BV / MSV。
只做从站就不用管「主站轮询」
下半部分的「主站轮询」是本机去读别的 BACnet 设备用的。只是被 BMS 读,这一段留空即可。
配完要点 💾 写入配置 → 🔄 重启生效。
实测验证(LP3232)
以下是在 LP3232(ESP32-S3,固件 2026.9.1,网口连接)上的完整实测流程。
配置示例
把 D100(数据寄存器)发布成 AV:1(可读写模拟量),把 Y0(输出继电器)发布成 BV:1(可读写开关量):
| 字段 | AV:1(测试计数器) | BV:1(测试开关) |
|---|---|---|
| 对象类型 | AV(Analog Value) | BV(Binary Value) |
| 地址 | AV:1 | BV:1 |
| 点名 | 测试计数器 | 测试开关 |
| 数据类型 | u16(16位无符号) | bite(位) |
| PLC寄存器 | D100 | Y0 |
| 访问权限 | 只读 | 读写 |
| 工程单位 | 95(无单位) | - |
设备实例号设为 32001,设备名称 LP3232-BACnet-Test,BACnet/IP 端口 47808(0xBAC0)。


验证方法
用任意 BACnet/IP 客户端工具(如 bacpypes3、YABE、VTS)在同一网段执行:
- Who-Is 广播扫描:确认设备能被发现,返回 I-Am 报文(设备实例号 32001)
- ReadProperty 读值:
- 读
Device:32001的Object_List,确认包含 AV:1 和 BV:1 - 读
AV:1的Present_Value,应等于 D100 的当前值 - 读
BV:1的Present_Value,应等于 Y0 的当前状态(active/inactive)
- 读
- WriteProperty 写值(仅对可读写对象):
- 写
BV:1的Present_Value为 inactive,确认 Y0 变为 0 - 写
BV:1的Present_Value为 active,确认 Y0 变为 1 - 释放优先级数组(写 NULL 到对应优先级),确认控制权归还本地逻辑
- 写
实测结果
在 LP3232 上实测通过:
| 测试项 | 结果 |
|---|---|
| Who-Is 扫描 | 发现 1 台设备,实例号 32001 |
| 设备名称 | LP3232-BACnet-Test |
| Object_List | device(32001), analog-value(1), binary-value(1) |
| AV:1 读值 | 正常,随 D100 变化 |
| BV:1 读值 | 正常,active/inactive 与 Y0 一致 |
| BV:1 写 inactive | 成功,Y0 变为 0 |
| BV:1 写 active | 成功,Y0 变为 1 |
| 优先级释放 | 成功,无错误 |
配合 DDC 逻辑验证
设备上运行 DDC「2秒周期 Y0」程序时,D100 在 0-9 循环、Y0 每 2 秒翻转。通过 BACnet 读 AV:1 和 BV:1 可以实时观察到这些变化,是验证 BACnet 与 PLC 寄存器联动的好方法。
相关文档
字段含义、对象类型清单、测试步骤见 bacnet 模块。
对外口径
仅同网段可用,不跨 BBMD、不支持 COV 订阅;未与第三方 BMS 做过逐一互操作测试,客户需要联调可提供设备协助。