Skip to main content

Verwenden von BACnet-Client-Funktionsbausteinen

Unter einem BACnet-Server können neben BACnet-Objekten auch BACnet-Clients als “Geräte” eingefügt werden.

Wie die Objekte und der Server bringt auch jedes Client-Gerät einen Funktionsbaustein mit, der unter dem gleichen Namen wie das Client-Gerät instanziiert wird.

Im Gegensatz zu BACnet-Objekten benötigt ein BACnet-Client keine umfangreiche (statische) Konfiguration, daher kann ein Client-Funktionsbaustein auch ohne Anlegen eines BACnet-Clients als “Gerät” verwendet werden. Er muss in diesem Fall aber im IEC-Code mit Hilfe von RegisterToServer() an seinem BACnet-Server „angemeldet“ und damit aktiviert werden. Beim Einfügen von BACnet-Clients als “Gerät” erfolgt diese Aktivierung automatisch.

Die BACnet-Client-Funktionsbausteine folgen dem „Common Behaviour Model“, verfügen also über Ein- und Ausgänge zur Ablaufsteuerung

  • Eingänge xExecute und xAbort

  • Ausgänge xBusy, xDone, xError und xAborted

  • Ein- und Ausgänge, die die Client-Request-Parameter oder -Ergebnisse repräsentieren

Beispiel 2. Beispiel für IEC-Code zu einer Client-Aktion

Folgender Code sendet mit Hilfe des Funktionsbausteins BACnetClientReadProperty aus der Bibliothek BACnet einen Client-Read-Property-Request an ein bestimmtes BACnet-Client-Gerät im BACnet-Netzwerk. Die erhaltene Antwort liest er in eine lokale Variable aus:

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


Sofern ein Client-Request eine Antwort liefert, wird der Antwortinhalt - wie im obigen Beispiel - in Form einer oder mehrerer Ausgangsvariablen bereitgestellt. Dies kann jedoch abhängig von der Client-Aktion variieren. Im Beispiel wurde zudem die Hilfsfunktion GetRealFromContents() zum Auslesen der Ausgangsvariablen readProp.result von Typ IEC_BACNET_PROPERTY_CONTENTS verwendet.