kostenfreier technischer Support

  kostenfreier Versand in DE

  kostenfreie Softwaredownloads

  für Geschäftskunden

Indirekte Adressierung von SPS Variablen in XCPpro


Variablen in der Thinget XC-Steuerung lassen sich auch indirekt adressieren. Indirekte Adressierung bedeutet, dass man die Variablenadresse in einem Befehl nicht fest setzt, sondern über eine Startadresse und einen Index (Pointer).

Indirekte Adressierung ist oft nützlich, zum Beispiel dort, wo mehrere gleiche Elemente mit ähnlichen Funktionen vorhanden sind.

In XCPPro wird der Index in eckigen Klammern hinter die Variable geschrieben z.B. Y0[D0], M10[D5], D10[D100]

Ein Beispiel:
Eine Waschanlage für Gemüse hat 4 Ventile für Segmente von Wasserdüsen entlang einer Förderstrecke. Die Ventile werden über die Ausgänge Y0 - Y3 gesteuert. Abhängig von der Position einer Gemüsekiste soll nur das jeweilige Segment das Gemüse mit Wasser besprühen, das auch gerade über der Gemüsekiste ist. Damit soll Wasser gespart werden. Die Position (0-3) der Gemüsekiste wird in der Variable D0 vorgehalten.

Im SPS-Progrann werden die Ventile über die Befehle ZRST Y0 Y3 (Zurücksetzen aller Ventile) und OUT Y0[D0] sehr einfach positionsabhängig geöffnet und geschlossen (siehe Bild).

Da die Ausgänge erst am Ende des SPS-Zyklus gesetzt werden, führt das Reset am Anfang nicht dazu, dass die Ventile ständig öffnen und schließen. Nur das Ventil des jeweils aktiven Segments bleibt offen und schließt automatisch, wenn das Segment nicht mehr das aktive ist.

Indirekte Adressierung in der Thinget SPS funktioniert für viele Variablen, z.B. für Bit-Variablen wie Merker, Eingänge oder Ausgänge aber auch für Word-Variablen wie Register (D). Auch Zähler und Timer können indirekt adressiert werden.

Ein weiteres Beispiel:
Befehl ADD D100 D10[D0] D100
Werte D0 = 5, D10 = 4, D15 = 20, D100 = 100
Was passiert nach einmaliger Ausführung des Befehls?
D100 hat den Wert 120. Es wird zu D100 der Inhalt von D10[5] also D15 addiert und in D100 abgespeichert.

Ein Hinweis zu Flanken: Positive und negative Flanken (z.B. von Eingängen) lassen sich mit indirekter Adressierung nicht richtig überwachen (Befehle LDP oder LDI). Ändert sich nämlich der Wert, weil sich der Indexwert geändert hat, wird das vom Programm als Flanke interpretiert. Beispiel: Eingänge mit X0 = 0 und X1 = 1. Im Programm wird über LDP X0[D0] die Flange überwacht. Ändert sich nun der Wert von D0 von 0 auf 1, dann reagiert die positive Flanke, obwohl sich die Werte X0 und X1 nicht geändert hat. Allerdings hat sich ja der Wert des Ausdrucks X0[D0] geändert. 

Euer spstiger