Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Stoppuhr

FredlFesl
2010-10-01
2010-10-04
  • FredlFesl - 2010-10-01

    Hi!
    Könnt ihr mir verraten wie ich eine Stoppuhr programmieren kann.
    Die Zeit soll starten wenn eine bool variable auf true ist stoppen wenn sie auf false ist.
    ist bestimmt nicht so schwer. Aber ich weiß es trotzdem nicht.

    Danke.

     
  • Rolf-Geisler - 2010-10-01

    Ist wirklich nicht so schwer.

    Hallo erstmal,
    es gibt die Funktion TIME(), die den CPU-Zeitstempel liefert. An der steigenden Flanke Deiner BOOL-Variablen holst Du Dir also die Zeit von der CPU ab und speicherst sie in eine TIME-Variable, und an der fallenden Flanke holst Du die Zeit noch mal von der CPU ab und bildest die Differenz zum gespeicherten Zeitstempel:

    VAR
      Trigger : BOOL;
      StartVonTrigger : TIME;
      LaengeVonTrigger : TIME;
      lhTrigger : R_TRIG;
      hlTrigger : F_TRIG;
    END_VAR
    (* Erst mal nach den Signalflanken suchen *)
    lhTrigger (CLK := Trigger);
    hlTrigger (CLK := Trigger);
    (* und jetzt die Signalflanken auswerten *)
    (* ... Startflanke von Trigger *)
    IF lhTrigger.Q
    THEN StartVonTrigger := TIME();
    END_IF;
    (* ... Stopflanke von Trigger *)
    IF hlTrigger.Q
    THEN LaengeVonTrigger := TIME() - StartVonTrigger;
    END_IF;
    

    Gruss Rolf

     
  • FredlFesl - 2010-10-04

    Vielen Dank!

     
  • Anonymous - 2010-10-04

    Originally created by: jl

    Hallo!

    Viele Wege führen zum Ziel.
    Man kann z.B. auch mit jedem Durchlauf des Taks eine Variable mit der Zykluszeit hochzählen lassen:

    IF starteStoppuhr THEN
    zeit := zeit + t#10ms;
    END_IF

    Ein Reset wird allerdings auch noch benötigt:

    IF reset THEN
    zeit := 0;
    END_IF

    Oder mit einem sich selbst rückstellendem Timer auch eine Variable hochzählen lassen. PT vom Timer bestimmt dann die Genauigkeit der Stoppuhr (hier z.B. 100ms)

    TON_takt(IN:= NOT TON_takt.Q AND starteStoppUhr, PT:= t#100ms , Q=> , ET=> );

    IF TON_takt.Q THEN
    zeit := zeit + TON_takt.PT;
    END_IF

    Oder einen Timer mit genügend langer PT laufen lassen und ET des Timer als gestoppte Zeit verwenden. Beachte allerdings bei dieser Variante, daß die Zeit beim erneuten starten wieder von 0 beginnt:

    TON_stoppuhr(IN:= starteStoppUhr, PT:= t#24h , Q=> , ET=> );

    IF starteStoppUhr THEN
    zeit := TON_stoppuhr.ET;
    END_IF

     
  • Anonymous - 2010-10-04

    Originally created by: jl

    Hallo nochmal!

    Die Variante mit der Systemzeit hätte ich so gemacht:

    IF starteStoppUhr THEN
    IF NOT getStartzeit THEN
    getStartzeit := TRUE;
    startzeit := TIME();
    END_IF
    zeit := TIME() - t1;
    END_IF

    IF reset THEN
    reset := FALSE;
    getStartzeit := FALSE
    zeit := t#0ms;
    END_IF

     

Log in to post a comment.