LabVIEWForum.de
Queues VI übergreifend verwenden - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: Datenkommunikation (/Forum-Datenkommunikation)
+---- Thema: Queues VI übergreifend verwenden (/Thread-Queues-VI-uebergreifend-verwenden)

Seiten: 1 2


Queues VI übergreifend verwenden - mdu - 05.03.2015 08:37

[attachment=52316]Hallo,

nachdem ich seid 2 Tagen ergebnislos nach einer Möglichkeit am suchen bin Queues für den Datenaustausch zwischen 2 oder mehreren VIs zu verwenden möchte ich das mal hier im Forum fragen.

Ich habe ein paar wenige Beiträge hier im Forum gefunden die dieses Thema ansprechen, jedoch immer ohne Beispiel und ohne konkrete Antwort auf die Frage wie es gemacht wird.

Im Anhang befindet sich ein einfaches Beispiel, dass die funktionsweise von Queues in einem VI erklärt und zeigt. Wie kann ich zum Beispiel (für diesen Fall) die Erzeuger und Verbraucherschleife in jeweils einem anderen VI bearbeiten und die Kommunikation der Queue gewährleisten?

Geht das über Referenzen? Wenn ja wie?

Vielen Dank für eure Hilfe


RE: Queues VI übergreifend verwenden - GerdW - 05.03.2015 09:22

Hallo mdu,

Zitat:Wie kann ich zum Beispiel … die Erzeuger und Verbraucherschleife in jeweils einem anderen VI bearbeiten und die Kommunikation der Queue gewährleisten?
Zwei Möglichkeiten:
1. Man erzeugt die Queue-Referenz wie du im VI und reicht sie per Draht an die zwei subVIs (Erzeuger + Verbraucher) weiter. Ganz normal also…
2. Man erzeugt die Queue-Referenz mit einem Namen (benannte Queue) - "Queue anfordern" hat dafür einen extra Eingang! Dies kann man in beiden subVIs mit demselben Namen machen und schon arbeiten beide subVIs mit derselben Queue…


RE: Queues VI übergreifend verwenden - toaran_ - 05.03.2015 09:58

Hi

Wenn man benannte Queue's oder Notifier erstellt und im subvi mittels "Queue anfordern" anfordert... muss man auch den selben Datentypen angeben sonst wird eine neue Queue Referenz erzeugt...

Ich habe mir für meine Projekte immer ein "Handler" VI gebaut das einzig dafür zuständig ist alle alle Referenzen zu öffnen. für diese Referenzen die ich übergreifend nutzen hab ich dann eine Globale Variable in der ich die einfach speichere und beim öffnen eines Vis das die Ref. braucht wird einmal die Globale gelesen...

T


RE: Queues VI übergreifend verwenden - Lucki - 05.03.2015 11:26

Zunächst mal: Ein ganz dickes Lob für das so wunderschön aufgeräumte VI. Solange ich hier im Forum dabei bin, habe ich so etwas Schönes kaum gesehen, die Regel ist eher säuisches Aussehen bis zum Geht-nicht-mehr.
Unterschied Lokale/globale Variablen einerseits und Queues/Melder andererseits:
Beim Datenaustausch mit lokalen/Globalen Variablen gibt es keine Synchronisation zwischen Erzeuger und Verbraucher. Beim Lesen weiß der Verbraucher nicht, ob der Wert bereits gelesen wurde oder nicht. Und umgekehrt, der Erzeuger weiß nicht, ob der letzte Wert beim Verbraucher schon abgeholt wurde oder nicht.
Dieses Manko wird überwunden mit Queues und Meldern.

Unterschied Queue und Melder:
Grob gesagt: Bei Queues kann es mehrere Erzeuger geben, aber immer nur einen Verbraucher.
Bei Meldern kann es mehrere Verbraucher geben. (Ob auch mehr als 1 Erzeuger möglich ist, weiß ich jetzt nicht genau)

Queues mit mehreren Erzeugern: Natürlich hat dann der Verbraucher ein Interesse daran zu wissen, von woher das Element kommt. Deshalb ist das Queueelement in der Regel ein Cluster mit den Elementen "Name" (Adresse) und "Wert" . Da wiederum der "Wert" je nach Herkunft unterschiedliches Format haben kann, nimmt man als Format meistens den Typ "Variant".

Die Einführung einer Wartefunkion in Deiner Verbraucherschleife ist hier für Studienzwecke natürlich begründbar. In realen Anwendungen wird man das aber nicht machen. Man könnte hier auch das studieren: Wenn der Verbrauch langsamer ist als die Erzeugung, dann ist eines Tages die Queue voll, und dann gibt es zwei Möglichkeiten: Entweder man macht es wie Du, dann bremst ab da die Verbraucherschleife die Erzeugerschleife aus. Es gehen aber keine Daten verloren. Oder man verwendet das VI "Element verlustbehaftet aus der Queue entfernen". Dann wird die Erzeugerschleife nicht ausgebremt, es gehen aber Daten verloren.

Ich habe mal das Haupt Vi ein ganz klein wenig verschlimmbessert und hänge es hier an.
Gruß Ludwig

[attachment=52328]


RE: Queues VI übergreifend verwenden - Holy - 05.03.2015 21:29

(05.03.2015 09:58 )toaran_ schrieb:  Wenn man benannte Queue's oder Notifier erstellt und im subvi mittels "Queue anfordern" anfordert... muss man auch den selben Datentypen angeben sonst wird eine neue Queue Referenz erzeugt...
Es wird keine neue Referenz erzeugt sondern der Fehler 1094.

(05.03.2015 11:26 )Lucki schrieb:  Unterschied Queue und Melder:
Grob gesagt: Bei Queues kann es mehrere Erzeuger geben, aber immer nur einen Verbraucher.
Bei Meldern kann es mehrere Verbraucher geben. (Ob auch mehr als 1 Erzeuger möglich ist, weiß ich jetzt nicht genau)
Bei Queues kann es auch mehrere Verbraucher geben. Kann zum Beispiel verwendet werden um rechenintensive Verarbeitung von einzelnen unabhängigen Datenpaketen auf mehrere CPUs zu verteilen o.ä.. Der konsumierende Charakter des "Dequeue Element" kann somit auch bei mehreren Verbrauchern vorteilhaft sein.
Hinsichtlich der Melder sind auch mehrere Erzeuger möglich.


RE: Queues VI übergreifend verwenden - teegee - 05.03.2015 22:40

(05.03.2015 09:22 )GerdW schrieb:  Zwei Möglichkeiten:
1. Man erzeugt die Queue-Referenz wie du im VI und reicht sie per Draht an die zwei subVIs (Erzeuger + Verbraucher) weiter. Ganz normal also…
2. Man erzeugt die Queue-Referenz mit einem Namen (benannte Queue) - "Queue anfordern" hat dafür einen extra Eingang! Dies kann man in beiden subVIs mit demselben Namen machen und schon arbeiten beide subVIs mit derselben Queue…

Oder 3. Man erzeugt die Queue-Referenz in einer Functional Global Variable, die man ueberall aufs Blockdiagram werfen kann und immer eine gueltige Referenz kriegt:
[attachment=52342]


RE: Queues VI übergreifend verwenden - Trinitatis - 05.03.2015 22:46

(05.03.2015 21:29 )Holy schrieb:  ...Bei Queues kann es auch mehrere Verbraucher geben...

Wenn ein Element aus einer Queue gelesen wurde, isses doch wech. Das ist bei Meldern nicht so. Da kann einunddieselbe Meldung an verschiedenen Stellen ausgelesen werden. Natürlich kann auch aus einer Queue an verschiedenen Stellen gelesen werden aber doch nicht dasselbe Queueelement, oder?

Gruß, Marko


RE: Queues VI übergreifend verwenden - Holy - 05.03.2015 23:02

(05.03.2015 22:46 )Trinitatis schrieb:  Wenn ein Element aus einer Queue gelesen wurde, isses doch wech. Das ist bei Meldern nicht so. Da kann einunddieselbe Meldung an verschiedenen Stellen ausgelesen werden. Natürlich kann auch aus einer Queue an verschiedenen Stellen gelesen werden aber doch nicht dasselbe Queueelement, oder?

Gruß, Marko
Ein normales Dequeue konsumiert das Element, wie ich in dem Beispiel ja beschrieben habe. Mein Einwand zielte auch nur darauf ab auf Anwendungsfälle hinzuweisen die mehrere Verbraucher einer Queue implementieren die hier jeweils unterschiedliche Elemente konsumieren. Einzige Möglichkeit eine Queue ohne konsumieren auszulesen ist "Preview".


RE: Queues VI übergreifend verwenden - Lucki - 06.03.2015 00:24

(05.03.2015 23:02 )Holy schrieb:  Einzige Möglichkeit eine Queue ohne konsumieren auszulesen ist "Preview".
Nein. Seite einigen LV-Versionen gibt es auch die Funktion "Am Anfang Einfügen". Auslesen und gleich wieder einfügen wäre eine zweite Möglichkeit die Queue unverändert zu lassen.
Bei meiner Erklärungen hatte ich bewußt geschrieben: "Grob gesagt", aber da ahnte ich schon, dass es trotdem von Supergurus Einwände geben könnte. Meine Meinung: Wenn ein Neuling erst mal weiß, dass eine Queue im Unterschied zum Melder nur einen Verbraucher hat, hat er für den Anfang erst mal eine gute Orientierung. Dass mit so einem einzigen Satz noch nicht alles über Queues gesagt ist, müßte eigentlich klar sein.


RE: Queues VI übergreifend verwenden - mdu - 13.03.2015 15:04

Hallo,

Vielen Dank für die schnellen Antworten, leider war ich die letzten Tage unterwegs und kann daher erst jetzt antworten.
Ihre Antworten haben mir weiter geholfen, im Endeffekt war es nur die Möglichkeit den Queues einen Namen zu geben die mir fehlte.

Zur zeit arbeite ich an einer Bedienoberfläche mit Menüstruktur die später als Standard für größere Projekte dienen soll. Hierbei laufen mehrere VI´s parallel die alle zu beginn der Anwendung in einem Globalen VI aufgerufen werden. Jedes VI hat eine globale Variable "Alive-bit". Wird nun Die Stopptaste gedrückt führt diese zu dem Globalen VI zurück und setzt dort alle "Alive"Globalen Variablen auf False: Somit werden alle Aufgerufenen VI's beendet.

Diese Lösung ist einfach und funktioniert, der Vorteil in dieser Art der Kommunikation ist, dass es wenig Aufwand erfordert und wenig platz im Blockdiagramm. Jedoch denke ich das es bestimmt bessere Möglichkeiten gibt eine solche Funktion zu lösen. Sollte man hier besser mit Meldern arbeiten, da es sich nur um Boolesche Werte handelt? Oder noch ganz anders vorgehen?

Des Weiteren werden manchmal noch mehrere Werte (Strings oder numerische) unter den VI's ausgetauscht.

Ich wünsche ein schönes Wochenende.
Mit freundlichen Grüßen

mdu