Skip to main content

SA0106 : Appels de méthodes virtuelles dans FB_INIT

Détecte les appels de méthode dans le FB_Init méthode d'un bloc fonctionnel de base, qui sont écrasés par un bloc fonctionnel dérivé d'un bloc fonctionnel de base

Justification : Dans ces cas, il se peut que les variables des méthodes écrasées ne soient pas initialisées dans le FB de base.

Importance : Élevée

Exemple 94. Exemple

Le bloc fonction FB_A comprend les méthodes FB_Init et Meth_MyInit. FB_Init appels Meth_MyInit pour l'initialisation. Le bloc fonction FB_B dérive de FB_A. PLC_PRG appels FB_B et utilise donc son mbMyDintB variable avant qu'elle ne soit initialisée. FB_B.Meth_MyInit écrase FB_A.Meth_MyInit.

FUNCTION_BLOCK FB_A
VAR
    mbMyDintA : DINT;
END_VAR
FUNCTION_BLOCK FB_B EXTENDS FB_A
VAR
    mbMyDintB : DINT;
END_VAR
METHOD FB_Init : BOOL
VAR_INPUT
    bInitRetains:BOOL;
    bInCopyCode:BOOL;
END_VAR
VAR
    diDummy:DINT;    //SA0106
END_VAR
mbMyDintA := 123;
diDummy := Meth_MyInit();
METHOD Meth_MyInit : DINT
VAR_INPUT
END_VAR
mbMyDintB := 123;    //access to member of FB_B
PROGRAM PLC_PRG
VAR
    g_BInst : FB_B;
    xVar : BOOL;
END_VAR

xVar := g_BInst.fb_init(TRUE, TRUE);
//this instruction causes the following order of initializations:
//FB_A.fb_init
//FB_B.Meth_MyInit    //SA0106
//FB_B.fb_init
//FB_B.Meth_MyInit

Sortie dans le messages voir:

  • sa_icon_message.png SA0106 : Appel de méthode virtuelle 'Meth_MyInit' dans FB_INIT