Schleifenabfrage in SCL - Zeitüberschreitung!

schnecke

Level-1
Beiträge
148
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Ihr,

habe da mal wieder ein Problemchen...

Ich wollte gerne in einer Schleife etwas überwachen und bekomme stets die Fehlermeldungen, dass

1) die max. freie Zykluszeit zweifach überschritten wurde UND
2) Zeitfehler, Start von OB 80 angefordert


Fragen:

- Wie kann ich so etwas umgehen, denn offensichtlich kommt der Fehler ja dadurch zustande, dass die CPU zu lange in der Schleife verharrt?
- Können solche Abfragen bei einer SPS überhaupt nicht gemacht werden?

Code:

Schleife.jpg


Vielen Dank!
 
Hallo,

du willst den Motor 3s laufen lassen? Dann frag das mit IF /THEN ab, sonst wartet das Programm solange an der Stelle -> CPU-STOP


André
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die While-Schleife verhindert die zyklische Programm-Abarbeitung (z.B. für 3s).

Eleganter ist es, mit einer If-Abfrage den aktuellen Zustand zu prüfen und die jeweilige Aktion auszuführen.

Ein While-Konstrukt würde ich nicht für "Warteaufträge" einsetzen. Die Schleife wird solange durchlaufen, bis die Bedingung Wahr ist.

Grüße

Ralph
 
Danke für eure Antworten... Nun, das war jetzt nur ein Beispielprojekt.

Im eigentlichen Projekt soll geprüft werden, ob best. Bedingungen erfüllt sind, während ein Timer abläuft.

Lässt sich dieses Zeitproblem irgendwie anders in den Griff bekommen - habe gelesen dass z.B. "RE_TRIGER" in den OB1 eingefügt werden kann, was dann das Stoppen der CPU verhindern soll? Allerdings klappt das nicht bei mir; die CPU geht sofort in Stop!

Danke!
 
Also da was drumherum bauen, damit die CPU nicht in Stop geht halte ich für unschön.
Das sieht nach zweifelhafter Programmierung aus. Gib mal ein ordentliches Beispiel. Dann kann Dir auch besser geholfen werden.
Man sollte hier das Problem an der Wurzel packen und sich fragen ob man unbedingt diese while-Schleife benötigt bzw. wie man es anders lösen kann.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
du darfst den Zyklus der SPS nicht unterbrechen (bin eigentlich gegner von SCl, darum mal nur im Kurzstil)

mit Start des Motors startest du deinen timer

Für die Abfrage fragst du den timer ab

wenn der Timer 1 wird dann hast du dein Ergebnis
 
Warum muss der Timer in der Schleife sein?
Ändere deinen Aufruf so, dass der Timer gestartet wird und wenn der im zyklischen Programm fertig ist, mache mit deinem Programmteil weiter.


bike
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bin noch ziemlich neu mit SCL, wollte eigentlich nur ne While Schleife probieren... habe mit folgendem Code, das gleiche Problem:

Code:
WHILE  wd_input <= 5 DO
   wd_output := 20;
        
END_WHILE;
wd_input und wd_output sind beide DINT.

Wie muss man eine While Schleife in SCL dann verwenden ohne die CPU auf Stopp zubringen? Hat jmd. evtl. ein praktisches Bspl?
 
Hallo,

wie vorher schon geraten wurde - keine Schleife sondern If-Then-Abfrage.

Das ganze SPS-Programm läuft schon als Schleife ab (die zeitlich überwacht wird). Du brauchst daher nur noch die Bedingung prüfen und die entsprechenden Werte setzen.
 
...
Wie muss man eine While Schleife in SCL dann verwenden ohne die CPU auf Stopp zubringen? Hat jmd. evtl. ein praktisches Bspl?
Vereinfacht kann man sagen:
Wenn Du innerhalb der Schleife dafür sorgst, daß die Ausstiegsbedingung auch erreicht wird, z.B. durch Wertberechnung, kannst Du sie verwenden. Also ähnlich FOR-NEXT-Schleifen - definiertes Ende, das von der Schleife bzw. den Befehlen innerhalb selbst gesteuert wird.
Kommt die Ausstiegsbedingung von außerhalb der Schleife, z.B. der Zustand eines Eingangs, dann besser IF-THEN verwenden (und damit die Schleife über den zyklischen Aufruf haben).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du musst dir die Schleifen so vorstellen, dass immer nach dem END_xxx "zurück gesprungen" wird! Aber das immer im selben SPS-Zyklus!!

Also um bei deinen Beispiel zu bleiben...

Code:
WHILE  wd_input <= 5 DO
wd_output := 20;
END_WHILE;

WHILE wd_input <=5 DO ... heißt soviel wie: Solange wd_input kleiner gleich 5 mache ... das was zwischen WHILE und DO steht nennt man auch Durchführungsbedingung!

Also hat wd_input z.B. den Wert 4 dann wird wd_output zwar mit dem Wert 20 überschrieben aba bei dem END_WHILE springt er wieder zurück zur Durchführungsbedingung!
Nachdem wir uns immer noch im selben Zyklus befinden und sich der Wert von wd_input nicht ändern wird, wird die Schleife immer und immer wieder durchgeführt (theoretisch unendlich).

Deine SPS geht dadurch in STOP.

Code:
Index := 0;
Out := 0;
WHILE Index < Endwert DO
Index := Index + 1;
Out := Out + Index;
END_WHILE

Das ist zwar kein praktisches Beispiel, aber überleg dir mal folgendes:

Endwert = 7

Wie oft wird die Schleife durchlaufen?
Welchen Wert hat Out nachdem die Schleife beendet wurde?
 
Du musst dir zu allererst mal vorstellen das die SPS ohne irgendwelches äußeres zutun eine Endlose Schleife ist.
Wenn du diese Denkweise mal begriffen hast, dann kommst du auch zum Ergebnis das eine WHILE-Schleife
von ein paar Spezialfällen abgesehen (hat aber dann mit Datenhandling zu tun), vollkommen unnötig ist.

Ich verwende eine WHILE Schleife praktisch gelegentlich mal zum durchsuchen eines Datenbereichs,
also ein Array durchsuchen bis ich im Array finde wonach ich suche, natürlich sollte man auch hier eine entsprechende Abbruchbedingung vorsehen.
P.S. Das könnte man auch mit FOR Schleife und Exit machen, ist aber optisch umständlicher.

Mfg
Manuel
 
Zurück
Oben