Anlegen und Löschen eigener BACnet Funktionsbausteine (FB)

Wenn neben den in der Bibliothek Tc3_BACnetRev14 vorhandenen FB eigene BACnet FB instanziiert werden sollen, müssen diese bei Beenden des SPS-Programms in einer Methode FB_exit gelöscht werden, damit der dynamisch allozierte Speicher wieder freigegeben wird.

Dynamisch angelegte FB-Instanzen von Funktionsbausteinen aus der Bibliothek Tc3_BACnetRev14 werden über die Methode FB_exit des Dynamic Object Manager automatisch gelöscht und aus dem Speicher entfernt.

Das nachfolgende Beispiel zeigt das dynamische Anlegen von FB-Instanzen eigener FB (die Implementierungen selbst werden in diesem Beispiel nicht gezeigt) sowie das Löschen dieser Instanzen in der Methode FB_exit.

Anlegen und Löschen eigener BACnet Funktionsbausteine (FB) 1:

Es ist darauf zu achten, dass der richtige Typ des FB bei der Freigabe verwendet wird.

Variable MAIN

PROGRAM MAIN
VAR
    fbDynObj : FB_DYN_OBJECTS;
END_VAR

Code MAIN

fbDynObj();

Variablen FB_DynObj

FUNCTION_BLOCK FB_DYN_OBJECTS
VAR
    DynMgmt : FB_BACnet_DynObjectManager := (bCycleObjects := TRUE, bAutoFinishInit := FALSE);

    bCreate : BOOL := TRUE;
    bDelete : BOOL;

    TestFbBVOwn : POINTER TO FB_BACnet_BV_Event;
    TestFbAVOwn : POINTER TO FB_BACnet_AV_EventSetp;
END_VAR

Code FB_DynObj

DynMgmt();
IF (DynMgmt.Ready) THEN
    IF (bCreate) THEN
        bCreate := FALSE;

        TestFbBVOwn := __NEW( FB_BACnet_BV_Event );
        IF (DynMgmt.CreateObjectEx(TestFbBVOwn, BACnet_Globals.nBACnetInstId_Auto, '\/TestBV own', '\/TestBV own', 0)) THEN
            // Initialize properties:
            TestFbBVOwn^.sInactiveText := 'AUS';
            TestFbBVOwn^.sActiveText := 'EIN';
        END_IF

        TestFbAVOwn := __NEW( FB_BACnet_AV_EventSetp );
    IF (DynMgmt.CreateObjectEx(TestFbAVOwn, BACnet_Globals.nBACnetInstId_Auto, '\/TestEvent own', '\/TestEvent own', 0)) THEN
            // Initialize properties:
            TestFbAVOwn^.fHighLimit := 470;
            TestFbAVOwn^.fLowLimit := -100;
    END_IF
        DynMgmt.FinishInit();
    END_IF

    IF (bDelete) THEN
        bDelete := FALSE;
    FB_exit(FALSE);
    END_IF
END_IF

Variablen der Methode FB_DynObj.FB_exit

METHOD FB_exit : BOOL
VAR_INPUT
    bInCopyCode : BOOL; // if TRUE, the exit method is called for exiting an instance that is copied afterwards (online change).
END_VAR

Code der Methode FB_DynObj.FB_exit

DynMgmt.RemoveObjectEx(TestFbAVOwn);
__DELETE(TestFbAVOwn);
DynMgmt.RemoveObjectEx(TestFbBVOwn);
__DELETE(TestFbBVOwn);