Betriebsfälle
Die Methoden FB_init, FB_reinit und FB_exit werden zu unterschiedlichen Zeitpunkten implizit aufgerufen. Zu diesen verschiedenen Betriebsfällen finden Sie im Folgenden Informationen:
- Betriebsfall „Erster Download“
- Betriebsfall „Erneuter Download“
- Betriebsfall „Online-Change“
Je nach Betriebsfall unterscheidet sich das Aufrufverhalten der Methoden. Durch die Abfrage der Methodenparameter „bInCopyCode“ und „bInitRetains“ von FB_init und FB_exit können Sie innerhalb der Methoden zwischen den Betriebsfällen unterscheiden. Das ermöglicht eine Anpassung der Implementierung an den jeweiligen Betriebsfall.
Betriebsfall | Betriebsfall | Betriebsfall |
---|---|---|
|
|
|
Methodenparameter:
| Methodenparameter:
| Methodenparameter:
|
Betriebsfall „Erster Download“
Beim Download eines SPS-Projekts auf eine Steuerung, die sich im Auslieferungszustand befindet, müssen die Speicherplätze aller Variablen durch Initialisierung in den gewünschten Ausgangszustand versetzt werden. Dabei werden die Datenbereiche von Funktionsbausteininstanzen mit den gewünschten Werten belegt. Durch die explizite Implementierung von FB_init für Funktionsbausteine können Sie die Initialisierung in dieser Situation gezielt beeinflussen.
Durch die Auswertung der FB_init-Methodenparameter „bInitRetains“ (TRUE) und „bInCopyCode“ (FALSE) können Sie diesen Betriebsfall eindeutig detektieren. (Siehe auch Betriebsfall „Online-Change“)
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. |
Attribut 'call_after_init' als Alternative zu FB_init
Nach dem Aufruf von FB_init und vor dem ersten Zyklus der Tasks eines SPS-Projekts werden die externen initialen Zuweisungen innerhalb der Deklaration der Funktionsbausteininstanz verarbeitet.
fbTimer : TON := (PT := T#500MS);
Solche Zuweisungen werden erst nach dem Aufruf von FB_init ausgeführt. Hätte TON eine FB_init-Methode, so wäre in dieser der zugewiesene Zeitwert von T#500MS nicht bekannt.
Um die Auswirkungen dieser Zuweisungen kontrollieren zu können, können Sie eine Methode eines Funktionsbausteins mit dem Attribut {attribute 'call_after_init'} versehen. Sie müssen das Attribut sowohl über dem Deklarationsteil der entsprechenden Methode als auch über dem Deklarationsteil des Funktionsbausteinrumpfes einfügen.
Die Methode wird nach der Verarbeitung der externen initialen Zuweisungen und vor dem Start der Tasks eines SPS-Projekts aufgerufen und kann so auf die Vorgaben des Anwenders (bei der externen Initialisierung) entsprechend reagieren.
Beispiel
{attribute 'call_after_init'}
FUNCTION_BLOCK FB_Sample
VAR_INPUT
nInput1 : INT;
nInput2 : INT := 100;
END_VAR
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
{attribute 'call_after_init'}
METHOD MyCallAfterInit
PROGRAM MAIN
VAR
fbSample : FB_Sample := (nInput2 := 700);
END_VAR
Beim Download erfolgen nacheinander folgende Aufrufe:
1. FB_init | Instanz initialisieren |
1. impliziter Initialisierungscode (implizite Nullinitialisierung und explizite interne Werteinitialisierung der Variablen)
2. expliziter Initialisierungscode (explizit in FB_init definierter Initialisierungscode) | |
| |
Durch die Auswertung der FB_init-Methodenparameter können Sie diesen Betriebsfall eindeutig detektieren. | |
2. explizite externe Variableninitialisierung über Instanzdeklaration des Funktionsbausteins | Externe initiale Zuweisungen verarbeiten |
| |
Wenn den Eingangsvariablen des Funktionsbausteins Werte zugewiesen sind, werden diese kopiert. Bei Variablen, denen von außen kein Wert zugewiesen ist, bleibt der ursprüngliche Wert erhalten. | |
3. Methode, die mit Attribut call_after_init deklariert ist | Alternative Initialisierung |
| |
Um diesen Betriebsfall eindeutig zu detektieren, können Sie den Wert von bInCopyCode zuvor in FB_init in eine Hilfsvariable kopieren und diese Hilfsvariable in der 'call_after_init'-Methode auswerten. |
Betriebsfall „Erneuter Download“
Beim erneuten Download eines SPS-Projekts wird eventuell ein bereits vorhandenes Projekt auf der Steuerung ersetzt. Deshalb muss der Speicherplatz für die vorhandenen Funktionsbausteine zunächst geregelt freigegeben werden. Dafür können Sie die Methode FB_exit verwenden. Ist diese Methode angelegt, wird sie aufgerufen, bevor das alte Projekt entfernt wird. Anschließend wird das neue Projekt auf die Steuerung geladen und FB_init aufgerufen. In FB_exit können Sie beispielsweise externe Ressourcen (mit Socket- oder File-Handles) in einen definierten Zustand versetzen oder dynamisch allokierten Speicher freigeben (__NEW- bzw. in diesem Fall __DELETE-Operator).
Durch die Auswertung des FB_exit-Methodenparameters „bInCopyCode“ (FALSE) können Sie diesen Betriebsfall eindeutig detektieren.
Betriebsfall „Online-Change“
Bei einem Online-Change können Sie über die Methoden FB_exit, FB_init und FB_reinit die Initialisierung von Funktionsbausteininstanzen beeinflussen. Im Rahmen des Online-Change werden die im Offlinebetrieb vollzogenen Änderungen an dem SPS-Projekt 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 dem SPS-Projekt keine Änderungen im Deklarationsteil eines Funktionsbausteins vorgenommen wurden, sondern nur in der Implementierung, dann findet keine Ersetzung der Datenbereiche statt. Es werden nur Codeblöcke ersetzt. Die Methoden FB_exit, FB_init und FB_reinit werden in diesem Fall nicht aufgerufen.
Wenn Sie Änderungen in der Deklaration eines Funktionsbausteins vorgenommen haben, die zum oben beschriebenen Kopiervorgang führen, 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 Methoden FB_init und FB_exit kann durch Auswertung der Parameter „bInitRetains“ (FALSE) und „bInCopyCode“ (TRUE) ermittelt werden, ob gerade ein Online-Change ausgeführt wird, der die Funktionsbausteininstanz betrifft und sie an einen anderen Speicherplatz verschiebt.
Beim Online-Change erfolgen nacheinander folgende Aufrufe:
1. FB_exit | Alte Instanz verlassen |
| |
Durch die Auswertung des FB_exit-Methodenparameters können Sie diesen Betriebsfall eindeutig detektieren. | |
2. FB_init | Neue Instanz initialisieren |
1. impliziter Initialisierungscode (implizite Nullinitialisierung und explizite interne Werteinitialisierung der Variablen) 2. expliziter Initialisierungscode (explizit in FB_init definierter Initialisierungscode) | |
| |
Durch die Auswertung der FB_init-Methodenparameter können Sie diesen Betriebsfall eindeutig detektieren. | |
3. explizite externe Variableninitialisierung über Instanzdeklaration des Funktionsbausteins | Externe initiale Zuweisungen verarbeiten |
| |
Wenn den Eingangsvariablen des Funktionsbausteins Werte zugewiesen sind, werden diese kopiert. Bei Variablen, denen von außen kein Wert zugewiesen ist, bleibt der ursprüngliche Wert erhalten. | |
4. Methode, die mit Attribut call_after_init deklariert ist | Alternative Initialisierung |
| |
Um diesen Betriebsfall eindeutig zu detektieren, können Sie den Wert von bInCopyCode zuvor in FB_init in eine Hilfsvariable kopieren und diese Hilfsvariable in der 'call_after_init'-Methode auswerten. | |
5. Kopiervorgang copy | Funktionsbausteinwerte kopieren (Copy-Code) |
| |
Bestehende Werte bleiben erhalten. Zu diesem Zweck werden sie aus der alten Instanz in die neue kopiert. | |
6. FB_reinit | Neue Instanz reinitialisieren |
| |
Diese Methode wird nach dem Kopiervorgang aufgerufen und setzt die Variablen der Instanz auf definierte Werte. |
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. |
Siehe auch: