如何使用ESP32 Feather开发板创建一个简单的BACnet MSTP服务器
BACnet 是一种国际标准的楼宇自动化通信协议,可使来自不同制造商的设备(如供暖、通风、空调、照明和安防系统)能够相互通信。目前的 BACnet 系统通常使用以太网作为传输介质(BACnet/IP),而较早的系统则通常采用 RS485(BACnet MSTP)作为第0层通信方式。
由于BACnet堆栈非常庞大,因此对RAM和程序内存的要求较高,这使得在小型微控制器上集成BACnet服务器变得困难。
BACnet 采用客户端-服务器模式运行。BACnet 服务器在楼宇自动化网络中提供数据(如温度、传感器读数或开关状态),而 BACnet 客户端则是接收设备或控制软件,用于主动获取这些数据或将命令发送给服务器。
在本教程中,我将向您展示如何在ESP32(Huzzah 32 Feather开发板)上实现一个简单的BACnet MSTP服务器,并额外添加一个RS485扩展板。
布线
至于BACnet MS/TP,最常见的连接方式是菊花链总线配置,即使用单根RS485电缆将网络中的所有设备按线性链式连接。
为此,请将每个设备的“+”和“-”端子相互连接。RS485机翼配备有5针连接器,其中两个引脚标有“A”和“B”。A引脚必须连接到其他设备的“+”端子,B引脚则连接到“-”端子。
对于较远距离,建议使用双绞线电缆。通过RS485可实现最长一英里的传输距离。
配置RS485翼板
对于BACnet MSTP通信,RS485侧的DIP开关和跳线必须正确配置。
羽翼有两个DIP开关和一个滑动开关,必须相应设置才能正常工作。
S1 DIP开关可用于选择收发切换的控制方式。我们让机翼自动切换发射/接收方向,这意味着今后在软件中无需再为此担心。因此,S1设置为OFF - ON - ON - OFF。
该引脚可通过S4配置为半双工或全双工模式。S4还可用于开启上拉和下拉电阻,以实现安全偏置。
我们需要半双工的RS485功能,并且要启用偏置。因此,所有S4开关均设置为ON。
终端电阻可通过滑动开关S2进行接通。只有当机翼连接到总线线路的两个端点之一时才需要启用,否则S2保持关闭状态。
软件
Harish Patel 的 BACnetLight 库提供了一个简化版的 BACnet 栈,可在微控制器上运行。尽管该栈最初是为 ESP32 设计的,但其他微控制器也能正常运行,毫无问题。
由于目前无法通过库管理器安装此库,因此我们必须先从 GitHub 下载该库,并将其解压到 Arduino\Library 目录中。
作为初步测试,我创建了一个小型示例程序,包含一个带有两个数据点的简单BACnet MSTP服务器。
一个数据点是一个模拟输入,在我们的例子中,它从温度传感器接收数据(传感器的数值由程序随机生成)。
另一个数据点是二进制输出,在我们的示例中,它被实现为一个虚拟“继电器”,并通过调试接口输出继电器的切换状态。
测试MSTP服务器
我们现在拥有一台简单的BACnet MSTP服务器,可以集成到现有系统中。但为了测试设备,我们仍然需要一个客户端。
您可以使用免费软件YABE(Yet Another BACnet Explorer)轻松在Windows或Linux电脑上设置客户端。为了使YABE能够通过BACnet MSTP进行通信,我们还需要一个标准的USB转RS485适配器。
安装完成后,我们就可以启动 YABE。首先,进入“功能”→“添加 BACnet 通道”:
现在,在窗口的右侧区域,找到“BACnet/MSTP 串行”下方,设置所连接的RS485适配器的COM端口(我的情况是COM12),并根据需要设置波特率及其他参数:
我们的BACnet设备现在会自动被检测并显示在通道下。如果双击已检测到的设备,我们将在“对象”窗口中看到三个项目:设备属性、模拟值和二进制输出。
当你点击某个对象时,其属性会显示在右侧的“属性”窗口中,你也可以修改这些属性。例如,如果我们点击 BINARY_OUTPUT,就可以通过修改属性窗口中的“当前值”变量来改变继电器状态(0 表示继电器断开,1 表示继电器闭合)。
然后我们可以在Arduino IDE的调试输出中看到结果:
代码
本文编译自hackster.io





