Skip to main content

Zugriff auf BACnet-Objekte und ihre Propertys

Jeder Funktionsbaustein eines als „Gerät“ im Projektbaum eingefügten BACnet-Objekts leitet vom Funktionsbaustein BACnetStaticObjectBase (Bibliothek BACnet) und damit von BACnetObjectBase ab.

BACnetObjectBase bietet damit für jedenBACnet-Objekt-Funktionsbaustein die Möglichkeit über die allgemeine Funktion SetPropertyInstance beliebige BACnet-Propertys zu verändern.

Die Daten des zu setzenden BACnet-Propertys werden SetPropertyInstance in Form der Struktur IEC_BACNET_PROPERTY_CONTENTS übergeben. Diese Struktur beinhaltet neben einer Enumeration, die den Datentyp beschreibt, auch einen Buffer, der einen POINTER TO BYTE auf die tatsächlichen BACnet-Property-Daten besitzt. Damit ist es möglich beliebige BACnet-Property-Datenstrukturen innerhalb der IEC_BACNET_PROPERTY_CONTENTS Struktur zu übergeben. Der angegebene Datentyp definiert dabei, auf welche Strukturen oder Daten der Puffer zeigt.

Die Enumeration CmpBACnet.IEC_BACNET_DATA_TYPE stellt die Auswahl an CODESYS BACnet-Datentypen zur Verfügung, der entsprechende Datentyp ist im Kommentar angegeben.

Für einige häufig verwendete Datentypen bietet der Basis-Funktionsbaustein BACnetObjectBase Hilfsfunktionen (SetBACnetRealProperty, SetBACnetBooleanProperty, etc.).

Beispiel 1. Beispiel für korrekt verwendete IEC_BACNET_PROPERTY_CONTENTS
METHOD SetBACnetRealProperty
VAR_INPUT
    propID: CmpBACnet.IEC_BACNET_PROPERTY_ID;
    rVal : REAL;
END_VAR
VAR
    BACreal : CmpBACnet.IEC_BACNET_REAL := 0.0;
    conts : CmpBACnet.IEC_BACNET_PROPERTY_CONTENTS := ( tag := CmpBACnet.IEC_BACNET_DATA_TYPE.DATA_TYPE_REAL,
        nElements := 1,
        buffer := ( nBufferSize := SIZEOF(REAL), pBuffer := ADR(BACreal) ),
        rawBuffer := ( nBufferSize := 0, pBuffer :=0) );
END_VAR
BACreal := rVal;
SetPropertyInstance(propID, -1, conts);

Dieser Code setzt ein BACnet-Property vom Typ REAL auf den Wert 0.0.



Entsprechend, um im allgemeinsten Fall BACnet-Propertys auszulesen, bietet der Funktionsbaustein BACnetObjectBase die Funktion GetPropertyInstance. Hier können Sie innerhalb der Struktur IEC_BACNET_PROPERTY_CONTENTS entweder einen mit dem korrekten Datentyp vorinitialisierter Puffer übergeben, der dann befüllt wird; oder einen Puffer der Größe 0, der automatisch initialisiert wird, den Sie dann aber mit Hilfe der Funktion FreeStackAllocatedMemory nach der Benutzung wieder freigeben müssen.

Unabhängig von diesem allgemeinen Fall stehen für die häufigsten Fälle Hilfsfunktionen bereit. Des Weiteren gibt es für alle im BACnet-Standard definierten Propertys je BACnet-Objekt-Funktionsbaustein eine Auswahl an Funktionsbaustein-Propertys, die den direkten, typisierten Zugriff erlauben.