TwinCAT 2, while-Schleife, Zykluszeitüberschreitung

jk1234

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich hab ein Problem.
Ich muss nämlich ein Programm schreiben, welches ein Tages-Sonneneinstrahlprofil abfährt und an der Klemme mittels Pwm ausgibt.
Ich hab das jetzt so gemacht, dass ich die Stundenwerte der Einstrahlung in einem Array gespeichert hab.
Mit einer While-Schleife lass ich ein Array-Zähler jede Stunde um 1 nach oben gehen,
um somit immer den nächsten Wert im Array zu nehmen (von 0 bis 24Uhr). Das Programm stürzt jedoch wegen Zykluszeitüberschreitung immer ab.
Weiß vielleicht jemand wie man das ohne Zykluszeitüberschreitung implementieren kann?

Vielen Dank schonmal!

Viele Grüße

jk1234
 
Was macht denn die While-Schleife? Vermutlich willst du dein Programm eine Stunde in einer Endlosschleife gefangen halten. Kein Wunder, dass die Zyluszeitüberwachung anspricht. Eine SPS arbeitet sowieso zyklisch.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, die While-Schleife wiederholt sich so lange, bis der Array-Zähler >=24 ist und der Array Zähler erhöht sich nur jede Stunde um 1 von 0 startend.
Also ist das Programm 24h in der While-Schleife gefangen :) Das dass nicht geht weiß ich inzwischen.
Aber ich weiß nicht wie ich es sonst schaffen kann, dass der Output sich in Echtzeit 1h-Takt auf den neuen Wert ändert?
 
Du kannst einfach einen Timerbaustein verwenden.

Code:
VAR
  timer:TON;
END_VAR

timer(IN := NOT timer.Q, PT := t#1h);

IF timer.Q THEN
  zaehler := zaehler + 1;
END_IF

IF zaehler = 24 THEN
 ......
END_IF

Mit while / repeat Schleifen immer extrem vorsichtig sein.
Dein SPS Programm wir immer zyklisch durchlaufen, mit der eingestellten Zykluszeit. Wenn die SPS es nicht schafft den Code in dieser Zeit auszuführen (z.B. weil irgendwelche Schleifen auf eine Bedingung warten die nicht eintrifft) gibt es eine Störung und die SPS hält an.
 
Zuletzt bearbeitet:
Moin jk1234,

es gibt bestimmt einige Möglichkeiten. Vielleicht stellt die Steuerung ja einen Sekundentakt bereit? Dann könntest Du davvon eine Flanke bilden und Sekunden zählen. Nach 60s ist eine Stunde voll...

VG

MFreiberger
 
Danke für eure Vorschläge, dadurch bin ich draufgekommen!
Hatte, wie Hohlkörper schon gesagt, eine Zeitmessung.
Hab's dann mit IF und in der Bedingung Modulo gelöst und wenn der Zähler bei 25 angekommen ist wieder auf 0 setzten
 
WIN_20200408_11_01_53_Pro.jpg
(Zeile 126-131)
Ne, das Modulo hab ich als Bedingung genommen, dass der Zähler nur jede Stunde eins nach oben gesetzt wird.
Und dann wenn h bei "25" (hier 250 da mein Programm 10 mal das h in der Sekunde wo die Bedingung zutrifft hochsetzt) ist, wird's wieder auf 0 gesetzt.
Die Uhrzeit 24Uhr und 0 Uhr wird dadurch einzeln durchgangen, was ja eigentlich falsch ist, aber es ging primär darum einen Tag von 0-24Uhr zu durchlaufen.
 
Ne, das Modulo hab ich als Bedingung genommen, dass der Zähler nur jede Stunde eins nach oben gesetzt wird.
Und dann wenn h bei "25" (hier 250 da mein Programm 10 mal das h in der Sekunde wo die Bedingung zutrifft hochsetzt) ist, wird's wieder auf 0 gesetzt.
Die Uhrzeit 24Uhr und 0 Uhr wird dadurch einzeln durchgangen, was ja eigentlich falsch ist, aber es ging primär darum einen Tag von 0-24Uhr zu durchlaufen.
Die Variablen tActualSystemTime.wMinute und tActualSystemTime.wSecond können tatsächlich Werte >= 60 enthalten? Sonst macht der MOD-Operator keinen Sinn.
Eine FlankenAuswertung für tActualSystemTime.wHour verglichen mit dem entsprechenden Wert im vorherigen ProgrammZyklus wäre doch einfacher und nicht abhängig davon, ob die Abfrage mehrfach bzw. wie oft sie pro Sekunde ausgeführt wird.
Ob Du nun in der Variablen h Stunden oder "DeziStunden" zählst, das ist Deine Entscheidung. Aber wieso gelangst Du überhaupt bis 25 oder 250? Hier wäre doch h MOD 24 bzw. h MOD 240 angebracht.
Ich kann Deinen Gedankengängen leider nicht folgen ...

PS:
Bzw. eine FlankenAuswertung für tActualSystemTime.wMinute kleiner als der entsprechende Wert im vorherigen ProgrammZyklus.
 
Zuletzt bearbeitet:
Zurück
Oben