BACnet:属性的循环读取
硬件
Raspberry Pi作为 BACnet 服务器(提供数据点) CODESYS Control Win V3作为 BACnet 客户端(循环读取数据点)
服务器和客户端的要求
检查文件CODESYSControl.cfg中是否存在以下条目。
-
包括 BACnet 组件: [ComponentManager] Component.[n+1]=CmpBACnet
-
包括BACnet协议栈的INI文件(注意语法): [CmpBACnet] IniFile=bacstac d .ini
BACnet 服务器的要求
创建一个“标准项目”并选择“CODESYS Control Raspberry Pi SL”作为设备。 通过网络扫描定义目标系统。

- 在设备树中插入“BACnet 服务器”和“BACnet 模拟值”对象:

- BACnet 网络中的每个设备都必须有一个唯一的 ID。在“BACnet 服务器”对象的BACnet 接口参数选项卡中进行设置。

在设备中,BACnet 对象类型(BACnet 模拟值、BACnet 二进制值等)的每个实例都会收到一个唯一的 ID。这在此处保持不变,作为值“1”。

BACnet 客户端的源代码中重复使用了设备的实例 ID 和对象类型的实例 ID。
- 调整“PLC_PRG”如下:

声明
VAR
xSwitch : BOOL;
lrValue : LREAL := 0.23;
END_VAR
实现
// Numeric simulation
IF xSwitch then
lrValue := lrValue + 0.01;
IF lrValue >= 5.0 THEN
xSwitch := False;
END_IF
ELSE
lrValue := lrValue - 0.01;
IF lrValue <= -5.0 THEN
xSwitch := True;
END_IF
END_IF
BACnet_Analog_Value.PresentValue := lrValue;
BACnet 客户端的要求(自 BACnet 版本 1.2.0.0 起)
- 创建一个“标准项目”并选择“ CODESYS Control Win V3 ”作为设备。
- 通过网络扫描定义目标系统(参见 BACnet 服务器)。
- 插入“BACnet Server”对象并将其重命名为“BACnet_Client”

- 调整PLC_PRG POU 如下:
声明
VAR
fbReadProperty : BACnet.BACnetClientReadProperty;
xReadExecute : BOOL;
lrReadValue : LREAL;
xInitDone : BOOL := FALSE;
END_VAR
实现
IF NOT xInitDone THEN
fbReadProperty.RegisterToServer(BACnet_Client);
fbReadProperty(dwTargetDeviceNumber := 718,
objType := BACnet.CmpBACnet.IEC_BACNET_OBJECT_TYPE.OBJ_ANALOG_VALUE, objInst := 1,
propID := BACnet.CmpBACnet.IEC_BACNET_PROPERTY_ID.PROP_PRESENT_VALUE);
xInitDone := TRUE;
ELSE
fbReadProperty(xExecute := xReadExecute);
IF fbReadProperty.xDone THEN
xReadExecute := FALSE;
lrReadValue := BACnet.GetRealFromContents(fbReadProperty.result);
END_IF
END_IF
BACnet 客户端的要求(最高 BACnet 版本 1.2.0.0)
- 创建一个“标准项目”并选择“ CODESYS Control Win V3 ”作为设备。
- 通过网络扫描定义目标系统(参见 BACnet 服务器)。
- 在设备树中插入一个“BACnet 服务器”对象和一个“BACnet 客户端属性访问”对象。

- 调整“PLC_PRG”POU 如下:

声明
VAR
readPropertyFB : BACnet.ClientReadProperty;
readReal : LREAL;
END_VAR
实现
//Simply execute the FB reading out a property
readPropertyFB(clientFB := BACnet_Client_Property_Access,
dwTargetDeviceNumber := 718,
objType := BACnet.CmpBACnet.IEC_BACNET_OBJECT_TYPE.OBJ_ANALOG_VALUE,
objInst := 1,
propID := BACnet.CmpBACnet.IEC_BACNET_PROPERTY_ID.PROP_PRESENT_VALUE);
//Start execution and send BACnet-request to BACnet-network
IF NOT readPropertyFB.xExecute THEN
readPropertyFB.xExecute := TRUE;
END_IF
//Wait for the answer on the request. When xDone is TRUE, an answer has been received.
IF readPropertyFB.xDone THEN
//Read out the answers contents
readReal := BACnet.GetRealFromContents(readPropertyFB.ReadPropertyResult);
//Reset FB and also its contents
readPropertyFB.xExecute := FALSE;
END_IF
下载并启动项目
BACnet服务器
- 将应用程序下载到 PLC。

BACnet客户端
- 将应用程序下载到 PLC。

读取设备属性
例如,如果读取设备的一般属性,则必须注意设备编号的 ID 与对象实例一致。 示例:读取固件的修订号:
实现
readPropertyFB(xExecute := xExecute,
clientFB := BACnet_Client_Property_Access,
dwTargetDeviceNumber := 718,
objType := BACnet.CmpBACnet.IEC_BACNET_OBJECT_TYPE.OBJ_DEVICE,
objInst := 718,
propID := BACnet.CmpBACnet.IEC_BACNET_PROPERTY_ID.PROP_FIRMWARE_REVISION);