STEP 7 – Indirekte Adressierung

15. August 2011 | Von | Kategorie: Automatisierungstricks

Für manchen erscheint die Indirekte Adressierung bei Step 7 als ein Buch mit sieben Siegeln. Dass es aber gar nicht so schwierig ist, möchte ich hier an einem Beispiel erläutern. Es gibt allerdings verschiedene Verfahren für das indirekte Adressieren, ich möchte allerdings nur 2 Varianten aufgreifen: Die Adressierung mit Pointer und den indirekten Aufruf eines Datenbausteins. Mit diesen beiden Varianten lassen sich die Möglichkeiten der indirekten Adressierung bereits voll ausschöpfen.

Zunächst mal eine Antwort auf die Frage, wozu überhaupt indirekt adressieren. Nehmen wir dieses Beispiel:

Eine Palettiermaschine muss eine Palette mit 10 Flaschenlagen packen. Da nicht alle Lagen die gleichen Kartonagen, bzw. Zwischenlagen erhalten, müssen die entsprechenden Daten für jede Lage in einem Datenbaustein hinterlegt sein. Um nicht das Programm für jede Lage einzeln schreiben zu müssen kann der Istwert des Lagenzählers zum Pointer gewandelt werden, um das für jede Lage gleiche Programm mit den Parametern aus dem Datenbaustein ablaufen zu lassen. Der Adresspointer besteht aus einem Wort (16 Bit). Die drei rechten Bits enhalten die Bit-Adresse, die übrigen die Byte-Adresse. Ein Pointer P#23.6 kann z.B. benutzt werden um den Eingang E 23.6 abzufragen oder den Ausgang A 23.6 zu setzen, oder in einem Datenbaustein das Datenbit DBX 23.6 auszulesen.

Doch nun zu unserem Beispiel:

L Z1   //Lagenzähler abfragen
L 2   //Daten liegen im WORD-Format vor benötigen also 2 Bytes
*I   //Multiplikation Zählwert x 2
SLW 3   //Pointer bilden, Wert im Akku um 3 Bits nach links verschieben
LAR1   //Pointer ins Adressregister 1 laden
AUF DB15   //Datenbaustein mit den Lagenparametern öffnen
L DBW[AR1,P#4.0]   //Datenbausteinwort aus Adressregister abfragen, mit DBW 4 beginnen
T MW50   //Übergabe Parameter an den Prozess

Nun möchte ich kurz erläutern, was hier passiert:

Der Istwert des Lagenzählers liegt als INT (16-bit Ganzzahl) vor. Da die abzufragenden Parameter (ab Datenwort 4 im DB15) immer auf 2 Bytes bereitstehen, also DBW4 (Lage 0), 6 (1. Lage), 8 (2. Lage), 10 ( 3. Lage) usw. müssen wir den Wert des Lagenzählers zunächst mit 2 multiplizieren. Nun muss der Wert noch zum Adresspointer gewandelt werden, damit z.B. der Wert 6 als P#6.0 erscheint und nicht als P#0.6 muss der Wert um 3 Bits nach links verschoben werden (Befehl: SLW 3). Dieser nun entstandene Pointer wird ins Adressregister AR1 geladen (Befehl: LAR1). Nach dem Öffnen des Datenbausteins kann nun auf das entsprechende Datenwort zugegriffen werden. Es wird das Datenwort geladen mit der Adresse aus dem Adressregister AR1 mit einem Versatz von 4.0. Nehmen wir die 3. Lage als Beispiel: Der Lagenzähler liefert den Wert 3, den wir mit 2 multiplizieren. Ins Adressregister AR1 laden wir nach dem Verschieben den Wert P#6.0. Wir laden also am Ende das Datenwort  DBW 10, welches sich aus dem Pointer P#6.0 (AR1) plus dem Versatz P#4.0 errechnet.

Das zweite Beispiel ist weniger komplex. Es wird ein Zahlenwert bereitgestellt, der angibt welcher Datenbaustein aufgeschlagen werden soll. Dieser Wert steht in MW 30. Nehmen wir an, es steht der Wert 24 [INT] darin. Mit dem Befehl „AUF DB[MW30]“ schlagen wir den Datenbaustein DB24 .

Ein weiteres Beispiel für indirekte Adressierung finden Sie in diesem Artikel:
http://dahlhoff-automation.de/wp/?p=30

 


Georg Dahlhoff
Automatisierungstechniker

Am Sportfeld 29
D-55278 Mommenheim / Rheinhessen

Kontakt: kontaktaufnahme.7E0@dahlhoff.com

Schlagworte: , , , ,

7 Kommentare auf "STEP 7 – Indirekte Adressierung"

  1. Mat sagt:

    vielen Dank für den Tippm, aber L DBW[AR1;P#4.0] ist falsch
    es muss L DBW[AR1,P#4.0] sein. Also Komma statt Semikolon

    • georg sagt:

      Das ist richtig! Vielen Dank für den Hinweis. Habe es soeben korrigiert.

      Gruß, G. Dahlhoff

  2. Serpi sagt:

    Hallo,
    ich vermute beim Pointer bilden sollte anstatt SLW3 SLD3 sein.
    Gruß
    Paul

    • Georg Dahlhoff sagt:

      Nein, anders als bei der S7-1200, wo zur Bildung eines Index immer ein DINT benötigt wird, funktioniert bei der S7-300 und S7-400 auch ein 16 Bit Integer-Wert zur Bildung eines Pointers.

      • Serpi sagt:

        Hallo Georg,
        ja hast du recht habe heute mit
        PLCSIM getestet beides funktioniert.
        Meiner Meinung nach sogar
        darf man beim bereichsübergreifender
        Adressierung keine SLD3 verwenden.
        Gruß
        Paul

        • Georg Dahlhoff sagt:

          Hallo Paul!
          Das Schieben um drei Bits nach links ist oft notwendig, weil die drei rechten Bits im Pointer immer die Bits der Pointeradresse abbilden. Möchte ich auf eine Byte-, Wort- oder Doppelwortadresse zugreifen, muss ich den Indexwert um die drei Stellen nach links verschieben, damit die Bitadresse .0 im Pointer steht.
          Herzliche Grüße, Georg

          • Serpi sagt:

            Hallo Georg,
            danke für deine Antwort.
            Ich habe leider zu viel Theorie und wenig
            Praktik :).Mit der Hochsprache geht es viel
            einfacher z.B. eine Zählschleife mit Array Elementen
            zu bilden.
            Ich weiß dass es im Step 7 einen Datentyp Array gibt .
            Kann man damit auch die Zählschleife wie etwa FOR ENDFOR
            bilden?
            Gruß
            Paul