Verschattungsregeln

In TwinCAT ist es prinzipiell erlaubt, den gleichen Bezeichner für verschiedene Elemente zu verwenden. So können beispielsweise ein Baustein und eine Variable gleich benannt werden. Um Verwechslungen vorzubeugen, sollte dies jedoch vermieden werden.

Negativbeispiel:

Im folgenden Codeausschnitt hat eine lokale Funktionsbaustein-Instanz den gleichen Namen wie eine Funktion:

FUNCTION Sample : INT
FUNCTION_BLOCK FB_Sample
PROGRAM MAIN
VAR
    Sample : FB_Sample;
END_VAR
Sample();

In einem solchen Fall ist unklar, ob im Programm die Instanz oder die Funktion aufgerufen wird.

Namenskonventionen:

Um sicherzustellen, dass Namen immer eindeutig sind, sollten Namenskonventionen, beispielsweise für die Festlegung bestimmter Präfixe für Variablen, beachtet werden. Eine mögliche Definition solcher Präfixe finden Sie im Abschnitt Bezeichner/Namen der TwinCAT-3-Programmierkonventionen.

Namenskonventionen können mit Hilfe von TE1200 | PLC Static Analysis automatisch überprüft werden. Die statische Codeanalyse könnte durch die Prüfung der Regel SA0027 auch die doppelte Verwendung des Namens Sample aufdecken und als Fehler melden.

Qualifizierter Zugriff:

Auch durch die konsequente Verwendung des Attributs 'qualified_only' für Enumerationen und globale Variablenlisten und durch die Verwendung von qualifizierten Bibliotheken können nicht-eindeutige Situationen vermieden werden.

Verschattung:

Der Compiler meldet grundsätzlich weder Fehler noch Warnungen, wenn derselbe Bezeichner für verschiedene Elemente verwendet wird. Stattdessen durchsucht der Compiler den Code in einer bestimmten Reihenfolge nach der Deklaration des Bezeichners. Wenn eine Deklaration gefunden wurde, dann sucht der Compiler nicht nach eventuellen weiteren Deklarationen an anderer Stelle. Wenn weitere Deklarationen existieren, dann sind diese für den Compiler „verschattet“. Im Folgenden werden die Verschattungsregeln beschrieben, das heißt die Suchreihenfolgen, die der Compiler bei der Suche nach der Deklaration für Bezeichner verwendet. Im Abschnitt „Uneindeutige Zugriffe und qualifizierte Zugriffe“ werden Möglichkeiten aufgezeigt, um uneindeutige Zugriffe zu vermeiden und die Verschattungsregeln zu umgehen.

Suchreihenfolge in der Applikation

Wenn der Compiler im Code einer Applikation auf einen einzelnen Bezeichner trifft, dann sucht er die zugehörige Deklaration in der folgenden Reihenfolge:

  1. Lokale Variablen einer Methode
  2. Lokale Variablen im Funktionsbaustein, Programm oder Funktion und in eventuellen Basisfunktionsbausteinen
  3. Lokale Methoden des Bausteins
  4. Globale Variablen im Projekt, wenn in der Variablenliste, in der die globalen Variablen deklariert sind, nicht das Attribut 'qualified_only' gesetzt ist.
  5. Globale Variablen in angezogenen Bibliotheken, wenn weder die Bibliothek noch die Variablenliste qualifizierten Zugriff erfordert.
  6. Baustein- oder Typnamen aus dem Projekt (das heißt: Namen von Globalen Variablenlisten, Funktionsbausteinen etc.)
  7. Baustein- oder Typnamen aus einer Bibliothek
  8. Namensräume von lokal angezogenen Bibliotheken und Bibliotheken, die von Bibliotheken veröffentlicht werden

Suchreihenfolge in der Bibliothek

Wenn der Compiler im Code einer Bibliothek auf einen einzelnen Bezeichner trifft, dann sucht er die zugehörige Deklaration in der folgenden Reihenfolge:

  1. Lokale Variablen einer Methode
  2. Lokale Variablen im Funktionsbaustein, Programm oder Funktion und in eventuellen Basis-Funktionsbausteinen
  3. Lokale Methoden des Bausteins
  4. Globale Variablen in der lokalen Bibliothek, wenn die Variablenliste, in der die globalen Variablen deklariert sind, nicht das Attribut 'qualified_only' gesetzt hat.
  5. Globale Variablen in angezogenen Bibliotheken, wenn weder die Bibliothek noch die Variablenliste qualifizierten Zugriff erfordert.
  6. Baustein- oder Typnamen aus der lokalen Bibliothek (das heißt: Namen von globalen Variablenlisten, Funktionsbausteinen etc.)
  7. Baustein- oder Typnamen aus einer angezogenen Bibliothek
  8. Namensräume von lokal angezogenen Bibliotheken und Bibliotheken, die von lokal angezogenen Bibliotheken veröffentlicht werden.

Uneindeutige Zugriffe und qualifizierte Zugriffe

Trotz dieser Suchreihenfolgen kann es zu uneindeutigen Zugriffen kommen. Das ist zum Beispiel der Fall, wenn eine Variable mit dem gleichen Namen in zwei globalen Variablenlisten vorkommt, die nicht qualifizierten Zugriff erfordern. Einen solchen Fall meldet der Compiler als Fehler (zum Beispiel: nicht eindeutige Verwendung des Namens <Variable>).

Eine solche uneindeutige Verwendung lässt sich durch einen qualifizierten Zugriff, also beispielsweise durch den Zugriff über den Namen der globalen Variablenliste, eindeutig machen (zum Beispiel: GVL.<Variable>).

Ein qualifizierter Zugriff lässt sich auch immer dazu nutzen, um Verschattungsregeln zu umgehen.

Um jederzeit die Deklarationsstelle eines Bezeichners zu finden, wählen Sie den Befehl Gehe zur Definition, der im Kontextmenü des Editorfensters zur Verfügung steht. Dies kann insbesondere dann hilfreich sein, wenn der Compiler eine scheinbar unverständliche Fehlermeldung produziert.

Suchen in Instanzpfaden

Die oben beschriebenen Suchreihenfolgen gelten nicht für Bezeichner, die in einem Instanzpfad als Komponente auftauchen, oder für Bezeichner, die als Eingänge in Aufrufen verwendet werden.

Für einen Zugriff der Art yy.Komponente hängt es von der Entität ab, die durch yy beschrieben wird, wo nach der Deklaration von Komponente gesucht wird.

Erst in zweiter Instanz entscheidet der Compiler, ob der Zugriff auf das gefundene Element erlaubt ist, das heißt, ob die Variable möglicherweise nur lokal zugreifbar ist, oder ob eine Methode privat ist. Wenn der Zugriff nicht erlaubt ist, wird ein Fehler ausgegeben.

Siehe auch: