![]() |
Schrittmotor
Hallo zusammen,
Zwecks Steuerung eines Schrittmotors habe ich für eine TButton-Komponente eine Routine geschrieben, die das für die Steuerung des Motors erforder- liche Bitmuster am Parallelport ausgibt: Globale Deklaration:
Delphi-Quellcode:
Die Routine läuft bzw. der Schrittmotor läßt sich einschalten und dreht wie gewünscht. Das Problem ist allerdings, dass sich die Routine bzw. der Motor nicht über einen zweiten Aus-Schalter(TButton) abschalten läßt, da das Formular, in dem sich die Schalter (DREH_RECHTS und ein weiterer AUS) befinden deaktiviert ist, sobald die Repeat-Until (Endlos!)Schleife läuft. Die Ereignis-Behandlungsroutine für den DREH_RECHTS-Button wird ja nicht bendet.
var
Form1: TForm1; ... Filter:byte; Ende: Boolean; procedure Tform1.DREH_RECHTSClick(Sender: TObject); begin ...Anweisungen Repeat ...Anweisungen ... If Filter = 1 then Ende:=True; Until Ende; ...Anweisungen end; Mittels Filter sollte ursprünglich die Information abgefragt werden, ob AUS geklickt wurde. Für eine TButton-Abfrage gibt es zwar etliche Möglichkeiten, nur sind diese alle sinnlos, wenn sich der AUS-Button bei laufendem Motor nicht schalten läßt. Da sich das Problem weder mit Mausabfragen noch durch die Verwendung eines weiteren Formulars lösen ließ (Die Endlosschleife deaktiviert sämtliche Formulare der Anwendung), habe ich eine zweite Anwendung geschrieben, mit welcher sich das Strobe-Bit vom Steuer-Registers des ParallelPorts schalten läßt. Das ursprüngliche Programm fragt jetzt über Filter das Strobe-Bit ab und der Motor läßt sich so mittels dieser Strobe-Bit-Änderung über das andere Programm wieder ausschalten. Ganz abgesehen davon, dass dies wohl keine sehr elegante Lösung für obiges Problems ist, besteht ja weiterhin das Problem, dass eine Manipu-lation des drehenden Motors also eine Drehzahlsteuerung während des Betriebs so noch nicht möglich ist. Für Tipps im voraus vielen Dank. |
AW: Schrittmotor
Willkommen in der Delphipraxis :hi:
Gehe ich recht in der Annahme, daß dein Problem hauptsächlich darin besteht, die Anwendung quasi nicht mehr bedienen zu können, während deine Repeat-Schleife abläuft? Dafür gibt es eine ganz einfache Lösung: Du mußt dafür sorgen, daß währenddessen weiterhin Windows-Messages abgearbeitet werden können. Dafür gibt es den Befehl ![]() Wenn du Code postest, tust du allen potentiellen Helfern einen großen Gefallen, diesen in die sogenannten Delphi-Tags einzubetten. Dazu markierst du den Code, den du in den Foren-Editor hineinkopiert oder -geschrieben hast und drückst dann den Button mit dem Delphi-Helm. Dadurch bleibt die Formatierung des Codes erhalten, wodurch dieser leichter lesbar wird.
Delphi-Quellcode:
Globale Deklaration:
var Form1: TForm1; ... Filter:byte; Ende: Boolean; procedure Tform1.DREH_RECHTSClick(Sender: TObject); begin ...Anweisungen Repeat ...Anweisungen ... If Filter = 1 then Ende:=True; Application.ProcessMessages; // z.B. hier die Botschaftswarteschlange abarbeiten Until Ende; ...Anweisungen end; |
AW: Schrittmotor
Hallo und willkommen in der DP. Damit hast du dir dein eigenes Weihnachtsgeschenk gemacht :-D :dp:
Das von Perlsau angesprochene
Delphi-Quellcode:
ist natürlich ein Weg, die Anwendung in de meisten Fällen wieder reagieren zu lassen. [EDIT]Unter Umständen kann dann aber dein Motor anfangen zu stocken. Je nachdem wie das Laufen des Motors implementiert ist.[/EDIT] Zum Test kannst du das auch einfach mal in deine Repeat Schleife einbauen und das ausprobieren. Wenn es dann funktioniert, solltest du dir darüber Gedanken machen, das alles in einen sogenannten Thread auszulagern. Threads sind extra dafür gemacht, dass Aktionen im Hintergrund ausgeführt werden und die Anwendung trotzdem noch reagiert. Hier mal ein kleines
Application.ProcessMessages
![]() |
AW: Schrittmotor
Moin...:P
Zitat:
Tipp: Was kostet es mehr wenn man es gleich richtig macht. :thumb: |
AW: Schrittmotor
Der TE scheint gerade erst mit der Programmierung angefangen zu haben, von daher ist
Delphi-Quellcode:
als schnelle Erfolgslösung schon mal gut.
Application.ProcessMessages
=> Make it work Der Hinweis auf einen Thread ist allerdings auch zwingend. => Make it right |
AW: Schrittmotor
Zitat:
|
AW: Schrittmotor
"Make it work -> make it Right"
Vorsicht mit solchen Parolen. Wenn's denn erst mal läuft, kriegst Du vom sogenannten Management selten die Erlaubnis, es richtig zu machen. Und so lebt der Mist ewig fort. Make it working the right way. :-D |
AW: Schrittmotor
Nochmals Danke für die geposteten Tipps, werde sie mit Sicherheit noch an- wenden (müssen!).Inzwischen habe ich das Problem quasi halb gelöst. Und zwar
habe ich die Steuerdaten für die verschiedenen Betriebszustände des Motors in eine Steuerdatei geschrieben, die vom Motorprogramm ständig abgefragt wird. Damit ist über zwei While-Schleifen sowohl ein Ein-Ausschalten als auch eine Drehzahländerung möglich WÄHREND der Motor läuft. Da das ganze aber nach wie vor nur mit zwei Programmen funktioniert und sich zu dem das Motorprogramm mit den Endlos-Schleifen nur mit dem Task-Manager beenden läßt, wird ApplicationProcessMessages bestimmt von mir verwendet werden. Mit dem Thema "Threads" habe ich mich noch nicht beschäftigt. Von daher werden die Links zu dem Thema wohl hilfreich sein. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 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 by Thomas Breitkreuz