Einzelnen Beitrag anzeigen

Rupert

Registriert seit: 10. Nov 2013
23 Beiträge
 
#1

Nach Timer.Enable killt sich das Programm

  Alt 5. Sep 2021, 18:11
Liebe Freunde.

Ich habe ein Programm geschrieben, das meine Heizung steuert. Seit 1997 läuft das Programm klaglaos, bis ich vor 6 Monaten die Pumpen- und Mischersteuerung ausgegliedert habe, und mit einer Siemens-LOGO durchführen lasse.

Im Grunde genommen hat sich nicht viel geändert:
- die Steuerbefehle für 4 Pumpen und 4 Mischer werden nicht mehr von der Steuerkarte in meinem PC ausgeführt.
- Daten vom Heizkessel und von der PV werden von einem Server eingelesen
- Die Abarbeitung Hauptschleife dauert nun anstatt 0,8sec. 1,3 sec.
Zu Beginn der Regelung stoppe ich den Timer und am Ende starte ich ihn wieder, damit er die Hauptschleife nicht erneut auslöst.
Der Timer löst jede Sekunde die Hauptschleife aus.
Ich habe schon andere Timerkomponenten ausprobiert, was leider keinen Erfolg gebracht hat

Mittlerweile habe ich zur Fehlersuche eine kleine Datenbank angelegt, die die Routinen vor dem Aufruf einträgt (siehe Bild)
irgendwann -mal nach 40000 Einträgen, dann nach 6000 Einträgen beendet sich das Programm an einem Punkt, wo der Punkt Timer.enable:=true ausgeführt wird.

Ich bin leider mit meiner Weisheit am Ende und hoffe, dass ich auf diesem Wege Ideen erhalte, die dieses Problem lösen.
Vielleicht stehe ich auch nur auf dem Schlauch.
Danke und
lg Rupert

Delphi-Quellcode:
procedure THauptformular.Hauptschleife(Owner: TObject);

Begin

  inc (Hauptschleifencounter,1);

  if Hauptschleifencounter > 10 then Begin
    CounterStop(nil);
    inc(Regel_intervall_ist,1);
    if Regel_intervall_ist >= Regel_intervall then
    Begin
// Abscannen der Raum- und Wassertemperaturen
      Digital_Messwerte_holen(nil);
      Analog_Messwerte_holen(nil);

      Pruefung_der_Vorprogrammierung(nil); // check auf einen Programmwechsel

// Daten der Photovoltaik und des Heizkessels abfragen
      NANO_Daten_vom_Server(nil);
      Fronius_Daten_vom_Server(nil);

      Steuern[Kessel_Port]:=aus;
      Begin
        Regelvorgang_Raeume(nil);

// Kesselbetrieb abfragen
        if ((not Heizung_ausflag)) then
          Abfrage_Kessel_Einschalten(nil);
        If ((not Winterbetrieb_Aktiv)) then
          Abfrage_Kessel_Ausschalten(nil); // nicht Abschalten, wenn Winterbetrieb

        Ausgeben_auf_Steuerungskarte(nil);

        Istwerte_aktualisieren(nil);

// Speichern der aktuellen Werte zur Statistik
        inc(Speicherintervall_ist,1);
        if Speicherintervall_ist >= Speicherintervall then Begin
          Speicherintervall_ist:=0;
          Memo1.Clear; //memofeld entleeren um Speicherüberläufe zu verhindern
          Speicherung_Der_Messdaten(nil);
        end; //Speicherintervall
      end; // if Heizung_ausflag
    end; //Regel_intervall

    Display_aktualisieren(nil);
    CounterStart(nil);
  end; //if Hauptschleifencounter > 10
end;


procedure THauptformular.Counterstop(Owner: TObject);
Begin
  TimerEx1.Enabled:=False;
end;

procedure THauptformular.CounterStart(Owner: TObject);
Begin
    TimerEx1. CleanupInstance;
    TimerEx1.Enabled:=True;
end;
  Mit Zitat antworten Zitat