Skip to main content

Utilizzo di BACnet Blocchi funzione client

Inoltre BACnet oggetti, BACnet i client possono anche essere inseriti come "dispositivi" sotto a BACnet server.

Come gli oggetti e il server, anche ogni dispositivo client porta con sé un blocco funzione istanziato con lo stesso nome del dispositivo client.

A differenza di BACnet oggetti, a BACnet il client non richiede una configurazione complessa (statica). Di conseguenza, un blocco funzione client può essere utilizzato anche senza creare un file BACnet client come "dispositivo". In questo caso, però, è necessario "accedere" al proprio file BACnet server tramite RegisterToServer() nell'IEC il codice ed essere attivato in questo modo. Questa "attivazione" avviene automaticamente quando a BACnet il client viene inserito come "dispositivo".

IL BACnet i blocchi funzione client implementano il "modello di comportamento comune" e quindi forniscono input e output per il controllo del flusso.

  • Ingressi xExecute e xAbort

  • Uscite xBusy, xDone, xError, E xAborted

  • Input e output per i parametri e i risultati della richiesta del client

Esempio 2. Esempio di codice IEC per un'azione client

Il codice seguente utilizza il blocco funzione BACnetClientReadProperty dal BACnet libreria per inviare una richiesta di proprietà di lettura del client a un file specifico BACnet dispositivo client in BACnet rete. La risposta ricevuta viene letta in una variabile locale:

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


Finché una richiesta del client invia una risposta, il contenuto della risposta viene fornito sotto forma di una o più variabili di output, come nell'esempio precedente. Tuttavia, questo può variare a seconda dell'azione del client. L'esempio utilizza anche la funzione ausiliaria GetRealFromContents() per leggere la variabile di output readProp.result di tipo IEC_BACNET_PROPERTY_CONTENTS.