Step 7 Indirekte Adressierung mit AWL

joe_bvb

Level-1
Beiträge
57
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich habe eine Aufgabe, die ich nicht lösen konnte:
Ein Datenbaustein DB100 soll mit Werten gefüllt werden. Der Datenbaustein soll eine Länge von 1000[INT] werten haben.
Der Inhalt soll gleich der Datenwortnummer sein z.B. DB100.DW0=0, DB100.DW2=2 usw.
Die Aufgabe soll in AWL gelöst werden mit Hilfe eines rekursiven Impuls.​
 
Das für dich richtige Stichwort ist "Pointer"
Hier gibt genug Anleitungen, daher einfach besser suchen als fragen


bike
 
Es gibt real keine S7-CPU, mit der Du diese Aufgabe rekursiv lösen könntest, da die Baustein-Schachtelungstiefe seeeehr begrenzt ist.

Harald
 
Vierlagig: Das habe ich selber nicht verstanden. aber ich würde die Aufgabe auch ohne rekursiven Impuls lösen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Guckst Du in der AWL-Hilfe unter "indirekte Adressierung". Ich empfehle die "Speicherindirekte Adressierung".

Lösung ohne rekursiv:
Mache eine Schleife von 0 bis 999. Der Schleifenindex * 2 ist der Wert, der in das DBW geschrieben werden soll. Der Schleifenindex * 16 ist die DBW-Adresse ( T DBW [#DW_Address] )

Wer denkt sich solche unverständlichen und vielleicht sogar unmöglichen ("rekursiv") Aufgaben aus???

Harald
 
Guckst Du in der AWL-Hilfe unter "indirekte Adressierung". Ich empfehle die "Speicherindirekte Adressierung".

Lösung ohne rekursiv:
Mache eine Schleife von 0 bis 999. Der Schleifenindex * 2 ist der Wert, der in das DBW geschrieben werden soll. Der Schleifenindex * 16 ist die DBW-Adresse ( T DBW [#DW_Address] )

Wer denkt sich solche unverständlichen und vielleicht sogar unmöglichen ("rekursiv") Aufgaben aus???

Harald

Die Lösung habe nicht ganz verstanden (Wie mache ich die Schleife in AWL). Ich bin total neu in der SPS
 
Die Lösung habe nicht ganz verstanden (Wie mache ich die Schleife in AWL). Ich bin total neu in der SPS

AUF "DB_AUFGABE_1" //Global Datenbaustein DB100
L P#0.0
T MD 10
L 0
T MW 30
hier: T DBW [MD 10]
L MW 30
L 2
+I
L MD 10
L P#2.0
+D
T MD 10
L MW 30
L 2
+I
T MW 30
LOOP hier

Das ist der Ansatz, den ich gemacht habe aber hat nicht funktioniert
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Guckst Du in der AWL-Hilfe unter "indirekte Adressierung". Ich empfehle die "Speicherindirekte Adressierung".

Lösung ohne rekursiv:
Mache eine Schleife von 0 bis 999. Der Schleifenindex * 2 ist der Wert, der in das DBW geschrieben werden soll. Der Schleifenindex * 16 ist die DBW-Adresse ( T DBW [#DW_Address] )

Wer denkt sich solche unverständlichen und vielleicht sogar unmöglichen ("rekursiv") Aufgaben aus???

Harald

AUF "DB_AUFGABE_1" //Global Datenbaustein DB100
L P#0.0
T MD 10
L 0
T MW 30
hier: T DBW [MD 10]
L MW 30
L 2
+I
L MD 10
L P#2.0
+D
T MD 10
L MW 30
L 2
+I
T MW 30
LOOP hier

Das ist der Ansatz, den ich gemacht habe aber hat nicht funktioniert
 
Zuletzt bearbeitet:
Hallo Joe,

du vermischt die Adressierung über Pointer (L P#0.0) mit der Speicherindirekten Adressierung (T DBW [MD 10]).
Versuchs mal mit L 0 bzw. L 2 statt L P#0.0/L P#2.0.
Und dann lies noch mal die Beiträge durch, auf die Volker in #7 verlinkt hat.

Grüße
Gebs
 
Hallo Joe,

du vermischt die Adressierung über Pointer (L P#0.0) mit der Speicherindirekten Adressierung (T DBW [MD 10]).
Versuchs mal mit L 0 bzw. L 2 statt L P#0.0/L P#2.0.
Und dann lies noch mal die Beiträge durch, auf die Volker in #7 verlinkt hat.

Grüße
Gebs

Ich habe es versucht. Das ging nicht
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Joe,

ich hab' leider nur auf die Adressierung geguckt.
Deine Schleife ist auch noch nicht ganz in Ordnung:
Wenn Du LOOP benutzt, brauchst Du natürlich noch einen Schleifenzähler.
Du kannst aber auch statt des LOOPs einen bedingten Sprung verwenden.
Dazu musst Du Das MW 30 mit dem höchst möglichen Wert vergleichen.

Grüße
Gebs
 
Joe macht das schon total richtig. Auch bei Speicherindirekter Adressierung wird mit Pointer P#.. gearbeitet. Und die Beiträge von Volker verkomplizieren das ganze nur unnötig...

@joe_bvb
Dein Fehler ist die Verwendung von LOOP. LOOP ist für herunterzählende (decrementierende) Schleifen gemacht, Deine Schleife arbeitet aber hochzählend (incrementierend). Entweder Du nimmst statt LOOP einen Vergleich, ob MW30 >= 1000 (oder 2000?) ist und wenn nicht einen Sprung zurück zum Schleifenanfang, oder Du nimmst noch eine zusätzliche Zählvariable nur für das LOOP, welche mit 1000 anfängt und durch den LOOP-Befehl heruntergezählt wird.

Harald
 
Joe macht das schon total richtig. Auch bei Speicherindirekter Adressierung wird mit Pointer P#.. gearbeitet.

Stimmt!
Ich bin noch nicht ganz wach! (Bin gerade erst aufgestanden:p! Habe endlich Urlaub:ROFLMAO:)
Ich sollte erst dann Beiträge schreiben, wenn ich den 1. Liter Kaffee getrunken habe!

Grüße
Gebs
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
AUF "DB_AUFGABE_1" //Global Datenbaustein DB100
L P#0.0
T MD 10
L 0
T MW 30

hier: T DBW [MD 10]
// L MW 30
// L 2
// +I


L MD 10 //Adresspointer um P#2.0 eine Wordadresse weiterstellen
L P#2.0
+D
T MD 10

L MW 30 //Wertzähler um 2 erhöhen
L 2
+I
T MW 30
L 2000
<I
TAK //MW30 zurück in AKKU1
SPB hier

// LOOP hier
.

Harald
 
Ich habe die Aufgabe jetzt so verbessert:


Anf: AUF "DB_AUFGABE_1" //Global Datenbaustein DB100
L 0
T MD 10
L 0
T MW 30
hier: T DBW [MD 10]
// L MW 30 Das hier kann weg.
// L 2
// +I

L MD 10
L P#2.0
+D
T MD 10
L MW 30
L 2
+I
T MW 30
L MW 30
L 1000
>=I
SPB Anf
SPA hier

Es sieht fast gut aus.
Wenn Du bei MW 30 >= 1000 auf Anf springst, wirst Du den Baustein nie verlassen! => Zykluszeitüberschreitung
Entweder springst Du an dieser Stelle hinter "SPA hier", oder
Du vergleichst MW 30 auf <= 1000 und springst bedingt zu "hier". Der Sprung zu Anf entfällt dann.
Und Du musst natürlich den Wert, den Du bei "hier" in Deinen DB schreiben willst vor dem Sprung in den Akku 1 laden.

(Harald hat ja schon einen funktionierenden Code geschrieben.)

Grüße
Gebs
 
Zuletzt bearbeitet:
Zurück
Oben