Step 7 Anfängerfrage indirekte Adressierung Array (AWL)

Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,
ich habe mal eine Frage zum Zugriff auf ein Array („Meld“), bestehend aus Wörtern (Array [0..49] of Word).
Dieses Array ist in meinem FB als statische Variable vorhanden. Da sich in diesem Array eine wechselnde Anzahl von Meldungen befinden, möchte ich indirekt adressiert (in AWL!) auf diese zugreifen. Ich habe ein sehr gutes Beispiel hierzu unter folgendem Link gefunden: http://www.sps-forum.de/simatic/6166-indirekte-adressierung-array.html
In diesem Beispiel befindet sich das Array im Temp-Bereich des FBs und kann somit mit LW (Local-Word) aufgerufen werden.
Code:
L LW [AR1,P#0.0]

Aber wie funktioniert dieser Aufruf bei meinem Array („Meld“)?
Code:
L Meld[AR1,P#0.0] // So geht’s nicht!

Vielen Dank für eure Hilfe!!
 
Code:
L Meld[AR1,P#0.0] // So geht’s nicht!
Erstens fehlt eine Größenangabe (B/W/D) für den Ladebefehl oder meinst Du, Deine CPU könnte das komplette Array "Meld" in den AKKU1 laden? ;)

Zweitens: Indirekte Adressierung in AWL kann nicht mit Symbolen umgehen, sie adressiert immer absolut.
Um wenigstens halbwegs symbolisch das Array "Meld" zu adressieren, kann man die Anfangsadresse des Arrays "Meld" in das Adressregister laden, z.B.
Code:
LAR1 P##Meld         //Anfangsadresse des Arrays "Meld" in AR1 laden
L    W [AR1,P#0.0]   //erstes Word aus dem Array in den AKKU1 laden (von Adresse Meld+0)

PS: das Hantieren mit Arrays geht in SCL viel einfacher und sogar symbolisch.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,

danke für deine Antwort. (Ich glaube, ich saß schon zu lange vorm Rechner! :D )

Aber ich habe dennoch eine Frage. Könntest du mir vielleicht erklären wie das mit den den folgenden Zeilen funktioniert? Ich weiß nicht wirklich, warum P#2.0 mit dem eigentlichen zugriffsbyte multipliziert werden muss. (Original Code unter: http://www.sps-forum.de/simatic/6166-indirekte-adressierung-array.html )


Code:
NETWORK
TITLE =Pointer bilden
 
      L     P#2.0; //Pointer mit 2 Byte laden
      L     MB    50; //Index
      *D     
      LAR1

Vielen Dank im Voraus!
 
Interessant! Hab ich so auch noch keinen machen sehen, funktioniert aber.

Vom Prinzip her steckt hinter P#2.0 auch nur eine gewöhnliche Zahl (müsste dez16 sein), wenn man die dann mit 50 (Annahme für MB50) multipliziert
bekommt man dez800 was P#100.0 entspricht.

Insofern sind arithmetische Operationen mit Pointern kein Problem, sofern richtig gemacht.
L P#2.0
L L#50
+D
....... liefert zum Beispiel nicht das Ergebnis P#52.0

Üblicher (für mich halt) ist es bei solchen Dingen eher wenn man zunächst mittels Berechnung die gewünschte Byteadresse bestimmt und diese dann
mittels SLD 3 in eine Pointer wandelt und dann ins AR1 lädt.

Aber wie gesagt funktioniert so auch problemlos und auch kürzer.

EDIT: Des weiteren gibt es falls du dich für indirekte Adressierung interessierst 2 hervorragende FAQ-Beiträge Pointer Zeiger FIFO LIFO und dann die Fortsetzung Any-Zeiger für Datentypen.
 
Zuletzt bearbeitet:
Zurück
Oben