Interrupt?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Hallo,

habe diesmal das Problem, dass ich über Python einen Schrittmotor ansteuern will. Das geht wunderbar. Wenn ich in meiner grafischen Oberfläche den Button "Start" drücke (in wxPython geschrieben) fährt dieser auch wie er sollte.
Ich muss aber auch einen zweiten Button vorsehen der sich "Stop" nennt.
Mit diesem soll es möglich sein den Motor zu stoppen.
Meine Frage lautet nun wie ich dies realisiere. Gibt es in Python so eine Art Interrupt mit dem ich aus der Klasse Motor, wo ich den Motor verfahre, in z.B. eine andere Klasse herausspringen kann um den Motor zu stoppen?

Gruss,
Toni
hehejo
User
Beiträge: 56
Registriert: Freitag 18. Februar 2005, 18:24
Wohnort: Stein
Kontaktdaten:

Du könntest einen Thread starten, welcher auf einen event wartet.

Code: Alles auswählen

from threading import Thread, Event
class t(Thread):
  def __init__(self, event):
    Thread.__init__(self)
    self.event = event
  
  def run(self):
    self.event.wait()
    StopSchrittmotor()

event = Event()
t = Thread(event)
t.start()
..
..
..
event.set()
Gruß, Johannes
[b][color=red]ascii stupid question,
get stupid ansii[/color][/b]
[url]http://www.hehejo.de[/url]
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Servus hehejo,

Danke für die ultraschnelle Antwort.
Werde dies morgen mal ausprobieren, da ich heute ziemlich im Termindruck bin.
Werde mich morgen nochmal an dieser Stelle melden, falls es (nicht) geklappt hat.

Gruss,
Toni
Iopodx@Gast

Hi toni,

mich würde mal interessieren wie du die Ansteuerung des Motors vorgenommen hast! Arbeite gerade an was ähnlichem und würde gern wissen wie du das realisiert hast! Wäre cool wenn du den Code mal posten könntest!

Mit freundlichen Grüßen und bestem Dank,
Iopodx
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Servus hehejo,

Habe jetzt endlich die Zeit dazu gehabt deinen Code genauer anzuschauen.
Ich weiss nicht, ob dieser sich für mein Problem eignet, zumindest weiss ich nicht wie ich dies in dieser Form realisieren sollte; Deshalb erläutere ich meine Codestruktur etwas genauer.
Ich habe eine extra Klasse mit meiner GUI programmiert. Dort wurde auch ein Button vorgesehen der Motorstart heisst, der eine Methode aufruft, die dann wiederum die Klasse Motor aufruft. In der Klasse Motor verfahre ich den Motor in einer Schleife per 2bitigem Graycode. Mein Problem besteht nun darin, wenn ich in der Klasse wo die GUI programmiert ist, den Button Motorstop drücke, die Schleife in der Klasse Motor, wo der Motor ja immer noch läuft, unterbrechen sollte, um z.B. in eine andere Klasse zu wechseln.
Wenn ich dann in eine andere Klasse wechsle wird ja folglicherweise der Motor ja stehenbleiben, weil die Schleife durch den Aufruf der neuen "Motorstopklasse" innerhalb der Schleife unterbrochen wurde.
Aus der "Motorstoppklasse" sollte es aber wieder möglich sein, wieder in die Schleife die den Motor verfährt, an der gleichen Stelle wieder zurückzuspringen.

Hoffe ich konnte mein Problem etwas genauer beschreiben und hoffe du kannst damit etwas anfangen.

Gruss,
Toni
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Hallo Iopodx,

Ich benutze einen bipolaren Schrittmotor von Nanotec (Kosten: um die 50€). Diesen steuere ich mit einer Schrittmotorsteuerung von Kemo (Datenblätter und Verkauf bei: www.reichelt.de , suchen nach M106, Kosten: 22.75€) an. Diese Steuerung braucht zwar Split Power (mit jedem beliebigen Doppelnetzteil realisierbar), aber man kann die Steuerung und damit den Motor über den Parallelport ganz einfach mit Python ansteuern, indem man einfach den Graycode über den Parallelport sendet (geht mit Python z.B. über das einzubindende pyParallel).

Hoffe ich konnte dir damit weiterhelfen.

Gruss,
Toni
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Toni83 hat geschrieben: Ich weiss nicht, ob dieser sich für mein Problem eignet, zumindest weiss ich nicht wie ich dies in dieser Form realisieren sollte;
Hi Toni!

Das mit Threading und Event ist nicht so schlecht wie du denkst.

Du brauchst sowiso Threads, damit die GUI bedienbar bleibt, auch wenn eine Funktion läuft.

Einen Thread startest du mit der Methode "start()". Diese führt intern die Methode "run()" aus. Starte einfach innerhalb der Methode "run()" deine Funktion, die den Motor zum Laufen bringt. Warte aber in **deiner** Funktion immer mit "event.wait()" darauf, ob das Event True oder False ist. Du musst natürlich das Event auch an deine Funktion weiterreichen. ;-)

Damit kannst du je eine Methode für den Start und eine für den Stop schreiben. Diese Methoden setzen einfach nur das Event auf True oder False. Das macht man mit den Event-Methoden "set()" und "clear()".
Ist das Event auf True, dann läuft deine Schleife. Ist das Event auf False gesetzt, wird die Schleife unterbrochen -- besser gesagt: sie wartet darauf, dass sie weiter machen darf.

Ich hoffe, die Sache nicht verwirrender dargestellt zu haben, als sie ist.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Hallo gerold,

Hört sich ganz gut an. :D
Ich verstehe dies jedoch noch nicht ganz.
Ich habe ja eine GUI Klasse, in dieser Klasse ist der Button Start, der wenn ich den drücke aus einem Event heraus eine Methode in dieser Klasse aufruft.
Meine Frage:
Wie ist das vorgehen in dieser Methode? Muss ich darin den Thread starten?
Wenn ich den Button Start drücke ist das natürlich ein anderer Event, als wenn ich den Button "Stopp" für den Motor drücke.
Das Zusammenspiel zwischen den beiden events ist mir noch nicht klar geworden. Wie kann ich die beiden events unter einen Hut bringen?
Nehmen wir dazu an, ich würde eine Methode für das Event beim Buttondrücken "Start" und eine Extramethode für das Drücken von "Stopp" haben. Wie müsste ich das dann realisieren?

Wäre sehr mit Dank verbunden, wenn du nochmal antworten könntest,
bin nämlich immer noch ein wenig ratlos.

Gruss,
Toni
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Toni83 hat geschrieben: Hört sich ganz gut an. :D
[...]
Wenn ich den Button Start drücke ist das natürlich ein anderer Event, als wenn ich den Button "Stopp" für den Motor drücke.
Das Zusammenspiel zwischen den beiden events ist mir noch nicht klar geworden.
Hi Toni!

Ich glaube, dass du denkst, dass du für START und für STOP jeweils einen eigenen Event brauchst. Dem ist aber nicht so.

Ein EVENT-Objekt kann zwei Zustände haben: "True" oder "False". Eine Schleife, in der "event.wait()" vorkommt, wird so lange an dieser Stelle unterbrochen bleiben, bis das "Event" den Zustand "True" bekommt.

Ich habe im Moment leider keine Zeit für ein Beispiel.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

Ich schätzte mal, dass wxPython auch Timer unterstützt. Wenn das der Fall ist, dann musst du nur, statt dem Loop, der deinen Motor steuert, eine Funktion schreiben, die vom Timer aufgerufen wird, und dann den Motor weiter dreht.

Um den Motor anzuhalten musst du nur den Timer ausschalten.
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Hallo ProgChild,

Habe jetzt in meiner Doku nichts über einen Timer in wxPython nachgelesen. Kannst du mir sagen, wo ich Infos darüber kriege?
Wäre sehr mit Dank verbunden, wenn du Zeit finden würdest an dieser
Stelle ein Beispielprogramm reinzustellen.

Gruss,
Toni
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

Also in wxWidgets heißt das ding wxTimer.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi!

Hier siehst du wie so etwas mit Thread und Event aussieht:

http://www.python-forum.de/viewtopic.php?p=22681#22681

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Gast

Servus ProgChild,

Muss ein Brett vor dem Kopf gehabt haben. Habe jetzt auch schon selber wxTimer gefunden.
Danke nochmals für den möglichen Lösungsvorschlag.

Gruss,
Toni
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Danke Gerold,

Ich muss mich jetzt echt vielmals für deine ausführliche Lösung bedanken. :wink:
Sie hilft mir sehr weiter, habe das Problem inzwischen gelöst.

Danke nochmals an alle,
Toni
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Hierzu hätte ich mal eine frage
kann ich ein wxpython Frame auch mit dem threading via parallel port
getInBusy() einen Button die Farbe Wechseln lassen und eine variable des Frame Fensters setzen!
ginge das mit dem Threading modul

Danke
Antworten