AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Nach Timer.Enable killt sich das Programm
Thema durchsuchen
Ansicht
Themen-Optionen

Nach Timer.Enable killt sich das Programm

Ein Thema von Rupert · begonnen am 5. Sep 2021 · letzter Beitrag vom 11. Okt 2021
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
Rupert

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

Nach Timer.Enable killt sich das Programm

  Alt 5. Sep 2021, 19: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
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.643 Beiträge
 
Delphi 12 Athens
 
#2

AW: Nach Timer.Enable killt sich das Programm

  Alt 5. Sep 2021, 20:09
Nach den Infos klingt das für mich komisch. Deine Hauptschleife wird jede Sekunde aufgerufen, dauert aber manchmal mehr als eine Sekunde.
Ich habe jetzt nicht dein Programm angeschaut, aber warum läßt du den Timer dann nicht alle 2 oder mehr Sekunden laufen, damit das Ende immer innerhalb der Zeit fertig ist?
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
mmw
(Gast)

n/a Beiträge
 
#3

AW: Nach Timer.Enable killt sich das Programm

  Alt 5. Sep 2021, 20:19
Halo,

laut Online Hilfe soll man

CleanupInstance

nicht direkt aufrufen.

https://docwiki.embarcadero.com/Libr...leanupInstance

Gruß
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#4

AW: Nach Timer.Enable killt sich das Programm

  Alt 5. Sep 2021, 22:59
Deine Hauptschleife wird jede Sekunde aufgerufen, dauert aber manchmal mehr als eine Sekunde.
Der Timer wird ja innerhalb der Schleife aus- und wieder eingeschaltet. Das Timer-Intervall startet also erst am Ende der Schleife.

Was allerdings auffällt ist, dass der Hauptschleifencounter nicht zurückgesetzt wird. Es wird also ab dem 10-ten Aufruf jedes mal der gesamte Zyklus durchlaufen. Ich weiß nicht, ob das so gedacht ist.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#5

AW: Nach Timer.Enable killt sich das Programm

  Alt 6. Sep 2021, 08:07
Ich vermute auch das "CleanupInstance" da nicht hingehört, kommentiere das mal aus.

Statt den Timer immer wieder aus und ein zu schalten, ist es vieleicht besser die vergangene Zeit seit dem letzen Aufruf zu testen.
Delphi-Quellcode:
    procedure Hauptschleife(Owner: TObject);
  private
    SteuerungAktiv: Boolean;
    NextStart: TDateTime;
    procedure DoSteuerung;
  end;

implementation

const
  StartIntervall = 1{s} /24/60/60;
  Startverzoegerung = 10{s} /24/60/60;

function NowUTC: TDateTime;
var
  SystemTime: TSystemTime;
begin
  GetSystemTime(SystemTime);
  Result := SystemTimeToDateTime(SystemTime);
end;

procedure THauptformular.Hauptschleife(Owner: TObject);
begin
  if not SteuerungAktiv then
  begin
    SteuerungAktiv := True;
    if NowUTC >= NextStart then
    begin
      NextStart := NextStart + StartIntervall; // alternativ NowUTC + StartIntervall
      DoSteuerung;
    end;
    SteuerungAktiv := False;
  end;
end;

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

procedure THauptformular.CounterStart(Owner: TObject);
Begin
  NextStart := NowUTC + Startverzoegerung;
  TimerEx1.Enabled:=True;
end;

Geändert von Blup ( 6. Sep 2021 um 08:40 Uhr)
  Mit Zitat antworten Zitat
Rupert

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

AW: Nach Timer.Enable killt sich das Programm

  Alt 6. Sep 2021, 08:24
Halo,

laut Online Hilfe soll man

CleanupInstance

nicht direkt aufrufen.

https://docwiki.embarcadero.com/Libr...leanupInstance

Gruß
CleanupInstance ist erst zuletzt hinzugefügt worden, um ev. Puffer zu bereinigen - aus Verzweiflung, weil bisher nichts zur Lösung beigetragen hat.
Wird remarkt - Danke!
  Mit Zitat antworten Zitat
Rupert

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

AW: Nach Timer.Enable killt sich das Programm

  Alt 6. Sep 2021, 08:46
Deine Hauptschleife wird jede Sekunde aufgerufen, dauert aber manchmal mehr als eine Sekunde.
Der Timer wird ja innerhalb der Schleife aus- und wieder eingeschaltet. Das Timer-Intervall startet also erst am Ende der Schleife.

Was allerdings auffällt ist, dass der Hauptschleifencounter nicht zurückgesetzt wird. Es wird also ab dem 10-ten Aufruf jedes mal der gesamte Zyklus durchlaufen. Ich weiß nicht, ob das so gedacht ist.
JA, das ist so gedacht.
Die Regelintervalle sind 20 sec. damit die Mischermotoren nicht dauernd auf/zu fahren. Deren Gesamtlaufzeit ist 140 sec.
Die Sericherintervalle sind 30 x Regelintervall also 600 sec.
der Hauptschleifencounter wird auf 0 gesetzt - habe ich beim Löschen der Kommentierung (wegen der Lesbarkeit des Codes) versehentlich mitgelöscht - sorry - aber danke, würde ohne Nullsetzung nicht funktionieren.

Hat sich von gestern auf heute nach 33142 Ereignissen wieder gekillt - an der selben Stelle.
Habe CleanupInstance entfernt und nach inc (Hauptschleifencounter,1); einen Eintrag in die Datenbank gesetzt, um zu sehen, ob der Timer die Hauptschleife auslöst oder er selbst den Kill auslöst.
SW neu gestartet.

Danke für die Tipps!


Delphi-Quellcode:
        Ausgeben_auf_Steuerungskarte(nil);
        Hauptschleifencounter:=0;
        Istwerte_aktualisieren(nil);
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Nach Timer.Enable killt sich das Programm

  Alt 6. Sep 2021, 09:36
Hallo,
was sagt denn FastMM4 zu Deinem Programm?

Ansonsten, wie schon gesagt wurde, mal den Taskmanager mitlaufen lassen
zwecks Kontrolle des Speichers und der Handles.
Heiko
  Mit Zitat antworten Zitat
Rupert

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

AW: Nach Timer.Enable killt sich das Programm

  Alt 6. Sep 2021, 15:14
Hallo,
was sagt denn FastMM4 zu Deinem Programm?

Ansonsten, wie schon gesagt wurde, mal den Taskmanager mitlaufen lassen
zwecks Kontrolle des Speichers und der Handles.
FastMM4 kannte ich nicht. Halte es vorerst im Focus - Danke.
Taskmanager läuft bereits mit.
  Mit Zitat antworten Zitat
Rupert

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

AW: Nach Timer.Enable killt sich das Programm

  Alt 6. Sep 2021, 15:38
Nach den Infos klingt das für mich komisch. Deine Hauptschleife wird jede Sekunde aufgerufen, dauert aber manchmal mehr als eine Sekunde.
Ich habe jetzt nicht dein Programm angeschaut, aber warum läßt du den Timer dann nicht alle 2 oder mehr Sekunden laufen, damit das Ende immer innerhalb der Zeit fertig ist?
Es läuft ein Countdown mit, der signalisiert, wann der nächste Regelvorgang startet.
In der Statuszeile werden die jeweiligen "Stationen" - was soeben durchgeführt wird - visualisiert.
Werde ich beim nächsten Crash auf 2 sec. erhöhen und testen. Führt m.e. jedoch nicht zum Verursacher des Problems, wäre aber vlt. eine Lösung - Danke!

https://www.delphipraxis.net/attachm...1&d=1630935434
Miniaturansicht angehängter Grafiken
statuszeile.png  
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz