LabVIEWForum.de
DAQ: Paralleler, nicht gleichzeitiger Zugriff erzeugt Datenlücken - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: Datenerfassung (DAQ) (/Forum-Datenerfassung-DAQ)
+---- Thema: DAQ: Paralleler, nicht gleichzeitiger Zugriff erzeugt Datenlücken (/Thread-DAQ-Paralleler-nicht-gleichzeitiger-Zugriff-erzeugt-Datenluecken)



DAQ: Paralleler, nicht gleichzeitiger Zugriff erzeugt Datenlücken - moTo - 24.04.2016 12:32

Hallo zusammen,
dies ist mein erster Post hier, schön hier zu sein Smile

Ich bin Student an einer Uni und erstelle gerade mit LabVIEW eine automatische Messdatenerfassung für ein Labor. Ich habe mich erst vor ca. einem Monat angefangen mit LabVIEW zu beschäftigen, daher bitte ich um Nachsicht wenn das eine oder andere bei mir noch nicht 100%ig klar ist :-)

Ich habe folgendes VI:
Ich habe eine Benutzeroberfläche, die dem User 3 Einstellmöglichkeiten für die Messdatenerfassung liefert: Zeitschritt (Intervall) der Datenaufzeichnung in Sekunden, Anzahl an Messungen bis Stop und Dauer der Messung in Sekunden sowie ein Start/Stop Button für die Messung.

Sobald die Messung gestartet wird, läuft eine Schleife los mit einer Wait Funktion für das Messintervall (die Wait Funktion ist in 100ms Abschnitte aufgeteilt, damit man auch bei Messintervallen von 5 Min jederzeit abbrechen kann).

Während dieser Schleife wird eben im gewählten Messintervall ein einziger Messwert aus dem DAQ rausgegeben.

Parallel dazu möchte ich noch eine ,,Live Ansicht'' einbinden, die dem User in Echtzeit die Messwerte rausgibt. Sobald ich aber 2 Express VI's zu demselben DAQ zuweise, bekomme ich Datenlücken in meiner Aufzeichnung, auch wenn die Anfragen an den DAQ nicht gleichzeitig ablaufen.

Mache ich irgendwas falsch bzw. gibt es dazu eine intelligente Lösung?
Der Screenshot zeigt das Block Diagramm im funktionierenden Zustand. Nun würde ich gerne eben ein zweites DAQ Express VI hinzufügen, dass die Werte in Echtzeit an einen Chart rausschreibt. Geht sowas?
Meine LabView Version ist 2015 und das DAQ ist ein USB-6001.


RE: DAQ: Paralleler, nicht gleichzeitiger Zugriff erzeugt Datenlücken - GerdW - 24.04.2016 16:43

Hallo moTo,

herzlich willkommen im Forum!

Zu deiner Frage: THINK DATAFLOW!

Zitat:Nun würde ich gerne eben ein zweites DAQ Express VI hinzufügen, dass die Werte in Echtzeit an einen Chart rausschreibt. Geht sowas?
Wenn beide DAQAssi auf die gleichen Kanäle zugreifen sollen: Nein!
Wozu aber überhaupt ein zweiter DAQ-Assi? Warum nicht einfach einen Chart an den Ausgang des ersten anschließen? Hmm

Wie schon gesagt: THINK DATAFLOW!
Dein DAQ-Assi ist eine Datenquelle, aus der Messdaten heraus kommen. Diese Daten kannst du nun weiterleiten - und eben auch verzweigen (aka: eine Datenkopie anlegen) und auf zwei Datensenken (wie z.B. Chart und Dateischreiben) verteilen!

Tipps:
- Bilder deines Blockdiagramms sind nett, Snippets oder gar VIs wären besser: Bilder lassen sich so schlecht debuggen…
- Vergleiche von boolschen Werte mit boolschen Konstanten sind immer Rube-Goldberg! Ein "bool == FALSE" ist eben ein NOT(bool), die diversen Select-Nodes lassen sich auch durch boolsche Operationen erschlagen…
- In deiner Wait-Schleife hast du einmal eine Wait-Funktion und direkt daneben die CurrentTime-Funktion. Ist dir schon mal aufgefallen (bzw. hast du die Kontexthilfe gelesen?), dass die Wait-Funktion den exakt gleichen Timestamp ausgibt wie die andere Funktion und du deshalb unnötig viel Aufwand programmiert hast?
- Rechenoperationen, die sich innerhalb einer Schleife nicht mehr ändern, sollte man vor der Schleife erledigen…
- einiges mehr, aber Bilder lassen sich eben so schlecht debuggen und editieren…


RE: DAQ: Paralleler, nicht gleichzeitiger Zugriff erzeugt Datenlücken - moTo - 24.04.2016 17:15

Hallo Gerd,

herzlichen Dank für deine Rückmeldung!
Anbei meine Antwort(en):

Wozu aber überhaupt ein zweiter DAQ-Assi? Warum nicht einfach einen Chart an den Ausgang des ersten anschließen? Hmm
Das Problem ist, dass ich im Prinzip zwei Vorgänge gleichzeitig mit unterschiedlichen Intervallen ausführen möchte. Die Datenaufzeichnung alle x Sekunden die vom Nutzer vorgegeben wird und dazu eine Live Datenanzeige die zB alle 10ms ,,feuert''.

Kurz mein Gedankengang dazu:
Die Schleife startet, der DAQ gibt einen Wert raus und dann startet die While Schleife mit der Wait(MS)-Funktion, die so lange warten soll, bis die vom Nutzer vorgegebene Intervallzeit rum ist oder bis eben der Stop Button gedrückt wird oder die Maximale Messzeit in Sekunden erreicht ist. Hier fällt es mir nun schwer, einen einzigen DAQ Express VI zu verwenden und gleichzeitig die Wait Funktion aufrecht zu erhalten.
Den Wert einfach zusätzlich in einen Chart schreiben geht ja, aber dann eben nur in demselben Intervall wie auch die Messwerte rausgeschrieben werden. Verstehst du mein Problem?
Ist leider schriftlich sehr schwer zu beschreiben...

zu deinen Tipps:
Tipps:
- Bilder deines Blockdiagramms sind nett, Snippets oder gar VIs wären besser: Bilder lassen sich so schlecht debuggen…
Das hatte ich auch ursprünglich vor, aber ich wusste nicht genau wie ich den relevanten Teil rausziehen konnte ohne wieder ein komplett neues vi zu schreiben, was ist hier das beste Vorgehen?

- Vergleiche von boolschen Werte mit boolschen Konstanten sind immer Rube-Goldberg! Ein "bool == FALSE" ist eben ein NOT(bool), die diversen Select-Nodes lassen sich auch durch boolsche Operationen erschlagen…
Da hast du völlig recht Smile Ich hatte die ,,Not'' - Funktion am Anfang nicht gefunden und daher diesen Umweg eingeschlagen, das muss ich jetzt noch in meinem gesamten VI abändern..

- In deiner Wait-Schleife hast du einmal eine Wait-Funktion und direkt daneben die CurrentTime-Funktion. Ist dir schon mal aufgefallen (bzw. hast du die Kontexthilfe gelesen?), dass die Wait-Funktion den exakt gleichen Timestamp ausgibt wie die andere Funktion und du deshalb unnötig viel Aufwand programmiert hast?
Auch hier, vielen Dank, das hatte ich tatsächlich noch nicht bemerkt. Werde ich ebenfalls ändern.

- Rechenoperationen, die sich innerhalb einer Schleife nicht mehr ändern, sollte man vor der Schleife erledigen…
Werde ich verstärkt drauf achten, welche Operationen meinst du genau? Bei vielen ist es ja leider nicht möglich die rauszuziehen..

- einiges mehr, aber Bilder lassen sich eben so schlecht debuggen und editieren…
Siehe Tipp 1 Smile


RE: DAQ: Paralleler, nicht gleichzeitiger Zugriff erzeugt Datenlücken - GerdW - 24.04.2016 17:43

Hallo moTo,

Zitat:Das Problem ist, dass ich im Prinzip zwei Vorgänge gleichzeitig mit unterschiedlichen Intervallen ausführen möchte. Die Datenaufzeichnung alle x Sekunden die vom Nutzer vorgegeben wird und dazu eine Live Datenanzeige die zB alle 10ms ,,feuert''.
Datenanzeige mit 100Hz ist Overkill, du kannst nur mit ~10Hz gucken…
Trotzdem hast du nur eine Datenquelle, deren Daten du auf zwei Senken verteilen musst. Im einfachsten Fall reicht dir eine Case-Struktur: je Iteration die Daten anzeigen, aber nur jede 5. Iteration auch speichern. Ansonsten helfen einem Queues, Daten von einer Schleife in eine andere zu schicken! (Stichwort: Producer-Consumer-Schema)

Zitat:Kurz mein Gedankengang dazu: Die Schleife startet, der DAQ gibt einen Wert raus und dann startet die While Schleife mit der Wait(MS)-Funktion, die so lange warten soll, bis die vom Nutzer vorgegebene Intervallzeit rum ist oder bis eben der Stop Button gedrückt wird oder die Maximale Messzeit in Sekunden erreicht ist.
Das ist "nett" gedacht, aber (IMHO) nicht schlüssig: während deine Warteschleife aktiv ist, werden weder neue Messdaten gelesen noch irgendwas gespeichert oder angezeigt. Deine äußere Schleife wartet, bis die innere Warteschleife fertig ist!
Je nachdem, wie der DAQ-Assi konfiguriert ist, führt diese Vorgehensweise nur zu Fehlermeldungen…

Zitat:aber ich wusste nicht genau wie ich den relevanten Teil rausziehen konnte ohne wieder ein komplett neues vi zu schreiben, was ist hier das beste Vorgehen?
Snippets! (Wenn ich bestimmte Wörter benutze, wie Snippet, Queue, etc., dann kann man diese in der LabVIEW-Hilfe nachschlagen oder googeln…)

Zitat:welche Operationen meinst du genau?
Zum Beispiel das "Umrechnen in Zehntelsekunden" links oben: der Rechenwert ändert sich in der Schleife nie, da die Ausgangsdaten innerhalb der Schleife konstant sind. Also kann die Rechenoperation einmal vor der Schleife durchgeführt werden!
Ebenso:
- Vergleich mit "-1" links unten
- zweiter Vergleich mit "-1" im linken unteren Quadranten
- Umrechnung nach U32 in der Warteschleife
- das Beschreiben von "LED Measurement running" mittels PropertyNode mittig unten und der TRUE-Konstanten

Außerdem sollten deine While-Loops eigentlich FOR-Loops sein, da sie jeweils mit einer maximalen Anzahl Iterationen laufen! Dann kannst du dir jeweils einen Vergleich in der Schleife sparen.
Einfach bei FOR-Loops die Abbruchbedingung anzeigen lassen…


RE: DAQ: Paralleler, nicht gleichzeitiger Zugriff erzeugt Datenlücken - moTo - 24.04.2016 18:39

Hallo GerdW,

nochmal danke für deine Geduld und die Infos.

Zitat:Datenanzeige mit 100Hz ist Overkill, du kannst nur mit ~10Hz gucken…
Trotzdem hast du nur eine Datenquelle, deren Daten du auf zwei Senken verteilen musst. Im einfachsten Fall reicht dir eine Case-Struktur: je Iteration die Daten anzeigen, aber nur jede 5. Iteration auch speichern. Ansonsten helfen einem Queues, Daten von einer Schleife in eine andere zu schicken! (Stichwort: Producer-Consumer-Schema)
Mit Queues habe ich noch gar keine Erfahrungen gemacht, aber ich werde wahrscheinlich nicht drum herum kommen (wobei die Sache mit der Case Struktur auch funktionieren sollte..).

Zitat:Kurz mein Gedankengang dazu: Die Schleife startet, der DAQ gibt einen Wert raus und dann startet die While Schleife mit der Wait(MS)-Funktion, die so lange warten soll, bis die vom Nutzer vorgegebene Intervallzeit rum ist oder bis eben der Stop Button gedrückt wird oder die Maximale Messzeit in Sekunden erreicht ist.
Das ist "nett" gedacht, aber (IMHO) nicht schlüssig: während deine Warteschleife aktiv ist, werden weder neue Messdaten gelesen noch irgendwas gespeichert oder angezeigt. Deine äußere Schleife wartet, bis die innere Warteschleife fertig ist!
Je nachdem, wie der DAQ-Assi konfiguriert ist, führt diese Vorgehensweise nur zu Fehlermeldungen…
Aber das ist ja auch genau das was ich ursprünglich wollte. In dieser Zeit soll ja eigentlich auch nichts passieren. Jetzt kommt eben noch die Sache mit der Live Ansicht dazu..


Zitat:aber ich wusste nicht genau wie ich den relevanten Teil rausziehen konnte ohne wieder ein komplett neues vi zu schreiben, was ist hier das beste Vorgehen?
Snippets! (Wenn ich bestimmte Wörter benutze, wie Snippet, Queue, etc., dann kann man diese in der LabVIEW-Hilfe nachschlagen oder googeln…)
Erledigt und angehängt

Zitat:Zum Beispiel das "Umrechnen in Zehntelsekunden" links oben: der Rechenwert ändert sich in der Schleife nie, da die Ausgangsdaten innerhalb der Schleife konstant sind. Also kann die Rechenoperation einmal vor der Schleife durchgeführt werden!
Ebenso:
- Vergleich mit "-1" links unten
- zweiter Vergleich mit "-1" im linken unteren Quadranten
- Umrechnung nach U32 in der Warteschleife
- das Beschreiben von "LED Measurement running" mittels PropertyNode mittig unten und der TRUE-Konstanten
Habe ich alles erledigt, danke dafür!

Zitat:Außerdem sollten deine While-Loops eigentlich FOR-Loops sein, da sie jeweils mit einer maximalen Anzahl Iterationen laufen! Dann kannst du dir jeweils einen Vergleich in der Schleife sparen.
Einfach bei FOR-Loops die Abbruchbedingung anzeigen lassen…
Was heißt in diesem Fall Abbruchbedingung anzeigen lassen?


RE: DAQ: Paralleler, nicht gleichzeitiger Zugriff erzeugt Datenlücken - GerdW - 25.04.2016 17:47

Hallo moto,

Zitat:Mit Queues habe ich noch gar keine Erfahrungen gemacht, aber ich werde wahrscheinlich nicht drum herum kommen
Ja.

Zitat:In dieser Zeit soll ja eigentlich auch nichts passieren. Jetzt kommt eben noch die Sache mit der Live Ansicht dazu..
Ja was denn nun? "Nichts machen" oder doch "Messwerte abfragen"? Hmm

Zitat:Was heißt in diesem Fall Abbruchbedingung anzeigen lassen?
Die LabVIEW-Hilfe zur FOR-Loop lesen und dann deren Abbruchbedingung per Rechtsklick sichtbar machen…


RE: DAQ: Paralleler, nicht gleichzeitiger Zugriff erzeugt Datenlücken - moTo - 25.04.2016 19:27

Hallo GerdW,

Zitat:
In dieser Zeit soll ja eigentlich auch nichts passieren. Jetzt kommt eben noch die Sache mit der Live Ansicht dazu..
Zitat:Ja was denn nun? "Nichts machen" oder doch "Messwerte abfragen"? Hmm
Das bezog sich auf vorher, da brauchte ich die Live Ansicht noch nicht Smile Aber ich werde mir das mit den Queues mal anschauen...

Zitat:Was heißt in diesem Fall Abbruchbedingung anzeigen lassen? Die LabVIEW-Hilfe zur FOR-Loop lesen und dann deren Abbruchbedingung per Rechtsklick sichtbar machen…
Ah das kannte ich noch nicht, danke!