Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

BACnet SL - Prioritätssteuerung über das Priority-Array

CRoemer
2019-01-19
2019-02-15
  • CRoemer - 2019-01-19

    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;
    

    Implementierung:

    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.

    IMG: LIB.png

     
  • Thomas - 2019-02-15

    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

    IMG: BACnet_PrioArray.png

    IMG: BACnet_Code.png

    IMG: BACnet_Result.png

     

Log in to post a comment.