Einzelnen Beitrag anzeigen

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