TIA Zykluszeit bei While Anweisung

Credofire

Level-1
Beiträge
640
Reaktionspunkte
35
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe als SCL n00b mal eine Frage zu der WHILE Anweisung. Ich habe folgendes programmiert:
SCL Programmierung.jpg

SCL Programmierung 2.jpg

Wenn ich nun aus dem SCL Teil die WHILE Anweisung nutze, dann jagt es mir die Zykluszeit auf 300 ms.
Wenn ich statt dessen die MOVE Anweisung aus dem Netzwerk darunter liegt die Zykluszeit bei 3 ms.

Hab ich da irgendwo einein Denkfehler bei der WHILE Anweisung? Ich hätte gedacht diese Anweisung wäre genau so zu benutzen?
 
Zuletzt bearbeitet:
Wenn ich nun aus dem SCL Teil die WHILE Anweisung nutze, dann jagt es mir die Zykluszeit auf 300 ms.
Du hast vergessen zu erwähnen, daß Deine SPS durch die Zykluszeitüberwachung in STOP geht - was logisch ist, weil Du eine Endlosschleife programmiert hast: die Abbruchbedingung (Variable "Merker".Messervergleich) wird in der Schleife nicht beeinflußt.

WHILE ist nicht nur eine Anweisung sondern eine Schleife. Eine WHILE-Schleife ausführt und wiederholt die Anweisungen der Schleife sofort, solange die Bedingung erfüllt ist. Es muß kontrolliert dafür gesorgt werden, daß innerhalb der Zyklusüberwachungszeit die Bedingung nicht mehr erfüllt ist damit die WHILE-Schleife verlassen wird.

Was willst Du mit dem WHILE erreichen? Worauf soll Deine WHILE-Schleife eigentlich warten? Warten auf externe Ereignisse macht man bei SPS nicht per WHILE-Schleife - das ganze SPS-Programm steckt bereits in einer großen Schleife, Main (OB1) wird bereits zyklisch aufgerufen.

PS: Wolltest Du vielleicht statt WHILE eigentlich ein schlichtes IF...THEN benutzen?

Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald

vielen Dank erstmal für deine Antwort. Ich dachte ich könnte mit diesem WHILE das netzwerk unter dem SCL Teil ersetzen. Also die Move Befehle zum Aufrufen eines Bildes. Ich möchte das solange die Variable "Merker".Messervergleich EIN ist, immer das gewünschte Bild aufgerufen wird. Wenn der Merker dann AUS ist, wird das Bild über einen Timer "zurückgesetzt".
Ich habe das mit dem WHILE geziehlt probiert um SCL zu lernen. Mein Gedanke war, solange der Merker EIN ist schreibe mit jedem Zyklus dies Bild. Aber so wie es aussieht geht der Zyklus ja nicht zu Ende und die CPU löst den Alarm aus.
Also ich stehe noch relativ am Anfang was das SCL angeht. Bisher habe ich nur IF Anweisungen benutzt und ab und an mal CASE. Ich dachte es wäre Zeit mal etwas neues zu probieren ;)
 
@credofire
Ich schlage vor, das Du Dich grundsätzlich nochmal mit der zyklischen Arbeitsweise einer SPS auseinandersetzt. Dann wird eigentlich klar, das While nur in wenigen Fällen notwendig ist für z.B. Verwaltungsvorgänge, die innerhalb eines Zyklus abgearbeitet werden müssen.

Ich hatte vor Jahren bei einem Bastelprojekt mit einem Microcontroller das umgekehrte Problem: Ich wollte die Arbeitsweise einer SPS simulieren und bin dabei immer wieder über die grundsätzlich andere Arbeitsweise der MCU gestolpert. Die zyklische Arbeitsweise hat für mich als größten Vorteil, das man die allermeisten Aufgaben als Single-Task-Problem lösen kann. Da kommt das vermutlich auch her. Schließlich ist Multitaskingfähigkeit bei SPS eher eine neuere Erfindung.
 
@CredoFire:
Wie dir schon beschrieben wurde ist nicht dein Vorhaben problematisch sondern wie du es angegangen bist.
Dein SPS-Programm selbst ist, wie schon genannt, eine einzige Schleife. Wenn du also das mit dem Bildwechsel umsetzen willst dann mach es so, wie schon von dir beschrieben :
- wird der Merker =1 dann aktiviere das Bild (aber mit der Flanke und nicht dem Zustand)
- das Abfallen des Merkers startet dann einen Timer
- der abgelaufene Timer (auch hier die Flanke und nicht der Zustand) lösst den anderen Bildwechsel aus.

Zu WHILE :
Im Grunde hat Harald das Wesentliche schon gesagt. Jetzt fragst du dich ggf. : "wo brauche ich das denn überhaupt ?"
Das hängt von der Anforderung ab. Normalerweise ist bei Schleife FOR .. TO immer der bessere Ansatz. Jetzt kann es aber auch mal sein, dass du das Ende nicht kennst oder suchen willst (Zum Beispiel in einem Array von 1000 Werten den Ersten Wert der 1234 hat heraussuchen - das könnte man dann auch schön mit WHILE machen - laufe solange bis Ende der Liste oder Wert an Index-Position = 1234)
Aber immer die Zykluszeit im Auge behalten ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Larry vielen Dank

@weisnix vielen Dank. Die grundsätzliche Zyklische Arbeitsweis ist mir schon klar, denke ich. Ich hätte nur nicht erwartet das sich das Programm in der WHILE Schleife "aufhängt". Ich habe einfach angenommen, dass quasi in jedem Zyklus geschaut wird ob die Bedingung wahr ist, und dann das Programm wie gewohnt weiter läuft.

Naja, es gibt immer viel zu lernen ;)
 
Die While-Schleife funktioniert in einer SPS nicht anders wie am PC und es hängt sich auch nichts auf. Am PC und auch auf einer SPS läuft die While-Schleife solange bis die entsprechende Bedingung erfüllt ist. Am PC reagiert dann schlimmstenfalls Dein Programm erst mal nicht mehr, bei einer SPS kann sowas allerdings fatale Folgen haben (z.B. Endschalter werden nicht mehr ausgewertet) aus diesem Grunde stoppt die Überwachung in so einem Fall die SPS oder löst, je nach Einstellung, andere Programme aus und stoppt dann erst.
 
Ich hätte nur nicht erwartet das sich das Programm in der WHILE Schleife "aufhängt".
Naja, was hätte auch anderes passieren sollen. Die SPS gurkt solange zwischen WHILE und END_WHILE herum bis der Masseausgleich-Merker kommt. Dieser kann aber nicht kommen da das Programm nicht aus deiner while herauskommt um diesen zu setzen. Mal abgesehen von nem separaten Task/Interrupt. Das würde auch in anderen Systemen die gleiche Reaktion verusachen.

Um zu verhindern dass die SPS die Anlage crasht, weil das Programm ja in einer Endlosschleife gefangen ist und damit keinen anderen Code abarbeiten kann, stoppt der sog. Watchdog-Timer die CPU. Ein Durchlauf von OB1 darf nicht länger dauern.
 
Zurück
Oben