thunderbird Geschrieben October 9, 2012 at 09:48 Geschrieben October 9, 2012 at 09:48 Hallo, ich baue gerade eine CNC Fräse. Dabei ist mir aufgefallen, dass mir da eine Methode fehlt die so lange blockiert, bis die mit setSteps gesetzte Position erreicht wurde. Ich kann das zwar über die Callback Funktion lösen, dass ist aber sehr umständlich. Schöner wäre es wenn ich eine direkte Methode in der API hätte. Zitieren
AuronX Geschrieben October 9, 2012 at 11:04 Geschrieben October 9, 2012 at 11:04 Obwohl ich noch nicht ganz verstehe wie du diese Funktion nutzen willst, wenn du mehr als eine Achse zur gleichen Zeit bewegst (diagonale Bewegung). In welcher Sprache implementierst du das ganze eigentlich? Denke die Bindings lassen sich da auf einfache Weise erweitern. Das Problem an den aktuellen Bindings ist halt, dass du für alle Bricks/Bricklets im wesentlichen nur beschränkte Funktionen anbieten kannst (da ja alles aus Config-Dateien automatisch erzeugt wird): - Funktionsrufe ohne Rückgabewert - Funktionsrufe mit Rückgabewert - Callbacks Die Funktionsrufe kehren alle so schnell wie sie können zurück, warten aber auch nur maximal ~2 Sekunden. Das heißt also so eine Funktion ist meines Erachtens nicht ohne weiteres für alle Sprachen implementierbar, sondern würde viel (strukturelle) Arbeit erfordern. Je nachdem welche Sprache du nutzt könnte ich anbieten mal eine "erweiterte" TF-Bibliothek dafür zusammenzustellen. Da könnte dieser Vorschlag drin umgesetzt werden, aber auch sowas wie die LCD-Umlaut Geschichte besser verpackt werden. Zitieren
Nic Geschrieben October 9, 2012 at 11:17 Geschrieben October 9, 2012 at 11:17 da eine Methode fehlt die so lange blockiert, bis die mit setSteps gesetzte Position erreicht wurde Verstehe ich nicht, wenn die mit SetSteps gesetzen Schritte abgefahren wurden, setzt der Callback ReachedSteps ein, oder man wartet über den Callback OnNewState ab ob der Stepper stoppt. Zitieren
AuronX Geschrieben October 9, 2012 at 11:29 Geschrieben October 9, 2012 at 11:29 Das hat er ja geschrieben, dass es den Callback gibt. Was thunderbird möchte ist sowas: xStepper.setStepsAndWait(10); yStepper.setStepsAndWait(10); xStepper.setStepsAndWait(10); Das würde semantisch jetzt bedeuten, dass erst 10 Steps auf der x-achse laufen. SObald die dann fertig sind laufen 10 auf der y, danach dann wieder 10 auf der x. Würde man diesen Code "nur" mit setSteps ausführen, dann würde sich alles diagonal bewegen (x und y gleichzeitig). Er wünscht sich also nur eine bequeme Variante für das was anders schon geht. Zitieren
gagahhag Geschrieben October 9, 2012 at 11:42 Geschrieben October 9, 2012 at 11:42 Die gleiche Problematik hatte ich mit meinem Stepper-Fahrzeug auch. Gelöste habe ich das Ganze, indem ich mir eine Steuerklasse (StepperController) geschrieben habe, die mir das schön löst. ZB muss ich dem Controller nur noch angeben, dass ich 100mm gerade aus fahren möchte und er macht das. Das gleiche für eine Drehbewegung (Winkel) und eine Kurve (Winkel und Radius). Der Controller selbst verwaltet eine Queue, welche solche Bewegungen abarbeitet. Sobald der Callback für einen Move ausgelöst wurde, wird (falls weitere vorhanden) die nächste Bewegung gestartet. Zitieren
thunderbird Geschrieben October 9, 2012 at 13:57 Autor Geschrieben October 9, 2012 at 13:57 @AuronX Ist natürlich richtig das man so nicht alle Achsen gleichzeitig fahren kann. Deswegen würde ich das ganze auch trennen. xStepper.setSteps(10); yStepper.setSteps(10); zStepper.setSteps(10); xStepper.waitPositionReached(); yStepper.waitPositionReached(); zStepper.waitPositionReached(); So könnte man auf alle Achsen warten. Ist die Achse schon an der richtigen Position kommt die Funktion sofort zurück. Ist also so eine Art Join für Stepper. Wegen so einer erweiterten API können wir gerne mal drüber spreche ich hätte da auch noch Sachen für einige Bricklets. @gagahhag So in der Art habe ich es im Moment auch gelöst. Fände es aber schöner wenn es in der API wäre, ist ja doch recht elementar ist. Ich schreibe meinen Code in JAVA Zitieren
gagahhag Geschrieben October 9, 2012 at 14:21 Geschrieben October 9, 2012 at 14:21 Da bin ich eher der Meinung, das die API elementar gehalten werden sollte. Die Bibliotheken darum herum kann man ja schreiben und öffentlich zugänglich machen -> Wiki? Ich weiss, das zur Zeit jeder seine Sachen schreibt, aber da kann ich mich auch selbst an der Nase nehmen. Ich habe meine Sachen ja auch (noch) nicht ins Wiki gestellt... Zitieren
AuronX Geschrieben October 9, 2012 at 14:40 Geschrieben October 9, 2012 at 14:40 Jop... man sollte da definitiv mehr teilen Für Java fällt mir auf Anhieb keine Gute Erweiterungsmöglichkeit ein, abgesehen von Vererbung. Also sowas wie ExtendedBrickStepper extends BrickStepper. Ansonsten wäre ein Decorator gut, aber der braucht ein Interface, also in dieser Art: public class DecoratedBrickStepper implements IBrickStepper { ... public DecoratedBrickStepper(IBrickStepper realStepper) { this.RealStepper = realStepper; } public void setSteps(int i) { RealStepper.setSteps(i); } ... } Zitieren
Nic Geschrieben October 9, 2012 at 15:29 Geschrieben October 9, 2012 at 15:29 Ah, eine Queue oder Stepper-Controller. Nur ist jeder Anwendungsfall u.U. verschieden, ob man das mit einem Controller so einfach lösen kann, die Möglichkeiten wie n-Motoren voneinander in ihrern Sequenzen abhängig sein können, sind umfangreich. Zitieren
gagahhag Geschrieben October 9, 2012 at 15:53 Geschrieben October 9, 2012 at 15:53 Ah, eine Queue oder Stepper-Controller. Nur ist jeder Anwendungsfall u.U. verschieden, ob man das mit einem Controller so einfach lösen kann, die Möglichkeiten wie n-Motoren voneinander in ihrern Sequenzen abhängig sein können, sind umfangreich. Das stimmt, deshalb muss man das je nach Anwendungsfall ausprogrammieren. Bei mir sind es 2 Motoren, die ich gleichzeitig steuern muss, dies macht mein Controller, wobei dieser eine Move-Queue hat, wo die nacheinander folgenden Bewegungen gespeichert werden. Zitieren
Nic Geschrieben October 11, 2012 at 09:23 Geschrieben October 11, 2012 at 09:23 @gagahhag Hmmh, so eine Queue könnte ich ev. auch gebrauchen. Wie hast du die Queue implementiert, ich setzte zwar Delphi ein, aber ev. hätte ich ein paar Inspirationen aus deinem Java-Code gewonnen. Zitieren
gagahhag Geschrieben October 11, 2012 at 09:37 Geschrieben October 11, 2012 at 09:37 Ich selbst habe eine Priority-Queue von Move-Objektion genommen. Ein Move ist bei mir eine Klasse, welche die Art der Bewegung (Strecke von x mm, Drehung um x Grad, Kurve von Radius x um y Grad, etc.) Diese stelle ich die Queue, welche dann Schritt für Schritt abgearbeitet wird. Wenn ich dazu komme, werde ich meinen Code ein bisschen dokumentieren und dann hier mal reinstellen. Aber ist (noch) nicht so schön, wie ich mir das wünsche -> Prototyping Zitieren
Nic Geschrieben October 12, 2012 at 14:28 Geschrieben October 12, 2012 at 14:28 Das wäre prima, hmmh aber was ist Move-Objektion. Ist damit ein Framework gemeint ? Zitieren
AuronX Geschrieben October 12, 2012 at 17:44 Geschrieben October 12, 2012 at 17:44 Ich vermute es ist ein Tippfehler: Move-Objekten Zitieren
gagahhag Geschrieben October 12, 2012 at 19:22 Geschrieben October 12, 2012 at 19:22 Genau, war ein Tippfehler... aber tönt doch gut Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.