用于 BACnet 客户端功能块
此外 BACnet 物体, BACnet 客户端也可以作为“设备”插入到 BACnet 服务器。
与对象和服务器一样,每个客户端设备也带有一个功能块,该功能块以与客户端设备相同的名称进行实例化。
不像 BACnet 物体,一个 BACnet 客户端不需要复杂的(静态)配置。因此,即使不创建客户端功能块也可以使用 BACnet 客户端作为“设备”。然而,在这种情况下,它必须“登录”到其 BACnet 服务器通过 RegisterToServer() 在 IEC 代码中,并以这种方式激活。这种“激活”会在以下情况下自动发生: BACnet 客户端作为“设备”插入。
这 BACnet 客户端功能块实现“通用行为模型”,因此它们为流控制提供输入和输出。
输入
xExecute和xAbort输出
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。