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.).
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.