Motorsteuerung mit C++
-
Wenn dir die Auflösung von
Sleepnicht reicht, du also eine genauere Zeitangabe brauchst, dann musst du dir andere Funktionen ansehen. Unter Windows z.B.QueryPerformanceCounter.Ansonsten verstehe ich nicht wo dein Problem liegt.
-
Ja, Zeiten vergleichen scheint ja naheliegend.
Noch naheliegender wäre es aber, einmal "manuell" zu zählen, wieviele Aufrufe vonSendDatanötig sind, die gewollte Position zu erreichen, um diese Anzahl dann hartcodiert zu implementieren.
-
Danke für die Anregungen!
Mein Problem ist, dass die Fahr höhe immer ziemlich genau gleich sein soll. Egal auf welchem PC ich das Programm abspiele und wieviele Anwendungen auf dem Pc laufen. Das wäre ja über die Schleifendurchläufe nicht gegeben.
Deswegen suche ich andere ansätze.
-
Hallo TobAm,
dass die Fahr höhe immer ziemlich genau gleich sein soll.
Egal was "ziemlich genau" bedeutet, geht sowas nur entweder mit einem Schrittmotor oder mit einer wie auch immer gearteten Rückkopplung. Im einfachsten Fall mit einem Endschalter und wenns wirklich genau sein muss mit einem Glasmassstab.
Herzliche Grüsse
Walter
-
Hallo Walter,
okay die Angabe "ziemlich genau" ist natürlich sehr schwammig.
Es ist leider ein Linearantrieb mit einem Gleichstrommoter. Mit einem Schrittmotor, da gebe ich dir recht würde es besser funktionieren.Der Antrieb muss 20 mm hoch und 20 mm runter fahren. Mit meiner Schleifen Variante habe ich einen Fehler von 0,5mm drin, der vollkommen ausreichend ist.
Die max. Schwankung darf 1mm groß sein.Ich habe auch leider keine Erfahrungswerte, wie sehr sich die Computerauslastung bemerbar macht. Oder meinst du, dass die Schwankung vernachlässigbar klein sein wird?
Gruß
-
Wie steuerst du diesen Motor überhaupt an? Stelle ich mir ziemlich geil vor mit C++ maschinerierte Ungetüme zu steuern.
Ich hab mal in Conrad nach Schrittmotoren gesucht. Sind sie immer so unrealistisch teuer?
-
Hallo TobAm,
bei einer Genauigkeit von +-0.5mm (1mm Fenster) würde ich einen Endschalter nehmen, die gibt es ja inzwischen auch in klein.
Bis zu einer CPU Auslastung von 20..30% laufen Threads nach meiner Erfahrung noch so, dass Du wahrescheinlich keine negativen Effekte haben wirst. Aber ich würde eine Lösung ohne Rückkopplung nichteinmal als gebastel bezeichnen.
@nichtwissend
Stelle ich mir ziemlich geil vor mit C++ maschinerierte Ungetüme zu steuern.
Ich mache das seit mehr als 30Jahren, zuerst mit Assembler, dann mit Modula-2 und seit ca. 10Jahren mit C++ und es macht immer noch Spass.
1 Profi Schrittmotorachse (Interface, Endstufe, Speisung und Motor) kostet ca. CHF 2000.-- 1 Kreuztisch mit einem Verfahrweg von 250mm kostet ohne Antrieb ca. CHF 15'000.-- ich finde, da ist der Schrittmotor eigentlich sehr günstig

Herzliche Grüsse
Walter
-
Hallo Walter,
aus der Sicht eines E-Technikers sehe ich das genau so mit der Rückkopplung.
Das Problem ist nur, dass ich eine Steuerung vom Hersteller nutzen muss und die leider sehr beschränkt ist. Ich kann lediglich die Befehle "fahr hoch" und "fahr runter" senden und die Position auslesen!Das auslesen der Position erfolgt in % und ist im günstigsten Fall 1mm genau, weil dann 1mm = 1% entspricht.
Ich habe auch mal versucht, über diese Prozentangabe eine höhe anzufahren, zum Beispiel fahre bis 70%, aber da ich immer nur entweder senden oder auslesen kann funktioniert dieses nicht.
Oder gibt es da eine Möglichkeit?
Gruß
Tobias
-
Hallo TobAm,
Do könntest folgendes probieren:
Annahme es muss immer die Absolutposition gesendet werden
const int kEndPos = 70; int pos = GetPos (); do { pos += 5; SendPos (pos); pos = GetPos (); } while (pos < kEndPos);Annahme es muss ein Weg gesendet werden
const int kEndPos = 70; int pos = GetPos (); do { SendPos (5); pos = GetPos (); } while (pos < kEndPos);Wenn ich etwas mehr über den Hersteller und das Produkt wüsste, könnte ich besser Helfen.
Herzliche Grüsse
Walter
-
Meiner Meinung nach ist die Löhsung mit den Endschaltern für dich sicher die beste,
und die Endschalter könntest Du ja zb. vom LPT1-Port also den Druckerport abfragen.
Ein Signal für den TopEndSwitch und eins für den DownEndswitch.Im Prgogramm dan einfach in einer Schleife wärend den Fahren die EndSwitch Signale
als Stopbedingung verwenden.Sommit hast Du keine Zeitliche Abhänigkeit mehr. Denn das wird Dir auf unterschiedlichen Rechnern sicher
Probleme bereiten bzw. müsstest Du jeden Rechner neu an die Steuerung anpassen.
mfg
-
Hallo Tobias,
wenn Du ein wenig konkreter wirst, so können wir Dir besser helfen.
Kannst Du uns einen Link auf die Beschreibung des Protokolls der Motorsteuerung nennen?
Was passiert genau, wenn Du genau einmal "T20\r" an die Steuerung sendest? Um wie viel verfährt der Motor dann?
Wenn Du zweimal "T20\r" sendest, in wie weit macht dann eine Pause oder keine Pause zwischen den beiden Kommandos einen Unterschied im Verhalten des Motors?
Kommt auf das Kommando "T20\r" hin eine Antwort zurück?
Wie liest man die Position aus?TobAm schrieb:
Ich habe auch mal versucht, über diese Prozentangabe eine höhe anzufahren, zum Beispiel fahre bis 70%, aber da ich immer nur entweder senden oder auslesen kann funktioniert dieses nicht.
Oder gibt es da eine Möglichkeit?
Ja natürlich geht das. Es kommt natürlich darauf an, wie die Position bei Dir ankommt. Musst Du sie aktiv abrufen oder kommt sie quasi asynchron von der Steuerung zurück? im letzteren Fall müsste man eine zweiten Thread starten, der auf eintreffende Meldungen wartet und diese kann man dann wahrscheinlich über ein Post-Message in den main-Thread einschleusen.
Gruß
Werner
-
Hallo Walter,
sorry ich war für ein paar Tage unterwegs. Schonmal danke für dein engagment.
Ich kann dir ja gerne mal ein paar Unterlagen zum Motor und der Steuerung per E-Mail schicken. Wäre super wenn du dann noch ein paar Tipps hättest.Gruß
Tobias