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;