EcoStruxure Machine Expert Version 1.1 unterstützt nicht die Controller M258, LMC058 und LMC078.

Zeiger

Überblick

Als Erweiterung der Norm IEC 61131-3 können Zeiger verwendet werden.

Zeiger speichern Adressen, während ein Anwendungsprogramm läuft. Ein Zeiger kann auf eine Variable mit jeglichem Datentyp verweisen. Die Möglichkeit der Verwendung einer Überwachungs­funktion für implizite Zeiger wird weiter unten in Paragraf CheckPointer-Funktion beschrieben.

Syntax einer Zeigerdeklaration

<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.

Beispiel

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; *)

Funktion Zeiger

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 Anwendung 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 Ansicht > Eigenschaften... > Übersetzen) 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 Online Change kann zu einer Änderung des Inhalts von Adressen führen.

Caution_Color.gifVORSICHT

UNGÜLTIGER ZEIGER

Überprüfen Sie die Gültigkeit der Zeiger, wenn Sie Zeiger für Adressen verwenden und den Befehl „Online Change“ ausführen.

Die Nichtbeachtung dieser Anweisungen kann Verletzungen oder Sachschäden zur Folge haben.

Indexzugriff auf Zeiger

Als eine Erweiterung der Norm IEC 61131-3, ist der Indexzugriff [] auf Variablen des Typs POINTER, STRING und WSTRING erlaubt.

opint[i] gibt den Basisdatentyp wider.

oDer 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.

Ziehen Sie pint[7] does not equate to (pint + 7)^ in Betracht.

oWenn 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. str[i] wird das i-te Zeichen des Strings als ein SINT wiedergeben (ASCII).

oWenn 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. wstr[i] wird das i-te Zeichen des Strings als ein INT wiedergeben (Unicode).

HINWEIS: Es besteht auch die Möglichkeit, Referenzen zu verwenden, die sich im Gegensatz zu einem Zeiger direkt auf einen Wert auswirken.

CheckPointerFunktion

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 Anwendung POU für implizite Prüfungen (Objekt) hinzufügen. Aktivieren Sie das Kontrollkästchen der Kategorie Zeiger-Checks.

HINWEIS: Sie müssen die CheckPointer-Funktion während der Inbetriebnahme der Maschine implementieren, um zu verifizieren, dass der bereitgestellte Zeiger sich auf eine gültige Speicheradresse bezieht, und ob die Anordnung des referierten Speicherbereichs zum Datentyp der Variable passt, auf den der Zeiger verweist.

CheckPointer überwacht Variablen des Typs REFERENCE TO auf vergleichbare Weise.

HINWEIS: Für den 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:

optToTest: Zieladresse des Zeigers

oiSize: 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.

oiGran: Granularität des Zugriffs, d. h. der größte nichtstrukturierte, in der referenzierten Variablen verwendete Datentyp iGran muss integerkompatibel sein.

obWrite: Zugriffsart (TRUE= Schreibzugriff, FALSE= Lesezugriff); der Datentyp von bWrite muss BOOL sein.

Implementierung der 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 Systemlaufzei­tausnahme und dem Schreiben eines Aufrufstapels 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

Implementierung der 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).