IEC-Zeiten unterbrechen und weiterlaufen lassen

simaticfan

Level-1
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich habe da ein Problem mit den IEC-Zeiten.
Ich benötige Zeitfunktionen , bei der ich die laufende Zeit "anhalten" und dann wieder weiterlaufen lassen kann ohne das die Zeit wieder von vorne beginnt sondern nur noch die Restzeit abläuft.
Ich benutze derzeit die SFB4.
Hiebei sehe ich nicht das Verhalten wie bei normalen Timern, das der Zeitwert stehenbleibt, wenn die SE-Bedingung vor Ablauf unterbrochen wird. Damit war es dort sehr einfach das beim Wiederstart weiterlaufen zu lassen.
Bei den IEC-Zeiten geht der Ablaufzeit-Wert sofort auf 0 wenn er vor Ablauf unterbrochen wird. Somit habe ich leider die Restzeit nicht mehr zur Verfügung.
IEC-Zeiten muss ich leider benutzen, da ich sehr lange Zeiten (10h und mehr) benötige.

Bin für jede Lösung dankbar (aber bitte nicht mit normalen Timern und Zählern für Mehrfachnutzung der Timer für die lange Zeit).
Besten Dank im Voraus.
 
Hallo

Wenn du Zeiten bis 10 Std. brauchst gehe ich davon aus dass eine Auflösung von 1 sec. reicht.
Ich würde den Zeitwert (als Int in Sekunden) in ein Datenwort schreiben und dann mittels Taktmerker im Sekundentakt runterzählen, oder eben nicht (= Unterbrechung).
Vergleicher wenn 0 erreicht --> Zeit abgelaufen. Fertig.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde wohl zum TONR (FC80) aus der Bibliothek "TI-S7 Converting Blocks" greifen. Kann aber gerade nicht in der Hilfe nachlesen, ob der diese Zeit abdecken kann, da ich hier kein Step7 habe.
 
Wenn Du was genaues brauchst, dann arbeite mit dem SFC64 "TIME TCK". Hier zählt die CPU zykluszeitunabhängig in 1ms-Schritten. Mit dem Wert kann man dann ja beliebig weiter arbeiten!
 
OK, vielen Dank erstmal für die Vorschläge.
Bei 1(Taktmerker) befüchte ich bei langen Zeiten ein Wegdriften
von der"Normalzeit", da ja dann Zykluszeiten doch eingehen bei den Abfragen im Programm. Ich hatte mir schon mal solche Timer selbst gebaut,
aber mit OB35 als Zeittaktzähler, ging, aber fand ich hier nicht so toll.

Ansonsten können auch mal 100h oder nur 100ms auftreten.
Und die Zeiten sollten mir halt auf Dauer nicht abdriften gegen die Uhrzeit.

Eins ist mir auch noch aufgefallen beim SFB4 , wenn da Null als Sollwert auftaucht (z.B.Fehleingabe vom User) schaltet er nicht sofort durch sondern läuft garnicht erst an. Find ich nicht gerade logisch.
Den Fall muss ich dann wieder abfangen.
Ich schau mir die genannten Funktionen mal an.
Also Danke nochmal.
 
Hallo,
das mit dem Vorgabewert "0" beim SFB3..5 ist kein Bug sondern ein Feature (von Siemens) ... ;)

Wenn du keinen weg-driftenden Zeitwert haben willst gibt es ur die Möglichkeit, dir jeweils mit der positiven Flanke deines Triggers die aktuelle Uhrzeit wegzuspeichern und mit der negativen Flanke die aktuelle Uhrzeit gegen die gespeicherte Uhrzeit zu verrechnen und als neuen Offset zu speichern.
Das könnte man ganz schön als FB machen, der dann auch den Vorteil hätte, dass die Zeitbasis TIME (also Millisekunden) sein könnte und dass es trotzdem noch ziemlich weit kommt. Wenn man dann auch noch das Datum mit dazu nimmt dann könnte man auch ununterbrochen im Prinzip beliebig auswerten ...

Gruß
Larry
 
Hallo simaticfan

Ich habe diese funktion in Codesys benötigt und mir ein Baustein geschrieben. Sollte aber genauso mit Simens IEC Zeiten gehen.
Ich hoffe Du kannst mit Programmierung in ST/SCL was anfangen.
Der Baustein arbeitet genauso wie ein IEC_TON hat aber zusätzlich den Eingang Enable mit dem die Zeit unterbrochen werden kann.

Code:
VAR_INPUT
 IN: BOOL; (* starts timer with rising edge, resets timer with falling edge *)
 Enable : BOOL ;
 PT: TIME; (* time to pass, before Q is set *)
END_VAR
VAR_OUTPUT
 Q: BOOL; (* is TRUE, PT seconds after IN had a rising edge *)
 ET: TIME; (* elapsed time *)
END_VAR
VAR
 TON : TON ;
 r_trig_IN : R_TRIG ;
 f_trig_Enable : F_TRIG ;
 Time_Memo : TIME ;
END_VAR
 
(* Positiver Impuls *)
r_trig_IN (CLK:= IN);
(* Negativer Impuls *)
f_trig_Enable (CLK:= Enable);
IF r_trig_IN.Q THEN (* Zeit neu setzen *)
 Time_Memo := PT ;
END_IF
IF f_trig_Enable.Q THEN (* Zeit unterbrechen *)
 (* Restzeit sichern *)
 Time_Memo := Time_Memo - TON.ET ;
END_IF
TON ( IN := Enable AND  IN, PT:= Time_Memo);
IF TON.Q AND Enable THEN
 Q := TRUE  ;
END_IF
IF NOT IN THEN
 Q := FALSE  ;
END_IF
IF IN THEN
 ET := PT - (Time_Memo - TON.ET);
ELSE
 ET := T#0s ;
END_IF

mfG Jochen
 
Zurück
Oben