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
undxAbort
Ausgänge
xBusy
,xDone
,xError
undxAborted
Ein- und Ausgänge, die die Client-Request-Parameter oder -Ergebnisse repräsentieren
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.