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

system.timer() Kategorie: Programmierung (von Detlef - 30.12.2010 17:09)
Ich nutze:
C-Control II Station
Hallo Zusammen,

ich habe Probleme mit einem Thread, der den Systemtimer verwendet.
Nach ca. 14 Tagen funktioniert er nicht mehr richtig, nach vier Wochen
werden die Fehlfunktionen so groÃ?, daÃ? ich einen Reset machen muÃ?.

Grundsätzlich stehe ich mit der long Variable auf Kriegsfu�; obwohl ich mich
meiner Meinung nach an die Spec halte, gibt es bei groÃ?en Zahlenwerten immer Probleme.

Deshalb glaube ich auch, da� der gro�e Zahlenwert des system.timer() Ursache für die
Probleme dieses Threads sind. Vielleicht erkennt ja einer von Euch sofort, was ich hier falsch mache.

Anbei der Code.
Grundsätzliche Funktion des Threads:
Mehrere Funktionen nacheinander ausführen.
Beispiel: Jalousien runterfahren und nach 20 Sekunden abschalten
oder
Licht aufziehen, nach einiger Zeit runterdimmen, dann nach weiterer Zeit ganz ausschalten.

Aktwert[a] ist der Aktor, der gesteuert wird
Aktwert[a+1] ist der Funtkionswert. Im Detail:
 0-9 sind Funktionen rund um Jalousiesteuerung
 10-19 sind Funktionen zur Relaissteuerung
 20-29 sind Funktionen für Lichtdimmung.
Aktwert[a+2] ist ein Parameter ( Wie weit sollen Jalousien fahren, wie hell das Dimmlicht usw.)
Aktzeit ist die Zeit in ms, die vergehen soll, bis die Aktwert-Funktion erneut aufgerufen wird.

Aktwert[a], Aktwert[a+1] und Aktwert[a+2] werden in einer anderen Funktion befüllt.
Nach deren Befüllung wir das Aktflag auf 1 gesetzt, damit folgender Thread aktiv wird:

thread Ueberwachung
{
  int a,wert;
  long wart;      // wart ist der Zeitpunkt wann reagiert werden soll.
                  // Reagiert wird, sobald system.timer() gröÃ?er wart wird.
  a=0;

  wait ((wart - system.timer()<=0) or Aktflag);  // Solange wart-wert noch nicht erreicht.
  wart = system.timer()+3600000;                 // jede Stunde zumindest ein Lauf.
  Aktflag=0;                                     // Interuptflag zurücknehmen.

  while Aktwert[a]!= ENDE                        // Schleife durchführen
    {
    if Aktwert[a] == LEER                        // Wenn Aktwert[a]==LEER und nächster Eintrag
      {                                          // ist ENDE, wir das ENDE um einen Eintrag
      if Aktwert[a+3]==ENDE Aktwert[a]=ENDE;     // vorgeholt.
      }
    else
      if (Aktzeit[a]-system.timer()) <= 0       // Ist diese Aktzeit überschritten?
        {
        if Aktwert[a+1] < 10                    // Jalousien steuern
          {
          if Aktwert[a+1] == 0                  // Modus 0 = Jalousie hoch bis Endschalter
            {
            dwmodule.JalAbs(JalZi[Aktwert[a]],Auf);  // Jalousie hochfahren
            sleep 100;
            Aktzeit[a]=system.timer()+30000; // neue Aktzeit = 30 Sec
            Aktwert[a+1]=1;                  // Modus auf 1 hochsetzen
            }
          else if Aktwert[a+1] == 1             // Modus 1 = Jalousien runterfahren.
            {
            if Aktwert[a+2] dwmodule.JalAbs(JalZi[Aktwert[a]],Ab);  // Jalousie runterfahren, wenn angegeben.
            sleep 100;                                              // verhindert das Kleben der Relais
            if Aktwert[a+2] == 1 Aktzeit[a]=system.timer()+4000;    // Jalousie viertel runterfahren
            else if Aktwert[a+2] == 2 Aktzeit[a]=system.timer()+8000;  // Jalousie halb runter
            else if Aktwert[a+2] == 3 Aktzeit[a]=system.timer()+12000;  // Jalousie ganz runter
            else if Aktwert[a+2] == 4 Aktzeit[a]=system.timer()+21000;  // Jalousie ganz runter
            Aktwert[a+1]=2;                   // Modi auf 2 hochsetzen
            }
          else if Aktwert[a+1] == 2           // Jalousien stoppen
            {
            dwmodule.JalAbs(JalZi[Aktwert[a]],Stop);
            sleep 100;
            Aktwert[a]=LEER;                  // Auftrag aus Aktwert löschen.
            }
          }
        else if Aktwert[a+1] < 20             // Relais steuern
          {
          }
        else if Aktwert[a+1] < 30             // Dimmer steuern
          {          
          }
        }
      if (wart-Aktzeit[a]) > 0 wart=Aktzeit[a]; // die kürzeste Wartzeit in wart eintragen
      a=a+3;                                    // nächsten Aktwert Eintrag prüfen.
    }
}


    Antwort schreiben


Antworten:

Re: system.timer() (von Wurl - 2.01.2011 21:32)
    Re: system.timer() (von nitraM - 4.01.2011 10:27)
        Re: system.timer() (von Detlef - 4.01.2011 11:35)
            Re: system.timer() (von nitraM - 5.01.2011 7:54)
                Re: system.timer() (von Wurl - 5.01.2011 10:48)
                    Re: system.timer() (von Detlef - 5.01.2011 17:08)
            Re: system.timer() (von Wurl - 4.01.2011 21:41)
    Re: system.timer() (von Detlef - 4.01.2011 8:50)