Weiß auch nicht genau was du dir von diesem Buch erwartest?.
Naja, da SCL eher in Richtung Hochsprache geht kannst du dir eigentlich auch Aufgaben für Hochsprachen nehmen.
SCL ist jetzt nicht sooo verschieden zum programmieren mit den herkömmlichen Programmiersprachen. Wo sich SCL/ST klar unterscheided ist, dass du bevorzugt mit Arrays arbeitest und Schlaufen viel einfacher programmiert sind als in den anderen Programmiersprachen. Und natürlich die Typenkonvertierung, die ist auch angenehmer gestaltet.
CoDeSys und TIA haben beide eine sehr gute Hilfefunktion die dir mit den Basics helfen. Abgesehen davon ein kurzer Abriss:
- := : Das Doppelpunkt-Gleich wird in SCL zur Zuweisung von Variablen genutzt. Variable die einen Wert erhalten soll zu vorderst, gefolgt vom := und dahinter deine Vergleiche. Oft gesehener Anfängerfehler: um einer Bool-Variable in Abhängigkeit eines Vergleichs einen Wert zuzuweisen wird kein IF gebraucht (siehe unten). Einfach boolVariable1 := (intVariable2 = Wert); und schon hast du auf deiner Variable ein TRUE oder FALSE wenn die Variable2 dem definierten Wert entspricht.
- ; : Das berühmt-berüchtigte Semikolon. Programmierer von Hochsprachen (ausser Python und ein paar anderen) haben schon graue Haare gekriegt weil sie irgendwo ein Semikolon vergessen haben. Das Semikolon wird verwendet, um in SCL eine Zeile oder Funktion (meistens ist das das gleiche da man schönheitshalber nur eine Funktion pro Zeile hat) abzuschliessen. Wird nicht an allen stellen benötigt, aber TIA meckert zuverlässig beim Tippen wenn du ein Semikolon vergessen hast.
- = >= <= <>: Die Operatoren die dir in SCL zur Verfügung stehen sind zahlreich. Hier am besten die Hilfefunktion konsultieren. Übrigends: Operatoren und Zuweisung lassen sich bedingt verbinden. Anstatt intVariable1 := intVariable 1 + 1; macht man einfach intVariable1 += 1; und schon hat man eine Zuweisung, welche auf die Variable den Wert 1 addiert (funktioniert nicht in TIA13, TIA14 weiss ich nicht).
- IF ... ELSIF ... ELSE ... END_IF; : Der Name ist Programm. Einfache Bedingte ausführung von Code. Kann mehr oder weniger 1 zu 1 mit Wenn-Dann-Sonst aus Excel verglichen werden. Code innerhalb der Bedingungen wird nur ausgeführt wenn die Bedingung erfüllt ist. Dazu hilfreich...
- AND OR NOT: Boolsche Logik wie du sie auch aus anderen Programmiersprachen kennst. Mehrere Bedingungen (z.B. für ein IF) lassen sich damit miteinander verknüpfen. Good to know: auch hier können mehrere Wertvergleiche über (intVariable1 = Wert) AND boolVariable; aneinandergereiht werden.
- CASE ... OF ... ELSE ... END_CASE; : Dies ist eine klassiche Switch-Funktion. Ein CASE arbeitet auf Basis einer Variable und führt Code aus wenn die Variable einem zuvor definierten Wert entspricht. Trifft keiner der definierten Werte zu, kann über ELSE Code ausgeführt werden der diesen Fall abfängt. Hiermit kann ich zum Beispiel recht einfach unterschiedliche Funktionen aufrufen je nach dem welchen Wert meine Variable hat (wenn ich z.B. Zustandsabhängig anderen Code ausführen will) ohne dass ich dafür mehrere IFs brauche.
- WHILE ... DO ... END_WHILE; : Die While-Schlaufe macht wie IF ihren Namen alle Ehre. While heisst ja bekanntlich im Englischen "Während", und genau so lässt sich die Funktion auch intepretieren. Während eine Bedingung erfüllt oder nicht erfüllt ist wird der Code innerhalb der Schlaufe ausgeführt. Damit lässt sich übrigends (wie mit jeder Schlaufe) sehr praktisch die CPU abschiessen wenn man die Bedingung nicht richtig definiert hat. Dann rattert sich die CPU zu Tode bis eine Zykluszeitüberschreitung auftritt. Tipp: Die Bedingung für die While Schlaufe fehlersicher machen. Zum Beispiel WHILE (intVariable 1 <= Wert) DO intVariable1 += 1; END_WHILE; womit die Schlaufe so lange ausgeführt wird wie die Variable kleiner als der Wert ist. Damit ist abgesichert dass die Schleife auch beendet wird wenn z.B. mehr als 1 auf die Variable addiert wird (also <= an statt = verwenden).
- FOR ... TO ... BY ... DO ... END_FOR; : Die FOR Schlaufe ist eine abgewandelte Form der While-Schlaufe. Diese Art der Schlaufe eignet sich speziell gut zum Abarbeiten von Arrays. Man definiert eine Variable, die man als Zähler verwenden will, gibt an bis wie weit die Variable inkrementiert werden soll, gibt an um wieviel die Variable inkrementiert werden soll (wenn nichts angegeben um 1) und definiert, was in jedem Schritt ausgeführt werden soll. Damit lässt sich hervorragend eine Funktion programmieren, welche vom ersten bis zum letzten Eintrag eines Arrays durchrattert und bei jedem Eintrag etwas ausführt. Dies würde dann z.B. wie folgt aussehen: FOR i := 0 TO 99 BY 1 DO code END_FOR; Dieser Schlaufe würde von 0 bis 99 in einerschritten durchlaufen und jedes Mal den Code-Teil ausführen. Dazu passend wäre ein Array[0..99] of Struct wobei die Variable i direkt als Index verwendet werden kann.
- REPEAT ... UNTIL ... END_REPEAT; Frag mich nicht wofür man diese Schlaufe benötigt. Ich habe bisher noch keine Anwendung dafür gefunden. Eigentlich wie eine While, nur dass man hier die Bedingung an den Schluss setzt, das heisst die Abbruchbedingung wird NACH dem abarbeiten der Schlaufe ausgeführt. Dies bedeutet, dass die Schlaufe immer min. 1 Mal ausgeführt wird.
- EXIT : Hiermit kann eine Schlaufe frühzeitig verlassen werden. Sehr nützlich wenn du z.B. innerhalb der Schlaufe auf einen Fehler triffst und die Schlaufe nicht noch zu Ende laufen lassen willst.
Ich denke damit habe ich einen Abriss über das wichtigste gemacht. Alles weitere findest du in der Hilfefunktion und in den Standardbibliotheken. Die oben genannten Funktionen sind soweit ich weiss bei allen Herstellern gleich, alles weitere kann herstellerabhängig sein.
ich benutze lieber die Übersetzung "SOLANGE" die Bedingung erfüllt ist, führe den folgenden Code aus...WHILE ... DO ... END_WHILE; : Die While-Schlaufe macht wie IF ihren Namen alle Ehre. While heisst ja bekanntlich im Englischen "Während",
...END_WHILE; womit die Schlaufe so lange ausgeführt wird, wie...
Genau deshalb habe ich sie mal bei meinem Übungsprojekt "4 gewinnt" eingesetzt. Der Code sollte min. 1x ausgeführt werden.REPEAT ... UNTIL ... END_REPEAT; Frag mich nicht wofür man diese Schlaufe benötigt. Ich habe bisher noch keine Anwendung dafür gefunden. Eigentlich wie eine While, nur dass man hier die Bedingung an den Schluss setzt, das heisst die Abbruchbedingung wird NACH dem abarbeiten der Schlaufe ausgeführt. Dies bedeutet, dass die Schlaufe immer min. 1 Mal ausgeführt wird.
Ja, natürlich:Und das mit dem einmaligen Durchlauf erreichst du auch bei einer WHILE-Schlaufe. Die Abbruchbedingung muss ja immer innerhalb der Schlaufe beschaltet werden. Wenn du also innerhalb der Schlaufe die Abbruchbedingung setzt hast du auch einen einmaligen Durchlauf. Vorausgesetzt natürlich die Bedingung wurde nicht schon ausserhalb gesetzt.
Der Unterschied: Mit REPEAT hatte ich nur genau eine Prüfung auf Wiederholung am Ende (je)des Schleifendurchlaufs.Fast immer sind die Schleifen-Varianten durch entsprechend angepasste Bedingungen gegeneinander austauschbar...
Man spart im Vergleich zu WHILE die Ausführung (oder gar Programmierung) einer Schleifenprüfung, wenn man sowieso mindestens einen Durchlauf benötigt.Frag mich nicht wofür man diese Schlaufe benötigt.
Ich würde sogar soweit gehen zu sagen: die REPEAT-Schleife ist die "Mutter" aller Schleifen. WHILE- und FOR-Schleifen sind nur mit allerlei komfortablen Extras aufgeblasene Varianten der REPEAT-Schleife. Man kann Programme auch nur mit REPEAT-Schleifen strukturieren, muss sich dann "lediglich" die Abbruchbedingungen und die Schleifenzählerverwaltung an den richtigen Stellen selber programmieren.
LOOP:
LD var1
ADD var2
ST var3
LD var4
JMPC LOOP
PROGRAM BSP
INTEGER I
I=0
10 IF(I .LT. 5) THEN
WRITE (*,*) I
I = I + 1
GOTO 10
END IF
C Die Zahlen 0 bis 4 werden ausgegeben
END
PROGRAM BSP
INTEGER I
I=6
10 CONTINUE
WRITE (*,*) I
I = I + 1
IF (I .LT. 5) GOTO 10
C Die Zahl 6 wird ausgegeben
END
Sorry, Deine "Mutter aller Schleifen" sieht verdächtig nach "Mutter aller EndlosSchleifen" aus!Ich dachte immer die "Mutter" aller Schleifen wäre:
Code:LOOP: LD var1 ADD var2 ST var3 LD var4 JMPC LOOP
Sorry, Deine "Mutter aller Schleifen" sieht verdächtig nach "Mutter aller EndlosSchleifen" aus!
Das C in JMPC sieht zwar nach bedingtem (conditional) Sprung aus, aber welches Kriterium wertet er aus? Vergleicht der JMPC denn auch Akku1 mit Akku2 ... oder welche Bedingung wird abgefragt? var4 wird in der Schleife nirgends verändert!?
Die Voraussetzung, nicht endlose Schleifen zu programmieren, ist definitiv ein bedingter Sprung.Obwohl immer wieder hier im Forum behauptet wird, dass sie nicht existiert, die "Mutter aller Schleifen" ist die "If-Schleife" ...
Position_mod_120:= p_ist_grad;
WHILE Position_mod_120 > 120.0 -0.5 do
Position_mod_120-=120.0;
END_WHILE;
Was willst Du uns damit sagen, statix?Hier mal eines der wenigen Besipiele einer While Schleife: ...
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?