Forum: PC-Programmierung LabVIEW: Bei Wert-Änderung etwas tun


von Borislav B. (boris_b)


Lesenswert?

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?

von Di P. (drpepper) Benutzerseite


Lesenswert?

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.

von Dieter (Gast)


Lesenswert?

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.

von MirkoB (Gast)


Angehängte Dateien:

Lesenswert?

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

von Di P. (drpepper) Benutzerseite


Lesenswert?

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
von MirkoB (Gast)


Lesenswert?

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

von Borislav B. (boris_b)


Lesenswert?

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 
;-)

von lalala (Gast)


Lesenswert?

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.

von Di P. (drpepper) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.