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!
18.11.2013, 14:42 (Dieser Beitrag wurde zuletzt bearbeitet: 18.11.2013 14:56 von che-salih.)
wie oben kurz geschrieben, möchte ich mit meine Daten die ich auslese auswerten. Dabei möchte ich in erster Linie die Zeitdifferenz von mehreren Messungen ermitteln. Es dient einer Laufveranstaltungmessung mit Rundenzeiten. Kleines Beispiel wie meine Daten vorliegen:
Die Daten befinden sich jeweils in einem 1D Array. Die Reihenfolge der ID`s kann nach der 1. Messung sich willkürlich ändern. Je nach welcher Transponder erkannt wird. Es werden n Messungen durchgeführt, abhängig vom Rundenzahl. An der Stelle möchte ich jetzt die Zeiten des jeweiligen Transponders miteinander verrechnen. Das heißt, ich möchte die Zeit des 2. Messung von der des 1. Messung abziehen. Und danach die Zeit des 3. Messung von der des 1. Messung abziehen usw. Damit habe ich immer die Rundenzeit/Gesamtlaufzeit eines Läufers.
Ich komme leider nicht dadrauf, wie ich das lösen kann. Im Anhang noch mein Unterprogramm, wo sich die Daten befinden.
Wenn man einen neuen Thread anfängt, ist es ungünstig, auf etwas "weiter oben" zu verweisen...
Zitat:Im Anhang noch mein Unterprogramm, wo sich die Daten befinden.
In diesem VI gibt es eine TCP-Leseroutine und eine TDMS-Schreibroutine - aber keine (Beispiel-)Daten!
Also gibt es eine allgemeine Antwort:
- Du musst die Daten jeweils eines Transponders zusammensammeln und kannst dann die gesammelten Daten bequem auswerten (z.B. durch Berechnen der Differenzen von Arrayelementen)...
- Um Die Daten zu sortieren, bietet sich ein Array of Cluster(TransponderID, Timestamp, Value(s)) an. Dieses befüllen, sortieren lassen und nach TransponderID auftrennen. (Fast) fertig!
Ich hab eine Messung gemacht. So sehen die Daten aus.
Also Transponder ID´s kann ich mit String suchen extrahieren oder? Mir fällt es aber schwer, die zugehörigen Zeiten zusammenzuführen.
Gruß
Che
Meine Beispiel Daten sind fehlerhaft. Ein Moment bitte
Ich kann die Daten leider nicht als 1 zu 1 in dem Programm wiedergeben. Man kann nur ein Wert als Standard einstellen. Die ID Nummern sind immer verschieden. Die letzten beiden Ziffern ändern sich immer. Die Zeiten ebenso. immer aufsteigend.
(18.11.2013 14:57 )GerdW schrieb: Also gibt es eine allgemeine Antwort:
- Du musst die Daten jeweils eines Transponders zusammensammeln und kannst dann die gesammelten Daten bequem auswerten (z.B. durch Berechnen der Differenzen von Arrayelementen)...
- Um Die Daten zu sortieren, bietet sich ein Array of Cluster(TransponderID, Timestamp, Value(s)) an. Dieses befüllen, sortieren lassen und nach TransponderID auftrennen. (Fast) fertig!
Wie kann ich mein Cluster dann nach TransponderID auftrennen? Welcher Funktion ist da nützlich? Also mein Cluster steht und ist aufsteigend sortiert mit 1D Array sortieren.
es wäre schön, wenn du ein VI anhängen würdest, wo alle Array-Inputs "schöne" Werte anzeigen. Es gibt da einen passenden Punkt im Edit-Menü von LabVIEW...
Zitat:Wie kann ich mein Cluster dann nach TransponderID auftrennen?
(18.11.2013 15:31 )che-salih schrieb: Man kann nur ein Wert als Standard einstellen.
Wer sagt denn so was, stimmt überhaupt nicht! Außerdem hast Du ja nicht mal einen Wert gespeichert, sondern rein gar nichts.
Standardwerte speichern: Kontextmenü / Datenoperationen / aktuellen Wert als Standard.
Edit: Deine Frage lt. Überschrift, wie man Zeitdifferenen berechnet, ist ja noch gar nicht beantwortet.
In Deinem Fall würde ich gar keine Zeitempel verwenden, sondern das normale numerische DBL-Fomat mit der Anzeigeeigenschaft "Relative Zeit"
Beispiel:
(Ich verwende in meinem System Punkte als Dezimalzeichen)
Anzeige
19.11.2013, 10:28 (Dieser Beitrag wurde zuletzt bearbeitet: 19.11.2013 10:32 von che-salih.)
ich habe versucht gehabt, die Werte über Datenoperation/aktuellen Wert als Standard einzeln zu speichern. Man kann das Array direkt als Standardwert speichern. Ich habe es korrigiert. Das Sortieren von meinem Cluster ist schon mal ganz hilfreich. Das zerlegen wieder in Transponder ID ist etwas unverständlich. Mit der Unbundle(ByName) bekomme ich mein sortiertes TR ID Array. Ich möchte aber mein Array nach ID Nummern zerlegen. Zum Beispiel: Mein ID mit der Nummer 3000300833B2DDD906C000000005 und die dazugehörige Zeit möchte ich dann in jeweils 1D Array oder in 2D Array haben. So kann ich dann die Rechenoperation durchführen. Mache ich irgendwo ein Gedankenfehler? Ich denke, dass wäre am einfachsten.
Zitat:Wer sagt denn so was, stimmt überhaupt nicht! Außerdem hast Du ja nicht mal einen Wert gespeichert, sondern rein gar nichts.
Standardwerte speichern: Kontextmenü / Datenoperationen / aktuellen Wert als Standard.
Edit: Deine Frage lt. Überschrift, wie man Zeitdifferenen berechnet, ist ja noch gar nicht beantwortet.
In Deinem Fall würde ich gar keine Zeitempel verwenden, sondern das normale numerische DBL-Fomat mit der Anzeigeeigenschaft "Relative Zeit"
Beispiel:
(Ich verwende in meinem System Punkte als Dezimalzeichen)
Danke fürs Beispiel. Ich denke auch, dass DBL Format besser geeignet ist. Ich kann ja mein TimeStamps in DBL konvertieren.
vielen vielen Dank Gerd. Das funktioniert perfekt. Alle meine Daten sind ID basiert segmentiert.
Ich möchte aber genau wissen, wie du es programmiert hast. Deswegen werde ich kurz schreiben was ich von deinem Programm verstanden habe. Falls ich falsch liege, würde ich dich bitten mich kurz zu korrigieren.
Also, du schlüsselst das sortierte Array Cluster nach Namen auf und fragst an der ID Ausgang zeilenweise, ob die ID mit der nächsten Iteration ungleich ist. Die Abfrage geschieht dann über die Schieberegister. Wenn die ID gleich ist, werden die Daten (Zeit, Value) zusammen in ein Clusterarray geschrieben. Fall der ID ungleich mit der nächsten Iteration ist, wird ein neue Cluster eröffnet usw.
Den False Case habe ich nur bedingt verstanden. Es ist klar, dass die Daten in den Clustern hinzugefügt werden aber ich sehr leider nicht ganz wie. Wenn du mir da einpaar Stichwörter geben würdest, wäre ich dankbar. Danke für deine Mühe.
Gruss
Che
19.11.2013, 13:47 (Dieser Beitrag wurde zuletzt bearbeitet: 19.11.2013 13:49 von GerdW.)
Zitat:Also, du schlüsselst das sortierte Array Cluster nach Namen auf und fragst an der ID Ausgang zeilenweise, ob die ID mit der nächsten Iteration ungleich ist. Die Abfrage geschieht dann über die Schieberegister.
- Das sortierte Array enthält Cluster aus [ID, timestamp, value]. Du willst diese Elemente nach ID gruppieren. Dafür lege ich eine Datenstruktur an, die aus einem Array of Cluster of [ID, array of timestamps, array of values] besteht.
- Der Vergleich findet mit der ID der vorigen Iteration statt. Wenn die IDs ungleich sind, wird ein neuer Cluster (für die neue ID) angelegt.
Zitat:Wenn die ID gleich ist, werden die Daten (Zeit, Value) zusammen in ein Clusterarray geschrieben. Fall der ID ungleich mit der nächsten Iteration ist, wird ein neue Cluster eröffnet usw.
Genau: Wenn die ID gleich geblieben ist, werden die neuen Timestamp/Value-Werte zu den schon vorhandenen hinzugefügt.
Zitat:Den False Case habe ich nur bedingt verstanden. Es ist klar, dass die Daten in den Clustern hinzugefügt werden aber ich sehr leider nicht ganz wie.
Der Einfachheit halber werden neue Cluster (für neue IDs) immer als erstes Element ins Array geschrieben. Im FALSE-Case wird also:
- das erste Arrayelement indiziert
- im erhaltenen Cluster werden die Arrays für Timestamp und Value "unbundled"
- zu diesen Arrays die neuen Werte hinzugefügt
- die Arrays wieder in den Cluster eingetragen
- der Cluster im "Ober"-Array eingetragen
Für solche Operationen bietet sich die verwendete Inplace-Struktur an...
Edit:
Im VI oben ist noch ein kleiner Bug: es wird immer ein leerer Cluster mit (ID "") erzeugt. Schau mal, ob du die Lösung, um dieses Verhalten zu umgehen, selbst findest...