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:36)
Als Antwort auf Re: Timerüberlauf von Detlef - 30.06.2009 8:12
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
> >  

oder konkret zu meinem Beispiel:

long Aktzeit[20];                                    // Initialisierung als long.

...

Aktzeit[a]= system.timer() + 20000;        // Zuweisung von Aktzeit

...
   
   if  (system.timer() - Aktzeit[a]) > 0       // Bedingung


wäre dann völlig ausreichend?

Detlef


    Antwort schreiben


Antworten: