LabVIEWForum.de - Kommunikation 2er Schleifen

LabVIEWForum.de

Normale Version: Kommunikation 2er Schleifen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

vielleicht habe ich falsch gesucht, aber leider konnte ich hier nichts finden.

Ich habe 2 Schleifen:

- eine zur Abfrage einer Ereignisstruktur
- parallel dazu eine für das Hauptprogramm

Nun möchte ich im Hauptprogramm Code ausführen, wenn sich über die Ereignisstruktur ein Wert geändert hat.

Ich kann mir nicht vorstellen, dass diese Kommunikation nur über lokale bzw. globale Variablen funktioniert bzw. einen DUmmy-Control:
In der Ereignisstruktur einen boolschen Wert auf "true" setzen und im Hauptprogramm auf diesen Wert prüfen. Ist dieser "true", wird eine Case-Struktur abgearbeitet und der boolsche Wert auf "false" gesetzt.

Wobei das Datenflussprinzip hier soweiso nicht funktionieren kann, da die Scheifen parallel laufen. Dennoch kommen mir lokale/globale Variablen in LabVIEW generell unauber vor.

Wie macht man es richtig?
Such mal (auch im NI-Examplefinder) nach Schlagworten wie "Queues", "Notifiers" (Melder), und/oder Producer-Consumer-Struktur (als Template unter File->New...).

Gruß, Jens
Danke für die Suchbegriffe. Die helfen mir weiter.Smile
' schrieb:Ich habe 2 Schleifen:
- eine zur Abfrage einer Ereignisstruktur
- parallel dazu eine für das Hauptprogramm
Stichwort: "Producer-Consumer"

Zitat:Wie macht man es richtig?
Über eine Queue oder einen Melder.


Edit
Mensch, da war ich aber langsam.
Dennoch danke. Das bestätigt mir die Aussage von Jens (auch wenn ich daran nicht gezweifelt habe).

Mit diesen ganzen Konstrukten (Melder, separate Ereignis-Schleife etc) ist es schier unmöglich, das Blockdiagramm auf eine Bildschirmauflösung zu bekommen. Das wird zwar überall empfohlen und schafft Übersicht, keine Frage. Aber in dem Fall bekomme ich das nicht hin.
Naja, was soll's.

Nachtrag: Mit der Producer-Consumer-Struktur funktioniert es einwandfrei.
Kommando zurück: Es funktioniert nicht korrekt.

Die Hauptschleife wird 1 x durchlaufen und dann wartet das VI "Element aus Queue entfernen" vermutlich auf das nächste Ereignis (das es nicht gibt):

[attachment=27459]
' schrieb:Die Hauptschleife wird 1 x durchlaufen und dann wartet das VI "Element aus Queue entfernen" vermutlich auf das nächste Ereignis (das es nicht gibt):
Ja, "Element aus Queue entfernen" wartet bis wieder was in die Queue geschrieben wurde. So funktioniert das. Wie hättest du es denn gerne? Ist der Timeout vielleicht etwas für dich?

Und bitte das komplette BD auf's Bild packen ...

Edit: Du wirst auf diese Weise deine Consumer Loop kaum beenden können, denn das VI wartet, wie gesagt, bis wieder was los ist. Am einfachsten ist, du verbindest den Error-Cluster von "Queue lesen" mit dem Stop-Terminal der Schleife. So wird sie beendet sobald die Queue zerstört wird.
Ich habe das BD nur schnell vereinfacht zusammengeklickt, um es auf das Relevante zu reduzieren.
Das links ist wie in den LV-Beispielen.

Ich hätte es gerne so, dass die Hauptschleife immer läuft und wenn ein nummerischer Wert vom Benutzer geändert wird, soll in der Hauptschleife ein zusätzlicher Code ausgeführt werden, der diese Werte verarbeitet (die oben angehänge Case-Struktur "kein Fehler").

Aber du hast Recht: Wenn ich das Timeout auf 1 ms setze, scheint es zu funktionieren, wie ich mir das vorstelle. 1 ms könnte riskant sein, vermute ich, doch ich möchte meine Hauptschleife nicht zu sehr ausbremsen.
' schrieb:Aber du hast Recht: Wenn ich das Timeout auf 1 ms setze, scheint es zu funktionieren, wie ich mir das vorstelle.
Für die Queue als solche reicht ein Timeout von z.B. 250ms. Entweder beendet sich das Queue-Element nach dieser Zeit von selbst oder dann, und dann sofort, wenn in der Queue was drinnen steht.

Zitat:1 ms könnte riskant sein, vermute ich, doch ich möchte meine Hauptschleife nicht zu sehr ausbremsen.
Eine Schleife, die mit 1ms Schleifendauer läuft, ist immer kritisch.
Ich mach eine Schleife nie kleiner als 50ms. Ggf. muss ich halt den Algorithmus anpassen.
Referenz-URLs