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”作为设备。 通过网络扫描定义目标系统。

图1

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

图2

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

图3

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

图4

BACnet 客户端的源代码中重复使用了设备的实例 ID 和对象类型的实例 ID。

  • 调整“PLC_PRG”如下:

图5


声明

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”

图6

  • 调整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 客户端属性访问”对象。

图7

  • 调整“PLC_PRG”POU 如下:

图8


声明

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。

图9

BACnet客户端

  • 将应用程序下载到 PLC。

图10

读取设备属性

例如,如果读取设备的一般属性,则必须注意设备编号的 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);