INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Dieses Thema hat akzeptierte Lösungen:

Drei Queues in einer While-Schleife mit case-Struktur



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!

13.05.2017, 12:30
Beitrag #1

EinVolvic Offline
LVF-Grünschnabel
*


Beiträge: 16
Registriert seit: May 2017

2016
-
DE



Drei Queues in einer While-Schleife mit case-Struktur
Hallo liebes Forum,

ich würde euch gerne bezüglich den Queues in meinem Progamm um euren Rat und eure Meinungen bitten.

Es geht um mein Messprogramm, welches in zwei Modi Daten erfassen und speichern kann. Das Programm ist nach dem Producer-Consumer Modell aufgebaut; es gibt für jeden Modus eine separate Queue, die vom Producer (erfassen) zum Consumer (speichern) führt. Es soll während einer Messung nur ein Modus aktiv sein.
Den Consumer habe ich mit einer einzigen While-Schleife realisiert, in der sich eine case-Struktur zur Unterscheidung der Messmodi befindet. Folglich führen zwei Daten-Queues zum Consumer.

Ich habe festgestellt, dass ich während der Programmlaufzeit den Selektor (Schalter) für die case-Struktur nicht mehr ändern kann. Er verbleibt immer in seiner Anfangsposition. Das Eigenartige: Wenn ich den Schalter nicht mit dem Selektoranschluss verbinde, wird er während der Programmlaufzeit aktualisiert. Schlussendlich habe ich das Problem so gelöst, dass ich noch eine dritte Queue als Steuerleitung eingeführt habe und seine Daten gleichzeitig mit den anderen Queues in die Schlange hinzugefügt werden. Das Programm funktioniert soweit ohne Probleme, ich möchte mir jedoch die Risiken betrachten und ggf. optimieren, für nächstes Mal besser machen.Blush


Frage 1: Ich habe gelesen, dass die Consumer-While-Schleife normalerweise immer auf die Queue-Daten wartet bevor sie ihren Inhalt ausführt. Wie verhält sie sich bei zwei oder drei Queues? Weißt die Schleife, dass sie für das Ausführen der case-Struktur sowohl die Daten-Queue als auch die Steuerleitung-Queue braucht und wartet dementsprechend?

Frage 2: Gibt es eine Möglichkeit dem Consumer den Selektorwert nur einmal mitzuteilen (bei Änderung)? Sodass sie nicht mehr auf die Steuerleitung zu warten braucht, wäre evtll. dadurch sogar schneller?

Frage 3: Ist die While-Schleife mit case-Struktur günstiger für die Programmlaufzeit als zwei While-Schleifen ohne case-Struktur?

Besten Dank und schöne Grüße
EinVolvic
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
14.05.2017, 07:59 (Dieser Beitrag wurde zuletzt bearbeitet: 14.05.2017 09:41 von Lucki.)
Beitrag #2

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
RE: Drei Queues in einer While-Schleife mit case-Struktur

Akzeptierte Lösung

Das Verwenden einer gesonderten Queue für jeden Producer ist kein guter Ansatz. Besser ist es, nur eine Queue zu verwenden, und damit der Consumer weiß, woher die Daten kommen, müssen die Queueelemente nicht nur die Daten, sondern auch die Datenquelle enthalten.
Das Datenformat in der Queue sollte also ein Cluster sein, bestehend aus Quelle und Daten. Datenformat Qelle: Text oder Enum; Datenformat Daten, falls die Daten je nach Quelle unterschiedliches Format haben: Variant.
Studiere mal das Beispiel, vielleicht erübrigen sich dann die anderen Fragen oder Du hast neue Fragen.

15.0 .vi  ProdCons.vi (Größe: 14,64 KB / Downloads: 337)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.05.2017, 11:05
Beitrag #3

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.696
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
RE: Drei Queues in einer While-Schleife mit case-Struktur
(13.05.2017 12:30 )EinVolvic schrieb:  Frage 1: Ich habe gelesen, dass die Consumer-While-Schleife normalerweise immer auf die Queue-Daten wartet bevor sie ihren Inhalt ausführt.
Das kann man so machen - muss aber nicht. Theoretisch kann die While-Schleife viele Sachen machen - eine davon wäre die Queue-Daten zu verarbeiten.

Zitat:Wie verhält sie sich bei zwei oder drei Queues?
Siehst du, und genau deswegen sind mehr als eine Queue problematisch.

Zitat:Weißt die Schleife, dass sie für das Ausführen der case-Struktur sowohl die Daten-Queue als auch die Steuerleitung-Queue braucht und wartet dementsprechend?
Die Schleife weiß genau das, was du in sie hineinprogrammierst - sie hat also keine Eigenintelligenz ...

Zitat:Frage 2: Gibt es eine Möglichkeit dem Consumer den Selektorwert nur einmal mitzuteilen (bei Änderung)? Sodass sie nicht mehr auf die Steuerleitung zu warten braucht
Es ist alles nur eine Sache der Umsetzung des Algorithmus, den du dir ausgedacht hast. Du brauchst also einen entsprechenden Algorithmus.

Zitat:wäre evtll. dadurch sogar schneller?
Hinweis: Schneller (bzw. Kürzer) ist nicht immer das beste Kriterium: Debugfähigkeit und Modularität gehen vor ...

Zitat:Frage 3: Ist die While-Schleife mit case-Struktur günstiger für die Programmlaufzeit als zwei While-Schleifen ohne case-Struktur?
Praktischerweise ja: Eine While-Schleife muss immer ihren kompletten Inhalt verarbeiten. Wenn man den Inhalt komplett oder auch nur teilweise in eine Case-Struktur verteilen kann, so kann man zu bestimmten Zeiten nur das tun, was für diesen Zeitpunkt notwendig ist. Da man dann nicht mehr alles tut, wird auch die Verarbeitungszeit kürzer.

Hinweis:
While-Schleife mit Case-Sequenz heißt (gegebenenfalls) Statemachine - macht sind in jedem Programm immer sehr gut.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
15.05.2017, 12:50
Beitrag #4

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
RE: Drei Queues in einer While-Schleife mit case-Struktur
(13.05.2017 12:30 )EinVolvic schrieb:  Frage 1: Ich habe gelesen, dass die Consumer-While-Schleife normalerweise immer auf die Queue-Daten wartet bevor sie ihren Inhalt ausführt. Wie verhält sie sich bei zwei oder drei Queues? Weißt die Schleife, dass sie für das Ausführen der case-Struktur sowohl die Daten-Queue als auch die Steuerleitung-Queue braucht und wartet dementsprechend?
Fasse alle Steuerungsoptionen in einem Enum zusammen, dann brauchst du auch nur 1 Queue.

Alternativ: Verwende für die Queue einen (typdefinierten) Cluster mit mehreren Enums und weiteren Daten, auch dann brauchst du nur 1 Queue.

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!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
15.05.2017, 19:37
Beitrag #5

EinVolvic Offline
LVF-Grünschnabel
*


Beiträge: 16
Registriert seit: May 2017

2016
-
DE



RE: Drei Queues in einer While-Schleife mit case-Struktur
Hallo Lucki, IchSelbst und Jens,

danke für eure Antworten, sie haben mir sehr weitergeholfen.

Zitat:Datenformat Daten, falls die Daten je nach Quelle unterschiedliches Format haben: Variant.
@Lucki: Die Idee, nur eine Queue zu verwenden ist mir auch als erstes gekommen. Ich hatte bisher nur Schwierigkeiten mit den zwei unterschiedlichen Datentypen gehabt. Dein Vorschlag mit dem Format Variant habe ich sofort ausprobiert und es klappt hervorragend. Man kann sogar nochmal ein Cluster-Typ als Daten einfügen.

Zitat:While-Schleife mit Case-Sequenz heißt (gegebenenfalls) Statemachine - macht sind in jedem Programm immer sehr gut.
@IchSelbst: Meine erste while-Schleife ist genau als Statemachine programmiert, die unter anderem die zwei Producer enthält.

Zitat:Alternativ: Verwende für die Queue einen (typdefinierten) Cluster mit mehreren Enums und weiteren Daten, auch dann brauchst du nur 1 Queue.
@Jens: Das klingt so ähnlich wie der Vorschlag von Lucki, haben hier alle so gute Ideen. Big Grin

Ich habe noch eine parallele Darstellung der Daten erstellt, die braucht nun zwingend ja eine zweite Queue (als zweiter Consumer) oder komme ich noch drumrum? Blush
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
15.05.2017, 20:28
Beitrag #6

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.696
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
RE: Drei Queues in einer While-Schleife mit case-Struktur
(15.05.2017 19:37 )EinVolvic schrieb:  haben hier alle so gute Ideen
Nee. Die wissen nur, wie's Programmieren richtig geht Yahoo

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
15.05.2017, 21:35
Beitrag #7

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
RE: Drei Queues in einer While-Schleife mit case-Struktur
(15.05.2017 19:37 )EinVolvic schrieb:  Ich habe noch eine parallele Darstellung der Daten erstellt, die braucht nun zwingend ja eine zweite Queue (als zweiter Consumer) oder komme ich noch drumrum? Blush
Zweiter Consumer, zweite Queue! (Queue ist immer N zu 1)

(15.05.2017 20:28 )IchSelbst schrieb:  
(15.05.2017 19:37 )EinVolvic schrieb:  haben hier alle so gute Ideen
Nee. Die wissen nur, wie's Programmieren richtig geht Yahoo
Tupta Laber Hopper Top1

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!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.05.2017, 08:54
Beitrag #8

EinVolvic Offline
LVF-Grünschnabel
*


Beiträge: 16
Registriert seit: May 2017

2016
-
DE



RE: Drei Queues in einer While-Schleife mit case-Struktur
(15.05.2017 20:28 )IchSelbst schrieb:  
(15.05.2017 19:37 )EinVolvic schrieb:  haben hier alle so gute Ideen
Nee. Die wissen nur, wie's Programmieren richtig geht Yahoo
Haha, das glaube ich.

Zitat:Zweiter Consumer, zweite Queue! (Queue ist immer N zu 1)
Dann wäre das auch geklärt, danke!

Letzte Frage: Mir ist aufgefallen, dass die Messzeit des Programms (Zeit zwischen zwei while-Schleifen bei der Messdatenabfrage) stark zunimmt, wenn ich auf dem Frontpanel zur Anzeige mit den Diagrammen wechsle. Dadurch steigt die Anzahl der Samples im Puffer, was für eine kurze Zeit auch kein Problem ist. Langfristig könnte das den Puffer jedoch überfüllen. Ist das ein generelles Problem in Labview? Ich habe festgestellt, auch wenn ich die Darstellung parallelisiere, tritt der Effekt immer noch auf (vielleicht etwas schwächer dann).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.05.2017, 09:55 (Dieser Beitrag wurde zuletzt bearbeitet: 16.05.2017 10:11 von Lucki.)
Beitrag #9

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
RE: Drei Queues in einer While-Schleife mit case-Struktur
(16.05.2017 08:54 )EinVolvic schrieb:  Letzte Frage: Mir ist aufgefallen, dass die Messzeit des Programms (Zeit zwischen zwei while-Schleifen bei der Messdatenabfrage) stark zunimmt, wenn ich auf dem Frontpanel zur Anzeige mit den Diagrammen wechsle. Dadurch steigt die Anzahl der Samples im Puffer, was für eine kurze Zeit auch kein Problem ist. Langfristig könnte das den Puffer jedoch überfüllen. Ist das ein generelles Problem in Labview? Ich habe festgestellt, auch wenn ich die Darstellung parallelisiere, tritt der Effekt immer noch auf (vielleicht etwas schwächer dann).
Ein generelles Problem von Labview ist das nicht. Eine Bildschirm- Graphik zu updaten ist immer aufwendig. Gar keinen Sinn macht es, die Update-Rate höher zu machen als die Monitor-Bildfrequenz von z.B. 75 Hz. Aber das Auge ist noch viel langsamer, selbst Update-Raten von mehr als 10 Hz sind unnötig. Wenn also die Messrate höher ist, ist es sinnvoll, nicht jeden Einzelwert sofort zur Graphik zu senden, sondern immer mehrere Werte gebündelt zu senden.
Aber die Langsamkeit kann natürlich auch noch andere Ursachen haben. Ganz besonders zu warnen wäre z.B. vor dem Aufruf irgendwelcher Eigenschaftsknoten bei jedem Update. Auch die automatische Bereichsanpassung ist schlecht für die Performance. Und das Plotfenster sollte frei sein, also keine numerische Anzeigen oder dergl. dort hineinplazieren
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.05.2017, 15:40
Beitrag #10

EinVolvic Offline
LVF-Grünschnabel
*


Beiträge: 16
Registriert seit: May 2017

2016
-
DE



RE: Drei Queues in einer While-Schleife mit case-Struktur
Also meine Verarbeitungsrate liegt bei 200ms, aber dann verarbeite ich immer Daten von mehreren Zeitpunkten. Wenn ich sie sofort verarbeiten würde sobald sie da sind, würde ich mit der Verarbeitung gar nicht hinterherkommen. Dementsprechend müsste die Darstellungsrate auch so in etwa um den Bereich liegen (die while-Schleife zur Darstellung wartet ja auf die Daten in der Queue).

Zitat:Ganz besonders zu warnen wäre z.B. vor dem Aufruf irgendwelcher Eigenschaftsknoten bei jedem Update
Ich verwende Eigenschaftsknoten, und zwar die von den entsprechenden Diagrammen, gibt es dazu eine andere Alternative? Mir würde noch einfallen, die Darstellung für beide Messmodi in einen Consumer zusammenzufassen. Bisher hat jeder Messmodus, aus historischen Gründen, seine eigene Darstellung gehabt.

Das Springen der Messzeit taucht übrigens auch auf, wenn ich etwas CPU- oder arbeitsspeicherlastiges ausführe, z.B. ein Programm öffnen oder zwischen ihnen wechseln.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Ansteuerung von drei DACs Rumo 15 17.596 11.06.2021 15:50
Letzter Beitrag: GerdW
  Case-Struktur: Angegebener Case nicht vorhanden braendy 10 6.833 02.02.2021 15:05
Letzter Beitrag: Lucki
  Case Struktur 2 Schleifendurchläufe verzögert True setzen aber sofort auf False bachatero18 4 5.700 07.11.2020 14:08
Letzter Beitrag: Martin.Henz
  CAN Nachrichten in Array verarbeiten und aus Case Struktur weiterverarbeiten Tomate27 4 4.554 17.07.2020 13:30
Letzter Beitrag: Tomate27
  Steuerung, Case-Struktur pixie_2 4 4.127 16.04.2020 14:30
Letzter Beitrag: GerdW
  Probleme mit Queues und Programmaufbau stefan1312 6 5.442 30.10.2018 17:08
Letzter Beitrag: NoWay

Gehe zu: