Indirekte Adressierung !

max1de

Level-1
Beiträge
45
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
An alle Experten und Liebhaber der Indirekten Adressierung !

Habe mir mal ein Programm geschrieben das erst einmal nur einen DB mit einer Indirekten Adressierung auslesen kann. (hier einfach nur db82.db1).

Problem: Es funktioniert! ...und warum ???

Kann mir einer genau beschreiben was das Programm macht???


L 1 //die indirekte Adresse
T MB 8
L MB 8
L 2
*I
SLW 2
T #zaehler
AUF DB 82
L DBW [#zaehler]
T MW 13
 
Pointer

Hi,
L 1 //die indirekte Adresse: falsch!
T MB 8
L MB 8 // AKKU1:hier steht 1
L 2 // AKKU2:hier steht 1 / AKKU1:hier steht 2
*I // AKKU1: da steht jetzt 2 (1*2 = 2) , Binär xxxx0010
SLW 2 // schiebe zweimal nach links, Binär xxx1000
T #zaehler // wenn der #zaehler 32 Bit lang ist, ist es jetzt der POINTER, zeigt auf Adresse 1.0 !!!!!!!!
AUF DB 82
L DBW [#zaehler] // hier wird DB82.DBW1 gelesen!
T MW 13

Denn der Pointerformat Ist 'Bytenummer.Bitnummer', wobei für Bitnummer
sind 3 Stellen reserviert.

Also dass das bei dir funktioniert, ist reiner ZUFALL!

Gruss: Vladi
 
Pointer

Hi,
wenn Du eine Zahl in den AKKU geladen hast, und die 3x nach links
schiebst, hättest Du immer den Pointer auf Byteadresse.
Diesen dann in einem DWORD laden, und indirekt lesen/schreiben.

L 80
SLW 3
T DWORD

AUF DB82
L DBW[DWORD] // liest DB82.DBW80

Klaro, oder?

Gruss: V.
 
Indirekte Adressierung

Hallo max1de,
so "zufällig" ist das nun auch wieder nicht. Wenn man wissen will, wie die AWL genau arbeitet, schreibt man sich das Programm mit den jeweiligen "Zeilenergebnissen" als Tabelle. Habe das mal für dein Programm gemacht:

Code:
[FONT=Times New Roman][SIZE=3]AWL                         AKKU1    AKKU2  MB8    #Zaehler    MW13[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]L 1                            1               X            X         X               X[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]T MB8                      1               X            1          X               X[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]L MB8                      1               1             1          X               X[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]L 2                            2               1             1          X               X[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]*I                              2               1             1          X               X[/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3]SLW 2                      8               1             1          X               X[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]T #Zaehler                8               1             1          8                X[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]Auf DB82                 8               1             1          8                X[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]L DBW[#Zaehler]    DBW1      8             1          8                X[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]T MW13                   DBW1      8             1          8                DBW1[/SIZE][/FONT]
Die Variable #Zaehler wird als Pointer benutzt. Dabei werden die rechten 3 Bit als Bitadresse und die Übrigen als Byteadresse benutzt. Die Zahl 8 (dual 1000 entspricht also dem Pointer 1.0). Deshalb wird aus dem DB82 das DW1 geladen und nach MW13 transferiert. Es besteht aus den Bytes 1 und 2 des DB82. Musterprogramme für so etwas gibt es nicht.
 
so "zufällig" ist das nun auch wieder nicht.

Selbstverständlich ist bei einer SPS rein gar nichts zufällig, das wär ja das Schlimmste was passieren kann. Das aber max1de Daten bekommen hat ist schon eher zufällig, weil der Code, den er dazu geschrieben hat, wohl wirklich rein zufällig richtig war, das hat er ja erkannt und deshalb die Frage gestellt :ROFLMAO:. Aber die Links und Antworten sollten ihm das erklärt haben.
 
Zurück
Oben