En général, rien dans EcoStruxure Machine Expert ne vous empêche d'utiliser le même identificateur pour différents éléments. Vous pouvez, par exemple, affecter le même nom à une instance de bloc fonction locale et à une fonction.
Dans l'exemple non recommandé ci-dessous, on ne sait pas vraiment si c'est l'instance ou la fonction qui est appelée dans le programme :
FUNCTION YYY : INT
;
END_FUNCTION
FUNCTION_BLOCK XXX
;
END_FUNCTION_BLOCK
PROGRAM PLC_PRG
VAR
YYY : XXX;
END_VAR
YYY();
END_PROGRAM
Pour ne pas créer de code ambigu, suivez les recommandations suivantes :
Respectez les conventions de dénomination, par exemple, en utilisant certains préfixes pour les variables. Pour plus d'informations, consultez la section Recommandations pour la dénomination des identificateurs.
Utilisez le composant Analyse de code fourni avec EcoStruxure Machine Expert pour vérifier la dénomination des variables.
Utilisez l'attribut qualified_only de manière cohérente pour les énumérations et les listes de variables globales.
Utilisez la bibliothèque préfixe d’espace de noms pour accéder à ses éléments.
Le compilateur EcoStruxure Machine Expert ne signale pas d'erreurs si un même identificateur est utilisé pour différents éléments, mais il recherche le code de la déclaration de l'identificateur dans un ordre spécifique. Dès qu'une déclaration est trouvée, la recherche s'interrompt. Les autres déclarations existant dans le code ne sont pas détectées. Elles sont « masquées » pour le compilateur. Le paragraphe suivant décrit les règles de masquage du compilateur, c'est-à-dire l'ordre suivi lors de la recherche des déclarations d'identificateurs. Le paragraphe Accès ambigu et accès qualifié explique comment éviter les accès ambigus et contourner les règles de masquage.
Lorsque le compilateur détecte un identificateur dans le code d'une application, il recherche la déclaration correspondante dans l'ordre suivant :
Phase |
Description |
---|---|
1 |
Variables locales d'une méthode. |
2 |
Variables locales dans le bloc fonction, le programme ou la fonction et dans les blocs fonction de base. |
3 |
Méthodes locales du POU. |
4 |
Variables globales dans l'application si l'attribut qualified_only n'est pas défini dans la liste où les variables globales sont déclarées. |
5 |
Variables globales dans l'application parente si l'attribut qualified_only n'est pas défini dans la liste où les variables globales sont déclarées. |
6 |
Variables globales dans les bibliothèques référencées lorsque ni la bibliothèque ni la liste de variables ne requièrent un accès qualifié. |
7 |
Noms de POU ou de type provenant de l'application (comme des noms de liste de variables globales ou de bloc fonction). |
8 |
Noms de POU ou de type provenant d'une application parente. |
9 |
Noms de POU ou de type provenant d'une bibliothèque. |
10 |
Espaces de noms de bibliothèques référencées localement et de bibliothèques publiées par des bibliothèques. |
11 |
Variables globales dans l'arborescence qualified_only n'est pas défini dans la liste où elles sont déclarées. si l'attribut |
12 |
Noms de POU ou de type provenant de l'arborescence (comme des noms de liste de variables globales ou de bloc fonction). |
Comme indiqué dans la section Description de l' arborescence des outils, le est disponible à deux emplacements différents dans l'arborescence : en tant quqe sous-noeud du noeud et en tant que sous-noeud du noeud .
Lorsque le compilateur détecte un identificateur dans le code d'une bibliothèque, il recherche la déclaration correspondante dans l'ordre suivant :
Phase |
Description |
---|---|
1 |
Variables locales d'une méthode. |
2 |
Variables locales dans le bloc fonction, le programme ou la fonction et dans les blocs fonction de base. |
3 |
Méthodes locales du POU. |
4 |
Variables globales dans la bibliothèque locale si l'attribut qualified_only n'est pas défini dans la liste où les variables globales sont déclarées. |
5 |
Variables globales dans les bibliothèques référencées lorsque ni la bibliothèque ni la liste de variables ne requièrent un accès qualifié. |
6 |
Noms de POU ou de type provenant de la bibliothèque locale (comme des noms de liste de variables globales ou de bloc fonction). |
7 |
Noms de POU ou de type provenant d'une bibliothèque référencée. |
8 |
Espaces de noms des bibliothèques référencées localement et des bibliothèques publiées par des bibliothèques référencées localement. |
Ces ordres de recherche ne peuvent pas éliminer totalement les accès ambigus. L'accès ambigu persiste, par exemple, s'il existe une variable de même nom dans deux listes de variables globales qui ne requièrent pas un accès qualifié. En cas de détection d'un tel cas, le compilateur signale l'erreur : ambiguous use of the name XXX
. Pour éviter cela, utilisez l'accès qualifié, notamment en ajoutant le nom de la liste de variables globales (exemple : GVL.XXX
).
Utilisez l'accès qualifié pour éviter le phénomène de masquage :
Utilisez le nom de la liste de variables globales pour assurer un accès unique à une variable de cette liste.
Utilisez le nom d'une bibliothèque pour assurer un accès unique aux éléments de la bibliothèque.
Utilisez le pointeur THIS pour offrir un accès unique aux variables d'un bloc fonction, même s'il existe une variable locale de même nom dans une méthode du bloc fonction.
Pour trouver l'emplacement de la déclaration d'un identificateur, exécutez la commande .
Les ordres de recherche décrits dans les paragraphes précédents ne s'appliquent pas aux :
identificateurs qui sont des composants d'un chemin d'instance ;
identificateurs utilisés comme entrées dans des appels.
En cas de tentative d'accès à yy.component
, l'entité yy
détermine l'emplacement où rechercher la déclaration de component
.
Si… |
Alors… |
---|---|
Si |
|
Si |
|
Si |
|
Dans la seconde instance, le compilateur détermine si l'accès à l'élément est autorisé (la variable peut n'être accessible que localement ou une méthode peut être privée). Si l'accès n'est pas autorisé, un message d'erreur est généré.