# Codesys Timer anhalten



## Hoffy (20 März 2019)

Ich schnuppere gerade in Codesys und möchte dass die Zeit (TON.ET) wieder anfing wo sie aufgehört hat ,
mein Problem  wenn ich Start drücke resettet sich die Zeit wieder und beginnt von von 0 an.

Hat Jemand eine Idee ?


----------



## plcSniffer (20 März 2019)

Sobald du den Timer pausieren möchtest, sicherst du dir den Wert TON_0.ET in eine Variable vom Typ TIME ab. Wenn der Timer wieder aus der Pause starten soll, schreibst du die Differenz aus TON_0.PT und TIME Variable nach TON_0.PT.

Ein Beispiel mal als SCL angefügt, lässt sich problemlos in KOP umsetzen und gegebenfalls auch erweitern.


```
VAR
    bStart      : BOOL;
    ftrigPause  : f_TRIG;
    tTimePaused : TIME;
    myTon       : TON;
    PT          : TIME := T#30s;
END_VAR
```


```
ftrigPause(CLK := bStart);

IF ftrigPause.Q THEN
    tTimePaused := myTon.ET;
    PT := PT - tTimePaused;
END_IF

myTon(IN := bStart, PT := PT);
```


----------



## Hoffy (20 März 2019)

Danke  das mit der Differenz  kenne ich , ich möchte nur wissen ob TON.ET bei  gespeicherten Zeit beginnen würde , anstatt sich zu resetten.


----------



## plcSniffer (20 März 2019)

Er beginnt wieder bei T#0ms. Ist dieses Verhalten nicht gewünscht muss ein eigener Baustein entwickelt werden.


----------



## Hoffy (20 März 2019)

Danke , ich habe eine andere simple Methode gefunden , und die Zeit lässt sich anhalten  und bei Bedarf weiter laufen


----------



## shrimps (20 März 2019)

Hoffy schrieb:


> Danke , ich habe eine andere simple Methode gefunden , und die Zeit lässt sich anhalten  und bei Bedarf weiter laufen


Prima, dann zeige uns die Bitte

Gesendet von meinem ONEPLUS A3003 mit Tapatalk


----------



## Heinileini (21 März 2019)

shrimps schrieb:


> Prima, dann zeige uns die Bitte


Genau, wir haben doch überhaupt nichts dagegen, wenn ein TE selbst eine gute Lösung findet.
VORRRRRAUSGESETZT, er verrät sie uns!


----------



## letsfixit (11 Dezember 2021)

plcSniffer schrieb:


> Sobald du den Timer pausieren möchtest, sicherst du dir den Wert TON_0.ET in eine Variable vom Typ TIME ab. Wenn der Timer wieder aus der Pause starten soll, schreibst du die Differenz aus TON_0.PT und TIME Variable nach TON_0.PT.
> 
> Ein Beispiel mal als SCL angefügt, lässt sich problemlos in KOP umsetzen und gegebenfalls auch erweitern.
> 
> ...


Danke für das Beispiel, hat mir sehr geholfen.


----------



## idtell (22 Dezember 2021)

Da ich beim durchstöbern bemerkt habe "hierzu hatte ich doch was" :
kann meinen Baustein mal hier posten.
wurde gemacht um einen counter zu ersetzen welcher nicht ganz 100% gleichmäßig ging
Das Teilchen wurde von mir auch mit der Möglichkeit versehen tote Anlaufzeiten zu entfernen

```
Deklaration:

FUNCTION_BLOCK toCnt

VAR_INPUT
    IN:BOOL;    (*while active the elapsed time increases untill target time reached*)
    PT:TIME;    (*duration to activate output*)
    Reset:BOOL;(*to reset the elapsed time*)
    Startuptime:TIME;(*time that for an example a motor needs to run a relevant rpm, ex. t#150ms*)
END_VAR

VAR_OUTPUT
    ET:TIME;(*elapsed time*)
    Q:BOOL;(*time expired*)
END_VAR

VAR
    akt_Time:TIME;
    Starttime:TIME;
    in_old:BOOL;
    ET_diff:TIME;
    ET_delay:TIME;
    ET_akt:TIME;
    ET_old:TIME;
    Last_time:TIME;
    ET_int:TIME;
    (*inflanke:trigger; steigende und fallende Flanken, schlank und debugZähler*)
END_VAR
```


```
Fb_Text:
akt_Time:=TIME();
(*inflanke(    Val            := in);*)
IF (in AND NOT in_old ) THEN(*natürlich könnte man auch trig verwenden (inflanke.SF), man spart so nur die unterinstanz*)
    Starttime:= akt_time;
END_IF
(*in_old := in; achtung da Flanke nocheinmal gebraucht wird nicht hier schon setzen .. da hätte trig den Fehler vermieden*)
IF in THEN
    IF akt_Time>= Starttime THEN (*differenz , Überlauf abfangen*)
        ET_diff := (akt_Time-Starttime);
    ELSE
        ET_diff := (Starttime - akt_Time);(*einfach umdrehen da immer ein Kreis bis zu maximalwert*)
    END_IF

    IF ET_diff >= Startuptime THEN(*anlaufzeit abziehen*)
        ET_delay := ET_diff - Startuptime;
    ELSE
        ET_delay := T#0MS;      
    END_IF

    ET_int := ET_old + ET_delay;(*man könnte auch die reinen differenzen zwischen jedem Zyklus aufaddieren was ständig abgerundete Werte addiert*)
ELSE
    IF NOT in AND in_old THEN(*wird trig ferwendet dann einfach inflanke.FF*)
        ET_old := ET_int;
    END_IF
    (*ET_int :=T#0MS; bequemer wenn man diesen Wert noch anschauen kann*)
END_IF

in_old := in;
Last_time:= akt_time;
IF reset THEN(*reseteingang sollte man extern entscheiden ob zulässig, oft nur zulässig sobald NA neugestartet*)
    ET_int:=T#0MS;
    Starttime:= akt_time;
    ET_old := ET_int;
END_IF

ET:=ET_int;(*alle bearbeitungen übernehmen*)
q := ((ET >= PT) AND in )AND NOT Reset; (*wenn ein totalneustart ansteht den ausgang nicht mehr schalten*)
```


----------

