Hallo zusammen,
folgendes Problem: Ich lese aus meinem Com-Port Sensordaten (Orientierungswinkel, Position und Geschwindigkeiten) einer IMU aus. Nun möchte ich die Daten darstellen. Bei den Winkeln und Geschwindigkeiten gabs keine Probleme, da man dort eifache xy-plots erstellen konnte. Nun möchte ich noch die Positionsdaten sozusagen 'real-time' in einem 3D Plot darstellen. Ich erhalte alle paar ms 3 Werte (x, y, z-Koordinaten) und die sollen dann in den Plot eingezeichnet werden, sobald sie verfügbar sind. Wie mache ich das? 3D-Liniengraph zum Beispiel nimmt ja nur Arrays als Inputs an...
Danke für die Hilfe
Ok ich formuliere das Problem nochmals anders: In 2D benutze ich einfache Kurvendiagramme, die mir die ankommenden Daten sofort in einen Graphen einzeichnen. Nun habe ich aber noch Positionsdaten (x,y,z) die ich gerne in einem 3D Graphen darstellen würde. Gibt es eine Funktion, welche mir Punkte ein einen 3D-Graphen einzeichnet, alle vergangenen Punkte behält und miteinander verbindet?
Nein, das Aufsammeln der Daten in einem/mehreren Arrays zur Anzeige im 3D-Plot musst du selber machen.
Stichworte zur Realisierung: Shift-Register und Build-Array.
Gruß, Jens
Hallo Jens,
danke für deine Antwort. Ich hab das mal gebaut, wie du es mir empfohlen hast und das funktioniert auch so. Nun habe ich aber das Problem, dass ich so viele Daten habe, sodass die Arrays unendlich gross werden und mein Plot mir nach ca. 5 sekunden das ganze Programm ausbremst. Ich hänge mal mein VI an, vielleicht hast du ja eine Idee oder siehst gleich den Fehler
. (Bitte nicht erschrecken, ich arbeite erst seit 4 Tagen mit LabVIEW...
)
Vielen Dank!
LV-Version: 9.0
' schrieb:Nun habe ich aber das Problem, dass ich so viele Daten habe, sodass die Arrays unendlich gross werden und mein Plot mir nach ca. 5 sekunden das ganze Programm ausbremst.
Ich empfehle folgendes:
Zum einen nur soviele Daten anzeigen, wie sinnvoll ist. Sinnvoll können z.B. die letzen 10.000 Werte sein.
Außerdem solltest du mit den Arrays wie folgt vorgehen: Vor der While-Schleife drei Array erstellen der Größe 10.000 Werte ("Array initialisieren"). In der Schleife wird dann nicht "In Array einfügen" gemacht, sondern "Teil-Array ersetzen". Ersteres verbraucht unendlich viel Zeit und Speicher, zweiteres weder das ein noch das andere (naja, zumindest fast). Jetzt ist zwar ein Indexzähler notwendig und ein bischen Arraymanagement, das ist zwar etwas Programmieraufwand, geht aber zur Laufzeit schneller.
Ganz schlecht in deinem VI ist, dass du Lese- und Anzeigeschleife komplett entkoppelt hast.
Was passiert bei dir: Deine "3D-Plot"-Schleife läuft parallel zu deiner "VISA-Schleife", und das so schnell wie möglich. Dauernd werden die lokalen Variablen ausgelesen und an deine Arrays angehängt. Somit wächst das Array rasend schnell an, und es kommt zu den Verzögerungen, die du bemerkst. Dauernd muss neuer Speicher alloziert werden wegen der Array-Vergrößerungen, und der 3D-Plot ist bei vielen Daten auch nicht gerade der Schnellste.
Mögliche Lösungen:
1. Die Anzeige kommt mit in die VISA-Lese-Schleife. Das ist aber nur zu empfehlen, wenn du nicht allzu schnell und allzu lange Daten für diese Darstellung sammelst.
2. Du überträgst per Queue (und schon 6. Tag kriegst du "Advanced LabVIEW Features um die Ohren gehauen
) die neu erfassten Datenpunkte von der VISA- zur 3D-Plot-Schleife. Vorteil: Die Schleifen können komplett unabhängig voneinander laufen, und die 3D-Plot-Schleife legt nur dann einen neuen Datenpunkt an, wenn auch wirklich in der VISA-Schleife ein neuer Punkt ausgelesen wurde.
Gruß, Jens