SA0106: Virtuelle Methodenaufrufe in FB_init

Funktion

Ermittelt Methodenaufrufe in der Methode FB_init eines Basis-Funktionsbausteins, die von einem vom Basis-FB abgeleiteten Funktionsbaustein überschrieben werden.

Begründung

In solchen Fällen kann es sein, dass die Variablen in überschriebenen Methoden im Basis-FB nicht initialisiert sind.

Wichtigkeit

Hoch

Beispiel:

Funktionsbaustein FB_Base:

FUNCTION_BLOCK FB_Base
VAR
    nBase        : DINT;
END_VAR

Methode FB_Base.FB_init:

METHOD FB_init : BOOL
VAR_INPUT
    bInitRetains : BOOL;
    bInCopyCode  : BOOL;
END_VAR
VAR
    nLocal       : DINT;
END_VAR
nLocal := MyInit();              // => SA0106

Methode FB_Base.MyInit:

METHOD MyInit : DINT
nBase  := 123;                   // access to member of FB_Base
MyInit := nBase;

Funktionsbaustein FB_Sub:

FUNCTION_BLOCK FB_Sub EXTENDS FB_Base
VAR
    nSub         : DINT;
END_VAR

Methode FB_Sub.MyInit:

METHOD MyInit : DINT
nSub   := 456;                   // access to member of FB_Sub
SUPER^.MyInit();                 // call of base implementation
MyInit := nSub;

Programm MAIN:

PROGRAM MAIN
VAR
    fbBase       : FB_Base;
    fbSub        : FB_Sub;
END_VAR

 

Die Instanz MAIN.fbBase besitzt nach der Initialisierung folgende Variablenwerte:

Die Instanz MAIN.fbSub besitzt nach der Initialisierung folgende Variablenwerte:

Die Variable MAIN.fbSub.nSub ist nach der Initialisierung 0, da während der Initialisierung von fbSub die folgende Aufrufreihenfolge durchgeführt wird: