Einschaltverzögerung pausieren und später fortsetzen

Gärtner

Level-2
Beiträge
34
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
vermutlich habe ich gerade ine Brett vorm Kopf, aber ich komme mit einem eigentlich banalen Problem nicht weiter.
Ich nutze eine Einschaltverzögerung für eine Alarmmeldung, ähnlich:
TonAlarm(in:=Eingang1 and Eingang 2, pt:=t#10m);

Jetzt möchte ich aber wenn EIngang 1 kurz abfällt die Zeit nicht resetten, sondern pausieren. Ich finde jedoch keinen Baustein dafür und bräuchte mal einen Denkanstoß.
MfG
 
Dafür gibt es auch nichts Fertiges (meines Wissens) - da müßtest du dir schon selber einen Baustein erstellen, der das tut.
Mein Vorschlag : ein FB in dem du für due Ablaufzeit selber eine Zählvariable nimmst, die du mit einem von dir gewählten Zeittakt dekrementierst.
 
So könnte es gehen ...

Code:
// Accumulator timer
// Switch-on delayed, like Standard.TON, but a falling edge at xIN only pauses the time accumulation.
// Only a timeout with a switching output or a positive edge at reset (xRst) enables a restart.
// Resolution in millisecond.
// v1.0, 2024-04-20, KLM

FUNCTION_BLOCK TONR_MS

VAR_INPUT
    xIN            : BOOL;
    tPT            : TIME;
    xRst        : BOOL;
END_VAR

VAR_OUTPUT
    xQ            : BOOL;
    tET            : TIME;
END_VAR

VAR
    fbRtIN        : Standard.R_TRIG;
    fbFtIN        : Standard.F_TRIG;
    xRun        : BOOL;
    udiStart    : UDINT;
    udiNow        : UDINT;
    udiCnt        : UDINT;
    udiHold        : UDINT;
END_VAR

Code:
fbRtIN(CLK:= xIN);
fbFtIN(CLK:= xIN);

IF fbRtIN.Q THEN
    udiStart := SysTimeCore.SysTimeGetMs();
    IF NOT xRun THEN
        udiHold := 0;
    END_IF
    xRun := TRUE;
END_IF

IF xRst THEN
    xRun := FALSE;
    xQ := FALSE;
END_IF

IF xIN AND xRun THEN
    udiNow := SysTimeCore.SysTimeGetMs();
    udiCnt := udiNow - udiStart;
    
    IF (udiHold + udiCnt) >= TO_UDINT(tPT) THEN
        xRun := FALSE;
        xQ := TRUE;
    END_IF
END_IF

IF fbFtIN.Q THEN
    udiHold := udiHold + udiCnt;
    xQ := xQ AND xRun;
END_IF

IF xRun THEN
    IF xIN THEN
        tET := TO_TIME(udiHold + udiCnt);
    ELSE
        tET := TO_TIME(udiHold);
    END_IF
ELSE
    IF xQ THEN
        tET := tPT;
    ELSE
        tET := TO_TIME(0);
    END_IF
END_IF
 
Hallo,
vermutlich habe ich gerade ine Brett vorm Kopf, aber ich komme mit einem eigentlich banalen Problem nicht weiter.
Ich nutze eine Einschaltverzögerung für eine Alarmmeldung, ähnlich:
TonAlarm(in:=Eingang1 and Eingang 2, pt:=t#10m);

Jetzt möchte ich aber wenn EIngang 1 kurz abfällt die Zeit nicht resetten, sondern pausieren. Ich finde jedoch keinen Baustein dafür und bräuchte mal einen Denkanstoß.
MfG
Vielleicht die noch benötigte Zeit wegspeichern und den Timer mit dieser Restzeit später wieder weiterlaufen lassen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ein Timer kann normalerweise einfach realisiert werden wenn man die Startzeit abspeichert und davon die aktuelle Zeit abzieht. Also wenn man das auf eine Speichernde Version umändern will einfach während der Off-Zeit den bereits abgelaufenen Wert speichern und bei einem Neustart des timers dann von der Startzeit abziehen. Dann kann man auch während der Offzeit diese gespeicherte Zeit reduzieren/resetten.
Das ganze ist relativ einfach zu realisieren, das einzige was man braucht ist eine Aktuelle Zeit in genügend hoher Auflösung. In Codesys-steuerungen kann man meistens auf eine ms Zeit zugreifen.
Code:
 akt_Time:=TIME();
 
Zurück
Oben