![]() |
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:
Die repeat-until-Schleife behindert jetzt aber die Überwachung in meiner anderen Klasse:
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;
Delphi-Quellcode:
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?
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; Vielen Dank BAMatze |
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 |
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)). |
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 |
Re: repeat until behindert Timer-funktion/ suche alternative
Zitat:
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 |
Re: repeat until behindert Timer-funktion/ suche alternative
Zitat:
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