TIA SCL Reaktion bei Endlosschleife.

qwsayxqay

Level-1
Beiträge
24
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Miteinander,

Angenommen man hat bspw. in SCL unabsichtlich eine Schleife programmiert, die sich in einem Zyklus zu einer Endlosschleife entwickelt.

Nun kann man ja in so einem Fall mit dem OB80 bei Überschreitung der maximalen Zykluszeit reagieren. Leider lässt es sich damit ja nun nicht verhindern, dass die CPU in den STOP Zustand geht....

Ich hätte gerne eine Lösung um während des Schleifendurchlaufs zu erkennen, ob sich eine Schleife evtl. zu einer Endlosschleife entwickelt um damit die Schleife rechtzeitig zu verlassen und dadurch verhindern, dass die CPU in STOP geht. Das könnte man z.B in etwa so lösen:

tempLReal3 := 0.0;

Start Schleife

Schleife Code

tempLReal2 := RUNTIME(tempLReal1);
tempLReal3 := tempLReal3 + tempLReal2;

IF (tempLReal3 >= "MAX_TIME") THEN
EXIT;
END_IF;


Ende Schleife;

Die Konstante "MAX_TIME" müsste dann irgendwo zwischen aktueller Zykluszeit und parametrierter maximaler Zykluszeit liegen.

Mir ist klar, dass man im Prinzip darauf achten sollte/muss Endlosschleifen auszuschließen. Allerdings suche ich nach einer "Defaultlößung", die standardmäßig jeder Programmierer zur Sicherheit in seine Schleifen einbaut.

Hat da zufällig jmd. eine Idee, ob man das Ganze etwas komfortabler lösen könnte? Bsp. Watchdog oder so...

Gruß
 
Zuletzt bearbeitet:
Ich muss da jetzt mal anders herum fragen :
Warum kann sich denn deine Schleife zu einer Endlosschleife entwicklen ? Ich habe da auch schon so manches "Monster" erschaffen - aber eine Endlosschleife war immer nur ein Programmierfehler ... 8)
Du musst bei alle dem beachten. dass die Zykluszeit ja denn Sinn hat, deine SPS in die Lage zu versetzen, auf etwas zu reagieren - das wirst du mit deinem Ansatz möglicherweise nicht mehr schaffen. Also ... was hast du eigentlich vor ? Vielleicht beschreibst du es nicht jur sondern postest auch einfach mal deinen Code ...

Gruß
Larry
 
Also wenn man bei jeder Schleife so einen Notausgang programmieren muss dann tut es mir einfach nur leid.
Man soll also bei jeder Schleife mit der eigenen Dummheit rechnen?

*ACK*

Sollte eine WHILE oder DO Schleife notwendig sein - was ich zu vermeiden suche - wird der Abbruch gut abgesichert. Vor allem nicht auf = prüfen, falls man mal einen Wert überspringt: immer auf >= oder <= prüfen.

In 99% der Fälle funktioniert eine FOR Schleife. Die ist nicht endlos.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Man soll also bei jeder Schleife mit der eigenen Dummheit rechnen?
Ja, unbedingt, Michael!

TippFehler, FlüchtigkeitsFehler und GedankenSprünge können einem ganz schnell einen Strich durch die Rechnung machen!
Lieber dreimal zuviel als einmal zu wenig überlegen/testen. Und auch die Fälle berücksichtigen und einplanen, von denen man sich einbildet, dass sie eigentlich nie auftreten werden.

Aber einen weiteren EndlosSchleifenWatchDog einzubauen, weil der vorhandene nicht gut genug sein soll ...
Entschleunigen ist zwar in Mode, aber deshalb eine schnelle Schleife in eine langsame, potenziell noch endlosere umzustricken, das kann es nicht sein.
So unangenehm ein PLC-Stopp auch sein kann, einen unerkannten Fehler im Programm finde ich weitaus schlimmer, ganz zu schweigen von tolerierten Fehlern.

Mir selbst würde ich ein solches HilfsMittel in der TestPhase erlauben, anderen aber nicht, aus dem tiefen Misstrauen heraus, dass die Mimik nicht wieder entfernt wird. ;)

Gruss, Heinileini
 
Wenn eine Schleife so unübersichtlich ist, dass man Angst hat, dass es zu Endlosschleifen kommen könnte, dann sollte man das ganze Konstrukt übersichtlicher gestalten und nicht Notausgänge dazuprogrammieren, von denen man dann ja auch nicht weiss, ob sie funktionieren ;)

Also, wenn ich nicht weiss, ob die Schleife funktioniert, weiss ich auch nicht, ob der Notausgang funktioniert...

GRUß
 
*ACK*

Sollte eine WHILE oder DO Schleife notwendig sein - was ich zu vermeiden suche - wird der Abbruch gut abgesichert. Vor allem nicht auf = prüfen, falls man mal einen Wert überspringt: immer auf >= oder <= prüfen.

In 99% der Fälle funktioniert eine FOR Schleife. Die ist nicht endlos.

Endlos ist vermutlich auch nicht das Wort das der OP meint. Aber eine FOR, While etc Schleife kann halt doch mal zu einer Zyklusüberschreitung führen. Die meisten dürften in einer While auch mit nem normalen Index arbeiten der bei jedem Durchlauf inkrementiert oder dekrementiert wird.

Allerdings, was da eine Erkennung mit Exit z.B. bei einer FOR und auch While bringen soll, sehe ich nicht. Die fängt ja beim nächsten Zyklus wieder von vorne an (bei While könnte man das ja noch abfangen und im nächsten Zyklus an der letzten Stelle weitermachen) und wird dasselbe Problem bekommen.

Man könnte natürlich mit time_Tck in der Schleife beobachten wie lange sie denn schon am arbeiten ist. Aber dann weiss man ja auch noch nicht wie viele Schleifen den Zyklus schon belastet haben und ob jetzt die aktuelle schleife schon beim ersten Durchlauf die Zyklusgrenze knackt.

Dann ist die Frage ja auch. Muss die Standardüberwachung für dieses Projekt so kurz sein? Gibt es nachteile wenn ein Zyklus mal 2 sekunden braucht und sonst immer nur 150ms. Kann man die Schleife die ab und zu lange braucht, auch auf mehrere Zyklen verteilen (ausmessen mit Runtime). Das gehört halt nunmal zum Plan wie man ein Programm erstellt. Sonst könnte es ja jeder :ROFLMAO:
 
....Allerdings suche ich nach einer "Defaultlößung", die standardmäßig jeder Programmierer zur Sicherheit in seine Schleifen einbaut...

Diesen Satz finde ich ja ganz gut. Allerdings besteht bei uns/mir kein Bedarf an so einer Lösung da wir standardmäßig Schleifen so programmieren, dass sie funktionieren.
 
Keine Schleife programmieren können, aber diesbezüglich Fehler abfangen wollen - genau mein Humor :ROFLMAO: !
Du hast ja Recht, Dagobert, aber man sieht immerhin den guten Willen!

Es wurde ein lauerndes Problem erkannt und die Notwendigkeit, ggfs zu handeln.
Ein kleiner Schritt in die[/der] richtige[n] Richtung, aber die daraus gezogene Konsequenz ... hmmm.
Die HemmSchwelle "mein Programm läuft" zu sagen, scheint auf das Niveau "mein Programm stürzt nicht mehr ab" gesunken zu sein. ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
....Allerdings suche ich nach einer "Defaultlößung", die standardmäßig jeder Programmierer zur Sicherheit in seine Schleifen einbaut...

Das ist ja das schöne an einer SPS, das diese Funktion im System implementiert ist.
Die CPU geht Automatisch in den Stop oder ruft einen Alarm OB auf.
Was will man mehr?
 
Was macht man eigentlich mit dieser Standardmäßigen "Lösung" für Schleifenüberläufe? Woher weiß man dann, dass man dem Schleifenablauf trauen kann und er nicht ungewollt vorzeitig rausspringt? Hat man dann in ungünstigen Fällen Schritte die noch hätten abgearbeitet werden müssen vergessen? Wie soll man das dann herausbekommen?
 
Woher weiß man dann, dass man dem Schleifenablauf trauen kann und er nicht ungewollt vorzeitig rausspringt?

Ne Schleife springt nicht ungewollt raus :ROFLMAO: Die macht immer genau das, was Du programmiert hast... Obwohl, naja, wenn Du was anderes gewollt hast, also Du programmiert hast, dann ist es dann doch irgendwie "ungewollt" :ROFLMAO:

Also keine Ahnung, was Du eigentlich willst. ;)
 
Meine bescheidene Meinung zu dem ganzen Thema,

man versucht ein Problem das man selber verursacht hat mit einer Methode zu umschiffen, die noch mehr Probleme
bringt und das ursprüngliche Problem auch nicht beseitigt / verbessert oder sonst was. Ich würde meine Kräfte
in die saubere Programmierung der ursprünglich gewünschten Funktion stecken. Dann braucht man alles andere auch
nicht.
 
Zurück
Oben