Meine Schrittmotorensteuerung - Probleme

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.
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

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
Benutzeravatar
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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Andyh hat geschrieben:Ich habe mir jetzt das Umfassende Buch über Python gekauft, geht es da auch im Threading?
Was ist denn das "Umfassende Buch ueber Python"? Etwa das dicke, unbrauchbare, was letztens so gehyped wurde?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Hallo

Ja das "dicke", aber unbraubar würde ich nicht sagen. Mit hat es bis jetzt schon ein paar fragen beantwortet.

Gruß
Andyh
BlackJack

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!?
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Also ich habs mir auch angeschaut...und kanns es ebenso keinem empfehlen. Einfach nur schlecht. Ein Java-Progger hat ein Python-Buch geschrieben!
Aus dem Buch lernt man jedenfalls nichts.
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

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
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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.
Hallo Andyh!

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}
>>> 
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Hallo

@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.
Benutzeravatar
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 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.

Andyh hat geschrieben:- Schrittmotor anzeuern
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:- Maschinenposition mitrechen und anzeigen (in Labels)
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:- die drei Labels in der GUI mit der aktuellen Pos. aktualisieren
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:- Endschalter überwachen (wenn ein signal über den LPT kommt muss die maschine anhalten)
Notschalter sollten unabhängig von irgendeinem Computer funktionieren und einfach alles abschalten.

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.

Andyh hat geschrieben:Wenn ich weiter mache braue ich irgendwann mal 20 threads.
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.


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.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Andyh hat geschrieben:Ich möchte
das hier herausbekommen:
G = 0
X = 12
F = 30
Hallo Andyh!

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
>>> 
Ich muss gleich sagen mit dict habe ich noch nicht gearbeitet.
Das ist als ob du ohne Beine durch die Gegend laufen müsstest. :cry:

- 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.
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Hallo

Gerold, du bist super!

Morgen werde ich mich mal hinsetzten und austesten.
Meinst du damit, dass du die einzelnen Befehle aufsplitten möchtest? So etwas z.B.?
Gut habe es getestet:

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
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

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
Gnushi
User
Beiträge: 77
Registriert: Dienstag 12. Dezember 2006, 09:49

Hi Andyh!
Andyh hat geschrieben:Ich will in einem QLCDNumber text anzeigen lassen, schaffe es nur nicht, es bleibt immer bei der Null.
Siehe
http://www.riverbankcomputing.com/Docs/ ... umber.html

Die Methode

Code: Alles auswählen

display()
scheints zu sein.

Gruß

GnuShi
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Hallo

Danke, bis jetzt bekomme ich nur fehler. Aber morgen versuche ich es weiter.

Gruß
Andyh
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Hallo

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)
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:

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,"")
Ist wahrscheinlich ganz einfach und ich bekomme es nicht hin :oops:

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

Andyh hat geschrieben:

Code: Alles auswählen

                        QString = "Hello"
                        self.infoa.display (self, QString)
Hallo Andyh!

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.
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

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
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

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
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]
Antworten