AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein repeat until behindert Timer-funktion/ suche alternative
Thema durchsuchen
Ansicht
Themen-Optionen

repeat until behindert Timer-funktion/ suche alternative

Ein Thema von BAMatze · begonnen am 22. Jul 2009 · letzter Beitrag vom 22. Jul 2009
Antwort Antwort
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#1

repeat until behindert Timer-funktion/ suche alternative

  Alt 22. Jul 2009, 12:19
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
2. Account Sero
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: repeat until behindert Timer-funktion/ suche alternative

  Alt 22. Jul 2009, 12:52
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
Klaus
  Mit Zitat antworten Zitat
exilant

Registriert seit: 28. Jul 2006
134 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: repeat until behindert Timer-funktion/ suche alternative

  Alt 22. Jul 2009, 12:53
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)).
Anything, carried to the extreme, becomes insanity. (Exilant)
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: repeat until behindert Timer-funktion/ suche alternative

  Alt 22. Jul 2009, 13:41
ok hat funktioniert auch wenn ich erstmal die schnellere Variant mit der "application.processmessages" gewählt hab.

Danke
2. Account Sero
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#5

Re: repeat until behindert Timer-funktion/ suche alternative

  Alt 22. Jul 2009, 14:32
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
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: repeat until behindert Timer-funktion/ suche alternative

  Alt 22. Jul 2009, 14:58
Zitat von Reinhard Kern:
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
2. Account Sero
  Mit Zitat antworten Zitat
Antwort Antwort


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 12:08 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