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!
ich versuche mich erst seit kurzem an LabVIEW und möchte gerne ein VI zu programmieren, welches Messwerte über DAQ einlesen kann, Fehler erkennt und entsprechende Ausgangsbefehle an externe Schaltgeräte sendet.
Soweit funktioniert auch alles wie es soll, nur möchte ich jetzt gerne in 2 Schleifen parallel die Messwerte auswerten lassen (z.B. in einer Schleife die der Geräte 1-4 und in der zweiten für die Geräte 5-8).
Ich bin hier schon auf den Ansatz der QSM gestoßen, habe mich aber aufgrund der "mehrere Quellen, eine Senke"-Problematik gegen Queues und für Melder entschieden.
Um meinen Ansatz zu verdeutlichen, habe ich mal ein Bild des VI angehängt.
Nun zu meinen Fragen:
1. Grundlegend: Sind Melder überhaupt für diese Anwendung geeignet?
2. Können Messwerte verloren gehen, ohne in den Schleifen ausgelesen worden zu sein, da diese zu schnell überschrieben werden?
3. Da die Schleifen nur im Fehlerfall stoppen, wird der Melder im Normalfall nicht freigegeben. Kommt es dadurch zum Überlaufen des Speichers? Falls ja, wie müsste ich die Sache angehen?
4. Ist es möglich, die Schleifendurchläufe zu synchronisieren, sodass eine Schleife nicht schon weitere Messwerte bearbeitet, während die andere noch mit älteren zu tun hat?
5. Ist die die globale Variable "Ausgänge" geeignet zur Übermittlung der Schaltbefehle?
Das ist nun ziemlich viel auf einmal aber ich hoffe, ihr könnt mir bei dem einen oder anderen Punkt helfen!
Viele Grüße,
Lars
21.04.2016, 13:03 (Dieser Beitrag wurde zuletzt bearbeitet: 21.04.2016 13:04 von GerdW.)
dein Konzept hat einen Pferdefuss, und der heißt "Race Condition"!
Du setzt in zwei parallelen Schleifen die globale Variable "Ausgänge" und liest diese in einer weiteren Schleife. Leider weißt du nie, welchen der beiden gesetzten Werte du liest!
Zitat:nur möchte ich jetzt gerne in 2 Schleifen parallel die Messwerte auswerten lassen (z.B. in einer Schleife die der Geräte 1-4 und in der zweiten für die Geräte 5-8).
Dann verteile deine Messwerte eben auf 2 Queues: "Gerät 1-4" für die erste Consumer-Loop und "Gerät 5-8" für die zweite!
Und Richtung Hardware-Ausgabe dann zwei Melder, die jeweils andere Schalter/Ausgabekanäle vorgeben…
1. Jein. (s.o.)
2. Vermeidet man mit Queues.
3. Vermeidet man mit TimeOuts.
4. Vermeidet man mit Queues.
5. Nein. (s.o.)
(21.04.2016 12:27 )Umpalumpa schrieb: Nun zu meinen Fragen:
1. Grundlegend: Sind Melder überhaupt für diese Anwendung geeignet?
Das hängt davon ab...
(21.04.2016 12:27 )Umpalumpa schrieb: 2. Können Messwerte verloren gehen, ohne in den Schleifen ausgelesen worden zu sein, da diese zu schnell überschrieben werden?
Ja, bzw. es könnte sein, dass bestimmte Messwerte nicht verarbeitet werden. Ob dir das Probleme macht, das musst du entscheiden.
(21.04.2016 12:27 )Umpalumpa schrieb: 3. Da die Schleifen nur im Fehlerfall stoppen, wird der Melder im Normalfall nicht freigegeben. Kommt es dadurch zum Überlaufen des Speichers? Falls ja, wie müsste ich die Sache angehen?
Sieht auf den ersten Blick in deinem Bsp nicht so aus.
(21.04.2016 12:27 )Umpalumpa schrieb: 4. Ist es möglich, die Schleifendurchläufe zu synchronisieren, sodass eine Schleife nicht schon weitere Messwerte bearbeitet, während die andere noch mit älteren zu tun hat?
Möglich ist viel. Im einfachsten Fall verzichtest du auf die parallelen Schleifen
(21.04.2016 12:27 )Umpalumpa schrieb: 5. Ist die die globale Variable "Ausgänge" geeignet zur Übermittlung der Schaltbefehle?
Definitiv NEIN, Sichwort Race-Condition. Du setzt von 2 Schleifen dasselbe globale Array, überschreibst also dauernd gegenseitig Werte aus der jeweils anderen Schleife.
Gruß, Jens
EDIT: Wieder mal 2 Stühle, 1 Meinung.
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!
Okay, ich schließe daraus, dass ich eher nicht den Umweg über Melder gehen sondern eher mit 2 Queues arbeiten sollte, da mir die Vollständigkeit der Verarbeitung am Herzen liegt.
Da ich die Kanalzuweisung jedoch nicht von vornherein festlegen möchte und diese über das Frontpanel geändert werden können soll, muss ich den komplette Datensatz an beide Queues übergeben, sodass sich die jeweiligen Schleifen "ihre" Werte raussuchen können.
Wird sich das Programm deutlich verlangsamen, wenn ich 2 Queues mit allen Messwerten laufen lasse?
Das Problem der Race-Condition mit einer globalen Variable leuchtet ein!
Viele Grüße,
Lars
21.04.2016, 14:25 (Dieser Beitrag wurde zuletzt bearbeitet: 21.04.2016 14:35 von Lucki.)
(21.04.2016 12:27 )Umpalumpa schrieb: Ich bin hier schon auf den Ansatz der QSM gestoßen, habe mich aber aufgrund der "mehrere Quellen, eine Senke"-Problematik gegen Queues und für Melder entschieden.
Hier liegts Du definitiv falsch. Ein Queue kann viele Qellen haben, aber nur eine Senke. Also sind Queues hier genau richtig.
Die Senke sollte allerdings wissen sollen, aus welcher Quelle die Daten kommen. Deshalb sollte das Datenformat der Queue ein Cluster sein, bestehend aus Absenderadresse (Enum) und Daten. Und falls, wie meistens, die Daten aus den unterschiedlichen Quellen unterschiedliches Format haben, dann sollte das Datenformat ein Variant sein.
Und versuche Dich nicht mit mehreren Queues. Mit einer einzigen Queue, betehend aus einem Cluster mit Enum und Variant, wirst Du glücklich werden. Alles andere ist Mumpitz.
(21.04.2016 14:25 )Lucki schrieb: Hier liegts Du definitiv falsch. Ein Queue kann viele Qellen haben, aber nur eine Senke. Also sind Queues hier genau richtig.
Das war es ja, was ich meinte. Ich habe zwar nur eine Quelle (auch wenn mehrere funktionieren würden), kann aber nur eine Senke bedienen mit einer Queue. Aber ich möchte ja 2 While-Schleifen, also 2 Senken bedienen.
21.04.2016, 16:17 (Dieser Beitrag wurde zuletzt bearbeitet: 22.04.2016 16:12 von Lucki.)