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
xExecute
yxAbort
Salidas
xBusy
,xDone
,xError
, yxAborted
Entradas 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_IF
Siempre 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
.