Betrifft welche Produkte?
ESP-DDS2-P (Global Drive PLC Developer Studio Version 2.0, 2.1)
Wie sieht die Reaktion aus?
Die Datenspeicheradresse einer Variablen vom Datentyp ARRAY wird einer Variablen vom Datentyp POINTER TO ARRAY zugewiesen. Wird nun mit Hilfe dieser POINTER-Variablen der Wert eines Elementes dieses Arrays ausgelesen, dann werden falsche Werte ermittelt, z.B. -32760.
Beispiel:
Deklaration
anVar:ARRAY[0..10] OF INT;
pnVar:POINTER TO ARRAY[0..10] OF INT;
nVar:INT;
Implementation:
anVar[1]:=1234; (*Wert dem zweiten Element des Arrays zuweisen*)
pnVar:=ADR(anVar); (*Datenspeicheradresse des Arrays ermitteln*)
nVar:=pnVar^[1]; (*nVar = -32760*)
Wann tritt das Problem auf?
Das oben beschriebene Verhalten tritt bei Pointer-Zugriffen auf Array-Elemente mit konstantem Index auf.
Im Beispiel von oben wird in der Zeile nVar:=pnVar^[1]; auf das Array-Element mit dem konstanten Index 1 zugegriffen.
Diagnosemöglichkeiten?
keine
Kurzfristige Maßnahmen/Empfehlungen?
Vermeiden Sie die Verwendung von Pointern in SPS-Programmen.
Falls Pointer zwingend erforderlich sind, adressieren Sie ein Array-Element der Pointer-Variablen nur indirekt.
Beispiel:
Implementation:
anVar[1]:=1234; (*Wert dem zweiten Element des Arrays zuweisen*)
pnVar:=ADR(anVar); (*Datenspeicheradresse des Arrays ermitteln*)
nIndex:=1; (*Indirekte Adresse des Array-Elements*)
nVar:=pnVar^[nIndex]; (*nVar = 1234*)
Diese Funktionseinschränkung ist mit der DDS Version 2.2 behoben.
Bewertung:
Lenze empfiehlt, die Verwendung von Pointern in SPS-Programmen soweit wie möglich zu vermeiden. Pointer-Variablen werden daher eher selten eingesetzt. Werden Pointer-Variablen auf die oben beschriebene Weise eingesetzt, wird diese Funktionseinschränkung spätestens bei der Inbetriebnahme der Maschine/ Anlage erkannt.