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:

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
„Erster Download“

Betriebsfall
„Erneuter Download“

Betriebsfall
„Online-Change“

  1. FB_init (impliziter und expliziter Initialisierungscode)
  2. explizite externe Variableninitialisierung über Instanzdeklaration des Funktionsbausteins
  3. Methode, die mit Attribut 'call_after_init' deklariert ist
  1. FB_exit
  2. FB_init (impliziter und expliziter Initialisierungscode)
  3. explizite externe Variableninitialisierung über Instanzdeklaration des Funktionsbausteins
  4. Methode, die mit Attribut 'call_after_init' deklariert ist
  1. FB_exit
  2. FB_init (impliziter und expliziter Initialisierungscode)
  3. explizite externe Variableninitialisierung über Instanzdeklaration des Funktionsbausteins
  4. Methode, die mit Attribut 'call_after_init' deklariert ist
  5. Kopiervorgang copy
  6. FB_reinit

Methodenparameter:

FB_init(bInitRetains := TRUE, bInCopyCode := FALSE);

Methodenparameter:

FB_exit(bInCopyCode := FALSE);

FB_init(bInitRetains := TRUE, bInCopyCode := FALSE);

Methodenparameter:

FB_exit(bInCopyCode := TRUE);

FB_init(bInitRetains := FALSE, bInCopyCode := TRUE);

 

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“)

Betriebsfälle 1:

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)

nInput1 := 0;
nInput2 := 100;

2. expliziter Initialisierungscode (explizit in FB_init definierter Initialisierungscode)

fbSample.FB_init(bInitRetains := TRUE, bInCopyCode := FALSE);

Durch die Auswertung der FB_init-Methodenparameter können Sie diesen Betriebsfall eindeutig detektieren.
Über die Methode FB_init können Sie beispielsweise Variablen mithilfe von zusätzlichem Initialisierungscode initialisieren oder andere Teile des SPS-Projekts über die Position bestimmter Variablen im Speicher informieren.

2. explizite externe Variableninitialisierung über Instanzdeklaration des Funktionsbausteins

Externe initiale Zuweisungen verarbeiten

nInput2 := 700;

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

fbSample.MyCallAfterInit();

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.
Sie können das Attribut als Alternative zu FB_init nutzen oder beispielsweise die Auswirkungen der expliziten externen Variableninitialisierung kontrollieren.
Gestalten Sie die Implementierung möglichst unabhängig. Die Methode kann nämlich auch aus dem SPS-Projekt heraus jederzeit aufgerufen werden, um eine Funktionsbausteininstanz in den ursprünglichen Zustand zurückzusetzen.

 

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.

Betriebsfälle 2:

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:

Betriebsfälle 3:

1. FB_exit

Alte Instanz verlassen

old_inst.FB_exit(bInCopyCode := TRUE);

Durch die Auswertung des FB_exit-Methodenparameters können Sie diesen Betriebsfall eindeutig detektieren.
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 des SPS-Projekts 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. (Hinweis: Sie können das Attribut 'call_on_type_change' nutzen, um auf die Datentypänderung eines referenzierten Funktionsbausteins zu reagieren.)
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 während des Online-Change oft nicht gesondert behandelt werden. (Siehe Betriebsfall „Erneuter Download")

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)

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

Durch die Auswertung der FB_init-Methodenparameter können Sie diesen Betriebsfall eindeutig detektieren.
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 andere Teile des SPS-Projekts über die neue Position bestimmter Variablen im Speicher informieren.

3. explizite externe Variableninitialisierung über Instanzdeklaration des Funktionsbausteins

Externe initiale Zuweisungen verarbeiten

new_inst : <FB-Name> := (<Variable>:=<value>);

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

new_inst.<Methodenname der gekennzeichneten Methode>();

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.
Sie können das Attribut beispielsweise als Alternative zu FB_init nutzen.
Gestalten Sie die Implementierung möglichst unabhängig. Die Methode kann nämlich auch aus dem SPS-Projekt heraus jederzeit aufgerufen werden, um eine Funktionsbausteininstanz in den ursprünglichen Zustand zurückzusetzen.

5. Kopiervorgang copy

Funktionsbausteinwerte kopieren (Copy-Code)

copy(&old_inst, &new_inst);

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

6. FB_reinit

Neue Instanz reinitialisieren

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 des SPS-Projekts ü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 dem SPS-Projekt heraus jederzeit aufgerufen werden, um eine Funktionsbausteininstanz in den ursprünglichen Zustand zurückzusetzen.

Betriebsfälle 4:

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: