Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: Timerüberlauf Kategorie: Programmierung (von Detlef - 30.06.2009 8:12)
Als Antwort auf Re: Timerüberlauf von nitram - 30.06.2009 7:10
Ich nutze:
C-Control II Station, OSOPT V3.0
> > > > Hallo,
> > > > ich habe mal eine Frage zur Timervariable.
> > > >
> > > > Die Systemtimervariable ist vom Typ long und wird ca. alle 24 Tage überlaufen. Die Frage ist, wie geht
> > > > man mit dieser Variable nun um? Ich habe beispielsweise zyklische Ã?berwachungen programmiert,
> > > > wo sich ein Proze� solange schlafen legt, bis system.timer() + X überschritten ist. Funktioniert auch
> > > > prima, gehe aber nun davon aus, da� in einem ünglücklichen Moment das Ganze auch mal
> > > > nach hinten losgehen kann.
> > > > Wie kann man diese Variable überhaupt sicher verwenden?
>
> ja kann man, warum auch nicht :-)
>
> > > > Kann man diese evtl. auch wieder zurücksetzen?
>
> ja kann man, macht aber keinen Sinn...
>
> > > Zurück setzen / verändern geht da nicht.
>
> > >
> > > Ich habe einen ähnlichen Anwendungsfall wie Du. Bei mir ist es eine Spannungsfrei Schaltung für
> > > Rolladenmotore.
> > >
> > > Ich habe eine zweite Variable (eigener Timer) genommen, welche im Sekundentakt hochgezählt wird.
> > > Diese benutze ich das als eigene Timer Variable. Um hier jetzt einen Ã?berlauf zu verhindern, wird die
> > > eigene Timervariable immer um 4.00 Uhr zurückgesetzt. Die Wahrscheinlichkeit, das früh um 4.00 Uhr
> > > Rolläden bedient werden, ist bei mir unwahrscheinlich. Aber man könnte auch hier noch entgegen
> > > wirken, und den Rolladen Thread einfach um 4.00 aussetzen.
> > >
> > > Ob diese Lösung bei Dir anwendbar ist, weis ich nicht. Vielleicht hilfst irgendwie als Lösungsansatz.
> > >
> > >
> > > Rene
> >
> > Hallo Rene
> > vielen Dank für die Antwort.
> > inst ja mal interessant, ein Anwendungsfall des Threads mit dem Timer ist tatsächlich auch die
> > Jalantriebe wieder spannungsfrei zu schalten...
> >
> > Habe jetzt erstmal folgenden Lösungsansatz gewählt, frage mich aber, ob das nicht auch eleganter
> > geht.
> >
> >       if (Aktzeit[a] <= system.timer() and Aktzeit[a]-360000000 < Aktzeit[a])      
> >        or (((Aktzeit[a]-360000000) > system.timer()) and Aktzeit[a] > 360000000)    
> >
> > Aktzeit[a] wird durch andere Funktionsteile gesetzt, und ist system.timer() + eine Wartezeit X.
> >
> > Normalerweise reicht ja der Vergleich
> >
> >     Aktzeit[a] <= system.timer()
> >
> > um ein Ereignis auszulösen, aber wegen des Zählerumlaufs habe ich das um
> >  
> >    Aktzeit[a]-360000000 < Aktzeit[a] erweitert. Dieser Ausdruck bleibt nämich negativ, wenn
> >
> > Aktzeit[a] umgelaufen ist.
> >
> > Au�erdem wir sofort ausgelöst, wenn Aktzeit[a] - 100 Stunden immernoch grö�er ist als
> > system.timer() obwohl Aktzeit[a] schon grö�er ist als 100 Stunden. dann ist nämlich
> > system.timer() umgelaufen, und das Ereignis mu� sofort ausgelöst werden.
>
> Timerabfragen sollten eigentlich immer nach folgenden Schema ablaufen:
>
>
> long timer;
>  timer=system.timer();
>  loop
>  {
>   ...
>   if  system.timer()-timer>=500 // Ist die Wartezeit von 500ms um??
>    {
>     timer=system.timer(); // Timerwert speichern
>     ... // mach etwas
>    }
>  }
>

>
> Solange der Datentyp vom Typ long sind, passiert nichts.
>
> nitraM

Hallo NitraM,

ganz verstanden habe ich das noch nicht.
Gesetzt den Fall, timer erhält bei der Zuweisung den Wert 2147483647.
600 ms später komme ich wieder zu der if Anweisung. system.timer() hätte wegen Umlaufs
den Wert -2147483048? Die Rechenoperation -2147483048 -2147483647 mü�te -4294966695 ergeben,
übersteigt damit den Wertebereich des Typs long um das Doppelte, aber wieso sollte das Ergebnis
trotzdem 600 werden?

Detlef
>  


    Antwort schreiben


Antworten:

Re: Timerüberlauf (von Detlef - 30.06.2009 8:36)
Re: Timerüberlauf (von nitram - 30.06.2009 8:30)
    Re: Timerüberlauf (von reneforster - 30.06.2009 15:01)
        Re: Timerüberlauf (von nitram - 30.06.2009 21:16)
    Re: Timerüberlauf (von Detlef - 30.06.2009 9:21)
    Re: Timerüberlauf (von Detlef - 30.06.2009 8:45)