Hallo
Ich bin mir nicht ganz sicher ob der XMLRPC-Server das richtige ist.
Denn Server muss ich ja ins hauptprogramm machen.
Damit der austausch klappt muss er ja ständig laufen, also in einem eigenen Thread, richtig?
muss ich den rest vom Programm dann auch umstellen, ist alles ohne Threads, oder kann ich den XMLRPC eifach unten dran hängen.
EDIT: Habe es herausgefunden:
Noch eine Frage:
wie tauscht der Server und der Client die Daten aus? Ich sehen nur Chinesisch.
Ich habe mir jetzt das Umfassende Buch über Python gekauft, geht es da auch im Threading?
Gruß
Andyh
Meine Schrittmotorensteuerung - Probleme
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo Andyh!
Ich verstehe nur Chinesisch
Ein Beispiel für die Kommunikation per XMLRPC hast du ja schon. Probier aus wie es funktioniert. Erweitere es um eine zustätzliche Funktion und lies dir die Hilfe zu den Modulen *SimpleXMLRPCServer* und *xmlrpclib* durch.
- http://docs.python.org/lib/module-Simpl ... erver.html
- http://docs.python.org/lib/module-xmlrpclib.html
Weiters findest du hier im Forum sicher noch Einiges zu XMLRPC und Threading -- inkl. einigen Beispielen.
mfg
Gerold
Ich verstehe nur Chinesisch
Ein Beispiel für die Kommunikation per XMLRPC hast du ja schon. Probier aus wie es funktioniert. Erweitere es um eine zustätzliche Funktion und lies dir die Hilfe zu den Modulen *SimpleXMLRPCServer* und *xmlrpclib* durch.
- http://docs.python.org/lib/module-Simpl ... erver.html
- http://docs.python.org/lib/module-xmlrpclib.html
Weiters findest du hier im Forum sicher noch Einiges zu XMLRPC und Threading -- inkl. einigen Beispielen.
mfg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Was ist denn das "Umfassende Buch ueber Python"? Etwa das dicke, unbrauchbare, was letztens so gehyped wurde?Andyh hat geschrieben:Ich habe mir jetzt das Umfassende Buch über Python gekauft, geht es da auch im Threading?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Hallo
Ja das "dicke", aber unbraubar würde ich nicht sagen. Mit hat es bis jetzt schon ein paar fragen beantwortet.
Gruß
Andyh
Ja das "dicke", aber unbraubar würde ich nicht sagen. Mit hat es bis jetzt schon ein paar fragen beantwortet.
Gruß
Andyh
Das Buch wurde hier im Thread Python - Das umfassende Handbuch diskutiert. Ich habe nur den Teil über Objektorientierung gelesen und der war wirklich schlecht, sowohl technisch als auch was Python-Idiome angeht. Das wurde eindeutig von jemandem geschrieben der von Python keine Ahnung hat. Wie gut kann dann der Rest vom Buch sein!?
Also ob das Buch jetzt gut ist oder nicht hat man ja schon an anderer Stelle Diskutiert.
Ich habe meine Schrittmotorensteuerung kommplte umgeworfen und fange nochmal von vorne an, weil das programm einfach zu unstrukturiert war.
Ich will diesmal gleich alles in eine GUI bauen.
Ich habe mal eine Frage wie ihr das machen würdet.
Also das muss alles gleichzeitig gehen:
- Schrittmotor anzeuern
- Maschinenposition mitrechen und anzeigen (in Labels)
- die drei Labels in der GUI mit der aktuellen Pos. aktualisieren
- Endschalter überwachen (wenn ein signal über den LPT kommt muss die maschine anhalten)
Also das letzte mal habe ich alles in threads gebaut (gut es hat nicht alles funktioniert z.B. das aktualisieren der drei labels)
Wenn ich weiter mache braue ich irgendwann mal 20 threads.
Also wie würdet ihr sowas angehen?
Gruß
Andyh
Ich habe meine Schrittmotorensteuerung kommplte umgeworfen und fange nochmal von vorne an, weil das programm einfach zu unstrukturiert war.
Ich will diesmal gleich alles in eine GUI bauen.
Ich habe mal eine Frage wie ihr das machen würdet.
Also das muss alles gleichzeitig gehen:
- Schrittmotor anzeuern
- Maschinenposition mitrechen und anzeigen (in Labels)
- die drei Labels in der GUI mit der aktuellen Pos. aktualisieren
- Endschalter überwachen (wenn ein signal über den LPT kommt muss die maschine anhalten)
Also das letzte mal habe ich alles in threads gebaut (gut es hat nicht alles funktioniert z.B. das aktualisieren der drei labels)
Wenn ich weiter mache braue ich irgendwann mal 20 threads.
Also wie würdet ihr sowas angehen?
Gruß
Andyh
Hallo
Noch bevor die anderen Frgane beantortet sing kommen schon neue:
Wie mache ich es das ich "G1 X12 F30" eingaben kann und es auch so verstanden wird.
Für alle die sich nicht mit CNC auskennen: Ich brauche aus diesem Sting die Variable G, F da diese veränderbar sind. X kann auch Y oder Z heisen, muss man auch erkennen und den wert dahinter.
Es gibt ja sicher eine "Relativ" einfache methode dafür, oder?
Gruß
Andyh
Noch bevor die anderen Frgane beantortet sing kommen schon neue:
Wie mache ich es das ich "G1 X12 F30" eingaben kann und es auch so verstanden wird.
Für alle die sich nicht mit CNC auskennen: Ich brauche aus diesem Sting die Variable G, F da diese veränderbar sind. X kann auch Y oder Z heisen, muss man auch erkennen und den wert dahinter.
Es gibt ja sicher eine "Relativ" einfache methode dafür, oder?
Gruß
Andyh
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo Andyh!Andyh hat geschrieben:Für alle die sich nicht mit CNC auskennen: Ich brauche aus diesem Sting die Variable G, F da diese veränderbar sind.
Meinst du damit, dass du die einzelnen Befehle aufsplitten möchtest? So etwas z.B.?
Code: Alles auswählen
>>> cmd_string = "G1 X12 F30"
>>> cmd_list = cmd_string.split()
>>> cmd_list
['G1', 'X12', 'F30']
>>> cmd_details = [ (cmd[0], int(cmd[1:])) for cmd in cmd_list ]
>>> cmd_details
[('G', 1), ('X', 12), ('F', 30)]
>>> cmd_dict = dict(cmd_details)
>>> cmd_dict
{'X': 12, 'G': 1, 'F': 30}
>>>
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Hallo
@gerold
Ja ich denke das ich das will. Danke!
Werde es mal ausprobieren
Gruß
Andyh
@gerold
Ja ich denke das ich das will. Danke!
Werde es mal ausprobieren
Gruß
Andyh
Zuletzt geändert von Andyh am Samstag 9. Februar 2008, 21:12, insgesamt 1-mal geändert.
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo Andyh!
Das hat Vor- und Nachteile. Ein Vorteil wäre, dass du dir die Kommunikation mit einem anderen Programm sparen kannst. Vielleicht wird dadurch das Programm weniger komplex.
Ein Nachteil ist, dass du die wichtigen Dinge nicht mehr von den unwichtigen trennen kannst.
Was ist oft wichtig? Z.B. die Ansteuerung der Schrittmotoren im richtigen Takt. Das sofortige Unterbrechen, falls ein Kommando von einem Taster kommt. (obwohl ich bei einem Notfalltaster eher zu einer kompletten Stromabschaltung des Gerätes tendieren würde)
Was ist oft unwichtig? Viele Teile der GUI. Die Anzeige des Fensterhintergrundes. Die schnelle Aktualisierung der Anzeige von Messdaten. Die Anzeige einer Statuszeile oder eines kleinen Bildchens zum Auflockern der Arbeitsoberfläche.
Wenn du ein Programm hast, welches die Steuerung der Fräse über hat, dann kannst du dieses Programm mit einer höheren Priorität laufen lassen, damit z.B. das Aufpoppen einer unwichtigen Update-Meldung das Programm nicht so sehr verlangsamt.
Unabhängig davon. Falls du noch einen der Kanäle "Error", "PaperOut" oder "Selected" frei hast, dann kannst du das eventuell darüber erledigen. Das habe ich noch nie ausprobiert.
Wenn du glaubst (da hast ja jetzt Erfahrung mit der Schrittmotorsteuerung sammeln können), dass die Schrittmotorsteuerung ohne Probleme auch in das GUI-Programm inkludiert werden kann, dann sparst du dir natürlich die Kommunikation zwischen den Prozessen.
Das hat zur Folge, dass du vom Schrittmotorsteuerungs-Thread aus in irgend eine Variable die SOLL-Position und in eine andere Variable die IST-Position schreiben kannst. Diese Variablen kannst du dann vom GUI-Programm aus direkt abfragen. Dafür lässt du einen Timer laufen, der z.B. alle 80 ms die Label aktualisiert.
Wichtig ist nur, dass du von eine Thread aus nie direkt etwas an einem GUI-Element veränderst. Das muss immer indirekt z.B. in wxPython über ``wx.CallAfter`` erledigt werden. Aber eines solltest du dir im Klaren sein. Die GUI kann niemals so schnell die Werte anzeigen wie sie vom Schrittmotorsteuerungs-Thread geliefert werden können. Also ist es fast besser, die Anzeigegeschwindigkeit von der GUI aus zu regeln und nicht von der Schrittmotorsteuerung aus.
Mehr fällt mir im Moment nicht ein.
mfg
Gerold
Andyh hat geschrieben:Ich will diesmal gleich alles in eine GUI bauen.
Das hat Vor- und Nachteile. Ein Vorteil wäre, dass du dir die Kommunikation mit einem anderen Programm sparen kannst. Vielleicht wird dadurch das Programm weniger komplex.
Ein Nachteil ist, dass du die wichtigen Dinge nicht mehr von den unwichtigen trennen kannst.
Was ist oft wichtig? Z.B. die Ansteuerung der Schrittmotoren im richtigen Takt. Das sofortige Unterbrechen, falls ein Kommando von einem Taster kommt. (obwohl ich bei einem Notfalltaster eher zu einer kompletten Stromabschaltung des Gerätes tendieren würde)
Was ist oft unwichtig? Viele Teile der GUI. Die Anzeige des Fensterhintergrundes. Die schnelle Aktualisierung der Anzeige von Messdaten. Die Anzeige einer Statuszeile oder eines kleinen Bildchens zum Auflockern der Arbeitsoberfläche.
Wenn du ein Programm hast, welches die Steuerung der Fräse über hat, dann kannst du dieses Programm mit einer höheren Priorität laufen lassen, damit z.B. das Aufpoppen einer unwichtigen Update-Meldung das Programm nicht so sehr verlangsamt.
Das ist ja der wichtigste Teil des Programms. Dieser bekommt auf jeden fall einen eigenen Thread. Vielleicht ist es sogar ratsam, diesen Teil in ein eigenes Programm auszulagern.Andyh hat geschrieben:- Schrittmotor anzeuern
Die Schrittmotoransteuerung hat ja immer die aktuellen Werte parat. Diese musst du vom GUI-Programm aus nur alle (sagen wir mal) 80 Millisekunden abrufen und anzeigen. Wenn die Schrittmotorsteuerung ein eigener Prozess ist, dann rufst du die aktuelle Position z.B. per XMLRPC ab. Das setzt voraus, dass in der Schrittmotorsteuerung, ein kleiner XMLRPC-Server eingebaut ist. Aber das bedeutet ja kaum 100 Zeilen mehr Code -- ist also leicht verwirklichbar.Andyh hat geschrieben:- Maschinenposition mitrechen und anzeigen (in Labels)
Lass in der GUI einen Timer laufen, der alle 80 ms die Schrittmotorsteuerung anruft um die aktuelle Position zu ermitteln. Diese neue Position kann dann im selben Schritt angezeigt werden.Andyh hat geschrieben:- die drei Labels in der GUI mit der aktuellen Pos. aktualisieren
Notschalter sollten unabhängig von irgendeinem Computer funktionieren und einfach alles abschalten.Andyh hat geschrieben:- Endschalter überwachen (wenn ein signal über den LPT kommt muss die maschine anhalten)
Unabhängig davon. Falls du noch einen der Kanäle "Error", "PaperOut" oder "Selected" frei hast, dann kannst du das eventuell darüber erledigen. Das habe ich noch nie ausprobiert.
Das sicher nicht. Ein Thread für die Schrittmotorsteuerung. Ein Thread für den XMLRPC-Server. In der GUI kannst du recht viel mit Timer machen.Andyh hat geschrieben:Wenn ich weiter mache braue ich irgendwann mal 20 threads.
Wenn du glaubst (da hast ja jetzt Erfahrung mit der Schrittmotorsteuerung sammeln können), dass die Schrittmotorsteuerung ohne Probleme auch in das GUI-Programm inkludiert werden kann, dann sparst du dir natürlich die Kommunikation zwischen den Prozessen.
Das hat zur Folge, dass du vom Schrittmotorsteuerungs-Thread aus in irgend eine Variable die SOLL-Position und in eine andere Variable die IST-Position schreiben kannst. Diese Variablen kannst du dann vom GUI-Programm aus direkt abfragen. Dafür lässt du einen Timer laufen, der z.B. alle 80 ms die Label aktualisiert.
Wichtig ist nur, dass du von eine Thread aus nie direkt etwas an einem GUI-Element veränderst. Das muss immer indirekt z.B. in wxPython über ``wx.CallAfter`` erledigt werden. Aber eines solltest du dir im Klaren sein. Die GUI kann niemals so schnell die Werte anzeigen wie sie vom Schrittmotorsteuerungs-Thread geliefert werden können. Also ist es fast besser, die Anzeigegeschwindigkeit von der GUI aus zu regeln und nicht von der Schrittmotorsteuerung aus.
Mehr fällt mir im Moment nicht ein.
mfg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo Andyh!Andyh hat geschrieben:Ich möchte
das hier herausbekommen:
G = 0
X = 12
F = 30
Code: Alles auswählen
>>> cmd_dict = {'X': 12, 'G': 1, 'F': 30}
>>> print "G:", cmd_dict.get("G", None)
G: 1
>>> print "X:", cmd_dict.get("X", None)
X: 12
>>> print "Y:", cmd_dict.get("Y", None)
Y: None
>>> print "F:", cmd_dict.get("F", None)
F: 30
>>>
Das ist als ob du ohne Beine durch die Gegend laufen müsstest.Ich muss gleich sagen mit dict habe ich noch nicht gearbeitet.
- http://docs.python.org/lib/typesmapping.html
- http://docs.python.org/lib/types.html
mfg
Gerold
Zuletzt geändert von gerold am Samstag 9. Februar 2008, 21:15, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Hallo
Gerold, du bist super!
Morgen werde ich mich mal hinsetzten und austesten.
Ich muss gleich sagen mit dict habe ich noch nicht gearbeitet.
Wie bekomme ich die Variablen dort hinaus.
Vieleicht habe ich mich etwas blöd ausgedrückt. Ich möchte
das hier herausbekommen:
G = 0
X = 12
F = 30
EDIT: Gerold du bist einfach schneller im tippen als ich im editieren bin.
und Danke
Gruß
Andyh
Gerold, du bist super!
Morgen werde ich mich mal hinsetzten und austesten.
Gut habe es getestet:Meinst du damit, dass du die einzelnen Befehle aufsplitten möchtest? So etwas z.B.?
Ich muss gleich sagen mit dict habe ich noch nicht gearbeitet.
Wie bekomme ich die Variablen dort hinaus.
Vieleicht habe ich mich etwas blöd ausgedrückt. Ich möchte
das hier herausbekommen:
G = 0
X = 12
F = 30
EDIT: Gerold du bist einfach schneller im tippen als ich im editieren bin.
und Danke
Gruß
Andyh
Hallo
Ich hänge schon wieder an den einfachtsen sachen fest (komisch die schweren Sachen klappen schon ganz gut).
Ich will in einem QLCDNumber text anzeigen lassen, schaffe es nur nicht, es bleibt immer bei der Null. Der Text soll sich nicht durch einen Button aufgeruffen werden sonder einfach so (blöd ausgedrück, ich meine z.B. am anfahng kommt "Hallo" und 2 sek. später kommt "alles in Ordung")
Im IT findet man dazu nicht wirklich was.
Gruß
Andyh
Ich hänge schon wieder an den einfachtsen sachen fest (komisch die schweren Sachen klappen schon ganz gut).
Ich will in einem QLCDNumber text anzeigen lassen, schaffe es nur nicht, es bleibt immer bei der Null. Der Text soll sich nicht durch einen Button aufgeruffen werden sonder einfach so (blöd ausgedrück, ich meine z.B. am anfahng kommt "Hallo" und 2 sek. später kommt "alles in Ordung")
Im IT findet man dazu nicht wirklich was.
Gruß
Andyh
Hi Andyh!
http://www.riverbankcomputing.com/Docs/ ... umber.html
Die Methode scheints zu sein.
Gruß
GnuShi
SieheAndyh hat geschrieben:Ich will in einem QLCDNumber text anzeigen lassen, schaffe es nur nicht, es bleibt immer bei der Null.
http://www.riverbankcomputing.com/Docs/ ... umber.html
Die Methode
Code: Alles auswählen
display()
Gruß
GnuShi
Hallo
Danke, bis jetzt bekomme ich nur fehler. Aber morgen versuche ich es weiter.
Gruß
Andyh
Danke, bis jetzt bekomme ich nur fehler. Aber morgen versuche ich es weiter.
Gruß
Andyh
Hallo
Den Fehler bekomme ich nicht weg:
TypeError: argument 1 of QLCDNumber.display() has an invalid type
Ich gebe ein:
Die zwei str habe ich gleich rausgemacht.
Achso bevor ich es vergesse, ich lade die GUI aus einem Mudul ein das ich mit dem Qt Designer gemacht habe.
Die Zeilen dorch sehen so aus:
Ist wahrscheinlich ganz einfach und ich bekomme es nicht hin
Gruß
Andyh
Den Fehler bekomme ich nicht weg:
TypeError: argument 1 of QLCDNumber.display() has an invalid type
Ich gebe ein:
Code: Alles auswählen
QString = "Hello"
self.infoa.display (self, QString)
Achso bevor ich es vergesse, ich lade die GUI aus einem Mudul ein das ich mit dem Qt Designer gemacht habe.
Die Zeilen dorch sehen so aus:
Code: Alles auswählen
self.infoa = QtGui.QLCDNumber(self.info)
self.infoa.setGeometry(QtCore.QRect(70,20,421,41))
self.infoa.setObjectName("infoa")
self.tabWidget.addTab(self.Automatik,"")
Gruß
Andyh
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo Andyh!Andyh hat geschrieben:Code: Alles auswählen
QString = "Hello" self.infoa.display (self, QString)
Vielleicht kann dieses "QLCDNumber" nur Zahlen anzeigen.
mfg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Hallo
EDIT:
Ich habe mich für Tkinter entschieden um meine GUI zu bauen, wenn sogar Gerold "vieleicht" sagt ist es wohl besser, wenn man selber kaum Ahnung hat etwas zu nehmen wo andere ne Ahnung haben.
Ich glaube man sollte nicht im 30 Sekundentakt Arbeiten (Teil raus, Teil wieder ein (an einer CNC-Drehmaschine)), weil ich immer was vergesse.
Wenn ich
QString = 1
Schreibe kommt das gleiche.
Gruß
Andyh
EDIT:
Ich habe mich für Tkinter entschieden um meine GUI zu bauen, wenn sogar Gerold "vieleicht" sagt ist es wohl besser, wenn man selber kaum Ahnung hat etwas zu nehmen wo andere ne Ahnung haben.
Ich glaube man sollte nicht im 30 Sekundentakt Arbeiten (Teil raus, Teil wieder ein (an einer CNC-Drehmaschine)), weil ich immer was vergesse.
Wenn ich
QString = 1
Schreibe kommt das gleiche.
Gruß
Andyh
Hallo
Ich habe mal wieder Fragen.
Aber erst mal was bis jetzt geht:
-G-Code Laden (über ein eigenes Fenster)
-G-Code in Variablen aufteilen(immer die Aktuellen Zeile in der Listbox)
-Programm Status änden(nur der text von einem Label)
-die Programm Einstellungen aus einen Datei Einlesen
So den Fragen:
Die GUI ist in einen thread verpackt. Wenn ich jetzt auf "Start" drücke soll die Aktuelle Zeile abgearbeitet werden, dazu müssen die Variablen an eine Funktion in einem anderen thread übergeben werden.
Wie rufe ich die Funktion in einem anderen thread auf? (ich glaube das geht granicht)
Oder wie kann ich das sonst machen?
Gruß
Andyh
Ich habe mal wieder Fragen.
Aber erst mal was bis jetzt geht:
-G-Code Laden (über ein eigenes Fenster)
-G-Code in Variablen aufteilen(immer die Aktuellen Zeile in der Listbox)
-Programm Status änden(nur der text von einem Label)
-die Programm Einstellungen aus einen Datei Einlesen
So den Fragen:
Die GUI ist in einen thread verpackt. Wenn ich jetzt auf "Start" drücke soll die Aktuelle Zeile abgearbeitet werden, dazu müssen die Variablen an eine Funktion in einem anderen thread übergeben werden.
Wie rufe ich die Funktion in einem anderen thread auf? (ich glaube das geht granicht)
Oder wie kann ich das sonst machen?
Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys
if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys
if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]