LabVIEWForum.de - Queued State Machine mit 3 While Schleifen

LabVIEWForum.de

Normale Version: Queued State Machine mit 3 While Schleifen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo Zusammen,

ich probiere mich gerade daran, eine Queued State Machine auf eine dritte While Schleife auf zu bohren. Hintergrund ist, ich nehme Messdaten via CAN-Bus auf. Nach X Messdatenaufnahmen speichere ich die Daten zyklisch in einer .txt-Datei ab (bzw. hänge die Daten an eine bestehende Datei an). Die Datenaufnahme + die Abspeicherung passiert gerade in ein und der gleichen While Schleife der Queued State Machine. Dies möchte ich nun entkoppeln. Dazu habe ich versucht das NI-Beispiel zu erweitern. Leider komme ich damit gerade nicht klar. Mein Ziel ist, dass die "Message Handling Loop 1" eine TRUE/FALSE-Variable auf True setzt, damit in der "Event Handling Loop" ein Event auslöst und eine Message auf die 2. Queue setzt. Die Daten befinden sich in der "Message Handling Loop 1" und sollen dann in die "Message Handling Loop 2" übertragen werden. Im Moment möchte ich aber erst einmal die Kommunikation zwischen diesen 3 While Schleifen aufbauen. Anbei habe ich meinen Versuch hochgeladen. Kann mir jemand sagen ob das überhaupt so gemacht wird, bzw. was ich ändern muss um dieses Konstrukt zum Laufen zu bekommen?

(Version LV2014)

VG!
Hallo Zusammen,

ich bin jetzt einen anderen Weg gegangen und versuche die Daten mit einer neue Queue an die 3. While Schleife zu versenden (siehe Screenshot). Ich habe mich an das Beispiel "simple queue.vi"gehalten. Ich bekomme die Daten aber nicht von der mittleren Schleife in die untere Schleife. Jemand eine Idee? Blink

(Aufgeräumt wird später Smile )
Ich tippe darauf, dass die erste Queue immer auf ein Element wartet, und die damit die dritte Schleife blockiert.
Sprich, so kann ich das nicht machen?
Ich habe auch schon versucht die erste Queue zu erweitern, dann bekomme ich ständig Fehlermeldung weil ich natürlich in der dritten Schleife andere Cases habe als in der zweiten Schleife. So ist das Minimalbeispiel aufgebaut das ich angehängt habe. Dafür habe ich auch noch keine Lösung.
Falls die erste Queue nur dafür da ist, die Schleife zu beenden, dann kannst du sie komplett weglassen (so sieht es zumindest aus). Die Schleife wird auch dann beendet, wenn du die anderen Queues auflöst und die Fehlerschnur mit dem Bedingungsanschluss verbunden bleibt.
(28.04.2016 09:01 )andrepf schrieb: [ -> ]Sprich, so kann ich das nicht machen?
Leider muss ich zuerst sagen: Irgendwie hat mich das VI aus dem ersten Posting optisch nicht so angesprochen, dass ich gleich hätte weiterkucken wollte. Daher nur folgende allgemeine Frage:

Hast du das so programmiert, dass nur einer(!) die Queue ausließt?

In die Queue schreiben können viele, aus der Queue lesen (samt entfernen) kann logischerweise aber nur einer. (Im Gegensatz zu einem Melder: da sollte nur einer reinschreiben, weil beim Reinschreiben überschrieben wird; Lesen können dann viele, weil beim Lesen nicht gelöscht wird.)
Dein VI sieht etwas chaotisch aus.
Du hast jede Menge sinnlose nicht Verwendetes. Damit machst Du die VI total unübersichtlich.
Z.B. an der oberen While Schleife ist links unten ein Queue die ins leere läuft.
Konstante ohne Leitung.
Leitungen übereinander gelegt.

Wenn Du erst mal alle Teile die keinen Sinn ergeben entfernst. Dann mal die "Strg U" Kombination benützt.

Dann findet man auch die Zusammenhänge besser.
Beim Aufräumen sieht man oft die Fehler, die man sich eingebaut hat.
Gruß
Freddy
Hallo Zusammen,
ich weiß, aber wenn man gerade noch so viel ändert wie ich lässt man die Aufräumerei gerne mal einmal liegen. Mein Datenlogger funktioniert jetzt einwandfrei und ich mache mich daran das VI zu strukturieren.

Vielen Dank!
Auswertung der eingegangenen antworten:
Ja, da das ganze Projekt im Wesentlichen aus sinnlosen leeren Strukturen besteht, könnte man sogar alles weglassen, nicht nur, wie vorgeschlagen, eine Schleife. Big Grin Der Witz das Programms ist aber doch, dass Programminhalte später noch reinkommen sollen.
Und ja, man kann das Programm einfacher durch Zerstörung der Queues beenden, was auswertbare Fehlermeldungen in den parallelen Scheifen verursacht, wodurch diese sich dann auch beenden lassen. Der Nachteil ist (das vermute ich), dass man sich damit den Wege für eine profesionelle Fehlerbehandlung im gesamten Projektes verbaut. So umständlich das Beenden hier erscheint, es ist die professionellere Methode.

Das Programm enthält drei Fehler, und die lassen sich doch ganz einfach finden und ausmerzen. Warum also nicht die Hilfe hier ansetzen?
1. Als Meldungen git es "Initialize" und "Initialize Panel". Behandelt wird aber nur "Initialize Panel"
Lösung: Initialize Panel im Main immer durch Initialize ersetzen
2. Die Exit-Meldung im Ereigniscase "Exit" muß an beide untere Schleifen gesendet werden, nicht nur an eine.
[attachment=55771]
3. Die Meldung "Update Display" in der dritten Scheife muß natürlich an die zweite Schleife gesendet werden, und nicht an sich selbt
[attachment=55772]
Fall ich noch was vergessen habe, hier das geänderte Main.vi:
[attachment=55775]
Referenz-URLs