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 hat die Methoden FB_init und MyInit. FB_init ruft MyInit zur Initialisierung auf.
- Funktionsbaustein FB_Sub ist von FB_Base abgeleitet.
- FB_Sub.MyInit überschreibt bzw. erweitert FB_Base.MyInit.
- MAIN instanziiert FB_Sub auf und verwendet dabei aufgrund der Aufrufreihenfolge während der Initialisierung die Instanzvariable nSub, bevor sie initialisiert wurde.
Funktionsbaustein FB_Base:
FUNCTION_BLOCK FB_Base
VAR
nBase : DINT;
END_VARMethode FB_Base.FB_init:
METHOD FB_init : BOOL
VAR_INPUT
bInitRetains : BOOL;
bInCopyCode : BOOL;
END_VAR
VAR
nLocal : DINT;
END_VARnLocal := MyInit(); // => SA0106Methode FB_Base.MyInit:
METHOD MyInit : DINTnBase := 123; // access to member of FB_Base
MyInit := nBase;Funktionsbaustein FB_Sub:
FUNCTION_BLOCK FB_Sub EXTENDS FB_Base
VAR
nSub : DINT;
END_VARMethode FB_Sub.MyInit:
METHOD MyInit : DINTnSub := 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:
- nBase ist 123
Die Instanz MAIN.fbSub besitzt nach der Initialisierung folgende Variablenwerte:
- nBase ist 123
- nSub ist 0
Die Variable MAIN.fbSub.nSub ist nach der Initialisierung 0, da während der Initialisierung von fbSub die folgende Aufrufreihenfolge durchgeführt wird:
- Initialisierung des Basisbausteins:
- implizite Initialisierung
- explizite Initialisierung: FB_Base.FB_init
- FB_Base.FB_init ruft FB_Sub.MyInit auf → SA0106
- FB_Sub.MyInit ruft FB_Base.MyInit auf (über SUPER-Zeiger)
- Initialisierung des abgeleiteten Bausteins:
- implizite Initialisierung