Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   repeat until behindert Timer-funktion/ suche alternative (https://www.delphipraxis.net/137509-repeat-until-behindert-timer-funktion-suche-alternative.html)

BAMatze 22. Jul 2009 11:19


repeat until behindert Timer-funktion/ suche alternative
 
Hallo nochmal an alle DP´ler,

wieder mal ein Problem. Also ich habe in einer Klasse einen Timer für die Kollisionsüberwachung von Verschiebetischen (es handelt sich um digitale Eingänge, also liegt Strom an so ist ein Anschlagssensor ausgelöst worden -> Stromabschaltung für Verschiebetische). Dabei liegen die digitalen Eingänge in einer seperaten Klasse (TObject) für das KontrolerBoard und die Verschiebetische in einer anderen. Jetzt muss ich allerdings am Anfang die Verschiebetische Kalibrieren und als Referenzposition definieren. Dies hab ich mittels einer repeat-until-Schleife so gelöst:

Delphi-Quellcode:
function TV_Tische.Kalibrierung: boolean;
var iIndex: Integer;
begin
  for iIndex := 1 to 2 do
    begin
      MMC_setdevice(iIndex); // Kanal für einen Verschiebetisch wird gewählt
      Beschleunigung_festlegen(2000);
      Geschwindigkeit_festlegen(2000);
      BewegenABS('FE2'); // Referenzposition anfahren
    end;
  if Bewegtsich(1) or Bewegtsich(2) then
    begin
      // die besagte repeat-until-schleife
      repeat

      until not (Bewegtsich(1) and Bewegtsich(2));
      result := true;
      for iIndex := 1 to 21 do MMC_sendCommand('DH'); // Referenzposition intern festlegen (Null setzen)
    end
  else result := false;
end;
Die repeat-until-Schleife behindert jetzt aber die Überwachung in meiner anderen Klasse:

Delphi-Quellcode:
procedure TControlerBoard.fdigEingaenge_pruefen(Sender: TObject);
var iIndex: integer;
begin
  for iIndex := 1 to 4 do
    begin
      case iIndex of
      ...
      2: begin
            if ReadDigitalChannel(iIndex) = false then
              begin
                if ReadDigitalChannel(iIndex) <> digEingaenge[iIndex] then
                  begin
                    digEingaenge[iIndex] := true;
                    Stromversorgung_Verschiebetische_einschalten;
                    Spleissgeraet_einschalten;
                  end;
              end
            else
              begin
                if ReadDigitalChannel(iIndex) <> digEingaenge[iIndex] then
                  begin
                    digEingaenge[iIndex] := false;
                    Nothalt;
                  end;
              end;
          end;
      3: begin
            if ReadDigitalChannel(iIndex) = false then
              begin
                if ReadDigitalChannel(iIndex) <> digEingaenge[iIndex] then
                  begin
                    digEingaenge[iIndex] := true;
                    Stromversorgung_Verschiebetische_einschalten;
                    Spleissgeraet_einschalten;
                  end;
              end
            else
              begin
                if ReadDigitalChannel(iIndex) <> digEingaenge[iIndex] then
                  begin
                    digEingaenge[iIndex] := false;
                    Nothalt;
                  end;
              end;
          end;
      4: begin
            if ReadDigitalChannel(iIndex) = false then
              begin
                if ReadDigitalChannel(iIndex) <> digEingaenge[iIndex] then
                  begin
                    digEingaenge[iIndex] := true;
                    Stromversorgung_Verschiebetische_einschalten;
                    Spleissgeraet_einschalten;
                  end;
              end
            else
              begin
                if ReadDigitalChannel(iIndex) <> digEingaenge[iIndex] then
                  begin
                    digEingaenge[iIndex] := false;
                    Nothalt;
                  end;
              end;
          end;
      end;
    end;
Das auslösen des Nothalts funktioniert, wenn ich nicht in der besagten repeat-until-Schleife drin bin. Leider bringt auch die Überprüfung der digitalen Ausgänge in der until-Anweisung keine Besserung. Hat jemand einen Vorschlag, wie man dies besser lösen könnte?

Vielen Dank
BAMatze

Klaus01 22. Jul 2009 11:52

Re: repeat until behindert Timer-funktion/ suche alternative
 
Mahlzeit,

kannst Du die Überwachung nicht in einen eigenen Thread auslagern?
Wenn nicht vielleicht hilft dann das Einfügen von Application.processMessage
in der repeat-until Schleife etwas?

Grüße
Klaus

exilant 22. Jul 2009 11:53

Re: repeat until behindert Timer-funktion/ suche alternative
 
1. Die beste Lösung: Die Steuerung/Statusabfrage der Devices in einen Thread verlagern und ohne TTimer arbeiten.

2. Nicht so gut, sollte aber gehen: in der "Repeat" Schleife ein "application.processmessages" einbauen (gegebenenfalls noch ein sleep(xx)).

BAMatze 22. Jul 2009 12:41

Re: repeat until behindert Timer-funktion/ suche alternative
 
ok hat funktioniert auch wenn ich erstmal die schnellere Variant mit der "application.processmessages" gewählt hab.

Danke

Reinhard Kern 22. Jul 2009 13:32

Re: repeat until behindert Timer-funktion/ suche alternative
 
Zitat:

Zitat von BAMatze
ok hat funktioniert auch wenn ich erstmal die schnellere Variant mit der "application.processmessages" gewählt hab.

Danke

Hi,

wenn es sich wirklich um einen Nothalt handelt, muss die Abschaltung durch externe, sichere Hardware erfolgen - du siehst ja an diesem Thread, warum.

Gruss Reinhard

BAMatze 22. Jul 2009 13:58

Re: repeat until behindert Timer-funktion/ suche alternative
 
Zitat:

Zitat von Reinhard Kern
Zitat:

Zitat von BAMatze
ok hat funktioniert auch wenn ich erstmal die schnellere Variant mit der "application.processmessages" gewählt hab.

Danke

Hi,

wenn es sich wirklich um einen Nothalt handelt, muss die Abschaltung durch externe, sichere Hardware erfolgen - du siehst ja an diesem Thread, warum.

Gruss Reinhard

Daran haben wir hier schon gedacht, es gibt auch einen richtigen Notausschalter, den man von Hand betätigt, der dann automatisch den Strom zu den Controlern der Verschiebetische trennt. Allerdings sind ebend auch Anschlagssensoren angebracht, die bei Missachtung (Der Bediener schaut nicht auf die Maschinen) im Notfallt ebenfalls den Strom kappen sollen, damit die Maschine nicht oder nur im kleinen Maße beschädigt wird. Und die Überwachung dieser Anschlagssensoren will ich derzeit implementieren.

Edit1: Wird wohl doch auf ein TThreat hinauslaufen, da ich wieder die Probleme erhalte, dass das application.processmessages das Starten meines Programms behindert.

BAMatze


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz