Shadowing-Regeln

Überblick

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 Global der Anwendungsbaumstruktur und um den Aufruf einer POU mit gleichem Namen aus der Gerätebaumstruktur zu vermeiden.

    Beispiel: svar_pou := __POOL.POU();

Compiler-Shadowing - Mehrere Deklarationen

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.

Suchreihenfolge in der Anwendung

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 qualified_only nicht in der Variablenliste gesetzt ist, in der die globalen Variablen deklariert sind.

b

Globale Variablen in einer übergeordneten Anwendung, wenn das Attribut qualified_only nicht in der Variablenliste gesetzt ist, in der die globalen Variablen deklariert sind.

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 Anwendungsbaumstruktur

a

Globale Variablen in der Anwendungsbaumstruktur, wenn das Attribut qualified_only nicht in der Variablenliste gesetzt ist, in der sie deklariert sind.

b

POU- oder Typnamen aus der Anwendungsbaumstruktur (z. B. Namen von globalen Variablenlisten, Funktionsbausteinen).

c

Bibliotheken aus der Anwendungsbaumstruktur.

HINWEIS: Bibliotheken, die im Bibliotheksverwalter eingefügt werden, der ein Unterknoten des Knotens Global der Tools-Baumstruktur ist, sind in allen Anwendungen im Projekt mit der Platzhalterauflösung verfügbar. Diese Bibliotheken bilden einen gemeinsamen Namensraum (Namespace) mit den Bibliotheken in der Anwendung.

Wie im Abschnitt Beschreibung der Tools-Baumstruktur beschrieben, ist der Bibliotheksverwalter an zwei verschiedenen Standorten in der Tools-Baumstruktur verfügbar: als Unterknoten des Knotens Global und als Unterknoten des Knotens Anwendung.

HINWEIS: Wenn dieselbe Bibliothek zu beiden Bibliotheksverwalter-Knoten hinzugefügt wurde, werden die Symbole der Bibliothek unter dem Anwendung-Knoten verwendet.

Suchreihenfolge in der Bibliothek

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.

Nicht eindeutiger und qualifizierter Zugriff

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 Bearbeiten > Durchsuchen > Gehe zu DefinitionSoMMenu/index.htm aus.

Suchen nach Instanzpfaden

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 yy eine Variable mit einem strukturierten Datentyp (STRUCT oder UNION) bezeichnet,

Dann wird component in der folgenden Reihenfolge gesucht:

  1. Lokale Variablen des Funktionsbausteins

  2. Lokale Variablen des Basis-Funktionsbausteins

  3. Methoden des Funktionsbausteins

  4. Methoden des Basis-Funktionsbausteins

Wenn yy eine globale Variablenliste oder ein Programm angibt,

Dann wird component nur in dieser Liste gesucht.

Wenn yy den Namensraum einer Bibliothek bezeichnet,

Dann wird component in dieser Bibliothek in der im Abschnitt Suchreihenfolge in der Bibliothek beschriebenen Reihenfolge gesucht.

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.