Skip to main content

用于 BACnet 客户端功能块

此外 BACnet 物体, BACnet 客户端也可以作为“设备”插入到 BACnet 服务器。

与对象和服务器一样,每个客户端设备也带有一个功能块,该功能块以与客户端设备相同的名称进行实例化。

不像 BACnet 物体,一个 BACnet 客户端不需要复杂的(静态)配置。因此,即使不创建客户端功能块也可以使用 BACnet 客户端作为“设备”。然而,在这种情况下,它必须“登录”到其 BACnet 服务器通过 RegisterToServer() 在 IEC 代码中,并以这种方式激活。这种“激活”会在以下情况下自动发生: BACnet 客户端作为“设备”插入。

BACnet 客户端功能块实现“通用行为模型”,因此它们为流控制提供输入和输出。

  • 输入 xExecutexAbort

  • 输出 xBusy, xDone, xError, 和 xAborted

  • 客户端请求参数和结果的输入和输出

2. 客户端操作的 IEC 代码示例

下面的代码使用了该功能块 BACnetClientReadProperty 来自 BACnet 库将客户端读取属性请求发送到特定的 BACnet 客户端设备在 BACnet 网络。收到的响应被读入局部变量:

PROGRAM PLC_PRG
VAR
    initDone : BOOL := FALSE;
    readProp : BACnet.BACnetClientReadProperty;
    readPropCnt : INT := 0;
    readPropErrorCnt : INT := 0;
    readPropCancelCnt : INT := 0;
    readPropVal : REAL;
END_VAR

IF NOT initDone THEN
    readProp.RegisterToServer(BACnet_Server);
    readProp(
        dwTargetDeviceNumber:= 43,
        objType:= BACnet.CmpBACnet.IEC_BACNET_OBJECT_TYPE.OBJ_ANALOG_VALUE,
        objInst:= 1,
        propID:= BACnet.CmpBACnet.IEC_BACNET_PROPERTY_ID.PROP_PRESENT_VALUE,
        nIndex:= -1);
END_IF

IF readProp.xExecute AND readProp.xBusy AND readProp.iState = 3 THEN
    IF readPropCnt MOD 2 = 0 THEN // cancel every second request
        readProp.xAbort := TRUE;
        readPropCancelCnt := readPropCancelCnt + 1;
    END_IF
END_IF
IF NOT readProp.xExecute AND NOT readProp.xAborted AND NOT readProp.xDone THEN
    readProp.xExecute := TRUE;
    readPropCnt := readPropCnt + 1;
END_IF

IF readProp.xExecute THEN
    IF readProp.xDone THEN
        readProp.xExecute := FALSE;
    END_IF
    IF readProp.xError THEN
        readProp.xExecute := FALSE;
        readPropErrorCnt := readPropErrorCnt + 1;
    END_IF
    IF readProp.xAborted THEN
        readProp.xExecute := FALSE;
        readProp.xAbort := FALSE;
    END_IF
END_IF

readProp();

IF readProp.xDone OR readProp.xError THEN
    IF readProp.xError THEN
        // handle error
        ;
    ELSE
        readPropVal := BACnet.GetRealFromContents(readProp.result);
    END_IF
END_IF


只要客户端请求发送响应,响应内容就会以一个或多个输出变量的形式提供,如上例所示。但是,这可能会根据客户端操作而有所不同。该示例还使用了辅助函数 GetRealFromContents() 读取输出变量 readProp.result 类型的 IEC_BACNET_PROPERTY_CONTENTS