Seite 1 von 1

Funktion While-Schleife (in Step7)

Verfasst: Dienstag 20. August 2013, 23:21
von Frank12NR
Hallo zusammen,
ich bin gerade am Anfang einer Unterrichtsreihe über SCL in Step 7. Da sich SCL recht stark an andere Programmiersprachen annähert, habe ich, bevor ich groß mit meinem eigentlichen Problem (dann im SPS-Forum) aushole, erstmal eine Vorab-Frage um Missverständnisse meinerseits auszuschließen:

Stimmt das so:

Eine while-Schleife der Form "While Eingang=1 Do Ausgang=1" bewirkt, dass der Ausgang 1 ist, so lange der Eingang 1 ist. Wird der Eingang danach zu 0, wird auch der Ausgang zu 0.

Falls es nicht stimmt wäre es nett, wenn mir jemand meinen Fehler aufzeigen könnte.

Danke und Gruß,
Frank

Verfasst: Mittwoch 21. August 2013, 10:00
von Oberwelle
Moin Frank,

ich kenne die Siemens Befehle nicht,

bei Bosch hätte es so ausgesehen:

U E0.0
= A0.0

bewirkt das der Ausgang wie der Eingang gesetzt wird, insofern der Abschnitt auch durchlaufen wird..


U E0.0
S A0.0

bewirkt das der Ausgang gesetzt wird, bist der Befehl zum rücksetzten kommt ( R A0.0 )


Grüße OW

Verfasst: Mittwoch 21. August 2013, 13:33
von Frank12NR
Hi Oberwelle,
danke, aber mit AWL hat mein Problem nichts zu tun ;)

Die Frage oben bezieht sich auf eine allgemeine While-Schleife, wie sie in ziemlich vielen Programmiersprachen möglich ist. Das konkrete Step7-Problem kommt dann im Anschluss.

Gruß,
Frank

Verfasst: Mittwoch 21. August 2013, 17:55
von MoaddiB
Hallo Frank,
Schaue dir im Zweifelsfall einmal eine Pascal-Befehlsliste an.
Ich bin selbst noch nicht so weit dir da zu helfen,
die Befehle sollten aber alle an Pascal angelehnt sein

Verfasst: Donnerstag 29. August 2013, 09:43
von Bapho
Frank12NR hat geschrieben:Hallo zusammen,
ich bin gerade am Anfang einer Unterrichtsreihe über SCL in Step 7. Da sich SCL recht stark an andere Programmiersprachen annähert, habe ich, bevor ich groß mit meinem eigentlichen Problem (dann im SPS-Forum) aushole, erstmal eine Vorab-Frage um Missverständnisse meinerseits auszuschließen:

Stimmt das so:

Eine while-Schleife der Form "While Eingang=1 Do Ausgang=1" bewirkt, dass der Ausgang 1 ist, so lange der Eingang 1 ist. Wird der Eingang danach zu 0, wird auch der Ausgang zu 0.

Falls es nicht stimmt wäre es nett, wenn mir jemand meinen Fehler aufzeigen könnte.

Danke und Gruß,
Frank
Stimmt genau. Am Ende muß aber ein End_While hin, allerdings steigt dir dann die SPS mit Fehler Zyklusüberwachung aus, da die Schleife solange durchlaufen wird, wie Eingang = 1.
In der S7 Welt brauch man weit weniger Schleifen als sonst, da die Bausteine meist zyklisch aufgerufen werden, somit ist das auch immer bissle heikel.

Verfasst: Freitag 26. September 2014, 09:53
von StreckerStefen
Frank12NR hat geschrieben: Eine while-Schleife der Form "While Eingang=1 Do Ausgang=1" bewirkt, dass der Ausgang 1 ist, so lange der Eingang 1 ist. Wird der Eingang danach zu 0, wird auch der Ausgang zu 0.
vieleicht kann ich da als Informatiker weiterhelfen.
while bla=1 do blubb=3
heisst übersetzt:
solange bla 1 ist setzte blubb auf 3

Verfasst: Montag 30. März 2015, 23:02
von Funkenschlosser
StreckerStefen hat geschrieben:vieleicht kann ich da als Informatiker weiterhelfen.
while bla=1 do blubb=3
heisst übersetzt:
solange bla 1 ist setzte blubb auf 3
Was wiederum (mit Verlaub) "hinrissig" ist, denn es läuft auf eine Endlosschleife hinaus. Eine "sinnvolle" Schleife muss im Rumpf die Abbruchbedingung beeinflussen können, sonst ist das ganze Quatsch, außer Du willst das System bewusst reaktionsunfähig machen.

Sinnvoll wäre z.B.

Setze x auf 1
Solange x < 100
: x auf Drucker ausgeben
: x um 2 erhöhen
Ende

So ein Programm würde beispielsweise alle ungeraden Zahlen bis 100 ausdrucken. Nur weil x innerhalb des Schleifenrumpfes verändert wird, kann sich der Aussagewert der Abbruchbedingung (x < 100) über der Zeit ändern. Könnte er das nicht, hätte man eine Endlosschleife...

Funky

Verfasst: Montag 30. März 2015, 23:51
von der Alphabetische
Funkenschlosser hat geschrieben:Was wiederum (mit Verlaub) "hinrissig" ist, denn es läuft auf eine Endlosschleife hinaus. Eine "sinnvolle" Schleife muss im Rumpf die Abbruchbedingung beeinflussen können, sonst ist das ganze Quatsch, außer Du willst das System bewusst reaktionsunfähig machen.
Das hier ist glaube ich deutlich "hinrissiger" (?) als das im Beitrag obendrüber.

Das was StreckerStefen geschrieben hat ergibt sehr wohl Sinn, z.B. wenn der Wert von bla von einem externen Signal beeinflusst wird. Oder wenn es auf dem System mehrere parallel ablaufende Threads gibt, die den Wert von bla beeinflussen können.

Verfasst: Dienstag 31. März 2015, 08:01
von Bapho
Die Frage ist immer wozu die Schleife dient bzw. was ich womit programmieren will.
In der SPS muß man mit solchen Sachen höllig aufpassen, besser ist da eine for Schleife mit einer festgelegten Anzahl an Durchläufen. Die SPS läuft ja eh immer in einer Dauerschleife, da würde es dann auch ein

Code: Alles auswählen

Ausgang1=: (Zahl = 1) AND Eingang1;

machen.
Solange die zwei Bedingungen gegeben sind wird der Ausgang true, ansonsten ist er false.
Wenn ich zbsp. von c# auf eine SPS zugreifen möchte und mir das selber stricken will muß ich die SPS dauerhaft pollen, dh. ich muß zu der SPS eine Verbindung aufbauen und dann immer wieder lesen, in einem separaten Thread ist das kein Problem und dann läuft da halt die Schleife solange ich eine Verbindung auf die SPS habe.