Codesys Timer anhalten

Hoffy

Level-1
Beiträge
132
Reaktionspunkte
16
Zuviel Werbung?
-> Hier kostenlos registrieren
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 ?

timer1.jpg
 
Zuletzt bearbeitet:
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.

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

Code:
ftrigPause(CLK := bStart);

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

myTon(IN := bStart, PT := PT);
 
Danke , ich habe eine andere simple Methode gefunden , und die Zeit lässt sich anhalten und bei Bedarf weiter laufen
 
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.

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

Code:
ftrigPause(CLK := bStart);

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

myTon(IN := bStart, PT := PT);
Danke für das Beispiel, hat mir sehr geholfen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
Code:
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
Code:
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*)
 
Zuletzt bearbeitet:
Zurück
Oben