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 11:24)
Als Antwort auf Re: Timerüberlauf von Detlef - 30.06.2009 9:54
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
> >  
>
> Boah, so ganz einfach ist das aber ja nicht.
> Nach Deiner Erklärung sollte man wie oben gezeigt mit der Timervariable umgehen.
> Das funktioniert aber nur, solange timer niemals grö�er als system.timer() wird.
> Ich dürfte also niemals zu timer einen Wert hinzuaddieren, da dann theoretisch
> das Rechenergebnis system.timer()-timer negativ werden kann, und der logische Vergleich sofort
> true ist.

Also irgendwie komme ich bei meiner Aufgabenstellung mit dem Timer nicht weiter.
Wenn ich zu einem Zeitpunkt X festlege wann ein verzögertes Ereignis A starten soll,
und zu einem Zeitpunkt Y festlege wann ein verzögertes Ereignis B starten soll, dann
kann ich niemals sagen, welches Ereignis (A oder B) als nächstes dran ist.
Das einzige was ich mit dem Timer ohne Berücksichtigung des Umlaufes machen kann ist, zu einem
Zeitpunkt X der garantiert NACH einem Zeitpunkt Y liegt, gucken wieviel Zeit verstrichen ist...


    Antwort schreiben


Antworten: