Als Erweiterung der Norm IEC 61131-3 können Zeiger verwendet werden.
Zeiger speichern Adressen, während ein Applikationsprogramm läuft. Ein Zeiger kann auf eine Variable eines beliebigen Datentyps oder auf eine Funktionsbausteininstanz verweisen. Die Möglichkeit der Verwendung einer Überwachungsfunktion für implizite Zeiger wird weiter unten in Paragraf CheckPointer-Funktion beschrieben.
<identifier>: POINTER TO <data type>;
Den Verweis eines Zeigers aufzuheben bedeutet, dass der Wert, der derzeit unter der Adresse, auf die der Zeiger zeigt, gespeichert ist, zurückgegeben wird. Der Verweis eines Zeigers kann aufgehoben werden, indem der Inhaltsoperator ^ (ASCII-Einschaltungszeichen oder Zirkumflex) an den Zeigerbezeichner angefügt wird. Siehe pt^
im unteren Beispiel.
Mit Hilfe des Adressenoperators ADR
address operator kann die Adresse einer Variablen einem Zeiger zugewiesen werden.
'<pointer name >' is not a valid assignment target
aus.
Beispiel: pwInput := ADR(wInput);
Um zu verhindern, dass der Compiler einen derartigen Fehler erkennt, kopieren Sie den Eingangswert (wInput) in eine Variable mit Schreibzugriff.
VAR
pt:POINTER TO INT; (* of pointer pt *)
var_int1:INT := 5; (* declaration of variables var_int1 and var_int2 *)
var_int2:INT;
END_VAR
pt := ADR(var_int1); (* address of var_int1 is assigned to pointer pt *)
var_int2:= pt^; (* value 5 of var_int1 gets assigned to var_int2 via dereferencing of pointer pt; *)
Im Online-Modus können Sie von einem Zeiger zum Deklarationsort der referenzierten Variablen springen. Führen Sie dazu den Befehl SoMMenu/index.htm aus.
EcoStruxure Machine Expert unterstützt außerdem Funktionszeiger. Diese Zeiger können an externe Bibliotheken übergeben werden, aber es besteht keine Möglichkeit, einen Funktionszeiger innerhalb einer Applikation im Programmiersystem aufzurufen. Die Laufzeitfunktion für die Registrierung von Callback-Funktionen (Systembibliotheksfunktion) erwartet den Funktionszeiger, und, je nach Callback, für den die Registrierung angefordert wurde, wird die entsprechende Funktion implizit vom Laufzeitsystem aufgerufen (z.B. bei STOP). Damit solch ein Systemaufruf möglich ist (Laufzeitsystem), müssen die entsprechenden Eigenschaften (standardmäßig unter ) für das Funktionsobjekt gesetzt werden.
Der ADR
-Operator kann auf Funktionsnamen, Programmnamen, Funktionsbausteinnamen und Methodennamen verwendet werden. Weil Funktionen nach einer Online-Änderung verschoben werden können, ist das Ergebnis nicht die Adresse der Funktion, sondern die Adresse eines Zeigers auf die Funktion. Diese Adresse ist gültig, solange die Funktion auf dem Ziel existiert.
Die Ausführung des Befehls
kann zu einer Änderung des Inhalts von Adressen führen.VORSICHT | |
---|---|
Als eine Erweiterung der Norm IEC 61131-3, ist der Indexzugriff []
auf Variablen des Typs POINTER, STRING und WSTRING erlaubt.
[i]
gibt den Basisdatentyp wider.
Der Indexzugriff auf Zeiger ist arithmetisch:
Wenn der Indexzugriff auf eine Variable des Typs Zeiger angewendet wird, entspricht der Offset pint[i]
(pint + i * SIZEOF(base type))^
. Der Indexzugriff führt zudem eine implizite Verweisaufhebung auf den Zeiger durch. Der Ergebnistyp ist der Basistyp des Zeigers.
Beachten Sie Folgendes: pint[7] does not equate to (pint + 7)^
.
Wenn der Indexzugriff auf eine Variable vom Typ STRING verwendet wird, dann ist das Ergebnis das Zeichen bei Offset index-expr
. Das Ergebnis ist vom Typ BYTE. [i]
wird das i-te Zeichen des Strings als ein SINT wiedergeben (ASCII).
Wenn der Indexzugriff auf eine Variable vom Typ WSTRING verwendet wird, dann ist das Ergebnis das Zeichen bei Offset index-expr
. Das Ergebnis ist vom Typ WORD. [i]
wird das i-te Zeichen des Strings als ein INT wiedergeben (Unicode).
CheckPointer
-Funktion
Um den Zeigerzugriff während der Laufzeit zu überwachen, können Sie die implizite Überwachungsfunktion CheckPointer verwenden. Sie können dies anpassen, wenn erforderlich. Dafür müssen Sie der Applikation das Objekt hinzufügen. Aktivieren Sie das Kontrollkästchen der Kategorie .
CheckPointer überwacht Variablen des Typs REFERENCE TO auf vergleichbare Weise.
THIS
-Zeiger gibt es keinen impliziten Aufruf der Prüffunktion.
Vorlage:
Deklarationsteil:
// Implicitly generated code : DO NOT EDIT
FUNCTION CheckPointer : POINTER TO BYTE
VAR_INPUT
ptToTest : POINTER TO BYTE;
iSize : DINT;
iGran : DINT;
bWrite: BOOL;
END_VAR
Beim Aufruf erhält die Funktion folgende Eingangsparameter:
ptToTest
: Zieladresse des Zeigers
iSize
: Größe der referenzierten Variablen; der Datentyp von iSize
muss integerkompatibel sein und muss die maximale potentielle Größe der an der Zeigeradresse gespeicherten Daten abdecken.
iGran
: Granularität des Zugriffs, d. h. der größte nichtstrukturierte, in der referenzierten Variablen verwendete Datentyp iGran
muss integerkompatibel sein.
bWrite
: Zugriffsart (TRUE= Schreibzugriff, FALSE= Lesezugriff); der Datentyp von bWrite
muss BOOL sein.
CheckPointer
-Funktion für Steuerungen des Typs PacDrive
Die Implementierung der CheckPointer-Funktion für Steuerungen des Typs PacDrive (PacDrive LMC Eco / PacDrive LMC Pro/Pro2) dient der Generierung einer Systemlaufzeitausnahme und dem Schreiben einer Aufrufliste in den Meldungslogger, wenn die Speicheradresse oder die Ausrichtung nicht gültig ist.
Implementierungsteil:
CheckPointer := ptToTest;
IF ptToTest = 0 THEN
FC_DiagMsgWrite(4, 'CP = 0');
FC_SysUserCallStack(0);
ELSE
CheckPointer := ptToTest;
END_IF
CheckPointer
-Funktion für Steuerungen des Typs Optimized Controller
Die Implementierung der CheckPointer-Funktion für Optimized Controller (z. B. Modicon M241 Logic Controller) dient der Rückgabe des übergebenen Zeigers.
Implementierungsteil (unvollständig):
// No standard way of implementation. Fill your own code here
CheckPointer := ptToTest;
Im Fall eines positiven Prüfergebnisses wird der unveränderte Eingangszeiger zurückgegeben (ptToTest
).