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