Datenerfassung - dynamische Arraygröße - Druckversion +- LabVIEWForum.de (https://www.labviewforum.de) +-- Forum: LabVIEW (/Forum-LabVIEW) +--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein) +---- Forum: Datenerfassung (DAQ) (/Forum-Datenerfassung-DAQ) +---- Thema: Datenerfassung - dynamische Arraygröße (/Thread-Datenerfassung-dynamische-Arraygroesse) |
Datenerfassung - dynamische Arraygröße - krys - 10.01.2008 11:32 Moin Habe eine kleine frage und hoffe auf ein Tip Ich benutze eine PCi 6133 karte und möchte aus 6 Kanallen die Spannungen erfassen. Das ist mir auch gelungen , aber ich muss mehrere perioden in en 2D Array speicher. 1 Periode 1 Zeile, 2 Periode 2 Zeile usw.. Die Periodenanzahl steht nicht fest , dass heißt der 2D array soll nicht fest sein sondern erweitbar zb von 1 bis 1000 Zeilen. Die genaue Zahl ist nicht bekannt. Hat jemand eine Idee wie man bei LabVIEW dynamische Arrays hinbekommt ( bei "c" ist es zb. "mallock" ) ?? Gruß Krys Datenerfassung - dynamische Arraygröße - Y-P - 10.01.2008 11:40 Ich habe es nicht genau verstanden, was Du meinst, weil ich mich in C so gut wie gar nicht (mehr) auskenne. Aber so wie ich es verstanden habe, suchst Du so etwas wie die Funktion "Build Array". Probier' doch das mal. Oder meinst Du doch was anderes? Gruß Markus Datenerfassung - dynamische Arraygröße - eg - 10.01.2008 11:50 In LabVIEW werden die Arrays fast automatisch dynamisch verwaltet. Das Array-Element überträgt gleichzeitig die Arraygrösse mit. Da musst du dir keine gedanken darüber machen. Aber umgekehrt, wenn du es statisch haben willst, musst du etwas überlegen (nur bestimmte VIs benutzen). Mit Build Array kannst du einfach dein Array erweitern ohne etwas besonderes dabei zu programmieren. Datenerfassung - dynamische Arraygröße - krys - 10.01.2008 12:56 Vieleicht was nicht eindeutig, oder mag sein ,dass ich zu kompliziert denke. Ich erfasse periodenweise Daten , dass heist eine Periode eine Zeile von Daten (zb 100 Werte) Bei nächsten for schleifendurchlauf erfasse ich wieder eine Periode also wieder eine Zeile von 100 Daten. Die zusammen zu fügen ist klar,es wird 2D array mit zwei Zeilen und 100 Spalten. Aber die Anzahl von for schleifendurchläufe wird von den Anwender angegeben. d.h von mein 2D Array wird verschieden Zeielnanzah haben, jedes mal anders ,nicht fest. Mein Problem ist die Zeilen mit den 100 Werten zusammenzufügen, weil ich Zeilenanzahl nicht fest gelegt ist. Die Zeilenzahl wird in den Program gelesen aber kann beliedig groß sein Als bei jedem Programmstart wird mein 2D array andere Zeilenzahaben. Geht es so was überhaupt?? Oder ist es einfache die "x" Zeilen mit je 100 Werten (Spalten) in eine Datei zu speichen ?? gruß krys Datenerfassung - dynamische Arraygröße - IchSelbst - 10.01.2008 15:55 ' schrieb:Geht es so was überhaupt??Es geht beides. Erstens: Wenn du nicht weist, wie viele Zeilen du haben wirst, kannst du ganz einfach das Element "Array erstellen" verwenden. Auf den oberen Eingang gibt du das bestehende 2d-Array und auf den unteren Eingang die neue Zeile, die ja ein 1D-Array ist. Das Ergebnis ist ein neues 2D-Array mit der neuen Anzahl von Zeilen. Das Element "Array erzeugen" musst du einstellen auf "Elemente verbinden" (siehe Eigenschaftsmenü des Elementes). Dieses Verfahren entspricht einem dymanischen Array. Vorteil: Einfach. Nachteil: Rechenintensiv wegen ständiger Speicherorganisation. Zweitens: Wenn du von vorne herein weist, wie viele Zeilen du haben wirst (For-Schleife), dann benutzt du die Funktion "Array initialisieren" und gibst für jede Dimension eine Größe an. In der For-Schleife benutzt du dann die Funktion "In Array ersetzen". Dieses Verfahren entspricht einem statischen Array. Allerdings wird auch dieses Array dynamisch verwaltet. Vorteil: Schnell, wenn weniger Speicheroperationen. Nachteil: Geringfügig komplizierter. Hinweis: In beiden Fällen besitzt die For-Schleife ein Schieberegister, das die Daten des Array während des Ablaufes der Schleife enthält. Datenerfassung - dynamische Arraygröße - Lucki - 10.01.2008 18:07 ' schrieb:Es geht beides.Drittens: Wenn Du nicht weißt, wie viele Elemente Du haben wirst, aber trotzdem so schnell wir unter zweitens sein möchtest, dann macht man es so: Den Array auf maximal zu erwartende Größe initialisieren (z. B Nullen hineinschreiben). Dann bei der Aufzeichnung die Elemente des Array, von vorn beginnend, ersetzen. Nach Ende der Aufzeichnung die nicht überschriebenen Werte hinten abschneiden. Datenerfassung - dynamische Arraygröße - eg - 10.01.2008 18:21 ' schrieb:Drittens: Hmm, aber woher weiss man welche werte nicht überschrieben sind? Ich meine eine 0 kann auch ein Messwert sein. Oder meinst du er soll mitzählen was er überschrieben hat und was nicht? Gruß Datenerfassung - dynamische Arraygröße - Lucki - 10.01.2008 18:25 ' schrieb:Hmm, aber woher weiss man welche werte nicht überschrieben sind? Ich meine eine 0 kann auch ein Messwert sein. Oder meinst du er soll mitzählen was er überschrieben hat und was nicht?Mitzählen muß ich ja sowieso, denn ich muß ja bei jeder folgenden Messung wissen, in welchen Index des Arrays ich den zu ersetzenden Werte hineinschreiben muß. Folglich weiß ich am Ende auch bis zu welchem Index ich gekommen bin und kann den Rest abschneiden. Edit: Und hier ein selbstgestricktes VI: (Mußte die Uhr mit hineinnehmen, damit man manuell stoppen kann, ohne daß schon 10000Werte erfasst wurden) [attachment=10600] Das VI ist V8. Mit V8.5 läßt sich das noch besser machen: For-Schleife mit vorzeitigem Abbruch verwenden, IN-Line Struktur verwenden Datenerfassung - dynamische Arraygröße - Lucki - 11.01.2008 08:44 ' schrieb:Drittens: Und hier das Beispiel dazu: [attachment=10597] Der Stop in den Beispielen muß in der Praxis kein manueller Stop sein, er symbolisiert hier nur das Nichtwissen über die endgültige Größe des Arrays während der Array-Erzeugung. Bild1: Die übliche Art der Array-Ezeugung, die leider wegen der fortlaufenden Reorganisation des Speichern mit steigender Arraygröße immer langsamer wird. Bild 2: So ist es schneller: Initialisierung des Arrays auf maximal zu erwartende Größe, dann hinzufügen der neuen Elemente durch Ersetzen, abschließend Abschneiden der nicht benutzten oberen Elemente. Bild 3: Mit LabVIEW 8.5 wird das alles ganz einfach: Initialisieren, ersetzen, Abschneiden; das alles macht die neue Struktur "For loop with conditional terminal" ganz automatisch. Datenerfassung - dynamische Arraygröße - krys - 13.01.2008 13:33 Hats gelapt Danke und Gruß an alle Krys |