Grundlegendes zur indirekten Adressierung

ms25

Level-1
Beiträge
11
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
Ich hab ein paar grundlegende Fragen zur indirekten Adressierung in AWL:

1. Warum geht:
L DB30.DBW45
und
L DB30.DBW[MD20] nicht
aber
L DBW[MD20] geht wieder
==>Ein Zeiger hat 32 Bit.

Nun möchte ich im FB einen eigenen Zeiger deklarieren, der im Programm dynamisch hochgezählt wird.
Beispiel:
Variablenansicht: STAT: #zeiger (Datentyp DWord bzw. DINT)

Und warum geht dann
L DBW[#zeiger] nicht?

3. Wie funktioniert die Umwandlung eines Integerwertes ins Zeigerformat?
Beispiel: Möchte das DB-Doppelwort an der Adresse 20 auslesen.

Habe schon folgendes erfolglos probiert:
...
AUF DB30 //DB aufschlagen
L #zeiger //Hier steht jetzt "20" (dezimal) drin
LAR1 //#zeiger ins Adressregister 1
L DBD[ar1,p#0.0] //AR1 mit 0.0Bit Offset
...
Wenn ich den Zeiger erst mit 32 multipliziere (32Bit) also (640 dezimal) gehts nicht.
Und wenn ich das ganze im Hex-Format mache gehts auch nicht.
???

Ich denke, mir fehlen da ein paar Grundlagen, versuche gerade, mir das Ganze selbst beizubringen.
Wäre nett, wenn ihr mir ein paar Tips geben könntet.
Danke!
 
Antwort zu 1:
Musst du Siemens fragen.

Antwort zu 2:
Step 7 akzeptiert keine "Pointer" im STAT-Bereich, normalerweise schreibt man den eigentlichen Pointer in den TEMP-Bereich,
oder arbeitet mit den Adressregistern.

Antwort zu 3:
Sollte so funktionieren:
Code:
AUF DB30                                     //DB aufschlagen
L #zeiger                                     //Hier steht jetzt "20" (dezimal) drin
[B]SLD 3[/B]
LAR1                                           //#zeiger ins Adressregister 1
L DBD[ar1,p#0.0]                          //AR1 mit 0.0Bit Offset
Im Pointerformat sind die 3 Rechten Bits praktisch die Bit-Adresse.
Darum das SLD 3.

Mfg
Manuel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!
ms25 schrieb:
3. Wie funktioniert die Umwandlung eines Integerwertes ins Zeigerformat?
Beispiel: Möchte das DB-Doppelwort an der Adresse 20 auslesen.

Habe schon folgendes erfolglos probiert:
...
AUF DB30 //DB aufschlagen
L #zeiger //Hier steht jetzt "20" (dezimal) drin
LAR1 //#zeiger ins Adressregister 1
L DBD[ar1,p#0.0] //AR1 mit 0.0Bit Offset
...
Wenn ich den Zeiger erst mit 32 multipliziere (32Bit) also (640 dezimal) gehts nicht.
Und wenn ich das ganze im Hex-Format mache gehts auch nicht.
???

Der Zeiger ist so aufgebaut:
yyyyyyyyyyyyyyyyxxx
y=Byteadresse
x=Bitadresse

Wenn du einen Wert hast den du in Pointer umwandeln willst dann musst du den Wert um 3 Stellen nach links verschieben (mit SLD 3) Danach ist dein Wert die Byteadresse.
 
Zurück
Oben