Skip to main content

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 y xAbort

  • Salidas xBusy, xDone, xError, y xAborted

  • Entradas y salidas para los parámetros y resultados de la solicitud del cliente

ejemplo 2. Ejemplo de código IEC para una acción de 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.