Uso de BACnet Bloques de funciones del cliente
Además de BACnet objetos, BACnet Los clientes también se pueden insertar como "dispositivos" debajo de un BACnet servidor.
Al igual que los objetos y el servidor, cada dispositivo cliente también trae consigo un bloque de funciones que se instancia con el mismo nombre que el dispositivo cliente.
A diferencia de BACnet objetos, un BACnet El cliente no requiere una configuración compleja (estática). Como resultado, un bloque de funciones de cliente se puede utilizar incluso sin crear un BACnet cliente como "dispositivo". En este caso, sin embargo, debe "iniciar sesión" en su BACnet servidor mediante RegisterToServer() en IEC el código, y ser activado de esa manera. Esta "activación" ocurre automáticamente cuando un BACnet El cliente se inserta como "dispositivo".
Los bloques de funciones del cliente BACnet implementan el "Modelo de comportamiento común" y, por lo tanto, proporcionan entradas y salidas para el control de flujo.
Entradas
xExecuteyxAbortSalidas
xBusy,xDone,xError, yxAbortedEntradas y salidas para los parámetros y resultados de la solicitud del cliente
El siguiente código utiliza el bloque de funciones. BACnetClientReadProperty desde el BACnet biblioteca para enviar una solicitud de propiedad de lectura del cliente a un determinado BACnet dispositivo cliente en el BACnet red. La respuesta recibida se lee en una variable local:
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_IFSiempre que una solicitud de cliente envíe una respuesta, el contenido de la respuesta se proporciona en forma de una o más variables de salida, como en el ejemplo anterior. Sin embargo, esto puede variar dependiendo de la acción del cliente. El ejemplo también utiliza la función auxiliar. GetRealFromContents() para leer la variable de salida readProp.result de tipo IEC_BACNET_PROPERTY_CONTENTS.