11.11.2004, 09:58
Beitrag #1
|
Joe
LVF-Gelegenheitsschreiber
Beiträge: 110
Registriert seit: Oct 2004
8.20
2004
kA
Deutschland
|
20 kHz Mehrkanal-Datei möglichst in Echtzeit abarbeiten
Hi,
ich habe folgendes Problem:
Ich muss eine Datei einlesen (ASCII), die aus 2-61 Spalten (leider nicht immer geordnet) besteht. Die erste Spalte enthält einen Zeitindex, die weiteren sind Messelektroden. Jetzt habe ich es schon hinbekommen, dass ich die Datei einlese, mir Zeile für Zeile vornehme, diese aufschlüssele und dann in den 1-60 Waveform Charts darstelle.
2 Probleme sind mir dabei jetzt untergekommen:
[list]
[*] Wenn ich ein Waveform Chart benutze, kann ich nur 1023 Punkte auf der X-Achse darstellen, was aber ein Problem ist, wenn ich 1 komplette Sekunde anzeigen will und meine Daten mit 20 kHz aufgenommen wurden.
[*] Das Ganze ist extrem langsam. Also ich kann den Millisekunden beim hochlaufen zuschauen.
[list]
Mein Programm läuft folgendermaßen ab:
[list]
[*] Ich lese die Datei Zeile für Zeile aus (Elemente sind durch einige Leerzeichen und anschließend ein TAB voneinander getrennt).
[*] Wenn die Zeile kommt, wo die Anordnung der Elektroden steht, schreibe ich mir diese per "Spreadsheet String to Array" in ein String-Array.
[*] Wenn die Daten kommen, werden diese ebenfalls per "Spreadsheet String to Array" in eine String-Array geschrieben (Double-Array hat irgendwie nicht funktioniert, ich bekomme trotz Format String %f bzw. %5.5f nur Integer-Werte hinten raus).
[*] Anschließend werden die Daten elementeweise in ein Double umgewandelt.
[*] Zuletzt habe ich eine For-Schleife, in der sowohl das Array mit der Elektroden-Anordnung als auch das Array mit den Messwerten elementeweise (gleichzeitig) eingeladen werden, wodurch ich sicherstelle, dass immer die passenden Daten an das entsprechende Waveform Chart gesendet werden.
[list]
Mir ist selber klar, dass diese andauernden Zählschleifen sehr viel Prozessorleistung schlucken und ich bin selber mit der bisherigen Lösung nur insofern zufrieden, als dass es überhaupt mal das macht, was es soll. Aber es ist halt zu langsam.
Kann mir irgendwer nützliche Tipps geben, wie man so eine Sache schneller machen kann? Und auch, wie ich 20000 Messpunkte auf einmal darstellen kann?
Viele Grüße,
Joe
P.S.: Wenn meine Erklärung oben zu undeutlich ist oder ihr starke Nerven habt , dann kann ich gerne noch mein VI hier hochladen.
|
|
|
11.11.2004, 11:45
Beitrag #2
|
Teutates
LVF-Gelegenheitsschreiber
Beiträge: 73
Registriert seit: Nov 2004
7.1 Developer Suite inkl. Vision
2004
kA
Deutschland
|
20 kHz Mehrkanal-Datei möglichst in Echtzeit abarbeiten
Hallo ich bin auch Anfänger aber vielleicht hab ich das ja richtig verstanden wie Deine Datei aufgebaut ist, 1 Spalte Zeit, 2-61 Spalte Messwerte für den jeweiligen KAnal und Zeitpunkt, d.h. in einer Sekunde maximal 20000*61 Messwerte wenn alle Elektroden Messwerte liefern oder wie?
Ich würde mal anders rangehen, die Datei Transponiren also so schreiben das Du alle Zeitpunkte in einer ZEile in ein Array schreiben kannst,
Dann jede Weitere Zeile dann mit 20000 Messwerten pro Kanal, diese 2 Arrays für jeden KAnal jeweils zu einem 2-D Array zusammenfasst und dann 1 Zeile Zeitindex 2 Zeile Messwert(Spannung oder wie auch immer)
so hast Du immer genau soviel 2-D Arrays wie angelegte Elektroden und zudem ist es einfach da Zeit und Spannungswerte einfach verknüpft werden können indem Du ein 2-D Array erstellst und einfach die 2 Zeilen übereinanderlegst.
Wenn Du erstmal die MEsswerte in die DAtei schreibst in der Form und dann auswertest denke ich das es schneller läuft denn was nützt Dir in Echtzeit bei der Messdauer die Daten auszuwerten, zudem kannst Du aller 1 Sekunde eine neue Dateispeichern oder einen neuen Abschnitt so werden die Arrays auf 20000 Werte einheitlich begrenzt, vielleicht wenn Du länger messen willst kannst Du eine Sekunde aufzeichnen in der nächsten die neuen Werte einlesen und bereits die letzte graphisch darstellen.
Falls ich da was falsch verstanden habe oder Du an bestimmte Dinge gebunden bist dan versuche Dir mal Deinen Datenfluss anzuschauen mit der Debuggingfunktion, so kannst Du die Daten verfolgen und siehst Wo er in schwitzen kommt, Du arbeitest numal mit kleinen Arrays aber das halt 20000 mal es dauert bei weitem nicht so lang 61 Arrays mit 20000 Messgrössen zuschreiben wie 20000 Arrays mit 61 Größen.(20000 mal das VI ausführen), ist zumindest meine Vermutung.
Achja Speicherauslastung schau mal im Taskmanager wenn das drastisch in die Knie geht dann musst Du mit weniger Werten auskommen, ich weiß zwar nicht was Du genau machst aber da gibt es auch dann eine Lösung.
Zu den 1023 Werten bei Diagrammen kannst Du per Rechtsklick die Historienlänge frei wählen nur der Standard Wert beträgt 1023, allerdings musst Du dann mit Bildlaufleiste arbeiten aber das ist eh klar bei so vielen Punkten.
Na denn Falls Dir das nicht hilft und hier keiner weiterhelfen kann dann gehe mal in das Forum schauen GSI Forum LVUG.
Gruß
Teutates
|
|
|
11.11.2004, 15:12
Beitrag #3
|
Joe
LVF-Gelegenheitsschreiber
Beiträge: 110
Registriert seit: Oct 2004
8.20
2004
kA
Deutschland
|
20 kHz Mehrkanal-Datei möglichst in Echtzeit abarbeiten
Teutates schrieb:Hallo ich bin auch Anfänger aber vielleicht hab ich das ja richtig verstanden wie Deine Datei aufgebaut ist, 1 Spalte Zeit, 2-61 Spalte Messwerte für den jeweiligen KAnal und Zeitpunkt, d.h. in einer Sekunde maximal 20000*61 Messwerte wenn alle Elektroden Messwerte liefern oder wie?
Genau so ist die Datei aufgebaut.
Zitat:Ich würde mal anders rangehen, die Datei Transponiren also so schreiben das Du alle Zeitpunkte in einer ZEile in ein Array schreiben kannst,
Dann jede Weitere Zeile dann mit 20000 Messwerten pro Kanal, diese 2 Arrays für jeden KAnal jeweils zu einem 2-D Array zusammenfasst und dann 1 Zeile Zeitindex 2 Zeile Messwert(Spannung oder wie auch immer)
so hast Du immer genau soviel 2-D Arrays wie angelegte Elektroden und zudem ist es einfach da Zeit und Spannungswerte einfach verknüpft werden können indem Du ein 2-D Array erstellst und einfach die 2 Zeilen übereinanderlegst.
Ist auf alle Fälle mal ein Ansatz, an dem ich arbeiten werde. Das Problem ist nur, dass ich aus einem anderen Programm auch Dateien verarbeiten muss und die sind nunmal so aufgebaut wie ich es oben beschrieben habe. Wenn ich selber die Messdaten abspeichere, werde ich mich natürlich an die schnellere Art halten.
Wenn ich jetzt aber die anderen Dateien einlese, muss ich in LabVIEW ein Programm schreiben, das mir die Datei entsprechend transponiert.
Oder existiert sowas schon irgendwie? Hat das schonmal einer gemacht?
Zitat:Zu den 1023 Werten bei Diagrammen kannst Du per Rechtsklick die Historienlänge frei wählen nur der Standard Wert beträgt 1023, allerdings musst Du dann mit Bildlaufleiste arbeiten aber das ist eh klar bei so vielen Punkten.
Ja, das ist wohl nicht zu vermeiden. Oder aber ich kann die Anzeige irgendwie runterinterpolieren, dass ich es in einem Display anzeigen kann.
[quote]Na denn Falls Dir das nicht hilft und hier keiner weiterhelfen kann dann gehe mal in das Forum schauen GSI Forum LVUG.
Gruß
|
|
|
11.11.2004, 17:22
Beitrag #4
|
Oliver Listing
LVF-Freak
Beiträge: 721
Registriert seit: Sep 2004
2012 und 2014 (Windows und Linux)
1998
EN
22844
Deutschland
|
20 kHz Mehrkanal-Datei möglichst in Echtzeit abarbeiten
Hi Joe,
ich will Dir ja nicht den Mut nehmen, aber meiner Meinung nach geht das nicht.
Bei 20kHz erhälst du alle 50usec. einen neuen Wert. Anscheinend an eine Datei gehängt.
Da Dateizugriffe eh nicht zu den schnellsten gehören...
Du mußt also Datenreduktion betreiben. Wie wäre es, wenn du immer ein Satz Daten holst , so schnell wie du kannst. Der Anwender wird es auf dem Graphen gar nicht merken. Wenn du die richtige Zeitzuteilung auf der X-Achse beibehalten willst, kommst du um einen XY-Graphen nicht herum.
Ein weiteres Problem ist dein Speicherverbrauch:
In einer Minute erzeugst du bei 4Byte pro Meßwert 4,5MB.
Würdest du diese immer alle einlesen, bearbeiten und zur Anzeige bringen wird sogar ein vielfaches benötigt. Den LabVIEW erzeugt von den Daten immer Kopien. Z.B. wandelst du die 4,5MB in DBL um - kleine Funktion, große Wirkung - hast du gerade nochmals 4,5MB verbraucht, somit insgesamt schon 9MB. Ohne den Speicherverbrauch beim einlesen zu betrachten - ach ja deine Anzeige braucht dann auch noch einmal 4,5MB...
Der Graph benötigt für die Aktualsierung, besonders bei großen Datenmengen, viel Zeit. Nötigenfalls währenddessen invisible schalten (flakert dann aber).
Meine Empfehlung deshalb:
Daten reduzieren, da eh niemand 20000 Meßwerte pro Sekunde betrachten kann (50 reichen völlig für ein Rucklfreies Bild.)
Gruß
Oliver
Ps: Das Forum der LVUG findest du übrigens unter www.lvug.de - du findest mich dort unter "Frank".
|
|
|
12.11.2004, 14:14
Beitrag #5
|
Teutates
LVF-Gelegenheitsschreiber
Beiträge: 73
Registriert seit: Nov 2004
7.1 Developer Suite inkl. Vision
2004
kA
Deutschland
|
20 kHz Mehrkanal-Datei möglichst in Echtzeit abarbeiten
Außerdem kommt es ja darauf an was denn da gemessen wird ist denn so eine hohe Auflösung überhaupt notwendig, wenn ja kannst Du nur offline auswerten, das heißt erst alle Messwerte erfassen und dann nach dem Messvorgang auswerten, Bei so einer DAtenmenge ist Echtzeit nur möglich mit einem Rechner naja jedenfalls ein großes Maschienchen was viele Opertationen gleichzeitig abarbeitet, wozu ja LabVIEW in der LAge ist bei außreichend Rescourcen, mach Dir mal einen Plan worauf es bei Dir wirklich ankommt was will man am Ende erzeugen, Ich würde Dir auch raten die Graphen mit Tecplot einzulesen in der endgültigen Auswertung und Dokumentation einzelner Versuche, besonders in Hinblick auf Publikation der Ergebnisse.
Versuch Dir einen Algorithmus zu erstellen wo das Programm wenig VI öffnen und schließen muss, besonders Dateioperationen, dann musst Du eben sehen was nötig ist um auf die nötige Geschwindigkeit zu kommen, mehr Arbeitsspeicher, CPU, weniger Punkte im Graphen anzeigen, denk an die Bildschirmauflösung , schreib Dir notfalls ein VI was Dir kleine Ausschnitte einließt und darstellt, wenn ein Bereich besonders interessant ist, ( allg. jeden 10 Wert einlesen und darstellen, im speziellen jeden Wert aber kleiner Zeitbereich oder so)
Kannst ja mal posten wenn Du eine Lösung gefunden hast und wie Du es umgesetzt hast würde mich doch sehr interessieren.
Na denn frohes Schaffen
Gruß
Teutates
|
|
|
15.11.2004, 09:21
Beitrag #6
|
Joe
LVF-Gelegenheitsschreiber
Beiträge: 110
Registriert seit: Oct 2004
8.20
2004
kA
Deutschland
|
20 kHz Mehrkanal-Datei möglichst in Echtzeit abarbeiten
Ich danke euch beiden sehr für eure Antworten und darin enthaltenen ausführlichen Erklärungen.
Damit kann ich mich ja jetzt mal an die Überlegungen machen.
OK, das mit den 20000 Werten ist Wunschdenken gewesen, ich sehs ein.:)Aber man wird es ja mal versuchen dürfen.
Wenn ich mich aber richtig erinnere, sollte es 5 kHz nicht unterschreiben. Das hieße dann also, dass ich nicht alle 50 usec, sondern nur alle 0,2 ms Daten abholen muss.
Ich werde weiter über Erfolge berichten und bei Misserfolgen fragen.
Gruß,
Joe
|
|
|
24.11.2004, 16:37
Beitrag #7
|
Joe
LVF-Gelegenheitsschreiber
Beiträge: 110
Registriert seit: Oct 2004
8.20
2004
kA
Deutschland
|
20 kHz Mehrkanal-Datei möglichst in Echtzeit abarbeiten
Hi,
leider muss ich dieses Thema erstmal beiseite schieben, da es als unwichtige Nebensache eingestuft wurde.
Aber ich bin an einer neuen Sache dran und weiß mir da auch keinen Rat. Hab aber extra schon einen neuen Ordner dafür aufgemacht.
Wäre schön, wenn mir einer --> HIERBEI <-- helfen kann.
Liebe Grüße,
Joe
|
|
|
| |