SA0160: Rekursive Aufrufe

Funktion

Ermittelt rekursive Aufrufe von Programmen, Aktionen, Methoden und Eigenschaften. Ermittelt auch mögliche Rekursionen durch virtuelle Funktionsaufrufe und Schnittstellenaufrufe.

Begründung

Rekursionen führen zu nicht-deterministischem Verhalten und sind daher eine Fehlerquelle.

Wichtigkeit

Mittel

PLCopen-Regel

CP13

Beispiel 1:

Methode FB_Sample.SampleMethod1:

METHOD SampleMethod1
VAR_INPUT
END_VAR
SampleMethod1(); (* => SA0160: Recursive call:
                              'MAIN -> FB_Sample.SampleMethod1 -> FB_Sample.SampleMethod1' *)

Methode FB_Sample.SampleMethod2:

METHOD SampleMethod2 : BOOL
VAR_INPUT
END_VAR
SampleMethod2 := THIS^.SampleMethod2();(* => SA0160: Recursive call:
                                                    'MAIN -> FB_Sample.SampleMethod2 -> FB_Sample.SampleMethod2' *)

Programm MAIN:

PROGRAM MAIN
VAR
    fbSample : FB_Sample;
    bReturn  : BOOL;
END_VAR
fbSample.SampleMethod1();
bReturn := fbSample.SampleMethod2();

Beispiel 2:

Bitte beachten Sie bei Eigenschaften:

Für eine Eigenschaft wird implizit eine lokale Eingangsvariable mit dem Namen der Eigenschaft erzeugt. Die folgende Set-Funktion einer Eigenschaft weist somit den Wert der impliziten lokalen Eingangsvariablen der Eigenschaft einer FB-Variablen zu.

Funktionsbaustein FB_Sample:

FUNCTION_BLOCK FB_Sample
VAR
    nParameter : INT;
END_VAR

Set-Funktion der Eigenschaft SampleProperty:

nParameter := SampleProperty;

 

Bei der folgenden Set-Funktion wird somit die implizite Eingangsvariable der Eigenschaft sich selbst zugewiesen. Die Zuweisung einer Variablen auf sich selbst bedeutet keine Rekursion, sodass diese Set-Funktion keinen Fehler SA0160 erzeugt.

Set-Funktion der Eigenschaft SampleProperty:

SampleProperty := SampleProperty;              // no error SA0160

 

Der Zugriff auf eine Eigenschaft über den THIS-Zeiger ist hingegen qualifiziert. Durch Verwendung des THIS-Zeigers wird auf die Instanz und somit auf die Eigenschaft und nicht auf die implizite lokale Eingangsvariable zugegriffen. Das bedeutet, dass die Verschattung von impliziter lokaler Eingangsvariablen und der Eigenschaft selbst aufgehoben wird. Bei der folgenden Set-Funktion wird daher ein erneuter Aufruf der Eigenschaft erzeugt, der zu einer Rekursion und damit zum Fehler SA0160 führt.

Set-Funktion der Eigenschaft SampleProperty:

THIS^.SampleProperty := SampleProperty;        // => SA0160