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.
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. (Siehe "Betriebsfall "Online-Change""
und "Betriebsfall "Erneuter Download".")
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!
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:
-
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 TypPOINTER
oderREFERENCE
. 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"") -
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. -
Kopiervorgang
copy
copy(&old_inst, &new_inst);
Bestehende Werte bleiben erhalten. Zu diesem Zweck werden sie aus der alten Instanz in die neue kopiert.
-
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.
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.
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
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.




HINWEIS

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.




HINWEIS

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
Methode FB_Init
für den Funktionsbaustein serialdevice
METHOD PUBLIC FB_Init : BOOL VAR_INPUT bInitRetains : 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
Die Funktionsbausteine MainFB
, SubFB
und SubSubFB
leiten voneinander ab. Dabei gilt: SubFB EXTENDS MainFB
und SubSubFB EXTENDS SubFB
.
Aufrufabfolge der Methoden FB_Exit
und FB_Init
:
-
fbSubSubFb.FB_Exit(...);
-
fbSubFb.FB_Exit(...);
-
fbMainFb.FB_Exit(...);
-
fbMainFb.FB_Init(...);
-
fbSubFb.FB_Init(...);
-
fbSubSubFb.FB_Init(...);