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:
- Lokale Variablen einer Methode
- Lokale Variablen im Funktionsbaustein, Programm oder Funktion und in eventuellen Basisfunktionsbausteinen
- Lokale Methoden des Bausteins
- Globale Variablen im Projekt, wenn in der Variablenliste, in der die globalen Variablen deklariert sind, nicht das Attribut 'qualified_only' gesetzt ist.
- Globale Variablen in angezogenen Bibliotheken, wenn weder die Bibliothek noch die Variablenliste qualifizierten Zugriff erfordert.
- Baustein- oder Typnamen aus dem Projekt (das heißt: Namen von Globalen Variablenlisten, Funktionsbausteinen etc.)
- Baustein- oder Typnamen aus einer Bibliothek
- 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:
- Lokale Variablen einer Methode
- Lokale Variablen im Funktionsbaustein, Programm oder Funktion und in eventuellen Basis-Funktionsbausteinen
- Lokale Methoden des Bausteins
- Globale Variablen in der lokalen Bibliothek, wenn die Variablenliste, in der die globalen Variablen deklariert sind, nicht das Attribut 'qualified_only' gesetzt hat.
- Globale Variablen in angezogenen Bibliotheken, wenn weder die Bibliothek noch die Variablenliste qualifizierten Zugriff erfordert.
- Baustein- oder Typnamen aus der lokalen Bibliothek (das heißt: Namen von globalen Variablenlisten, Funktionsbausteinen etc.)
- Baustein- oder Typnamen aus einer angezogenen Bibliothek
- 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.
- Mit dem Namen der globalen Variablenliste kann eindeutig auf eine Variable in dieser Liste zugegriffen werden.
- Mit dem Namen einer Bibliothek kann eindeutig auf Elemente in dieser Bibliothek zugegriffen werden.
- Mit dem Pointer THIS kann eindeutig auf Variablen in einem Funktionsbaustein zugegriffen werden, auch wenn eine lokale Variable mit gleichem Namen in einer Methode des Funktionsbausteins existiert.
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.
- Wenn
yy
eine Variable mit strukturiertem Datentyp bezeichnet (also vom Typ STRUCT oder UNION), dann wirdKomponente
in dieser Reihenfolge gesucht: - Lokale Variablen des Funktionsbausteins
- Lokale Variablen des Basis-Funktionsbausteins
- Methoden des Funktionsbausteins
- Methoden des Basis-Funktionsbausteins
- Wenn
yy
eine globale Variablenliste bezeichnet oder ein Programm, dann wirdKomponente
nur in dieser Liste gesucht. - Wenn
yy
einen Namensraum einer Bibliothek bezeichnet, dann wirdKomponente
in dieser Bibliothek genauso gesucht, wie es im obigen Abschnitt „Suchreihenfolge in der Bibliothek“ beschrieben ist.
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: