Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
Ich habe ein Problem. Ich möchte mit LabVIEW einen Motor ansteuern. Soweit kein Problem. Der Moter erhält einen ASCII Befehl ("mrX", wobei X die anzahl der "Ticks" ist, um die der Motor fahren soll). Wenn der Motor desen Befehl erhalten hat, dann fängt er an sich zu bewegen. Ich möchte nun aber den Motor mittes eines Sliders steuern. Das Programm bleibt in einer While-Schleife während der Benutzer mittes Slider die Position des Motors einstellen kann. Das VI, welches den Befehl zum Bewegen des Motors ausgibt, sitzt in einer Event-Schleife und wird gestartet, sobald die Maustaste über dem Steuerslider losgelassen wird. Dann wird der Slider gesperrt, solange der Motor sich bewegt.
Nun ergibt sich aber ein Problem. Wenn der Benutzer nachässig ist, dann "greift" er den Schieber mit der Maus und bewegt ihn, kann aber dann die Maus außerhalb des Slider-Bereichs loslassen. Damit greift meine Case-Struktur aber nicht mehr und dass will ich vermeiden. Frage: Gibt es eine Möglichkeit das VI "Motorbewegen" immer dann auszulösen, wenn den Wert des Sliders geändert WURDE?
Alternativ könnte ich den Slider dynamisch abfragen, immer nur wenn der Benutzer einen neuen Wert eingestellt hat. Da habe ich aber auch keine Idee, wie ich das umsätzen könnte!
Um Mein Problem zu verdeutlichen habe ich mal ein kleines Demo-VI geschrieben. Slide2 soll immer dann aktualisiert werden, wenn der Benutzer den Wert von Slide geändert hat. Aber es soll sich nicht dadurch umgehen lassen, dass der Anwender die Maus außerhalb von Slide losläßt. Viellicht habt ihr mehr Ideen als ich. Danke im Vorraus!
Ach ja: Das Ist LabVIEW 8.2 ne andere Version habe ich leider nicht!
EDIT: Oh, je! Aus irgend einem unerfindlichen Grund ist mein Beitrag 2 mal im Forum gelandet! Tut mir leid! Bitte liebe Moderatoren, löscht einen! Nochmals Sorry!
' schrieb:EDIT: Oh, je! Aus irgend einem unerfindlichen Grund ist mein Beitrag 2 mal im Forum gelandet! Tut mir leid! Bitte liebe Moderatoren, löscht einen! Nochmals Sorry!
Kein großes Problem, kann passieren. Erledigt...
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
Hallo Marcus A,
verschiebe das Slide Control in die Eventstruktur in das entsprechende Event. Das Event wird auch nur bei einer Wertänderung ausgelöst. Wozu benötigst Du das Timeout?
' schrieb:Hallo Marcus A,
verschiebe das Slide Control in die Eventstruktur in das entsprechende Event. Das Event wird auch nur bei einer Wertänderung ausgelöst. Wozu benötigst Du das Timeout?
Mike
Time out dient dazu, dass auch die anderen Elemente auf den Frontpanel bearbeitet werden. Wenn du das wegläßt, dann wird z.b. der "Stop"-Knopf nicht abgefragt. Aber wenn ich das auch anders machen kann, dann sag es mir ;-)
Slide Control in die Eventstruktur? Habe ich ausprobiert, aber es ergibt sich das sebe Problem: Wenn die Maustaste außerhalb der Control losgelassen wird, dann wird das Event nicht ausgelößt. Oder muss ich ein anderes Event definieren?!?
Hallo Marcus A,
ändere das Timeout Event in ein "stop value change event". Platziere deinen Stop Knopf in diesem Event und verbinde das Control mit der Schleifenabbruchbedinung. Zu deinem Slider: Du kannst auch hier ein Value Change Event benutzen. Das würde das Event bei jeder Veränderung auslösen. Wenn dir das nicht gefällt, dann erzeuge ein zusätzlichen Event "Slide Control verlassen" in dem du auch den Wert des 2. Sliders änderst. Am besten du benutzt dann ein Shiftregister in dem du den aktuellen Wert speicherst und ihn nach der Eventstruktur in des Anzeigeelement schreibst.
Gut zu den Timeout: In diesem Fall würde das funktionieren. Aber mein richtiges VI ist etwas umfangreicher... daher lasse ich das wohl so :-)
Das Problem mit "ValueCange" ist, dass das Case bei JEDER änderung ausgeführt wird. Wenn der Benutzer den Regler schiebt, dann wird wird praktisch die anzeige mitgeschoben. Das würde aber meinen Motor in der Realität zur Verzewiflung treiben ... Daher darf das Case erst ausgeführt werden, wenn er User den Knopf Losläßt.
Zu Slide Contol verlassen: Wenn ich dich richtig verstanden habe soll ich Mouse leave verweden. Dann wird das aber auch ausgelöst, wenn der benutzer gar nichts an dem Regler verändert hat... -> Auch doof! Oder habe ich dich missverstanden? Kannst du mal nen Beispiel posten?
' schrieb:...
Zu Slide Contol verlassen: Wenn ich dich richtig verstanden habe soll ich Mouse leave verweden. Dann wird das aber auch ausgelöst, wenn der benutzer gar nichts an dem Regler verändert hat... -> Auch doof! Oder habe ich dich missverstanden? Kannst du mal nen Beispiel posten?
Ja das stimmt, aber da können ja dann entsprechende Mechanismen eingefügt werden. Außerdem empfehle ich dir, wenn du eine Eventstruktur verwendest diese auch konsequent zu nutzen (für alle Controls die ein Event auslösen das du brauchst, auch der Stop Knopf ).
Wie wäre es wenn du mit dem Schieberegler die neue Position einstellst und mit einem Zusatzknopf den Wert dann tatsächlich an den Motor schickst. Die andere Idee ist aber auf jeden Fall auch möglich.
Gegenfrage: Warum benutzt Du nicht als Ereignis einfach "Wertänderung" (des Sliders) statt "Maustaste losgelassen"?
So würde es normalerweise gemacht, und das Problem hättest Du nicht.
Ein mögliche Antwort könnte sein: : Bei Wertänderung finden während des slidens, also nicht erst wenn der Endwert erreicht ist, schon jede Menge Ereignisse statt. Es könnte sein, daß das in der geplanten Applikation stört.
Wenn das die Antwort ist, bitte noch mal melden, dann müßte etwas überlegt werden.
Ein einfache Lösung wäre mit einem "OK"-Button zum Übernehmen der Werte. Siehe Beispiel.
Hm. Einstellen und dann "Los" sagen ist meine Notlösung. Aber das muss doch besser gehen!! Was meinst du denn mit "entsprechenden Mechanismen"?
Zu den Verwendungen der Case-Strukturen. Die benutze ich gerade zum ersten mal (merkt man vielleicht) In dem Alten LV, das ich vorher benutzt hatte gabs die noch nicht. Daher sind sie mir ein wenig unheimlich ;-) Immerhin kann man LV damit wunderbar "abstürzen" lassen indem man ein Event nicht, oder falsch, behandelt... Ein wenig erinnern die mich an "Spagetti-Code" Daher will ich die eigentlich nicht verwenden. Aber vielleicht sehe ich das ja auch falsch. Ich lass mich gerne belehren!
Hallo Marcus A,
das einzige Problem das ich denke das du mit dem loslassen hast ist, dass wenn du den Bereich des Controls verläßt und die Maus trotzdem gedrückt hältst das der Wert dann nicht mehr übernommen wird, oder?
Ansonsten sehe ich bei der loslass Lösung keine Schwierigkeiten.
Mit entsprechenden Mechanismen meine ich, dass du abfragen kannst ob die Maus den Bereich betreten hat und erst dann auf das verlassen reagierst.
Ich empfehle die Events zu benutzen. Du brauchst Zustände nicht ständig abfragen um auf eine Wertänderung zu reagieren. Ich sehe da nur Vorteile.