Im Allgemeinen sind in EcoStruxure Machine Expert keine Einschränkungen vorhanden, die Sie davon abhalten könnten, denselben Bezeichner für unterschiedliche Elemente zu verwenden. So können Sie beispielsweise einer lokalen Funktionsbausteininstanz und einer Funktion denselben Namen zuweisen.
Im folgenden Beispiel für „schlechte Vorgehensweisen“ ist nicht klar, ob die Instanz oder die Funktion im Programm aufgerufen wird:
FUNCTION YYY : INT
;
END_FUNCTION
FUNCTION_BLOCK XXX
;
END_FUNCTION_BLOCK
PROGRAM PLC_PRG
VAR
YYY : XXX;
END_VAR
YYY();
END_PROGRAM
Um zu verhindern, dass mehrdeutiger Code erstellt wird, sollten Sie sich vorwiegend an die folgenden „guten Vorgehensweisen“ halten:
Beachten Sie die Namenskonventionen, z. B. durch Verwendung bestimmter Präfixe für Variablen. Weitere Informationen finden Sie unter Empfehlungen für die Benennung von Bezeichnern.
Verwenden Sie die mit EcoStruxure Machine Expert bereitgestellte Codeanalyse-Komponente, um die Namensgebung für Variablen zu überprüfen.
Achten Sie auf eine konsistente Nutzung des qualified_only Attributs für Enumerationen und globale Variablenlisten.
Verwenden Sie das bibliotheksspezifische Namensraum-Präfix für den Zugriff auf Elemente der Bibliothek.
Verwenden Sie das Präfix __POOL
zum expliziten Aufrufen einer POU vom Knoten der und um den Aufruf einer POU mit gleichem Namen aus der zu vermeiden.
Beispiel: svar_pou := __POOL.POU();
Der Compiler von EcoStruxure Machine Expert meldet keine Fehler, wenn derselbe Bezeichner für verschiedene Elemente verwendet wird. Er durchsucht jedoch den Code nach der Deklaration des Bezeichners in einer bestimmten Reihenfolge. Sobald eine Deklaration gefunden wird, wird die Suche angehalten. Andere Deklarationen, die ggf. im Code enthalten sind, können nicht erfasst werden, sie werden für den Compiler „abgeschattet“ (shadowed). Im folgenden Abschnitt werden die Shadowing-Regeln des Compilers beschrieben, d. h. die Reihenfolge, die bei der Suche nach Bezeichnerdeklarationen eingehalten wird. Im Abschnitt Nicht eindeutiger und qualifizierter Zugriff werden Verfahren beschrieben, die Ihnen dabei helfen, unklaren Zugriff zu vermeiden und Shadowing-Regeln zu umgehen.
Wenn der Compiler einen einzelnen Bezeichner im Code einer Anwendung erkennt, sucht er nach der entsprechenden Deklaration unter Beachtung der folgenden Reihenfolge:
Schritt |
Unterstufe |
Beschreibung |
---|---|---|
1 |
Lokale Variablen |
|
a |
Lokale Variablen einer Methode. |
|
b |
Lokale Variablen im Funktionsbaustein, im Programm oder in der Funktion sowie in den Basis-Funktionsbausteinen. |
|
c |
Lokale Methoden der POU. |
|
2 |
Globale Variablen |
|
a |
Globale Variablen in der Anwendung, wenn das Attribut |
|
b |
Globale Variablen in einer übergeordneten Anwendung, wenn das Attribut |
|
c |
Globale Variablen in referenzierten Bibliotheken, wenn weder für die Bibliothek noch für die Variablenliste ein qualifizierter Zugriff erforderlich ist. |
|
3 |
POU- oder Typennamen |
|
a |
POU- oder Typennamen der Anwendung (z. B. die Namen von globalen Variablenlisten, Funktionsbausteinen). |
|
b |
POU- oder Typennamen einer übergeordneten Anwendung. |
|
c |
POU- oder Typennamen einer Bibliothek. |
|
4 |
Bibliotheken |
|
a |
Namensräume von lokal referenzierten Bibliotheken und von Bibliotheken, die von Bibliotheken veröffentlicht werden. |
|
5 |
Globale Variablen in der |
|
a |
Globale Variablen in der |
|
b |
POU- oder Typnamen aus der (z. B. Namen von globalen Variablenlisten, Funktionsbausteinen). |
|
c |
Bibliotheken aus der . |
Wie im Abschnitt Beschreibung der Tools-Baumstruktur beschrieben, ist der an zwei verschiedenen Standorten in der verfügbar: als Unterknoten des Knotens und als Unterknoten des Knotens .
Wenn der Compiler einen einzelnen Bezeichner im Code einer Bibliothek erkennt, sucht er nach der entsprechenden Deklaration unter Beachtung der folgenden Reihenfolge:
Phase |
Beschreibung |
---|---|
1 |
Lokale Variablen einer Methode. |
2 |
Lokale Variablen im Funktionsbaustein, im Programm oder in der Funktion sowie in den Basis-Funktionsbausteinen. |
3 |
Lokale Methoden der POU. |
4 |
Globale Variablen in der lokalen Bibliothek, wenn das Attribut qualified_only nicht in der Variablenliste gesetzt ist, in der die globalen Variablen deklariert sind. |
5 |
Globale Variablen in referenzierten Bibliotheken, wenn weder für die Bibliothek noch für die Variablenliste ein qualifizierter Zugriff erforderlich ist. |
6 |
POU- oder Typennamen der lokalen Bibliothek (z. B. die Namen von globalen Variablenlisten, Funktionsbausteinen). |
7 |
POU- oder Typennamen einer referenzierten Bibliothek. |
8 |
Namensräume von lokal referenzierten Bibliotheken und von Bibliotheken, die von lokal referenzierten Bibliotheken veröffentlicht werden. |
Diese Suchreihenfolgen sind jedoch nicht in der Lage, unklaren Zugriff vollständig auszugrenzen. Es ist nach wie vor ein nicht eindeutiger Zugriff vorhanden, wenn z. B. eine Variable mit demselben Namen in zwei globalen Variablenlisten vorhanden ist, für die kein qualifizierter Zugriff erforderlich ist. Wenn ein solcher Fall erkannt wird, meldet der Compiler einen Fehler: ambiguous use of the name XXX
. Um dies zu vermeiden, verwenden Sie qualifizierten Zugriff, z. B. durch Hinzufügen des Namens der globalen Variablenliste (Beispiel: GVL.XXX
).
Verwenden Sie quaifizierten Zugriff, um Shadowing zu vermeiden:
Verwenden Sie den Namen der globalen Variablenliste, um eindeutigen Zugriff auf eine Variable in der Liste bereitzustellen.
Verwenden Sie den Namen einer Bibliothek, um eindeutigen Zugriff auf die Elemente in der Bibliothek bereitzustellen.
Verwenden Sie den THIS-Zeiger, um eindeutigen Zugriff auf Variablen in einem Funktionsbaustein bereitzustellen, selbst wenn eine lokale Variable mit demselben Namen in einer Methode des Funktionsbausteins vorhanden ist.
Um den Deklarationspfad eines Bezeichners zu finden, führen Sie den Befehl SoMMenu/index.htm aus.
Die in den vorhergehenden Abschnitten beschriebenen Suchreihenfolgen gelten nicht für:
Bezeichner, die als Komponenten eines Instanzpfads vorhanden sind.
Bezeichner, die als Eingänge in Aufrufen verwendet werden.
Bei dem Versuch eines Zugriffs auf yy.component
, bestimmt die Einheit yy
den Ort, an dem nach der Deklaration von component
gesucht wird.
Aktion |
Folge |
---|---|
Wenn |
Dann wird
|
Wenn |
Dann wird |
Wenn |
Dann wird |
In der zweiten Instanz ermittelt der Compiler, ob der Zugriff auf das Element genehmigt ist (die Variable ist ggf. nur lokal zugänglich oder eine Methode ist unter Umständen privat). Wenn der Zugriff nicht genehmigt ist, wird eine Fehlermeldung ausgegeben.