Pour prendre en charge la programmation orientée objet, un bloc fonction peut mettre en œuvre plusieurs interfaces qui permettent d'utiliser des méthodes.
FUNCTION_BLOCK <nom du bloc fonction> IMPLEMENTS <nom interface_1>|,<nom interface_2>, …, <nom interface_n>
Un bloc fonction qui met en œuvre une interface doit contenir toutes les méthodes et toutes les propriétés (propriétés d'interface) définies par cette interface. Il s'agit du nom, des entrées et de la sortie de la méthode ou propriété concernée qui doivent être rigoureusement identiques.
Pour cela, lors de la création d'un nouveau bloc fonction mettant en œuvre une interface, toutes les méthodes et toutes les propriétés définies dans cette interface sont automatiquement insérées sous le nouveau bloc fonction dans l'
.Lorsque vous utilisez l'héritage des blocs fonction, prenez en compte le point suivant : si des méthodes ou des attributs ont été créés par héritage d'une interface, mettez-les en œuvre ou supprimez-les si vous devez utiliser l'implémentation du bloc fonction de base. Les attributs pragma sont insérés automatiquement. Ils sont détectés lors de la compilation et des messages sont générés pour vous rappeler que les méthodes ou propriétés héritées doivent être vérifiées. Supprimez les attributs pragma après avoir mis en œuvre complètement le nouveau bloc fonction.
Pour plus d'informations, consultez la description de la commande .
INTERFACE I1
inclut la méthode GetName
:
METHOD GetName : STRING
Les blocs fonction A
et B
mettent en œuvre tous les deux l'interface I1
:
FUNCTION_BLOCK A IMPLEMENTS I1
FUNCTION_BLOCK B IMPLEMENTS I1
Ainsi, la méthode GetName
doit être disponible dans les deux blocs fonction et sera placée automatiquement sous chacun lors de leur insertion dans l'arborescence .
Examinez la déclaration d'une variable de type I1
:
FUNCTION DeliverName : STRING
VAR_INPUT
l_i : I1;
END_VAR
Cette entrée peut recevoir tous les blocs fonction qui mettent en œuvre l'interface I1
.
Exemple d'appels de fonction :
DeliverName(l_i := A_instance); // call with instance of type A
DeliverName(l_i := B_instance); // call with instance of type B
Un appel à la méthode d'interface se traduisit donc par un appel à la mise en œuvre du bloc fonction. Dès que la référence est affectée, l'adresse correspondante est surveillée en mode en ligne. Si aucune référence n'a encore été affectée, la valeur 0 s'affiche lors de la surveillance en mode en ligne.
Dans l'exemple, consultez la partie relative à la mise en œuvre de la fonction DeliverName
:
DeliverName := l_i.GetName(); // in this case it depends on the "real" type of l_i whether A.GetName or B.GetName is called
EXTENDS
dans la déclaration.