Daten (Cluster) in Datei speichern - Druckversion +- LabVIEWForum.de (https://www.labviewforum.de) +-- Forum: LabVIEW (/Forum-LabVIEW) +--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein) +---- Forum: Datenbank & File IO (/Forum-Datenbank-File-IO) +---- Thema: Daten (Cluster) in Datei speichern (/Thread-Daten-Cluster-in-Datei-speichern) |
Daten (Cluster) in Datei speichern - T-M - 15.10.2010 10:35 Zunächst mal hallo an alle! Ich habe gerade angefangen mich mit Labview vertraut zu machen und habe auch schon einige Probleme Dank der tollen Antworten hier im Forum lösen können, dafür also schonmal vielen Dank an alle. Nun bin ich bei meinem Programm allerdings auf ein Problem getroffen, das mir etwas mehr Kopfzerbrechen bereitet. Ich nehme an das Problem ist ganz einfach zu lösen und ich habe nur die Datenstrukturen und ihr Zusammenwirken nicht verstanden, aber auf jeden Fall würde ich mich freuen, wenn jemand mir das kurz erklären könnte. Ich taste mit einer Messkarte PCI-5922 die in einem externen, über Glasfaser angebundenen, Gehäuse steckt ein Signal ab und lasse es anzeigen. Das Signal wird dann zusätzlich einer FFT unterzogen und mit einem zweiten Signal (noch simuliert, später auch abgetastet) einer Korrelationsuntersuchung unterzogen. Beide Signalabtastungen und alle Berechnungen werden immer für nur einen Durchlauf mit einer einstellbaren Menge an Abtastwerten durchgeführt, ein zweiter Durchlauf kann mit einem Taster gestartet werden. Nun habe ich zwei Probleme, für die ich noch keine Lösung gefunden habe: 1. Wenn ich die Phasenlage des simulierten Signals ändern will muß ich das ganze Programm (oder VI?) abbrechen und neu starten, weil die Änderung sonst zwar im Eingabeelement anmgezeigt wird, das Signal sich jedoch nur beim Neustart verschiebt und nicht, wie geplant, beim neuen Durchlauf der Case-Schleife. 2. Ich will die erzeugten Daten in eine Datei speichern um sie mit anderen Kollegen austauschen zu können, die sie evtl. auch mit anderen Programmen weiterverarbeiten. Das bedeutet ich will die beiden abgetasteten Signalverläufe, das Leistungsspektrum, den Korrelationsfaktor und den Real- und Imaginärteil der Korrelationsfunktion zusammen in einer Datei speichern. Dazu hatte ich mir überlegt das folgende Struktur ganz gut wäre: t-Achse Signal1 | Werte Signal1 | t-Achse Signal2 | Werte Signal2 | Korrelationsfaktor | f-Achse Spektrum | Werte Spektrum | Realteil | Imag.Teil Wobei | eine Trennung der Spalten bedeutet. Satt den beiden Zeitachsen ginge es auch nur eine Zeitachse, oder notfalls sogar nur das dt, zu speichern, ist aber nicht ganz so schön. Selbiges gilt natürlich auch für die f-Achse. Ich habe um das so zu machen einfach mal ein Cluster erzeugt, das die zu speichernden Werte beinhaltet. Das kommt daher das ich mir Datenstruktur halt wie oben angegeben vorstelle und dachte diese Tabelle (Matrix, Array, wie auch immer) sollte sich auch in dieser Form speichern lassen. Leider habe ich keine Funktion gefunden, die das macht und auch Nachschlagen in einem Buch und im Internet haben nicht zum Erfolg geführt, wobei das (wie imemr) durchaus an meinen Suchbegriffen liegen kann. LabView-Version ist 8.2 So, hier nun noch das VI dazu Daten (Cluster) in Datei speichern - SeBa - 15.10.2010 11:07 Zu 1.: Die Phase wird beim ersten Ausführen des Signalgenerators oder beim Reset übernommen... Du musst also Reset = True setzen, wenn du die Phasenänderung sehen willst. Zu 2.: Grundsätzlich würde ich die eher zu einem Standardtrennzeichen (Semikolon, Leerzeichen, Tab, ect.) raten. Du kannst deine Daten auch in einem ArrayOfString ablegen und mit der Funktion Write To Spreadsheet File abspeichern. Gruß SeBa Daten (Cluster) in Datei speichern - T-M - 15.10.2010 11:52 Danke für die schnelle Antwort! ' schrieb:Zu 1.: Die Phase wird beim ersten Ausführen des Signalgenerators oder beim Reset übernommen... Du musst also Reset = True setzen, wenn du die Phasenänderung sehen willst. Hab ich jetzt gemacht und funktioniert, danke. ' schrieb:Zu 2.: Grundsätzlich würde ich die eher zu einem Standardtrennzeichen (Semikolon, Leerzeichen, Tab, ect.) raten. Das | soll ja nicht in der Datei die Trennung machen, da dachte ich eher an Tab oder Semikolon, das war nur um in meiner Aufzählung zu zeigen wo die Spaltentrennung hin soll. ' schrieb:Du kannst deine Daten auch in einem ArrayOfString ablegen und mit der Funktion Write To Spreadsheet File abspeichern. Dazu müßte ich dann erstmal die durch die Abtastung erzeugten Signale nach X- und Y-Achse trennen, die Daten in String umwandeln und dann zu einem Array zusammenführen, oder? Daten (Cluster) in Datei speichern - SeBa - 15.10.2010 12:07 Im Endeffekt läuft es doch sowieso auf irgendeine Umwandlung nach String raus. Du willst die Daten ja als Text abspeichern. Stellen wir einfach mal das CSV Format in den Raum. Der genannten Funktion kannst du ein 2D-Array übergeben. Die Funktion ist polymorph, das bedeutet du kannst auch ein 2D ArrayOf(Int/Dbl....) anschließen. Du brauchst aber eine Headerzeile (t-Achse Signal1 | Werte Signal1...) und die ist ein String. Jetzt kannst du einmal die Funktion aufruden und den 1D-Header (also als ArrayOfString) übergeben und dann nochmal aufrufen und die 2D-Daten (keine Strings) übergeben (da wird die Umwandlung Zahl->String hat von der Funktion übernommen) und an die Datei anhängen. Oder du wandelst selbst um, und übergibst nur ein 2D-ArrayOfString, welches dann im Endeffekt genauso aussieht, wie du es in der Datei haben willst. Gruß SeBa Daten (Cluster) in Datei speichern - T-M - 18.10.2010 10:27 Vielen Dank, das hat soweit geklappt. Eine abschließende Frage habe ich dazu aber noch: Die Arrays werden ja untereinander gesetzt, wobei ein 1-D-Array ja als Zeilenvektor behandelt wird. Wenn ich jetzt der Funktion sage das sie das Array transponieren soll, dann wird daraus korrekt ein Spaltenvektor, also die Werte werden untereinander in die Datei geschrieben. Nun wollte ich ursprünglich wegen der besseren Lesbarkeit (und natürlich weil ich es so gewohnt bin) oben den Header haben (als Zeilenvektor) und darunter die Messdaten als Spaltenvektoren. Das funktioniert bei nur 2 Spaltenvektoren ja gut, weil ich sie einfach zu einem 2-D-Array zusammenfasse und transponiert abspeichere. Wenn ich nun aber mehr Spaltenvektoren habe, dann kann ich die ja nicht mit einmaligem Aufrufen der Fuktion abspeichern, weil die ja nur 2-D-Arrays annimmt. Rufe ich die Funktion aber ein zweites Mal auf um die Daten anzuhängen, dann werden sie "unten" angehängt und nicht "rechts". Damit entsteht aber natürlich der Eindruck das es sich nicht um 4, sondern nur um 2 Spaltenvekroten (und damit Mesreihen) handelt. Außerdem ist es ohne Kenntniss der Sampleanzhal unmöglich zu erkennen wo die neue Messreihe anfängt. Gibt es eine (einfache?) Möglichkeit ein n-dimensionales Array (2<n<10) in eine Datei zu schreiben? Oder gibt es alternativ ein Kommando, mit dem man erreichen kann das die Daten nicht "unten", sondern "rechts" angehängt werden? Ich habe auch überlegt, dass ich die Daten ja in ein mehrdimensionales Array stecken könnte (als Spaltenvektor) und dann dieses in einer for-Schleife zeilenweise an die Datei anhängen könnte, die ich außerhalb dieser Schleife mit dem Header versehe. Aber irgendwie scheint mir das ein viel zu kompliziertes Vorgehen für eine LabView-Programmierung... Gruß T-M Daten (Cluster) in Datei speichern - SeBa - 18.10.2010 10:51 Hmm... also ich lass jetzt einfach mel deine Spalten/Zeilenvektoren weg. Knackpunkt ist einfach, dass du in einer bestehenden Datei nicht in einer beliebigen Zeile rechts weiterschreiben kannst. An Datei anhängen bedeutet immer unten anhängen. Du schreibst auch etwas wirr, einmal willst du Daten irgendwann (rechts) anhängen müssen... ein ander Mal hast du alle Daten und willst die in die Datei zeilenweise schreiben... Also sage ich einfach mal, wie ich die Datei nach rechts hin auffüllen würde. Bedingung dafür ist dann, dass die Datei erzeugt wird, es werden Daten geschrieben, die Datei wird geschlossen und du willst irgendwann neue Daten an diese Datei anhängen. -> Daten sammeln -> Datei öffnen -> Datei auslesen -> Ausgelesene Daten mit den neuen kombinieren, sodass das neue Array nach rechts hin aufgefüllt wurde -> Neues Array in Datei speichern, nicht anhängen sondern überschreiben Falls du alle Daten sammelst und nur am Ende die Datei schreibst und danach nicht mehr anfassen musst, würde ich dir weiterhin empfehlen die Daten in einem 2D-ArrayOfString zu sammeln. Das hat den Vorteil, dass du einfach mal ein Anzeigeelement anschließen kannst um zu schauen wie das Array (und damit später die Datei) aussieht. Gruß SeBa Daten (Cluster) in Datei speichern - T-M - 18.10.2010 11:51 ' schrieb:Knackpunkt ist einfach, dass du in einer bestehenden Datei nicht in einer beliebigen Zeile rechts weiterschreiben kannst. An Datei anhängen bedeutet immer unten anhängen. Dann versuche ich mal das etwas klarer zu formulieren: Ich habe die Daten alle vorliegen und will sie in die Datei schreiben, wobei die Datenpunkte von einem Signal untereinander stehen sollen. Die vom zweiten Signal sollen danneben stehen und auch untereinander. Diese Struktur bekomme ich wenn ich die Daten als 2-D-Array vorliegen habe und dann trosponiert in die Datei schreibe. Tatsächlich habe ich jedoch nicht 2 Signale, sonder mehr. Da kommt noch das Frequenzspektrum, die Kreuzkorrelation und evtl. noch weitere Signale dazu. In jedem Fall erreiche ich zu einem bestimmten Zeitpunkt den Zustand das ich die Daten, die ich in eine Datei schreiben will alle vorliegen habe, ohne das bisher eine Datei erstellt wurde. Diese Daten würden zusammengefasst nun z.B. ein 5-dimensionales Array ergeben, sind aber noch nicht zu einem solchen zusammengefasst. Diese Daten will ich nun alle in eine Datei schreiben, wobei jede Spalte ein Signal sein soll. Würde die Write to Spreadsheet Arrays beliebiger Dimension annehmen würde ich die Daten einfach zu einem Array zusammenfassen und es transponiert abspeichern. So wie ich die FUnktion verstanden habe kann sie aber nur mit maximal 2-dimensionalen Arrays umgehen. Darum kam ich auf die Idee erst ein 2-D-Array abzuspeichern und dann das nächste daneben zu setzen. Wie ich Deiner Antwort entnehem kann das aber nicht funktionieren, weil die Daten immer unten angehängt werden. Mein Problem ist somit das ich ein z.B. 5-dimensionales Array transponiert in die Datei schreiben will, aber es dafür anscheinend keine fertige Funktion gibt. Darum wollte ich nun wissen, ob es einen einfachereren Weg gibt als den folgenden: 1. Daten zu einem 5-D-Array zusammenfassen 2. 5-D-Array transponieren 3. erstes Teilarray des transponierten 5-D-Arrays nehmen 4. dieses Teilarray (sollte ja 5 Elemente beinhalten) in die Datei schreiben 5. nächstes Teilarray holen 6. nächstes Teilarray an Datei anfügen 7. Schritte 5 und 6 mittels Schleife wiederholen, bis alle Daten geschrieben sind 8. Schleife verlassen ' schrieb:Also sage ich einfach mal, wie ich die Datei nach rechts hin auffüllen würde. Bedingung dafür ist dann, dass die Datei erzeugt wird, es werden Daten geschrieben, die Datei wird geschlossen und du willst irgendwann neue Daten an diese Datei anhängen. Das Vorgehen zum "rechts anhängen" klingt nach einer ähnlichen Struktur, wie ich sie mir auch überlegt hatte. Das Problem ist ja nur, dass es sich nicht um ein 2-D-Array handelt, sondern um mehrere, die alle in die gleiche Datei sollen, was die Funktion ja nicht unterstützt, soweit mir bekannt. Gruß T-M PS: Zur Verdeutlichung evtl. noch dieses VI, das ich bisher habe. (LabView 8.2) Ich erstelle damit 2 Dateien, weil ich es eben bisher noch nicht geschafft habe die Daten die ich da abspeichere (2 2-D-Arrays, also zussammen ein 4-D-Array) in eine Datei zu speichern, was ja mein Ziel ist. Daten (Cluster) in Datei speichern - SeBa - 18.10.2010 12:11 *schmunzel* Du brauchst kein 5D-Array... Das die Spreadsheet Funktion "nur" mit max. 2D-Array arbeitet hat ja seinen Grund... wie würdest du denn ein 5D-Array im Notepad darstellen? Du musst bedenken, dass hier die direkte Umsetzung in die "reale Welt", sprich Papier und Bleistift, erfolgt. 5D-Arrays auf Papier versucht ja auch keiner... Was ich oben schon versucht habe zu erklären ist folgendes. Du sammelst dir deine Daten. Jedes Signal vonmir aus in einem eigenen Array. Das sind dann (behaupte ich mal) 1D-Arrays. Alle diese Arrays packst du jetzt in ein größes 2D-Array zusammen. Stell dir einfach vor du willst deine Daten in Excel eintragen... ein Arbeitsblatt in Excel ist nichts weiter als ein 2D-Array. Ich muss jetzt erstmal in ein Meeting, falls du nicht weiter kommst, einfach nochmal melden. Dann mach ich dir mal ein Beispiel. Gruß SeBa Daten (Cluster) in Datei speichern - T-M - 18.10.2010 12:51 Argh.... Du hast natürlich Recht. Da ich ja vorher noch nie was mit LabView gemacht habe hab ich ganze Zeit den Zusammenhang von Dimension und Zeilen-/Spaltenzahl durcheinander gebracht. Ich habe natürlich ein 2-D-Array der Form "Daten[n][m]" Also: Problem gar nicht vorhanden. Bedienerfehler. Danke T-M |