CODESYS - das IEC 61131-3 Programmiersystem

Willkommen im offiziellen CODESYS - Forum von 3S-Smart Software Solutions | A member of the CODESYS Group
Deutsche Version English version russian version 
Aktuelle Zeit: Fr Sep 20, 2019 7:45 am

Alle Zeiten sind UTC




Ein neues Thema erstellen  Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa Jan 19, 2019 10:09 am 
Offline

Registriert: Mi Jan 09, 2019 12:02 pm
Beiträge: 6
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:
Code:
   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;

Implementierung:
Code:
bnSTATUS := BC_MANUAL.GetPriorityArray(pPrioArray => ptrPRI_ARR);
MEM.MemMove(
   pSource := ptrPRI_ARR,
   pDestination := ADR(PRI_ARR),
   uiNumberOfBytes := SIZEOF(PRI_ARR)
);
BACnet.FreeStackAllocatedMemory(ptrPRI_ARR);


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


Dateianhänge:
Dateikommentar: Ausschnitt der Doku für die Funktion „GetPriorityArray“
LIB.png
LIB.png [ 37.01 KiB | 453 mal betrachtet ]
Nach oben
   
BeitragVerfasst: Fr Feb 15, 2019 7:14 am 
Offline

Registriert: Mi Okt 12, 2016 11:28 am
Beiträge: 24
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


Dateianhänge:
BACnet_PrioArray.png
BACnet_PrioArray.png [ 24.32 KiB | 403 mal betrachtet ]
BACnet_Code.png
BACnet_Code.png [ 46.72 KiB | 403 mal betrachtet ]
BACnet_Result.png
BACnet_Result.png [ 41.25 KiB | 403 mal betrachtet ]
Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 2 Beiträge ] 

Alle Zeiten sind UTC


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.
Sie dürfen keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de