- Beiträge
- 9.191
- Reaktionspunkte
- 2.950
-> Hier kostenlos registrieren
Um einen Zeitimpuls (z.B. Sekundenimpuls) zu generieren, habe ich bei der 300/400er oder auch bei den
Codesys-Steuerungen bisher oft einen TON-Timer verwendet, der am Eingang IN mit den negierten eigenen Ausgang Q
beschaltet ist. Der Ausgang Q steht dann nach Ablauf der Zeit für genau einen Zyklus auf true.
Bei der S7-1200 funktioniert das nicht mehr, bzw. ist es von der Programmierung abhängig ob es funktioniert.
Ich habe mir ein kleines Testprogramm mit 4 verschiedenen Varianten von TON-Aufrufen geschrieben, aufgerufen im OB1.
Um die verschiedenen Varianten von der Funktion her vergleichen zu können, wird wenn der Ausgang Q eines Timers auf true
steht eine Integer-Variable inkrementiert.
Die Funktion Wait wartet in einer Schleife bis die parametrierte Zeit abgelaufen ist:
Ergebnis:
* Timer Variante 1
Abfrage Q nach dem Timeraufruf. Zähler zählt überhaupt nicht bzw. hochsporadisch.
* Timer Variante 2
Timer-Ausgang Q über Hilfsvariable auf Eingang zurückgelegt. Zähler zählt.
* Timer Variante 3
Abfrage Timer-Ausgang Q vor dem Timeraufruf. Zähler zählt.
* Timer Variante 4
Grundsätzlich wie Variante 1, aber mit Zeitverzögerung zwischen TON-Aufruf und der Abfrage des Ausgangs Q.
Je größer die Zeit für Wait, desto schneller zählt der Zähler.
Jetzt versuche ich mir dieses Verhalten irgendwie zu erklären.
Die einzige Möglichkeit die mir einfällt wäre, dass die TON-Timer bei der 1200 nicht im OB1 Zyklus wenn sie vom Programmablauf
an der Reihe sind, sondern unabhängig davon in einer Art internen Task aufgerufen werden.
Das wirft meine Vorstellung vom geordneten Ablauf in einer SPS etwas durcheinander.
Gibt es noch eine andere Erklärung für dieses Verhalten?
Vielleicht kann das ja jemand mit TIA V12, einem neueren Firmwarestand oder sogar mit einer 1500er testen.
Meine Testumgebung:
TIA V11 Sp3 Upd4
1214 DC/DC/Relais HW2, FW V2.2.0
Codesys-Steuerungen bisher oft einen TON-Timer verwendet, der am Eingang IN mit den negierten eigenen Ausgang Q
beschaltet ist. Der Ausgang Q steht dann nach Ablauf der Zeit für genau einen Zyklus auf true.
Bei der S7-1200 funktioniert das nicht mehr, bzw. ist es von der Programmierung abhängig ob es funktioniert.
Ich habe mir ein kleines Testprogramm mit 4 verschiedenen Varianten von TON-Aufrufen geschrieben, aufgerufen im OB1.
Um die verschiedenen Varianten von der Funktion her vergleichen zu können, wird wenn der Ausgang Q eines Timers auf true
steht eine Integer-Variable inkrementiert.
Code:
FUNCTION_BLOCK "IECTimerTest"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
"PT" : Time := T#3s; // Zeitwert für alle Timer
END_VAR
VAR_OUTPUT
"TON1_CNT" : Int;
"TON2_CNT" : Int;
"TON3_CNT" : Int;
"TON4_CNT" : Int;
END_VAR
VAR
"TON1" : TON_TIME;
"TON2" : TON_TIME;
"TON3" : TON_TIME;
"TON4" : TON_TIME;
"TON2_Q" : Bool;
END_VAR
BEGIN
(* Test Timer 1
* Abfrage Q nach Timeraufruf, Zähler zählt nicht
*)
#TON1(IN:=NOT #TON1.Q, PT:= #PT);
IF #TON1.Q THEN
#TON1_CNT := #TON1_CNT + 1;
END_IF;
(* Test Timer 2
* Q über Hilfsvariable auf Eingang, Zähler zählt
*)
#TON2(IN:=NOT #TON2_Q, PT:= #PT, Q => #TON2_Q);
(* Timer 2 Zählimpuls, zählt *)
IF #TON2.Q THEN
#TON2_CNT := #TON2_CNT + 1;
END_IF;
(* Test Timer 3
* Abfrage Q vor dem Timeraufruf, Zähler zählt
*)
IF #TON3.Q THEN
#TON3_CNT := #TON3_CNT + 1;
END_IF;
#TON3(IN:=NOT #TON3.Q, PT:= #PT);
(* Test Timer 4
* wie 1, aber mit Zeitverzögerung zwischen TON-Aufruf
* und der Abfrage des Ausgangs Q. Je größer die Zeit für Wait, desto
* schneller zählt der Zähler.
*)
#TON4(IN:=NOT #TON4.Q, PT:= #PT);
"Wait"(T := t#10ms);
IF #TON4.Q THEN
#TON4_CNT := #TON4_CNT + 1;
END_IF;
END_FUNCTION_BLOCK
Die Funktion Wait wartet in einer Schleife bis die parametrierte Zeit abgelaufen ist:
Code:
FUNCTION "Wait" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
"PT" : Time;
END_VAR
VAR_TEMP
"starttime" : DTL;
"acttime" : DTL;
"diff" : Time;
"RD_SYS_T_RET_VAL" : Int;
END_VAR
BEGIN
(* Verweilt in der Funktion bis die an PT parametrierte Zeit abgelaufen ist. *)
#RD_SYS_T_RET_VAL := RD_SYS_T(OUT => #starttime);
REPEAT
#RD_SYS_T_RET_VAL := RD_SYS_T(#acttime);
#diff := T_DIFF(IN1 := #acttime, IN2 := #starttime);
UNTIL #diff >= #PT END_REPEAT;
END_FUNCTION
Ergebnis:
* Timer Variante 1
Abfrage Q nach dem Timeraufruf. Zähler zählt überhaupt nicht bzw. hochsporadisch.
* Timer Variante 2
Timer-Ausgang Q über Hilfsvariable auf Eingang zurückgelegt. Zähler zählt.
* Timer Variante 3
Abfrage Timer-Ausgang Q vor dem Timeraufruf. Zähler zählt.
* Timer Variante 4
Grundsätzlich wie Variante 1, aber mit Zeitverzögerung zwischen TON-Aufruf und der Abfrage des Ausgangs Q.
Je größer die Zeit für Wait, desto schneller zählt der Zähler.
Jetzt versuche ich mir dieses Verhalten irgendwie zu erklären.
Die einzige Möglichkeit die mir einfällt wäre, dass die TON-Timer bei der 1200 nicht im OB1 Zyklus wenn sie vom Programmablauf
an der Reihe sind, sondern unabhängig davon in einer Art internen Task aufgerufen werden.
Das wirft meine Vorstellung vom geordneten Ablauf in einer SPS etwas durcheinander.
Gibt es noch eine andere Erklärung für dieses Verhalten?
Vielleicht kann das ja jemand mit TIA V12, einem neueren Firmwarestand oder sogar mit einer 1500er testen.
Meine Testumgebung:
TIA V11 Sp3 Upd4
1214 DC/DC/Relais HW2, FW V2.2.0