FB_init
FB_init ist immer implizit verfügbar und wird grundsätzlich aufgerufen, um die Standardinitialisierung durchzuführen (impliziter Aufruf). Für eine gezielte Einflussnahme können Sie die Methode außerdem explizit deklarieren und zusätzlichen Code zum Standardinitialisierungscode ergänzen.
Wenn während der Ausführung der explizit definierte Initialisierungscode erreicht wird, ist die Funktionsbausteininstanz bereits über den impliziten Initialisierungscode vollständig initialisiert, sowohl bei automatischer Nullinitialisierung als auch bei individueller Werteinitialisierung. Es darf deshalb kein Aufruf SUPER^.FB_init
erfolgen.
Debugging Das Finden von Fehlern in den Methoden FB_init ist mühsam, weil unter anderem das Setzen von Haltepunkten nicht die gewünschte Wirkung haben kann. |
Automatisches Core Dump bei Exception in FB_init/FB_reinit/FB_exit Falls innerhalb des Codes von FB_init/FB_reinit/FB_exit ein Ausnahmefehler auftritt, z.B. aufgrund eines Programmierfehlers, legt das Laufzeitsystem automatisch einen Core Dump auf dem Zielsystem ab (ab TC3.1 Build 4024.25). Dieser Core Dump wird als *.core-Datei im Boot-Ordner des Zielsystems abgelegt (standardmäßig unter C:\TwinCAT\3.1\Boot\Plc) und kann zur Ursachensuche verwendet werden. Weitere Informationen zum Laden eines Core Dumps finden Sie unter: Fehleranalyse mit Core Dump |
Initialisierungsreihenfolge beachten Bitte beachten Sie, dass die Werte, die den Eingangsvariablen der Funktionsbausteininstanz zugewiesen werden, bei der Ausführung von FB_init noch nicht bekannt sind. Wenn Sie die Ausführung von FB_init parametrieren möchten, können Sie in der FB_init-Methode zusätzliche Methodeneingänge deklarieren. |
Expliziter Aufruf von FB_init
Expliziter Aufruf nicht empfohlen Bei den Methoden FB_init, FB_reinit und FB_exit handelt es sich um Systemfunktionen, die zu unterschiedlichen Zeitpunkten implizit aufgerufen werden (weitere Informationen hierzu finden Sie unter Betriebsfälle). Ein expliziter Aufruf dieser Methoden kann unbeabsichtigte Folgen haben und wird daher nicht empfohlen. |
Die Methode FB_init kann prinzipiell auch explizit aufgerufen werden. Dies wird jedoch nicht empfohlen.
Bei einem expliziten Aufruf wird nicht nur der explizite Initialisierungscode der FB_init-Methode erneut ausgeführt, sondern auch die implizite Initialisierung findet erneut statt. Es werden z. B. alle Variablen neu initialisiert, sowohl bei automatischer Nullinitialisierung als auch bei individueller Werteinitialisierung.
Letzteres bewirkt, dass beide Initialisierungsschritte auch für die in dieser Instanz deklarierten FB-Instanzen durchgeführt werden. Dieser Vorgang setzt sich über die weiteren enthaltenen Instanzebenen fort.
Wenn FB-Instanzen neu initialisiert werden, ohne vorher de-initialisiert worden zu sein, kann dies zu Problemen im weiteren Programmablauf führen, beispielsweise wenn die FB_init-Methode dynamische Speicherallokationen oder einen Instanzzähler beinhaltet.
Da die FBs dabei nicht entsprechend ihrer vorgesehenen Verwendung genutzt werden und da die problematischen Folgen möglicherweise nicht abzuschätzen sind, wird ausdrücklich davon abgeraten, FB_init-Methoden explizit aufzurufen.
Schnittstelle der Methode FB_init
METHOD FB_init : BOOL
VAR_INPUT
bInitRetains : BOOL; // if TRUE, the retain variables are initialized (warm start / cold start)
bInCopyCode : BOOL; // if TRUE, the instance afterwards gets moved into the copy code (online change)
END_VAR
Durch die Auswertung der FB_init-Methodenparameter können Sie die Betriebsfälle unterscheiden und die Implementierung gegebenenfalls anpassen. (Siehe Betriebsfälle)
Methodenparameter | (erster/erneuter) Download | Online Change | TwinCAT Neustart (ohne erneuten Download) |
---|---|---|---|
bInitRetains | TRUE | FALSE | FALSE |
bInCopyCode | FALSE | TRUE | FALSE |
Sie können in einer FB_init-Methode zusätzliche Methodeneingänge deklarieren. Diese Eingänge müssen Sie dann in der Deklaration der Funktionsbausteininstanz setzen.
Rückgabewert
Implizite Aufrufe
Bei impliziten Aufrufen der Methoden wird der Rückgabewert vom System nicht ausgewertet. Auch wenn Sie den Rückgabewert anpassen, wird dieser bei einem impliziten Aufruf nicht ausgewertet.
Explizite Aufrufe
Bei expliziten Aufrufen der Methoden können Sie den Rückgabewert auswerten. Dafür können Sie einen sinnvollen Rückgabewert zurückliefern.
FB_init bei abgeleiteten Bausteinen
Wenn ein Funktionsbaustein von einem anderen Funktionsbaustein abgeleitet ist, dann wird für diesen Funktionsbaustein automatisch die FB_init-Methode des Basisfunktionsbausteins ausgeführt. Falls die FB_init-Methode des abgeleiteten Funktionsbausteins explizit hinzugefügt wird, wird diese im Anschluss an die FB_init-Methode des Basisfunktionsbausteins ausgeführt (siehe Verhalten bei abgeleiteten Bausteinen).
Wenn die FB_init-Methode des abgeleiteten Funktionsbausteins in expliziter Form vorhanden sein soll, muss diese dieselben Parameter definieren wie die FB_init-Methode des Basisfunktionsbausteins. Sie können jedoch weitere Parameter hinzufügen, um für die abgeleitete Instanz eine spezielle Initialisierung einzurichten.
Die FB_init-Methode ist nicht zu vergleichen mit dem Konstrukt eines Konstruktors, wie er aus C#, C++ oder auch Java bekannt ist, da ein Funktionsbaustein in der SPS keinen Konstruktor benötigt, um seine deklarierten Variablen zu initialisieren. Dies findet bereits in den Deklarationszeilen implizit oder auch explizit statt. Die sich daraus ergebenden Konsequenzen für Funktionsbausteine, die andere Funktionsbausteine erweitern, werden im Abschnitt Verhalten bei abgeleiteten Bausteinen beschrieben. |
Beispiele für die Zuweisung von zusätzlichen FB_init-Parametern
Beispiel 1:
Methode FB_SerialDevice.FB_init
METHOD PUBLIC FB_init : BOOL
VAR_INPUT
bInitRetains : BOOL; // if TRUE, the retain variables are initialized (warm start / cold start)
bInCopyCode : BOOL; // if TRUE, the instance afterwards gets moved into the copy code (online change)
nComNum : INT; // additional input: number of the COM-interface that is to be observed
END_VAR
Deklaration des Funktionsbausteins FB_SerialDevice:
fbCom1 : FB_SerialDevice(nComNum := 1);
fbCom0 : FB_SerialDevice(nComNum := 0);
Beispiel 2:
Funktionsbaustein FB_Sample:
FUNCTION_BLOCK FB_Sample
VAR
nStartValue : INT;
END_VAR
Methode FB_Sample.FB_init:
METHOD FB_init : BOOL
VAR_INPUT
bInitRetains : BOOL; // if TRUE, the retain variables are initialized (warm start / cold start)
bInCopyCode : BOOL; // if TRUE, the instance afterwards gets moved into the copy code (online change)
nValue : INT; // parameter to initialize the start value
END_VAR
nStartValue := nValue;
Deklaration des Funktionsbausteins FB_Sample:
PROGRAM MAIN
VAR
fbSample1 : FB_Sample(123); // => fbSample1.nStartValue is set to 123
fbSample2 : FB_Sample(456); // => fbSample2.nStartValue is set to 456
END_VAR
Beispiel 3:
Im folgenden Beispiel werden eine Eingangsvariable und eine Eigenschaft von einem Funktionsbaustein initialisiert, welcher über eine FB_init-Methode mit einem zusätzlichen Parameter verfügt.
Funktionsbaustein FB_Sample:
FUNCTION_BLOCK FB_Sample
VAR_INPUT
nInput : INT;
END_VAR
VAR
nLocalInitParam : INT;
nLocalProp : INT;
END_VAR
Methode FB_Sample.FB_init:
METHOD FB_init : BOOL
VAR_INPUT
bInitRetains : BOOL; // if TRUE, the retain variables are initialized (warm start / cold start)
bInCopyCode : BOOL; // if TRUE, the instance afterwards gets moved into the copy code (online change)
nInitParam : INT;
END_VAR
nLocalInitParam := nInitParam;
Eigenschaft FB_Sample.nMyProperty und die zugehörige Set-Funktion:
PROPERTY nMyProperty : INT
nLocalProp := nMyProperty;
Programm MAIN:
PROGRAM MAIN
VAR
fbSample : FB_Sample(nInitParam := 1) := (nInput := 2, nMyProperty := 3);
aSample : ARRAY[1..2] OF FB_Sample[(nInitParam := 4), (nInitParam := 7)]
:= [(nInput := 5, nMyProperty := 6), (nInput := 8, nMyProperty := 9)];
END_VAR
Initialisierungsergebnis:
- fbSample
- nInput = 2
- nLocalInitParam = 1
- nLocalProp = 3
- aSample[1]
- nInput = 5
- nLocalInitParam = 4
- nLocalProp = 6
- aSample[2]
- nInput = 8
- nLocalInitParam = 7
- nLocalProp = 9
Siehe auch: