Hallo Zusammen,
ich arbeite aktuell an meinem ersten Projekt mit Codesys in Verbindung mit BACnet SL, bei dem ich über einen BACnet-Server BACnet-Objekte für ein externes Leitsystem anbiete. Das Ganze läuft auf der Codesys Control Win V3. Die BACnet-Kommunikation habe ich nun gestern testen können und es hat alles soweit funktioniert.
Ich habe jetzt allerdings noch folgende Problemstellung:
Einige der BACnet-Objekte sollen vom externen Leitsystem auch beschrieben (bzw. mit Hand-Werten überschrieben) werden. Das Schreiben der Objekte geschieht dann über das Priority-Array der BACnet-Objekte (z.B. auf der Priorität für Handeingriffe). Ich möchte nun im ersten Schritt herausfinden können, auf welcher Priorität eines BACnet-Objektes welcher Wert geschrieben wurde, um ggf. einen Handeingriff vom Leitsystem feststellen zu können.
Um an das Priority-Array eines BACnet-Objektes zu gelangen bieten die Objekte, die dies unterstützen eine Methode mit dem Namen „GetPriorityArray“ an. Die Beschreibung dieser Funktion habe ich als Screenshot angehängt. Um das ganze auszuprobieren habe ich also einen kleinen Testcode geschrieben, der mir dieses Array eines Datenpunktes auslesen soll:
Deklaration:
PRI_ARR : ARRAY [1..16] OF BACnet.CmpBACnet.IEC_BACNET_PRIORITY_ARRAY_ITEM;
ptrPRI_ARR : POINTER TO ARRAY [1..16] OF BACnet.CmpBACnet.IEC_BACNET_PRIORITY_ARRAY_ITEM;
bnSTATUS : BACnet.CmpBACnet.IEC_BACNET_STATUS;
“BC_MANUAL” ist hierbei ein BACnet-Analogwert. Der Testcode fragt zyklisch das Priority-Array des BACnet-Objekts ab, kopiert dieses in einen Datenpuffer („PRI_ARR“) und gibt den Pointer wieder frei.
Was ich beim Ausführen der Applikation beobachtet habe ist, dass das Array („PRI_ARR“), welches eigentlich das Priority-Array des BACnet-Objektes beinhalten sollte, die meiste Zeit über nur null-Werte (Alle Werte in der Array-Struktur auf 0) enthält. In regelmäßigen Abständen springen die Werte allerdings für einen Zyklus auf irgendwelche zufälligen Werte. Es kommt mir so vor, als zeige der Pointer, den ich von „GetPriorityArray“ erhalte irgendwo in den Speicher, wo ich mir dann zufällige Werte kopiere, aber nicht den Inhalt des eigentlichen Priority-Arrays.
Meine Frage ist, was ich bei der Verwendung der Funktion falsch mache?
Oder gibt es möglicherweise einen anderen (besseren) Weg um an das Priority-Array zu gelangen (z.B. über eine Bibliotheksfunktion)?
Vielen Dank vorab.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Moin CRoemer,
das Springen habe ich bei mir nur gesehen, wenn ich praktisch einen Online-Change mache.
Nach einem Runtime-Neustart ist mir nichts aufgefallen.
Der normale Write-Befehl wird mit Prio16 geschrieben.
Schreibst Du nun auf die Prio8 (Manual operator) wird diese auch automatisch auf den Present-Value übertragen.
Daher sollte das eigentlich nicht die Funktion sein, die Du suchst.
Gruß
Thomas
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo Zusammen,
ich arbeite aktuell an meinem ersten Projekt mit Codesys in Verbindung mit BACnet SL, bei dem ich über einen BACnet-Server BACnet-Objekte für ein externes Leitsystem anbiete. Das Ganze läuft auf der Codesys Control Win V3. Die BACnet-Kommunikation habe ich nun gestern testen können und es hat alles soweit funktioniert.
Ich habe jetzt allerdings noch folgende Problemstellung:
Einige der BACnet-Objekte sollen vom externen Leitsystem auch beschrieben (bzw. mit Hand-Werten überschrieben) werden. Das Schreiben der Objekte geschieht dann über das Priority-Array der BACnet-Objekte (z.B. auf der Priorität für Handeingriffe). Ich möchte nun im ersten Schritt herausfinden können, auf welcher Priorität eines BACnet-Objektes welcher Wert geschrieben wurde, um ggf. einen Handeingriff vom Leitsystem feststellen zu können.
Um an das Priority-Array eines BACnet-Objektes zu gelangen bieten die Objekte, die dies unterstützen eine Methode mit dem Namen „GetPriorityArray“ an. Die Beschreibung dieser Funktion habe ich als Screenshot angehängt. Um das ganze auszuprobieren habe ich also einen kleinen Testcode geschrieben, der mir dieses Array eines Datenpunktes auslesen soll:
Deklaration:
Implementierung:
“BC_MANUAL” ist hierbei ein BACnet-Analogwert. Der Testcode fragt zyklisch das Priority-Array des BACnet-Objekts ab, kopiert dieses in einen Datenpuffer („PRI_ARR“) und gibt den Pointer wieder frei.
Was ich beim Ausführen der Applikation beobachtet habe ist, dass das Array („PRI_ARR“), welches eigentlich das Priority-Array des BACnet-Objektes beinhalten sollte, die meiste Zeit über nur null-Werte (Alle Werte in der Array-Struktur auf 0) enthält. In regelmäßigen Abständen springen die Werte allerdings für einen Zyklus auf irgendwelche zufälligen Werte. Es kommt mir so vor, als zeige der Pointer, den ich von „GetPriorityArray“ erhalte irgendwo in den Speicher, wo ich mir dann zufällige Werte kopiere, aber nicht den Inhalt des eigentlichen Priority-Arrays.
Meine Frage ist, was ich bei der Verwendung der Funktion falsch mache?
Oder gibt es möglicherweise einen anderen (besseren) Weg um an das Priority-Array zu gelangen (z.B. über eine Bibliotheksfunktion)?
Vielen Dank vorab.
Moin CRoemer,
das Springen habe ich bei mir nur gesehen, wenn ich praktisch einen Online-Change mache.
Nach einem Runtime-Neustart ist mir nichts aufgefallen.
Der normale Write-Befehl wird mit Prio16 geschrieben.
Schreibst Du nun auf die Prio8 (Manual operator) wird diese auch automatisch auf den Present-Value übertragen.
Daher sollte das eigentlich nicht die Funktion sein, die Du suchst.
Gruß
Thomas