-> Hier kostenlos registrieren
.
Harald
Das hat super funktioniert. Danke
Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: This feature may not be available in some browsers.
.
Harald
.
Harald
*
LAR1 P#0.0
AUF DB 3
L DBLG
SRW 1
next: T MW 10
INVI
+ 1001
T DBW [AR1,P#0.0]
+AR1 P#2.0
L MW 10
LOOP next
Hallo Joe,
mit "T MW 30" schreibst Du Deinen neuen Wert ins MW 30 (Ergebnis der vorherigen Berechnung. Steht im Akku 1)
Mit "L 2000" wird das Ergebnis der Berechnung vom Akku 1 in den Akku 2 geschoben und die 2000 in den Akku 1 geschrieben.
dann erfolgt der Vergleich.
Mit TAK (Tausche Akku) wir das Ergebnis der Berechnung vom Akku 2 in den Akku 1 geschrieben und die 2000 vom Akku 1 in den Akku 2.
Somit hast Du das Ergebnis der Berechnung (MW 30) vor Deinem Sprung zu "hier" wieder im Akku 1 stehen.
Das brauchst Du, weil nach der Sprungmarke "hier" ja der Akku 1 in Deinen DB geschrieben wird (T DBW [MD10]).
Ich hoffe ich habs einigermaßen verständlich geschrieben.
Grüße
Gebs
L 5 // jetzt steht 5 im Akku 1
L 4 // jetzt steht die 5 in Akku 2 und im Akku 1 steht 4
*I // Jetzt steht 20 im Akku 1 (Ergebnis der Multiplikation) und 5 im Akku 2
L 21 // jetzt steht 21 im Akku 1 und 20 im Akku 2
==I // Vergleich
// Irgendeine Aktion
// Wenn Du jetzt mit der 20 weiterrechnen willst, musst Du sie wieder in den Akku 1 bekommen =>
TAK // jetzt ist die 20 wieder im Akku 1
Hmm, ich sehe da keine Rekursion? für mich ist das eindeutig iterativ.ich habe nochmal über die rekursive Lösung nachgedacht ... lineare Rekursion wäre nach meinem Dafürhalten in der folgenden Lösung realisiert.
Code:* LAR1 P#0.0 AUF DB 3 L DBLG SRW 1 next: T MW 10 INVI + 1001 T DBW [AR1,P#0.0] +AR1 P#2.0 L MW 10 LOOP next
wozu SLW 1?
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 meine ich auch. Die Frage, was mit "rekursiver Impuls" gemeint ist, ist von Anfang an ungeklärt.woher stammt die Aufgabenstellung und vielleicht könnte der Aufgabensteller dazu etwas sagen.
Das meine ich auch. Die Frage, was mit "rekursiver Impuls" gemeint ist, ist von Anfang an ungeklärt.
Wer weiß, ob da tatsächlich das Wort "rekursiv" in der Aufgabenstellung steht? Vielleicht ist einfach ein stinknormaler Triggerpuls (rising edge) gemeint, damit das Beschreiben des DB nur einmal ausgeführt wird???
Harald
Hallo Harald,
Alles ist in Ordnung, dieser rekursive Impuls muss nicht sein. Danke
Wie Gebs schon in #24 schrieb:Diese Schritte habe nicht verstanden:
T MW 30
L 2000
<I
TAK //MW30 zurück in AKKU1
SPB hier
Was macht TAK und was wolltest du damit sagen?
Wie Gebs schon in #24 schrieb:
Wenn der Sprung zu "hier" ausgeführt wird, dann muß der Wert von MW30 im AKKU1 stehen, weil der Wert da in den DB geschrieben wird. Wegen dem "L 2000" für den Vergleich steht aber die 2000 in AKKU1 und der Wert von MW30 wurde in AKKU2 geschoben. Wie bekommt man nun am einfachsten den Wert zurück in AKKU1? --> entweder mit TAK (tauscht die Inhalte von AKKU1 und AKKU2) oder mit POP (holt den Inhalt von AKKU2 in AKKU1) oder durch erneutes Laden aus dem MW30. Erneutes Laden wäre schön übersichtlich, TAK und POP sind aber kürzer und schneller als das Laden, POP ist für viele AWL-Leser nicht so geläufig, also habe ich mich für TAK entschieden. Man kann das Programm aber auch anders schreiben, z.B. das "L MW30" direkt in der Zeile hinter "hier:" machen, oder den Vergleich mit 2000 andersrum formulieren, so daß die 2000 in AKKU2 steht und der neue Wert des MW30 in AKKU1 steht, oder ...
Harald
Er steht aber in der Aufgabenstellung!
und er könnte sein, also angenommen, wir wollen diese Option umsetzen, was ist dann mit "rekursiver Impuls" gemeint?
Da stürzt nichts ab. LOOP oder SPB springen bedingt nur dann zurück zum Schleifenanfang, solange die Schleife noch nicht 1000-mal ausgeführt wurde. Nach vollständiger Abarbeitung der Schleife ist die Rücksprungbedingung nicht mehr erfüllt und der Sprung deshalb nicht mehr ausgeführt und das Programm wird einfach mit der nächsten Anweisung nach der Schleife fortgesetzt.wie die Schleife verlassen wird (beendet) habe nicht kappiert, weil wenn die Schleife nicht verlassen wird, stürzt er ab(weil er einen unendlichen Zyklus hat).
Da stürzt nichts ab. LOOP oder SPB springen bedingt nur dann zurück zum Schleifenanfang, solange die Schleife noch nicht 1000-mal ausgeführt wurde. Nach vollständiger Abarbeitung der Schleife ist die Rücksprungbedingung nicht mehr erfüllt und der Sprung deshalb nicht mehr ausgeführt und das Programm wird einfach mit der nächsten Anweisung nach der Schleife fortgesetzt.
Harald
// Schleife initialisieren
L 0
T MW 10 //Schleifenzähler (Index)
AUF DB 100 //Global Datenbaustein DB100 mit 1000 INT
// Schleife schon komplett abgearbeitet?
next: L 1000
L MW 10
<=I
SPB ende //ja, fertig
// nein: 0, 2, 4 ... 1998 in DB100.DBW[0, 2, 4 ... 1998] schreiben
// DB100.DBW[Index*2] := Index*2 ;
SLD 4 //Index * 16 --> DBW_Adresse P#xxxx.0
T #tmp_DW_Adr
SRD 3 //Index * 2 --> Wert, der in DBW geschrieben wird
T DBW [#tmp_DW_Adr]
// Schleifenzähler weiterschalten
L MW 10
+ 1
T MW 10
SPA next //nächstes DBW
// Fertig
ende: NOP 0
// Schleife initialisieren
L 0
T MW 10 //Schleifenzähler (Index)
AUF DB 100 //Global Datenbaustein DB100 mit 1000 INT
// Schleife schon komplett abgearbeitet?
next: L 1000
L MW 10
<=I
SPB ende //ja, fertig
// nein: 0, 2, 4 ... 1998 in DB100.DBW[0, 2, 4 ... 1998] schreiben
// DB100.DBW[Index*2] := Index*2 ;
SLD 4 //Index * 16 --> DBW_Adresse P#xxxx.0
LAR1
SRD 3 //Index * 2 --> Wert, der in DBW geschrieben wird
T DBW [AR1,P#0.0]
// Schleifenzähler weiterschalten
L MW 10
+ 1
T MW 10
SPA next //nächstes DBW
// Fertig
ende: NOP 0
Wir verwenden essentielle Cookies, damit diese Website funktioniert, und optionale Cookies, um den Komfort bei der Nutzung zu verbessern.
Siehe weitere Informationen und konfiguriere deine Einstellungen