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

Re: Programm bleibt stehen Kategorie: Programmierung (von Günni - 4.01.2005 9:47)
Als Antwort auf Programm bleibt stehen von Horst - 3.01.2005 20:57
Ich nutze:
C164CI-ControllerBoard, OSOPT V3.0
> Hallo ich benutze die Control II für die Heizungsteuerung. Die Anzeige auf dem externen LCD, die
> eigentliche Steuerung, die Zeitverwaltung, Datenspeicherung auf 4 Mbit und die Temperaturabfrage der
> 8 Temperaturmodule über den TWBus laufen in verschiedene Treads.
>
> Die Steuerung läuft tadellos bis auf die Tatsache dass nach einiger Zeit sich die Steuerung aufhängt.
> Sobald der Thread für die Temperaturerfassung nicht gestartet wird läuft die Steuerung. Wird der
> Temperaturthread gestartet steht die Steuerung ab und zu nach einigen Minuten jedoch spätestestens
> einigen Stunden.
>
> Hat jemand hierfür eine  Erklärung oder ähnliche Probleme? Ich würde mich freuen wenn jemand eine
> Lösung für dieses Problem hat. Bin etwas verzweifelt da´ich schon seit ein paar Woche versuche den
> Fehler zu finden. Kann es zu Timingproblemen kommen wenn da das externe LCD auch über die Ports
> P1 gesteuert wird????
>
>
> Hier habe ich ein Teil des Temperturthreads abgebildet.
>
> //********************************************
> function Modemstatus() returns int
> {
>    long erg;
>    capture global.pf;
>    twb.init();
>    erg = twbs.rw_frame(0, allg.Modem_Adresse, 0, 0, 0);
>    release;
>    return (erg);
> }
>  
> function twb_temp(byte adr) returns int
> {
>     int Temp;
>     string s;
>     byte i;
>
>     //Temperatur über TWB abfragen
>     for i = 1 ... 3
>       {
>       capture global.pf;
>       Temp = twbs.stemp(adr);
>       release;
>       if (Temp < 2000)
>          break;
>       }
>     //Temperatur oder Fehler zurück melden
>     return(Temp);
>
> }
>
> //****************************************
> //   Temperatur Thread
> //****************************************
> thread Temperaturen
> {
>    int Temp;
>    byte i;
>    string s1, s2;
>
>    //TWB-Bus initialisieren
>    Temp = sensor_prog.Modemstatus();
>    allg.anz1 = "Modemstatus:";
>    s1 = "Modemstatus:";
>    if Temp < 2000
>       {
>       allg.Einst.Zustand = allg.setBit(allg.Einst.Zustand, allg.z_Twb, allg.OFF);
>       allg.anz2 = "   OK";
>       s2 = "   OK";
>       //anzeige.ausgebenl(s1, s2);
>       }
>    else
>       {
>       allg.Einst.Zustand = allg.setBit(allg.Einst.Zustand, allg.z_Twb, allg.ON);
>       //Fehlermeldung anzeigen
>       allg.anz2 = sensor_prog.ERR[Temp - 2001];
>       s2 = sensor_prog.ERR[Temp - 2001];
>       allg.anz_func = 1;
>       }
>
> run 1000;
>
>    loop
>    {
>    if allg.getBit(allg.Einst.Zustand, allg.z_Simu)
>       {
>       //Temparaturen aus Temperaturvektor nehmen
>       // nicht neu setzen
>       continue;
>       }
>
>    if allg.getBit(allg.Einst.Zustand, allg.z_Twb)
>       {
>       //Temparaturen aus Temperaturvektor nehmen
>       // nicht neu setzen
>       continue;
>       }
>
>    //Hier werden die Temperaturen abgefragt und in die Globalen Variablen
>    //geschrieben
>
>    //Brenner abfragen
>    Temp = twb_temp(allg.t_Brenner + 1);
>    if Temp < 2000
>       allg.Temp[allg.t_Brenner] = Temp + allg.Einst.Tkorr_Brenner;
>    
>    //Vorlauf abfragen
>    //twb.init();
>    Temp = twb_temp(allg.t_Vorlauf + 1);
>    if Temp < 2000
>       allg.Temp[allg.t_Vorlauf] = Temp + allg.Einst.Tkorr_Vorlauf;
>
>    //Aussentemperatur abfragen
>    //twb.init();
>    Temp = twb_temp(allg.t_Aussen + 1);
>    if Temp < 2000
>       allg.Temp[allg.t_Aussen] = Temp + allg.Einst.Tkorr_Aussen;
>
>    //Brauchwasser abfragen
>    //twb.init();
>    Temp = twb_temp(allg.t_Brauchw + 1);
>    if Temp < 2000
>       allg.Temp[allg.t_Brauchw] = Temp + allg.Einst.Tkorr_Brauchw;
>
>    //Solar abfragen
>    //twb.init();
>    Temp = twb_temp(allg.t_Solar_u + 1);
>    if Temp < 2000
>       allg.Temp[allg.t_Solar_u] = Temp + allg.Einst.Tkorr_Solar_u;
>    //twb.init();
>    Temp = twb_temp(allg.t_Solar_o + 1);
>    if Temp < 2000
>       allg.Temp[allg.t_Solar_o] = Temp + allg.Einst.Tkorr_Solar_o;
>
>    //Kaminofen abfragen
>    //twb.init();
>    Temp = twb_temp(allg.t_Kamin + 1);
>    if Temp < 2000
>       allg.Temp[allg.t_Kamin] = Temp + allg.Einst.Tkorr_Kamin;
>
>    //Heizkreis abfragen
>    //twb.init();
>    Temp = twb_temp(allg.t_Heiz + 1);
>    if Temp < 2000
>       allg.Temp[allg.t_Heiz] = Temp + allg.Einst.Tkorr_Heiz;
>
>
>    sleep 1000;
>    }
> //************************************************************


Hallo Horst,

das kann meiner Meinung eigentlich nur am capture liegen.
Ich würde da mal suchen, evtl. mal weglassen.
Man kann nicht "um Systemfunktionen herum" capturen da diese selbst capture/release benutzen.

Grü�e
Günni


    Antwort schreiben


Antworten:

Re: Programm bleibt stehen (von Horst - 13.01.2005 13:27)