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!
Ich habe ein kleines Problem bei der Arrayerstellung.
Es geht um folgendes:
(LV 8.5.1)
Derzeit arbeite ich an einem VI, welches kontinuierlich einen Geber ausliest und nach jedem lesen eines Wertes (1D-Array) diesen in eine Queue legt.
Nach Abschluss der Erfassung soll aus diesen 1D Arrays ein 2D Array erstellt werden.
Ich benutze derzeit eine For-Schlaufe mit Schieberegister, lese jedes Element aus der Queue und hänge es an das Array an und gebe dieses wieder ins Schieberegister, doch bei einigen hunderttausend 1D Arrays dauert dies einige Minuten, was zu lange ist.
In der Hilfe las ich, dass "Queue freigeben" ein 1D-Array von allen Queueelementen ausgibt und dachte mir, wenn ich das irgendwie umformen könnte, dann wäre das genau das was ich suche, doch wenn die Elemente Arrays sind, werden die Elemente zuerst in einen Cluster gelegt um danach in einem 1D-Array zusammengefügt zu werden, auf eine kluge Lösung bin ich bisher nicht gekommen, (denn wenn ich wieder mit For-Schlaufe beginne habe ich dasselbe Problem).
Als letzte Alternative versuchte ich nicht nur immer ein Element anzuhängen sondern immer hundert und siehe da, der Zeitbedarf ging auf 20% zurück.
Man kann also davon ausgehen, dass eine weitere Erhöhung dieser Zahl eine weitere Zeitersparnis bringt, doch es ist schon mühsam hundert Anschlüsse zu verdrahten...
Daraufhin habe ich versucht ein rekursives SubVI zu erstellen, mit welchem ich nicht mehr auf For-Schlaufen angewiesen wäre, doch LV stört sich daran.
Hat jemand von euch schon Erfahrungen mit dieser Problematik gemacht oder vielleicht eine Idee wie ich ohne For-Schlaufe ans Ziel kommen könnte?
Besten Dank und Gruss
Anzeige
20.06.2010, 09:21 (Dieser Beitrag wurde zuletzt bearbeitet: 24.10.2010 08:59 von Lucki.)
Hier nur ein paar ungeordnete Gedankensplitter zum Thema:[list=1]
[*] Wozu überhaupt eine Queue verwenden, da doch die DAQ-Datenerfassung schon voll gepuffert ist? Warum nicht diesen Datenpuffer genügend groß machen, während der Datenerfassung kommt alles in diesen Puffer hinein und erst wenn sie beendet ist, wird ausgelesen. Das funktioniert auch VI-übergreifend, genau wie bei der Queue. Für eine Erzeuger-Verbraucher-Struktur benötige ich, wenn die Erzeugung über DAQ erfolgt, überhaupt keine Queue - der Zwischenspeicher zum Senden der Daten vom Erzeuger zum Verbraucher ist schon da.<>
[*] Daß bei Queues die einzelnen Datenpakete geclustert werden, ist notwendig, weil ja die Länge der hinzugefügten 1D-Arrays jedesmal unterschiedlich sein kann. Deshalb hat man in der Queue kein 2D-Array, sondern ein 1D-Array aus Clustern mit 1D-Array-Elementen. Wenn Du nur ein 1D-Array in der Queue haben möchtest, ginge das nur so, daß Du als Queue-Dateninhalt das Einzelelement vorgibst und bei 10 neu hinzukommenden Elementen diese nicht als Array, sondern in einer For-Schliefe als 10 neue Einzelelemente hinzufügst. Während der Datenerfassung entsteht dadurch wahrscheinlich kein zusätzlicher Zeibedarf.<>
[*] Für die Umformung, z.B eines 100 elementigen 1 D Array in ein 10*100 2D-Array gibt es die superschnelle Funktion "Array umformen". Die kennst Du wohl gar nich?<>
[st]Aber wozu sage ich das alles? Konzentriere Dich doch einfach auf den Punkt 1, das wäre doch optimal.
Salü Lucki, besten Dank für deine Gedanken zum Thema!
In meinen Ausführungen war ich wohl en wenig zu knausrig...
Meine Erfassung geschieht über SerialPort (VISA), an dieser Schnittstelle befindet sich eine Basisstation mit beliebig vielen Gebern.
Das programm liest einen Wert aus dem Puffer, ordnet ihn einem Geber zu und stellt ihn in die entsprechende Queue, am Ende sollen 2D-Arrays aller Messwerte pro Geber verfügbar sein.
zu Punkt1: Ich kann den VISA-Puffer schon beliebig gross machen, nur brauche ich dann nach der Erfassung umso mehr Zeit alle Datenpakete zu prüfen und zu sortieren, kommt so also nicht in Frage.
Punkt 2: Danke, das hatte ich so schon vermutet, das mit der Forschleife geht ebenfalls nicht, da zwei unmittelbar nacheinander folgende Pakete von verschiedenen Gebern sein können.
Punkt 3: Doch die kenne ich schon, die nutzt mir einfach nichts, da ich ja nicht ein 2D-Array von Clustern von 1D Array will
Ich habe jetzt einige SuBVI erstellt, mit denen man bis zu 100000 Elemente parallel abarbeiten kann, hat dann halt doch einige hundert Verbindungen gebraucht, aber es spart enorm Zeit, ein Beispiel mit 650000 1D-Arrays à 7 Elementen dauerte mit der reinen For-Schlaufenlösung etwa 2Minuten, jetzt noch etwa 3s womit ich sehr gut leben kann.
Ich suche momentan noch eventuelle Fehler und wenn sich nichts findet, werde ich diese Funktionen hier posten, vielleicht kann sie ja mal wer brauchen.
Besten Dank für deine Inputs
Gruss
22.10.2010, 11:30 (Dieser Beitrag wurde zuletzt bearbeitet: 22.10.2010 12:55 von jg.)
Och ich hätte es mir mal angeschaut. So Optimierungsdinger machen ja manchmal auch Spass... besser als jedes Kreuzworträtsel. Vorallem da du hunderte von Anschlüssen per Hand verdrahtest.
Leider hast du dich mit dem gewählten rar Format selbst aufs Abstellgleis navigiert.
Gruß und schönens WE
SeBa
Dieser Beitrag soll weder nützlich, informativ noch lesbar sein.
Er erhebt lediglich den Anspruch dort wo er ungenau ist, wenigstens eindeutig ungenau zu sein.
In Fällen größerer Abweichungen ist es immer der Leser, der sich geirrt hat.
Rette einen Baum!
Diesen Beitrag nur ausdrucken, wenn unbedingt nötig!
22.10.2010, 12:08 (Dieser Beitrag wurde zuletzt bearbeitet: 22.10.2010 12:09 von GerdW.)
mich stört rar nicht - ich musste dafür herrlich lachen...
Andreasser: Hat dir schon mal jemand gesagt, das ForLoops in LV AutoIndexing anbieten? Da müsste man nicht 100 Array-Elemente zu Fuß indizieren und wieder zu einem neuen Array zusammenpacken! Und das Ganze dann noch in 3 subVIs - dein 1000er schießt da ja wirklich den Vogel ab (geschätzte 5 Screens hoch auf meinem FullHD-Display)!
Ja ich weiß... ist ein anderes Thema:Dwollt es nur mal wieder erwähnen.
' schrieb:- ich musste dafür herrlich lachen...
(geschätzte 5 Screens hoch auf meinem FullHD-Display)!
Nach nem Screenshot zum Mitlachen zu fragen, würd wohl den Rahmen sprengen. Ich stells mir einfach vor... --> ...
Gruß SeBa
Dieser Beitrag soll weder nützlich, informativ noch lesbar sein.
Er erhebt lediglich den Anspruch dort wo er ungenau ist, wenigstens eindeutig ungenau zu sein.
In Fällen größerer Abweichungen ist es immer der Leser, der sich geirrt hat.
Rette einen Baum!
Diesen Beitrag nur ausdrucken, wenn unbedingt nötig!
schön dass ich zu eurer Erheiterung etwas beitragen konnte. Ich muss zugeben, als ich dies erschaffen hatte, wars mir selber manchmal zum lachen, aber da mir niemand weiterhelfen konnte, schaute ich, dass ich zu etwas brauchbaren kam...optisch wurde ja alles in ein SubVI gepackt, womit es nicht mehr störend war
Seba: Ich habe dies nur gepostet für den Fall, dass jemand soetwas mal sucht, als ich dies tat fand ich leider nichts.
Ich befinde mich somit auf keinem Abstellgleis und wenn du kein rar benutzen willst, ist das dein gutes Recht
GerdW: Ich nehme an, du meinst mit autoindexing, dass ich nur eine einzelne Schlaufe einbauen hätte müssen, doch das Problem war, dass genau dies zu extremen Wartezeiten geführt hat. Falls ich dich falsch verstanden habe, würde ich mich gerne mehr über diese Kritik unterhalten.
Edit: Danke, ich habe es gerade nochmals versucht, du hast recht GerdW Ich schlage vor, behalten wir doch dieses VI in lustiger Erinnerung
Kann leider nicht mitlachen, dann bei mir hängt sich Labview schon bein Aufruf dieser VIs auf - was mir vorher noch nie passiert ist. Liegt vielleicht daran, daß ich LV 2010 verwende, oder WIN7 32bit...
Edit: Das "100er.vi" kam jetzt nach ca 2 Minuten Ladezeit doch noch. Habs gleich mal kurz entschlackt: