Ein Pointer speichert zur Laufzeit die Speicheradresse von Objekten wie beispielsweise Variablen oder Funktionsbaustein-Instanzen.
Syntax der Pointer-Deklaration:
<pointer name>: POINTER TO <data type | data unit type | function block>;
Beispiel
FUNCTION_BLOCK FB_Point VAR piNumber: POINTER TO INT; iNumber1: INT := 5; iNumber2: INT; END_VAR piNumber := ADR(iNumber1); // piNumber is assigned to address of iNumber1 iNumber2 := piNumber^; // value 5 of iNumber1 is assigned to variable iNumber2 by dereferencing of pointer piNumber
Einen Pointer zu dereferenzieren bedeutet, den Wert zu erhalten, auf den der Pointer
zeigt. Ein Pointer wird dereferenziert, indem der Inhaltsoperator ^
an den Pointer-Bezeichner angehängt wird, beispielsweise piNumber^
im oben gezeigten Beispiel. Um einem Pointer die Adresse eines Objekts zuzuweisen,
wird auf das Objekt der Adressoperator ADR
angewendet: ADR(iNumber1)
Im Onlinebetrieb können Sie mit dem Befehl „Bearbeiten Symbol suchen Gehe zu Referenz“ von einem Pointer zur Deklarationsstelle des referenzierten Objekts springen.




HINWEIS

Wenn ein Pointer auf einen E/A-Eingang zeigt, gilt der Zugriff als schreibender Zugriff. Dies führt bei der Codeerzeugung
zur Compilerwarnung „'<pointer name >' ist kein gültiges Zuordnungsziel“. Beispiel: pwInput := ADR(wInput);
Wenn Sie ein Konstrukt dieser Art benötigen, müssen Sie den Eingangswert (wInput
) zuerst auf eine Variable mit Schreibzugriff kopieren.
Indexzugriff auf Pointer
CODESYS erlaubt den Indexzugriff []
auf Variablen vom Typ POINTER TO
, ebenso wie auf die Datentypen STRING
oder WSTRING
.
Auf die Daten, auf die der Pointer zeigt, kann auch zugegriffen werden, indem der
Klammeroperator []
an den Pointer-Bezeichner angehängt wird, beispielsweise piData[i]
. Der Basisdatentyp des Pointers bestimmt den Datentyp und die Größe der indizierten
Komponente. Der Indexzugriff auf den Pointer erfolgt dabei arithmetisch, indem zur
Adresse des Pointers der indexabhängige Offset i * SIZEOF( <base type> )
addiert wird. Gleichzeitig wird der Pointer implizit dereferenziert.
Berechnung: piData[i] := (piData + i * SIZEOF(INT))^;
Das ist nicht: piData[i] != (piData + i)^
Indexzugriff STRING
Wenn Sie den Indexzugriff bei einer Variablen vom Typ STRING
verwenden, erhalten Sie das Zeichen am Offset des Indexausdrucks. Das Ergebnis ist
vom Typ BYTE
. Beispielsweise gibt sData[i]
das i-te Zeichen der Zeichenkette sData
als SINT
(ASCII) zurück.
Indexzugriff WSTRING
Wenn Sie den Indexzugriff bei einer Variablen vom Typ WSTRING
verwenden, erhalten Sie das Zeichen am Offset des Indexausdrucks. Das Ergebnis ist
vom Typ WORD
. Beispielsweise gibt wsData[i]
das i-te Zeichen der Zeichenkette als INT
(Unicode) zurück.
Pointer subtrahieren
Das Ergebnis der Differenz zweier Pointer ist ein Wert vom Typ DWORD
, auch auf
64-Bit-Plattformen, wenn die Pointer 64-Bit-Pointer sind.
Die Verwendung von Referenzen hat den Vorteil dass Typsicherheit garantiert ist. Das ist bei Pointern nicht der Fall.
Der Speicherzugriff von Pointern während der Laufzeit kann durch die implizite Überwachungsfunktion
CheckPointer
geprüft werden.