Messwerte aus UM232H (USB) jede ms in TDMS Datei schreiben
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!
RE: Messwerte aus UM232H (USB) jede ms in TDMS Datei schreiben
(08.06.2021 14:56 )BenBaeumker schrieb: Und für so einen Versuch die Abfrage, wie viele Bytes gerade im Buffer liegen, mit in die While-Schleife reinziehen, nicht 1x davor abfragen. Das dürfte nämlich aktuell eine deiner Ursachen sein, wieso deine Datei nur so wenige Datensätze enthält.
Gruß, Jens
Vielen Dank, dieser Tipp hat mich auf die richtige Spur gebracht. Es lagen immer 4080 Bytes zur Abholung bereit, diese wurden dann komplett eingelesen. Mein String hat aber immer nur eine Länge von 61 Bytes. Ich habe nun die abhzuholenden Bytes auf 61 eingestellt und siehe da: Nun läuft die Schleife in 3 Sekunden ca. 3000x durch.
[/quote]
Schon mal in der ersten Antwort vorgeschlagen:
Zitat:liest du wirklich immer genau 1 Datensatz innerhalb deiner While-Schleife ein? Oder enthält dein String "Lesen aka USB" mglw. jeweils viele Datenblöcke?
Aber schön, dass es jetzt läuft.
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!
RE: Messwerte aus UM232H (USB) jede ms in TDMS Datei schreiben
Hallo Ben,
Zitat:Die TDMS Datei erwartet ja dynamische Daten.
Ein klares NEIN!
Verwende nach Möglichkeit KEINE "dynamischen Daten" aka DDT-Drähte oder ExpressVIs…
Zitat:Meine Überlegung war es, die einzelnen Werte zu bündeln und über einen indizierten Kanal aus der Schleife nach jedem Durchlauf raus zu geben. Leider passt das Datei-Format dann nicht mehr. Ich möchte das ganze natürlich auch etwas entkoppeln, damit die Schleifendurchläufe nicht so verlangsamt werden.
Du meinst sicherlich einen "autoindizierenden Tunnel"…
Wenn du die einzelnen Werte vorher "bündelst", dann erzeugst du einen Cluster. Und der wird zu einem Array of Cluster am Schleifenrand. Und das wiederum versteht weder das TDMSWrite, noch das zugehörige ExpressVI!
Zitat:Wie würdet ihr hierzu vorgehen?
Ich würde mir mal die BeispielVIs zu TDMS anschauen und damit lernen, wie man (vernünftig) Daten in TDMS-Dateien speichert…
RE: Messwerte aus UM232H (USB) jede ms in TDMS Datei schreiben
Sooooo ich habe alles hinbekommen und das Programm bereits erweitert. Läuft alles wunderbar soweit. Vielen Dank für eure Unterstützung bis hierhin
Ich habe nun noch ein weiteres Anliegen:
1) Schönheitspunkt: Kann man die aufgenommenen Signale in der TDMS (bzw. im Header) benennen? meine zehn Signale heißen "undefined" bis "undefined_9".
Gibt es da eine Möglichkeit diese mit eigenen Bezeichnungen zu versehen?
RE: Messwerte aus UM232H (USB) jede ms in TDMS Datei schreiben
Hallo Ben,
Zitat:Sooooo ich habe alles hinbekommen und das Programm bereits erweitert. Läuft alles wunderbar soweit.
Schön!
Zitat:Schönheitspunkt: Kann man die aufgenommenen Signale in der TDMS (bzw. im Header) benennen? meine zehn Signale heißen "undefined" bis "undefined_9". Gibt es da eine Möglichkeit diese mit eigenen Bezeichnungen zu versehen?
Ja, man kann den Signalen in TDMS auch Namen geben…
Es wäre vielleicht hilfreich, wenn du uns mal zeigen würdest, wie dein VI momentan aussieht - dann würde man vielleicht auch erkennen, wo du noch nachbessern müsstest!
RE: Messwerte aus UM232H (USB) jede ms in TDMS Datei schreiben
Hier mal mein derzeitiges Ergebnis. Es funktioniert super, bekomme jede ms ein Wertepaket (10 Messwerte aus String) in meine TDMS Datei
So hatte ich dann versucht die Kanalnamen noch einzufügen, hat auch funktioniert - allerdings bekomme ich nun nur noch ein Wertepaket (10 Messwerte) in meine TDMS, egal wie lange ich messe. Quasi nur der "letzte" Wert.
und so sieht es normalerweise dann in der TDMS aus:
und das ist meine TDMS mit Namen:
Ich schätze das Problem ist die Indizierung am Tunnel der While-Schleife... die brauche ich ja, damit meine Werte nach jedem Schleifendurchlauf in die TDMS geschrieben werden.
Wahrscheinlich sehe ich den Wald vor lauter Bäumen nicht mehr
22.07.2021, 15:09 (Dieser Beitrag wurde zuletzt bearbeitet: 22.07.2021 15:12 von GerdW.)
RE: Messwerte aus UM232H (USB) jede ms in TDMS Datei schreiben
Hallo Ben,
Zitat:Wahrscheinlich sehe ich den Wald vor lauter Bäumen nicht mehr
Genau!
Hau doch mal die ganzen Bäume weg, an denen "DDT" oder "ExpressVI" dransteht! Dann wird der Wald viel heller!!!
Zitat:Hier mal mein derzeitiges Ergebnis. Es funktioniert super, bekomme jede ms ein Wertepaket (10 Messwerte aus String) in meine TDMS Datei
Von "Code aufräumen" hälst du nicht viel?
Übersichtlicher Code ist viel besser lesbar…
Zitat:So hatte ich dann versucht die Kanalnamen noch einzufügen, hat auch funktioniert - allerdings bekomme ich nun nur noch ein Wertepaket (10 Messwerte) in meine TDMS, egal wie lange ich messe. Quasi nur der "letzte" Wert.
Das hat was mit den DDT-Drähten zu tun…
Zitat:Ich schätze das Problem ist die Indizierung am Tunnel der While-Schleife... die brauche ich ja, damit meine Werte nach jedem Schleifendurchlauf in die TDMS geschrieben werden.
Wenn du auf DDT-Drähte verzichten würdest, würde so manches einfacher werden…
Warum musst du Waveforms erstellen, die nur exakt ein Sample enthalten?
Warum musst du Waveform per MergeSignals zusammenführen? Warum kein BuildArray?
Warum in jeder Iteration erneut Waveforms erstellen, nur um Namen vergeben zu können?
Wieso überhaupt den Code 10fach duplizieren statt mit einer FOR-Loop zu arbeiten???
Warum Bilder anhängen, wenn du nach Code gefragt wirst?
RE: Messwerte aus UM232H (USB) jede ms in TDMS Datei schreiben
Zitat:Wenn du auf DDT-Drähte verzichten würdest, würde so manches einfacher werden…
Warum musst du Waveforms erstellen, die nur exakt ein Sample enthalten?
Warum musst du Waveform per MergeSignals zusammenführen? Warum kein BuildArray?
Warum in jeder Iteration erneut Waveforms erstellen, nur um Namen vergeben zu können?
Wieso überhaupt den Code 10fach duplizieren statt mit einer FOR-Loop zu arbeiten???
Warum Bilder anhängen, wenn du nach Code gefragt wirst?
Wie würde das Verzichten auf DDT Drähte denn aussehen? Ich hab mich da etwas an dem bisherigen Programm orientiert - bei dem über DAQmx ausgelesen wurde, da kamen auch immer Dynamische Daten raus
Waveforms hatte ich aus einem Beispiel von google, das seh für mich am verständlichsten aus...
Signale zusammenführen hab ich bereits beides versucht, sowohl MergeSignals als auch Bündeln.
Wie würde das ganze mit einer For-Loop aussehen? Und wie kann ich den Code sinnvoll verschlanken?
Anbei das Programm
23.07.2021, 08:49 (Dieser Beitrag wurde zuletzt bearbeitet: 23.07.2021 08:52 von GerdW.)
RE: Messwerte aus UM232H (USB) jede ms in TDMS Datei schreiben
Hallo Ben,
Zitat:Waveforms hatte ich aus einem Beispiel von google, das seh für mich am verständlichsten aus...
Signale zusammenführen hab ich bereits beides versucht, sowohl MergeSignals als auch Bündeln.
Wie würde das ganze mit einer For-Loop aussehen? Und wie kann ich den Code sinnvoll verschlanken?
So z.B.:
Zitat:Wie würde das Verzichten auf DDT Drähte denn aussehen? Ich hab mich da etwas an dem bisherigen Programm orientiert - bei dem über DAQmx ausgelesen wurde, da kamen auch immer Dynamische Daten raus
Wo werden im "bisherigen" Programm denn DDT-Drähte verwendet? Das ist doch nur eine riesige Sequenz, in der mit einem FTDI-Konverter kommuniziert wird!?
Und ich kenne keine einzige DAQmx-Funktion, die mit DDT-Drähten arbeitet! (Der DAQAssistent ist ein "nur" ExpressVI, das wiederum auf DAQmx-Funktionen zurückgreift…)
RE: Messwerte aus UM232H (USB) jede ms in TDMS Datei schreiben
Vielen Dank @GerdW das hilft mir schon einmal sehr weiter. Ich habe gerade auch das ExpressVI für die TDMS durch TDMS Öffnen/Schreiben/Schließen ersetzt. Das funktioniert bereits, jetzt setze ich den Vorschlag mit der For-loop noch um.
Ich habe noch drei allgemeine Fragen :
1) Ich möchte eine Live-Ansicht meiner Messwerte in Graphen (für jeden Messwert ein Graph) darstellen. Ist es sinnvoll den Graphen in der While-Schleife anzubinden oder eher außerhalb? Stichwort Verarbeitungszeit...
2) Würdest du das Schreiben in die TDMS datei innerhalb der Schleife oder Außerhalb ansetzen?
3) Mein String enthält keinen "Zeitstempel". Ich würde in der TDMS jedoch gerne einen Zeitstempel für jedes Wertepaket einfügen. Aktuell ist quasi meine Anzahl an Schleifendurchläufe meine Zeitskala. Ich habe jedoch bedenken, dass bei hoher Systemauslastung Verzögerungen meine Messung verfälschen, den Schleifendurchlauf verlängern und hätte deshalb gerne einen "richtigen" Zeitwert zum Zuordnen in der TDMS
Wie gehe ich hier am besten und vor allem Resourcen sparend vor? Ich arbeite ja im ms-Bereich, sprich jede ms ein Wertepaket.
RE: Messwerte aus UM232H (USB) jede ms in TDMS Datei schreiben
Hallo Ben,
Zitat:Ich möchte eine Live-Ansicht meiner Messwerte in Graphen (für jeden Messwert ein Graph) darstellen. Ist es sinnvoll den Graphen in der While-Schleife anzubinden oder eher außerhalb? Stichwort Verarbeitungszeit...
Jeder zusätzliche Indicator benötigt Rechenzeit. Und Anzeigen für größere Datenmengen brauchen noch mehr Zeit…
Du willst sicherlich mit Charts statt Graphen arbeiten, so wie bisher!? (Da ist ein Unterschied: LabVIEW-Basics!)
Zitat:Würdest du das Schreiben in die TDMS datei innerhalb der Schleife oder Außerhalb ansetzen?
Wenn die Schleife zum Lesen der Daten von der seriellen Schnittstelle zeitkritisch ist, würde ich in dieser Schleife keine Dateioperationen vornehmen!
Ich empfehle dir (dringend), einen Blick auf das Producer-Consumer-Schema zu werfen. LabVIEW bringt da Beispiele mit…
Zitat:Mein String enthält keinen "Zeitstempel". Ich würde in der TDMS jedoch gerne einen Zeitstempel für jedes Wertepaket einfügen. Aktuell ist quasi meine Anzahl an Schleifendurchläufe meine Zeitskala. Ich habe jedoch bedenken, dass bei hoher Systemauslastung Verzögerungen meine Messung verfälschen, den Schleifendurchlauf verlängern und hätte deshalb gerne einen "richtigen" Zeitwert zum Zuordnen in der TDMS Wie gehe ich hier am besten und vor allem Resourcen sparend vor? Ich arbeite ja im ms-Bereich, sprich jede ms ein Wertepaket.
Vorschläge:
- Lass dir von deiner Datenquelle einen Zeitstempel mitschicken. (Und wenn du dabei bist, auch gleich den gesendeten String anders formatieren: das hatten wir vor Wochen schon besprochen…)
- Lese den String vom seriellen Port und packe ihn mit einem Timestamp in einen Cluster (Producer-Loop). Den schickst du dann per Queue zu deinem Consumer, der den Cluster ausliest, den String auswertet und und die Daten in einer Datei speichert. (Evtl. noch Daten von dort dann in einen zweiten Consumer weiterleiten, der sich um die Anzeige auf dem UI kümmert…)