Step 7 AWL Code Erklärung

MadMa

Level-1
Beiträge
16
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe Community,

Da ich hier neu bin kurz etwas über mich:
Ich habe Jahrelang mit C++ Programmiert und viel mit Arduino herum experimentiert.

Jetzt will ich mich Hobby bedingt etwas in SPS einarbeiten.
Ich bin 41 Jahre alt und habe 3 Kinder.


Jetzt zu meiner Frage:
Ich habe einen AWL-code und weiß auch in etwa was er macht aber leider verstehe ich noch nicht jedes Detail. zB wann muss man ein # schreiben oder ab welcher Zeile genau wird eine Sprunganweisung ausgeführt und wie weit geht diese Sprung Anweisung. In c++ ist es an den {Klammern} zu erkennen.
Es wäre super hilfreich wenn mir vllt jemand zu jeder Zeile ein kurzes Stichwort schreiben könnte was genau da passiert und warum welche Buchstabe verwendet wurde.
Noch hilfreicher wäre es wenn mir jemand ein gutes Buch empfehlen könnte, dass mich schritt für schritt einlernt..

L #Analog
T #AnalogI
L -10000
>=I
SPB M001
L -10000
T #AnalogI
M001: L #AnalogI
L 10000
<=I
SPB M002
L 10000
T #AnalogI
M002: L #AnalogI
ITD
T #AnalogDI
DTR
T #AnalogR
L 5.0e-4
L #AnalogR
*R
T #ResultR

Hier noch die Aufgabenstellung dazu:
• Laden der WORD-Variablen Analog und Interpretation als Ganzzahlwert• Vergleich mit einem unteren Grenzwert von -10000 und einem oberen Wert von +10000. BeiUnter bzw. Uberschreiten der Grenzwerte soll der Eingangswert durch den jeweiligen Grenz- ¨wert ersetzt werden.• Multiplikation mit der Konstanten 5.0 · 10−4.• Ausgabe des resultierenden Ergebnisses an die REAL-Variable ResultR.

Vielen Lieben Dank Schon Mal Euch!!!
Grüße
Max
 
L -> Lädt einen Wert in AKKU 1 (Speicherbereich in der CPU) und schiebt einen Wert, welcher in AKKU 1 stand in AKKU 2
T -> Überträgt den aktuellen Wert aus AKKU 1 in den angegebenen Speicherbereich
>= -> Größer/Gleich Vergleich AKKU 1 mit AKKU 2. Sollte das Ergebnis TRUE sein, wir das VKE in der CPU auf eins gesetzt, ansonst auf 0
SPB -> Springe bedingt. Wenn VKE=1 wird zu der Marke gesprungen, ansonst wird der Code weiter bearbeitet.
ITD -> Wandelt ein Int in einen DInt
DTR -> Wandelt ein DInt in ein Real
*R -> Multipliziert AKKU 1 mit AKKU 2 und schreibt das Ergebnis in AKKU 1

Hier:
Code:
Lade #Analog
 Transferiere #AnalogI
 Lade -10000
> =I // Vergleiche AKKU 1 (-10000) mit AKKU 2 (#AnalogI)
 SPB M001 // Ist VKE=1 springe zu M001, sprich, wenn AnalogI, welcher eigentlich Analog ist, größer als -10000 ist, dann springe weiter.
 Lade -10000 
 Transferiere #AnalogI 
 M001: L #AnalogI
 Lade 10000
< =I // Vergleich in die andere Richtung
 SPB M002 // Das Gleiche, wie oben
 Lade 10000
 Transferiere #AnalogI
 M002: L #AnalogI
 ITD //  Mach aus einem INT einen DINT
 Transferiere #AnalogDI
 DTR //  Mach aus einem DINT ein REAL
 Transferiere #AnalogR
 L 5.0e-4 //  Lade die Zahl in AKKU 1 und schiebe aktuelles in AKKU 2
 L #AnalogR // Lade die Zahl in AKKU 1 und schiebe aktuelles in AKKU 2
 *R //  Multipliziere AKKU 1 (AnalogR) mit AKKU 2 (5.0e-4)
 Transferiere #ResultR
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bitte benutze für Deinen Code den Code-Button (#) am Ende der 2. Icon-Reihe.
Dann funktionieren auch Einrückungen und der Code ist besser lesbar.


aber leider verstehe ich noch nicht jedes Detail. zB wann muss man ein # schreiben
Die Raute # kennzeichnet lokale Variablen



ab welcher Zeile genau wird eine Sprunganweisung ausgeführt und wie weit geht diese Sprung Anweisung.
Der Sprung beginnt bei der Sprunganweisung, z.B:
Code:
[COLOR=#008000][B]SPB[/B][/COLOR] [B][COLOR=#ffa500]M001[/COLOR][/B]
und endet bei der Sprungmarke, z.B.:
Code:
[B][COLOR=#ffa500]M001:[/COLOR][/B] L #AnalogI


Versuch' dann erst mal selber zu übersetzen.
Bei Unklarheiten -> Cursor auf den Befehl -> F1
;)
 
Hallo Krumnix und hucki,

danke das Ihr mir so schnell geantwortet habt! Beide antworten waren mir sehr hilfreich.
Schönen Tag noch!
Gruß
Max
 
Ich hab nochmal paar Frage zu dem Code.

1.Gleich im ersten Aufgaben Teil steht:"Laden der WORD-Variablen Analog und Interpretation als Ganzzahlwert".
Warum interpretier ich die nicht gleich nach dem Laden als Ganzahlwert mit dem Befehl ITD?
Ich habe doch noch ein Wort und kein Integer oder?
Und es ist doch egal ob ich einen Integer oder einen Doppel Integer habe.
IDT wird verwendet, weil es sich um ein Word mit 16Bit handelt und dass zu einer Ganzzahl mit 32 Bit umgewandelt wird oder?

2. Frage handelt von den ersten 4 Programm Zeilen.
Lade #Analog
Transferiere #AnalogI
Lade -10000
> =I // Vergleiche AKKU 1 (-10000) mit AKKU 2 (#AnalogI)

müsste AKKU1 nicht #AnalogI und AKKU 2 -1000 sein?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hab nochmal eine Frage zu dem Code.
Gleich im ersten Aufgaben Teil steht:"Laden der WORD-Variablen Analog und Interpretation als Ganzzahlwert".
Warum interpretier ich die nicht gleich nach dem Laden als Ganzahlwert mit dem Befehl IDT?
IDT wird verwendet, weil es sich um ein Word mit 16Bit handelt und dass zu einer Ganzzahl mit 32 Bit umgewandelt wird oder?
Dann müsste #AnalogI ein DINT sein, um den Wert aufzunehmen und würde damit mehr Speicherplatz belegen.



und die 2. Frage handelt von den ersten 4 Programm Zeilen.
Lade #Analog
Transferiere #AnalogI
Lade -10000
> =I // Vergleiche AKKU 1 (-10000) mit AKKU 2 (#AnalogI)

müsste AKKU1 nicht #AnalogI und AKKU 2 -1000 sein?
Der Befehl Lade (L) lädt immer! in den Akku 1.
Der Inhalt von Akku 1 wird vorher zum Akku 2 kopiert (verschoben).
Deshalb steht die -10000 in Akku 1, da dieser Lade-Befehl als Letztes erfolgte.
 
Zuletzt bearbeitet:
Ich hab nochmal eine Frage zu dem Code.
Gleich im ersten Aufgaben Teil steht:"Laden der WORD-Variablen Analog und Interpretation als Ganzzahlwert".
Warum interpretier ich die nicht gleich nach dem Laden als Ganzahlwert mit dem Befehl IDT?
IDT wird verwendet, weil es sich um ein Word mit 16Bit handelt und dass zu einer Ganzzahl mit 32 Bit umgewandelt wird oder?

Du meinst ITD!
ITD (Umwandlung einer Ganzzahl, 16 Bit, in eine Ganzzahl, 32 Bit) wertet den Inhalt von AKKU1-L als Ganzzahl (16 Bit) aus und wandelt diese in eine Ganzzahl (32 Bit) um. Das Ergebnis wird in AKKU 1 gespeichert.

Kleiner Tipp, im Editor kann man sehr schön (wie bei C++ auch) wenn man auf dem Befehl steht über F1 sich die Hilfe dazu anzeigen lassen!

und die 2. Frage handelt von den ersten 4 Programm Zeilen.
Code:
Lade #Analog 
 Transferiere #AnalogI
 Lade -10000
> =I // Vergleiche AKKU 1 (-10000) mit AKKU 2 (#AnalogI)
müsste AKKU1 nicht #AnalogI und AKKU 2 -1000 sein?

Nein,
Transferiere #AnalogI --> steht im Akku 1
Lade -10000 --> kommt im Akku 1 und der Vorherige Inhalt Akku 1 (#AnalogI) wird in Akku 2 geschoben
 
Ich hätte auch noch weitere Fragen zum Code:

L #Analog
T #AnalogI
L -10000
>=I

SPB M001 //angenommen VKE ist 0 (kein Sprung), wieso wird in der nächsten Zeile wieder -10000 in Akku1 geladen?
L -10000 // durch das erneute Laden der Zahl -10000 in Akku1, befindet sich die Zahl nun in Akku 1 und 2
T #AnalogI // jetzt wird AnalogI mit dem Wert aus Akku1 überschrieben, jetzt besetzt die Zahl -10000 Akku 1, 2 und die Variable...
//...AnalogI, wozu das Ganze, und wie soll AnalogI nun zum weiteren Vergleich verwendet werden?
M001: L #AnalogI // durch den Sprung wurden die zwei vorherigen Zeilen übersprungen, richtig? Diese Zeile hier wird also in beiden Fällen...
//... abgearbeitet?
//Jetzt wurde AnalogI, was zuvor von Akku1 mit der Zahl -10000 überschrieben wurde, wieder zurück in Akku1 geladen??
L 10000 //Nun ist 10000 in Akku1 und AnalogI= -10000 in Akku2? Stimmt der Code wirklich?
<=I
SPB M002
L 10000
T #AnalogI
M002: L #AnalogI
ITD
T #AnalogDI
DTR
T #AnalogR
L 5.0e-4
L #AnalogR
*R
T #ResultR


Wieso lädt man vor und nach der Sprungmarke M001 oder M002 zweimal den gleichen Wert (-10000 oder 10000) in Akku1?. Dadurch sind doch beide Akkus mit dem gleichen Wert besetzt. Und das anschließende Transferieren des Akku1-Wertes in die Variable AnalogI erscheint mir unverständlich, da dadurch die lokale Variable ihren ursprünglichen Wert verliert.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
SPB M001
L -10000
// richtig, könnte weggelassen werden auch bei L 10000 weiter unten
T #AnalogI // falls der Wert zuvor -12523 war wird er hier begrenzt gleiches gilt weiter unten für +10000 falls darüber
M001: L #AnalogI
L 10000 // Akku 1 hat jetzt 10000 AnalogI (Akku2) nicht unbedingt -10000, falls dieser oben nur zB 3458 (>=-10000) hatte wurde die Sprunganweisung ausgeführt
 
@quantum: Deine Anmerkungen sind korrekt. Man könnte den Code mit Sicherheit kürzen. Aber für "Anfänger" wäre das echt zuviel. Trotzdem würden sie die Bedeutung von Akku 1 und Akku 2 besser verstehen.
Man könnte ja versuchen, das Programm hier so klein als möglich zu gestalten :)

z.B.:
Code:
L #Analog
T #AnalogI
L -10000
>=I
SPB M001
T #AnalogI
M001: L #AnalogI
L 10000
<=I
SPB M002
T #AnalogI
M002: L #AnalogI
ITD
DTR
L 5.0e-4
*R
T #ResultR
 
Zurück
Oben