LabVIEWForum.de - Probleme mit Queues und Programmaufbau

LabVIEWForum.de

Normale Version: Probleme mit Queues und Programmaufbau
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo!

Ich hab ein Programm geschrieben, mit welchen ich Sollwerte aus einem Textfile ( soll etwas ähnliches werden wie ein G-Code Interpreter) lese und anschließend
in einer Queue abspeicher.

Leider hat mein Programm das Problem, dass es aufgrund eines Speicherproblems abstürtzt.
Zunächst einmal habe ich ein paar Fragen zu einer Queue:

Das Prinzip dahinter ist mir ansich klar, aber leider weiß ich nicht genau wie man mit Queues umgeht.

Werden Queues normal zuerst befüllt, bis sie anschließend gelesen werden.
-> ich habe 1000 Werte - anschließend werden diese in die Queue geschrieben- sobald alle drinnen stehen können diese ausgelesen werden oder passiert das normal gleichzeitig?
Wie definiert man genau die Größe einer Queue?... ich denke an mein Textfile - die Anzahl der Werte ist doch immer variabel.?

Hmm vl hat jemand ein paar Tipps wie man zunächst die Queue zum Beispiel mit 1000 Werten befüllt und diese anschließend über einen Button entleert - um Cluster für Cluster einem weiteren Programm zur
Verfügung zu stellen..

Leider stehe ich mit den Queues ein wenig an Blink

Eine weitere Frage hätte ich noch:

In meinem Case : "File zum Lesen öffnen" weise ich dem zweiten Shift Register am Ausgang den Wert Standard zu, kann mir jemand sagen wie man das schöner lösen kann? .. oder ist das in meinem Fall die einzige Lösung?
bzw mit den Error Codes wärs whs am sinnvollsten ganz links in der While Schleife einen Standard zu definieren und diesen über Shift Register von Iteration zu Iteration mitzuführen? ..

Wäre über Infos echt dankbar!!
Vielen Dank für eure Unterstützung.

Ich benutze Labview 2017.

LG Stefan
Hallo Stefan,

Zitat:sobald alle drinnen stehen können diese ausgelesen werden oder passiert das normal gleichzeitig?
Sobald der erste Wert in der Queue drin steht, kann er am anderen Ende der Queue auch wieder ausgelesen werden.
Sowas passiert üblicherweise parallel…

Zitat:Wie definiert man genau die Größe einer Queue?... ich denke an mein Textfile - die Anzahl der Werte ist doch immer variabel.?
Du kannst der Queue beim Erstellen eine Maximalgröße vorgeben - meist benötigt man dies aber nicht.
Auf einem WindowsPC kann die Queue (quasi) beliebig groß wachsen - bis der Speicher platzt…

Zitat:Hmm vl hat jemand ein paar Tipps wie man zunächst die Queue zum Beispiel mit 1000 Werten befüllt und diese anschließend über einen Button entleert - um Cluster für Cluster einem weiteren Programm zur Verfügung zu stellen..
Einfach diese 1000 Werte in die Queue schreiben.
Und danach dann deinen Consumer starten.
Tipp: Schau dir mal die Producer-Consumer-Schemata an. LabVIEW bringt da schon Beispielprojekte mit!
Momentan befüllst du die Queue (so schnell es nur geht), bis du den STOPP-Button klickst. Und liest langsamer aus, da du noch die Bildschirmausgabe im Consumer drin hast…

Zitat:In meinem Case : "File zum Lesen öffnen" weise ich dem zweiten Shift Register am Ausgang den Wert Standard zu, kann mir jemand sagen wie man das schöner lösen kann? .. oder ist das in meinem Fall die einzige Lösung?
1. Deine States sollten mit einem (typdefinierten) Enum adressiert werden. Strings sind einerseits variabler, aber auch fehleranfälliger.
2. Wichtige Shiftregister NIE auf "default if unwired" setzen, sondern immer durchverdrahten! (Tipp: man kann Tunnel auch verknüpfen, dann übernimmt LabVIEW einen Großteil der Verdrahtungsarbeit!)
3. Cluster (wie deinen G-Code-Platzhalter) immer typdefinieren - und die Elemente mit sinnvollen Labels versehen. Dann (Un)BundleByName verwenden!

Zitat:bzw mit den Error Codes wärs whs am sinnvollsten ganz links in der While Schleife einen Standard zu definieren und diesen über Shift Register von Iteration zu Iteration mitzuführen? ..
??? Weiß nicht, was du da meinst… Hmm
ok! Vielen Dank schon einmal für die Antwort!

Aber eine Frage hätte ich noch zu Queues:

Gibt es die Möglichkeit pro Schleifendurchlauf immer nur ein Element ( ein Cluster ) aus der Queue auszulesen?
Habe mir die Beispiele bereits durchgesehen aber hierfür leider nichts passendes gefunden..

LG Stefan
(29.10.2018 22:45 )stefan1312 schrieb: [ -> ]Aber eine Frage hätte ich noch zu Queues:

Gibt es die Möglichkeit pro Schleifendurchlauf immer nur ein Element ( ein Cluster ) aus der Queue auszulesen?
Nur, wenn du du als Datentyp deiner Queue den Cluster und nicht ein "Array of Cluster" definierst.

Gruß, Jens
(30.10.2018 07:40 )jg schrieb: [ -> ]
(29.10.2018 22:45 )stefan1312 schrieb: [ -> ]Aber eine Frage hätte ich noch zu Queues:

Gibt es die Möglichkeit pro Schleifendurchlauf immer nur ein Element ( ein Cluster ) aus der Queue auszulesen?
Nur, wenn du du als Datentyp deiner Queue den Cluster und nicht ein "Array of Cluster" definierst.

Gruß, Jens

Dequeue Element holt ein Element aus der Queue. Ist das ein Array und du benötigst z.B. nur dessen ersten Wert, könntest du dies rausholen, indizieren/splitten und den Rest des Arrays, falls benötigt, wieder zurückschreiben (enqueue Element).

Zum Thema paralleles Handling von Queues:
Grundsätzlich hat das Dequeue Element einen Timeout Anschluss. Das VI wartet die angehängten Zeit ab, ehe es im Datenfluss weitergeht (vorrausgesetzt es befinden sich keine Elemente in der Queue). Hier ist natürlich Vorsicht geboten. Kein Wert (Standard ist 0) an diesem Anschluss lässt die Queue unendlich lange auf Werte warten. Kommt also nichts mehr, wird dein VI hier stehen bleiben und du hast keine Chance mehr dein VI zu beenden. Hängst du aber eine Zeit an, musst du mindestens prüfen, ob ein Timeout erfolgte oder nicht. Im Falle eines Timeouts spuckt dir der Dequeue Baustein sonst den Standardwert von Obtain Queue aus und das ist eventuell nicht zielführend Blink

Kleine Anmerkung, falls ich hier mit meinem Kommentar am Thema vorbeischieße: Ich konnte dein VI aktuell nicht öffnen, da mir derzeit nur Version 16 zur Verfügung steht. Möglicherweise hast du das also schon auf dem Schirm bzw. berücksichtigt, stefan1312.
Ergänzung: beim timeout ist der Standardwert -1...
(30.10.2018 17:00 )GerdW schrieb: [ -> ]Ergänzung: beim timeout ist der Standardwert -1...

Ja stimmt. Entschuldigt bitte die Fehlinformation meinerseits. Ich war der felsenfesten Ansicht, dass eine 0 das gleiche Verhalten erzeugt. Das ist aber defacto nicht so, wie ich grad im Selbstversuch nochmal getestet habe.
Danke für den Hinweis!
Referenz-URLs