Skip to main content

Methode: FB_Init, FB_Reinit, FB_Exit

Die Methoden können Sie explizit einsetzen, um Einfluss zu nehmen auf die Initialisierung von Funktionsbaustein-Variablen und auf das Verhalten beim Beenden von Funktionsbausteinen.

Tipp

Der Typ des Rückgabewertes für die impliziten Methoden ist BOOL. Der Wert wird vom System nicht ausgewertet, der Typ sollte jedoch nicht geändert werden.

FB_Init ist immer implizit verfügbar und wird grundsätzlich bei der Initialisierung aufgerufen. Für eine gezielte Einflussnahme können Sie die Methode außerdem explizit deklarieren und dort zusätzlichen Code zum Standardinitialisierungscode ergänzen.

FB_Reinit muss explizit implementiert werden. Wenn diese Methode vorliegt, wird sie aufgerufen, nachdem die Instanz des betreffenden Funktionsbausteins kopiert wurde. Das geschieht während eines Online-Changes nach Änderungen an der Funktionsbausteindeklaration (Signaturänderung), um das neue Instanzmodul zu reinitalisieren. Um eine Reinitialisierung der Basisimplementierung des Funktionsbausteins zu erreichen, müssen Sie FB_Reinit noch explizit aufrufen.

FB_Exit müssen Sie explizit implementieren. Wenn eine Implementierung vorliegt, wird die Methode aufgerufen, bevor der Code der Funktionsbaustein-Instanz von der Steuerung entfernt wird (impliziter Aufruf).

Im Folgenden sehen Sie für verschiedenen Betriebsfälle einige Anwendungsfälle dieser Methoden.

Betriebsfall „Erster Download“

Beim Download einer Applikation auf eine Steuerung, die sich im Auslieferungszustand befindet, müssen die Speicherplätze aller Variablen in den gewünschten Ausgangszustand versetzt werden. Dadurch werden die Datenbereiche von Funktionsbaustein-Instanzen mit den gewünschten Werten belegt. Durch die explizite Implementierung von FB_Init für Funktionsbausteine können Sie im Code der Applikation in dieser Situation gezielt reagieren. Durch die Auswertung der Methodenparameter bInCopyCode (FALSE) und bInitRetains (TRUE) können Sie diesen Betriebsfall eindeutig detektieren.

Betriebsfall „Online-Change“

Im Rahmen des Online-Changes können Sie über die Methoden FB_Exit, FB_Init und FB_Reinit die Initialisierung von Funktionsbaustein-Instanzen beeinflussen. Im Rahmen des Online-Changes werden die im Offlinebetrieb vollzogenen Änderungen an der Applikation in der laufenden Steuerung nachvollzogen. Deshalb werden die „alten“ Instanzen der Funktionsbausteine durch Ihre „neuen Geschwister“ möglichst stoßfrei ersetzt. Wenn vor dem Login in der Applikation keine Änderungen am Deklarationsteil eines Funktionsbausteins vorgenommen wurde, sondern nur in der Implementierung, dann findet keine Ersetzung der Datenbereiche statt. Es werden nur Codeblöcke ersetzt. Dann werden die Methoden FB_Exit, FB_Init und FB_Reinit nicht aufgerufen!

Tipp

Wenn Sie Änderungen in der Deklaration eines Funktionsbausteins vorgenommen haben, die zum oben beschriebenen Kopiervorgang führen werden, erhalten Sie beim Online-Change eine Meldung zu den „möglicherweise unbeabsichtigten Auswirkungen“. In den Details der Meldungsbox sehen Sie eine Liste aller zu kopierenden Instanzen aufgelistet.

Im Code der Methode FB_Init kann durch Auswertung der Parameter bInCopyCode (TRUE) ermittelt werden, ob gerade ein Online-Change ausgeführt wird.

Beim Online-Change erfolgen nacheinander folgende Aufrufe:

  1. FB_Exit

    old_inst.FB_Exit(bInCopyCode := TRUE);

    Sie können den Aufruf von FB_Exit beim Verlassen der „alten“ Instanz verwenden, um vor dem Kopiervorgang bestimmte Aufräumarbeiten anzustoßen. So können Sie die Daten für den folgenden Kopiervorgang vorbereiten und den Zustand der „neuen“ Instanz beeinflussen. Andere Teile der Applikation können Sie über die bevorstehende Lageänderung im Speicher informieren. Achten Sie besonders auf Variablen vom Typ POINTER oder REFERENCE. Diese verweisen nach dem Online-Change eventuell nicht mehr auf die gewünschten Speicherstellen. Schnittstellenvariablen (INTERFACE) werden vom Compiler gesondert behandelt und beim Online-Change entsprechend angepasst. Externe Ressourcen wie beispielsweise Sockets, Files oder andere Handles können eventuell unverändert von der neuen Instanz übernommen werden. Sie müssen oft während des Online-Changes nicht gesondert behandelt werden. (Siehe „Betriebsfall „Erneuter Download““)

  2. FB_Init

    new_inst.FB_Init(bInitRetains := FALSE, bInCopyCode := TRUE);

    Der Aufruf von FB_Init erfolgt vor dem Kopiervorgang und kann verwendet werden, um für den Online-Change spezifische Operationen auszuführen. Beispielsweise können Sie darüber Variablen an der „neuen“ Position im Speicher entsprechend initialisieren lassen, oder andere Teile der Applikation über die neue Position bestimmter Variablen im Speicher informieren.

  3. Kopiervorgang copy

    copy(&old_inst, &new_inst);

    Bestehende Werte bleiben erhalten. Zu diesem Zweck werden sie aus der alten Instanz in die neue kopiert.

  4. FB_Reinit

    new_inst.FB_Reinit();

    Diese Methode wird nach dem Kopiervorgang aufgerufen und setzt die Variablen der Instanz auf definierte Werte. Beispielsweise können Sie darüber Variablen an der „neuen“ Position im Speicher entsprechend initialisieren, oder andere Teile der Applikation über die neue Position bestimmter Variablen im Speicher informieren. Gestalten Sie die Implementierung unabhängig vom Online-Change. Die Methode kann nämlich auch aus der Applikation heraus jederzeit aufgerufen werden, um eine Funktionsbaustein-Instanz in den ursprünglichen Zustand zurückzuversetzen.

Tipp

Mit dem Attribut {attribute 'no_copy'} können Sie für eine einzelne Variable des Funktionsbausteins verhindern, dass diese beim Online-Change kopiert wird. Sie behält dann immer den Initialwert.

Für weitere Informationen siehe: Einstellungen Speicherreserve für Online-Change

Betriebsfall „Erneuter Download“

Beim Download einer Applikation wird eventuell eine bereits vorhandene Applikation auf der Steuerung ersetzt. Deshalb muss der Speicherplatz für die vorhandenen Funktionsbausteine geregelt freigegeben werden. Sie können die Methode FB_Exit verwenden, um die dazu notwendigen Schritte zu implementieren. Beispielsweise können Sie externe Ressourcen (mit Socket- oder File-Handles) in einen definierten Zustand versetzen.

Sie können diesen Betriebsfall detektieren, indem Sie überprüfen, ob bei der Methode FB_Exit der Parameter bInCopyCode = FALSE ist.

Betriebsfall „Start der Applikation“

Vor dem ersten Zyklus der Task einer Applikation werden die initialen Zuweisungen verarbeitet.

Beispiel 308. Beispiel

T1 : TON := (PT:=t#500ms);



Solche Zuweisungen werden erst nach dem Aufruf von FB_Init ausgeführt. Um die Auswirkungen dieser Zuweisungen kontrollieren zu können, dürfen Sie einen Funktionsbaustein oder eine Methode eines Funktionsbausteins mit dem Attribut {attribute ‘call_after_init‘} versehen. Sie müssen das Attribut sowohl über dem Deklarationsteil des Funktionsbausteinrumpfes als auch über dem Deklarationsteil der entsprechenden Methode einfügen. Ein Baustein, der einen anderen Baustein erweitert, der das {attribute 'call_after_init'} verwendet, muss ebenfalls mit dem Attribut versehen werden. Aus Gründen der Verständlichkeit wird empfohlen, die entsprechende Methode mit dem gleichen Namen, der gleichen Signatur und dem gleichen Attribut zu überschreiben. Das erfordert einen Aufruf von SUPER^.MyInit. Der Name der Methode ist frei wählbar. (Ausnahmen: FB_Init, FB_Reinit und FB_Exit). Die Methode wird nach der Verarbeitung der initialen Zuweisungen und vor dem Start der Tasks einer Applikation aufgerufen und kann so auf die Vorgaben des Anwenders entsprechend reagieren.

Bedenken Sie bei der Verwendung von FB_Init oder {attribute 'call_after_init'} jedoch auch Folgendes:Das Finden von Fehlern in den Methoden FB_Init oder in Methoden die mit {attribute 'call_after_init'} dekoriert sind, ist mühsam,weil unter Anderem das Setzen von Haltepunkten nicht die gewünschte Wirkung haben kann.

Wichtig

Wenn während der Ausführung der explizit definierten Initialisierungscode erreicht wird, ist die Funktionsbaustein-Instanz bereits über den impliziten Initialisierungscode vollständig initialisiert. Es darf deshalb kein SUPER^.FB_Init-Aufruf erfolgen.

Wichtig

FB_Init ersetzt den in CoDeSys V2.3 verwendeten INI-Operator. Die Methode ist nicht zu vergleichen mit dem Konstrukt eines Konstruktors, wie man ihn aus C#, C++ oder auch Java kennt. Das hat Konsequenzen für Funktionsbausteine, die andere Funktionsbausteine erweitern. (Siehe unten „Abgeleitete Funktionsbausteine“)

Schnittstelle der Methode FB_Init

METHOD FB_Init : BOOL
VAR_INPUT
    bInitRetains : BOOL; // TRUE: the retain variables are initialized (reset warm / reset cold)
    bInCopyCode : BOOL;  // TRUE:  the instance will be copied to the copy code afterward (online change)
END_VAR

Sie können in einer FB_Init-Methode zusätzliche Funktionsbaustein-Eingänge deklarieren. Sie müssen dann diese Eingänge in der Deklaration der Funktionsbaustein-Instanz setzen.

Beispiel 309. Beispiel

Methode FB_Init für den Funktionsbaustein serialdevice

METHOD PUBLIC FB_Init : BOOL
VAR_INPUT
    nbInitRetains : BOOL; // initializing of retain variable
    bInCopyCode : BOOL; // instance is copied to copy code
    iCOMnum : INT; // additional input: number of the  COM interface, that is to be observed
END_VAR

Instanzierung des Funktionsbausteins serialdevice:

com1: serialdevice(iCOMnum:=1);
com0: serialdevice(iCOMnum:=0);


Schnittstelle der Methode FB_Reinit

METHOD FB_Reinit : BOOL

Schnittstelle der Methode FB_Exit

Es gibt es den obligatorischen Parameter bInCopyCode.

METHOD FB_Exit : BOOL
VAR_INPUT
 bInCopyCode : BOOL; // TRUE: the exit method is called in order to leave the instance which will be copied afterwards (online change).
END_VAR

Verhalten bei abgeleiteten Funktionsbausteinen

Wenn ein Funktionsbaustein von einem anderen Funktionsbaustein abgeleitet ist, muss die FB_Init-Methode des abgeleiteten Funktionsbausteins dieselben Parameter definieren wie die FB_Init-Methode des Basisfunktionsbausteins. Sie können jedoch weitere Parameter hinzufügen, um für die Instanz eine spezielle Initialisierung einzurichten.

Beispiel 310. Beispiel

Die Funktionsbausteine MainFB, SubFB und SubSubFB leiten voneinander ab. Dabei gilt: SubFB EXTENDS MainFB und SubSubFB EXTENDS SubFB.

Prozedur. Aufrufabfolge der Methoden FB_Exit und FB_Init:
  1. fbSubSubFb.FB_Exit(...);

  2. fbSubFb.FB_Exit(...);

  3. fbMainFb.FB_Exit(...);

  4. fbMainFb.FB_Init(...);

  5. fbSubFb.FB_Init(...);

  6. fbSubSubFb.FB_Init(...);