Hallo, ich würde gerne folgende simple Funktionalität in LabVIEW umsetzen: Wenn der Anwender an der GUI einen Wert ändert (z.B. via Numeric Control) soll ein Stück Code ausgeführt werden (z.B. Wert per TCP/IP senden). Bisher habe ich das einfach in eine Endlosschleife gepackt (Wert holen, senden, wiederholen), aber das ist natürlich ein gräuslicher Ansatz. Der Wert soll schließlich nur übertragen werden, wenn er sich geändert hat. Ich hatte gehofft, dass man das einfach auf Event-orientierte Art lösen könnte. Leider findet sich zu dem Thema recht wenig, und wenn dann nur sehr komplizierte Sachen. Ist sowas auf einfache Art möglich?
Eventstruktur --> Ereignis für "Wertänderung" deines Frontpanel-Elements einfügen. Timeout-Event für die Struktur einfügen, da sonst ewig gewartet wird. Hilfe hilft.
Hallo, ich habe auf der Arbeit einen vergleichbaren Messstand mit Messages Queues in LabView gebaut. Die Datenübertragung lief seperat mit einem Message Queue und die GUI selber auch. Somit war ein Klick auf der GUI nur eine Message die an einen Hintergrundprozess ging und der sich dort um die eigentlich Rechnerei gekümmert hat. Messages Queues kann man prioritisieren indem man am Anfang oder Ende des FIFOs schreibt bzw. dieses mal leerräumt. Ein zweiter Prozess, gesteuert von einem Timer hat immer eine Message in den Queue für die Datenabfrage der Hardware gesteuert. Der dritte Prozess hat in den Message Queue geguckt und dann gesehen welches Kommando an die Hardware gehen soll und dementsprechend alles eingeleitet. Eigentlich eine schöne Dreiteilung wo notfalls auch jeder Prozess auf einem anderen PC hätte laufen können und die Daten per TCP/UDP ausgetauscht werden. Der andere Vorteil ist, dass Du relativ gut Erweiterungen einspielen kannst. Ich habe damals viel über Message Queues gelernt, auch deren Prioritisierung. Allerdings habe ich bei nachfolgenden Projekten die reine Hardwarekommunikation zwischen Messgerät und PC als DLL in C geschrieben. Was allerdings eher an einer lahmarschigen String Sortierung in LabView lag. Somit wird dann der Teil Timer und Hardware regelmäßig abfragen regelmäßig in der DLL ausgeführt.
...könnte es so wie im Anhang klappen? Das innere der Eventstruktur wird nur ausgeführt, wenn eine "Wertänderung" stattfindet. Es wird nur 1x ausgeführt, aus dem Grund befindet es sich in der While-Schleife. Mirko
So klappt die Ausführung bei Wertänderung. Da aber immer einer der Cases der Eventstruktur ausgeführt wird, und standardmäßig ein unbegrenzter Timeout eingestellt ist, solltest du noch am Tiemouteingang einen Wert in ms angeben und einen Case dafür erstellen. Den kannst du dann einfach leer lassen. Wenn du das nicht tust, hängt das Programm sonst dort fest, weil darauf gewartet wird, dass einer der Events eintritt (in deinem Fall die Wertänderung). Die Schleifenlaufzeit bekommt dadurch natürlich ein unteres Limit. Weiß grade nicht, ob man das Tiemout auch auf 0 ms setzen kann. edit: Gerade probiert. Timeout auf 0 ms geht. Eine Schleife dauert dann bei mir zwischen 50 und 60 µs (im Minimal-Beispiel). edit²: Ich sehe grade, dass du eh einen 100 ms Timer drin hast. Setz also das Timeout für das Event auf einen Wert darunter, und du solltest keine Probleme bekommen.
:
Bearbeitet durch User
...ich bin zwar nicht der TO, aber trotzdem danke. ;) Per default ist der Timeout auf -1. Ich habe einfach mal eine Anzeigeeinheit an die Schleifeniteration gemacht und siehe da: Die While-Schleife wird nur bearbeitet, wenn ein Ereigniss eintritt. (Wartet sich also tot) Also ein Timeout anschließen -> Aber der Event-Case Timeout muss vorhanden sein...sonst gehts auch nicht. ;) Mirko
Erst mal vielen Dank an alle! Di Pi schrieb: > Timeout-Event für die Struktur einfügen, da sonst ewig gewartet wird. Kannst du das noch mal kurz erläutern? Wenn kein Event auftritt, soll ja auch gewartet werden. Warum sollte man das nach einer fixen Zeitspanne abbrechen? Ggf. hast du ja auch gerade einen anderen Anwendungsfall im Kopf als ich ;-)
Boris P. schrieb: > Warum sollte man > das nach einer fixen Zeitspanne abbrechen? Damit z.B. Dein Stop Button nochmal ausgelesen werden kann. Ansonsten müsstest Du Stop drücken und dann das "wert" Event nochmals auslösen damit die Schleife beendet werden kann. Das macht sich beim Kunden nicht so gut.
Boris P. schrieb: > Di Pi schrieb: >> Timeout-Event für die Struktur einfügen, da sonst ewig gewartet wird. > > Kannst du das noch mal kurz erläutern? lalala schrieb: > Boris P. schrieb: >> Warum sollte man >> das nach einer fixen Zeitspanne abbrechen? > > Damit z.B. Dein Stop Button nochmal ausgelesen werden kann. Ansonsten > müsstest Du Stop drücken und dann das "wert" Event nochmals auslösen > damit die Schleife beendet werden kann. Das macht sich beim Kunden nicht > so gut. lalala hats beschrieben. Es geht um die Blockierung deiner Programmschleife.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.