Geht es hier wirklich um SPS-Programmierung?Muss ich dann das Programm extern z.B. mit einem ton alle 100ms aufrufen oder gibt es etwas wie eine sleep() Funktion wie in c, das ich in die while loop integrieren kann?
Aus Deiner WHILE-Schleife kommt das Programm erst heraus, wenn die Bedingung "Speichervariable <= 1000" nicht mehr erfüllt ist, also wenn Speichervariable > 1000 geworden ist (oder wenn das so lange dauert, daß die Zykluszeitübertwachung Deine SPS in STOP schickt).
Das "IF Speichervariable >= 1000 THEN" direkt nach der Schleife ist dann immer erfüllt, wodurch Speichervariable immer auf 0 gesetzt wird.
Harald
Speichervariable:= Speichervariable + Testprg.Testvariable;
IF Speichervariable >= 1000 THEN
Speichervariable:=0;
END_IF
TON_1(IN:= xHilfsVar, PT:=T#100MS);
xHilfsVar := NOT TON_1.Q;
IF TON_1.Q THEN
Speichervariable:= Speichervariable + Testprg.Testvariable;
END_IF
IF Speichervariable >= 1000 THEN
Speichervariable:=0;
END_IF
Die Abstände zwischen 2 aufeinanderfolgenden Starts des Timers ist >= 100 ms.Code:xHilfsVar := NOT TOF_1.Q; TOF_1(IN:= xHilfsVar, PT:=T#100MS);
TON_1(IN:= TRUE, PT:=T#100MS); //ggf. IN:= xNotFirstCycle
IF TON_1.Q THEN
TON_1(IN:= FALSE); //den TON einmal mit IN = 0 aufrufen --> Reset des TON
...
Ich meine, auch bei dieser TOF-Konstruktion wird ein Pulsabstand (Periodendauer) "PT + 1 Zyklus" erzeugt, weil die TOF-Zeit erst läuft, wenn IN = 0Code:xHilfsVar := NOT TOF_1.Q; TOF_1(IN:= xHilfsVar, PT:=T#100MS);
Ergebnis nach 1min:
Task 50ms: Ergebnis Speichervariable: 300
Task 10ms: Ergebnis Speichervariable:500
Task 1ms: Ergebnis Speichervariable:600
Damit auch noch leichte Programmausführungszeit-Schwankungen vom Anfang der Task bis zum Programmcode mit dem TON eliminiert werden, kann man noch weitere 10..50% der Task-Zeit vom Wert für PT abziehen, dann sorgt das Task-Aufruf-Raster dafür, daß sich ein tatsächlicher Pulsabstand von 100ms einstellt, und auch die 10ms-Task bzw die 50ms-Task auf 600 kommen:Um diesen zusätzlichen Reset-Zyklus zu eliminieren [...] Oder man stellt PT auf "Sollzeit" - 1x Taskzeit ein.
TON_1(IN:= xHilfsVar, PT:=T#87MS); //10ms-Task / für 50ms-Task sollte ein Wert T#40MS funktionieren
xHilfsVar := NOT TON_1.Q;
IF TON_1.Q THEN
Speichervariable := Speichervariable + 1;
END_IF
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?