In StateMachine Daten zwischenspeichern und manuell speichern
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!
In StateMachine Daten zwischenspeichern und manuell speichern
Hallo LabView-Community,
ich arbeite seit Anfang des Jahres mit LabView (bitte verzeiht mir eventuelle Anfängerfragen und eine wirre Programmierung ;-) ) und bin dabei ein Programm zu schreiben, dass aus einem DAQ (wahrscheinlich ein USB-DAQ von NI (wir habens noch nicht hier)) drei angeschlossene Sensoren auslesen soll und nach der Messung die Daten in einem Excel-File (mit voreingestelltem Template) zu speichern.
Dafür verwende ich eine StateMachine mit der ich die Messung (mittels DAQmx-VIs) starten und stoppen, sowie Report-Settings (Name, Titel und Firma) eingeben und den Report speichern kann.
Meine Frage ist nun: Wie kriege ich es hin, dass die Daten, die im Measurement-State gesammelt werden, anschließend auch im Report-State ankommen?
Ich habe es bereits mit lokalen Variablen und Arrays ausprobiert, komme aber auf keinen grünen Zweig.
Wenn ich einfach nur eine lokale Variable zum Datenübertrag nutze, wird ja nur der aktuellste Wert zwischengespeichert.
Mit einem Array habe ich es auch schon versucht, muss aber gestehen, dass ich das noch nicht ganz durchschaut und ich kein Tutorial bisher entdeckt habe, dass eine ähnliche Funktion beschreibt.
Vielleicht hat ja jemand von euch eine Lösung. Ich wäre euch sehr dankbar
RE: In StateMachine Daten zwischenspeichern und manuell speichern
Hallo Chris,
Daten in ein Array schreiben, dafür gibt es die Funktion "IN ARRAY EINFÜGEN".
Man kann aus dem MAIN.VI nicht erkennen wann die Daten in das Array sollen.
Innerhalb der inneren While Schleife oder der äußeren While Schleife?
RE: In StateMachine Daten zwischenspeichern und manuell speichern
Hallo Freddy,
die Daten sollen so (zwischen-)gespeichert werden, dass sie in einem anderen Case verfügbar sind. Also müssen die Daten (nach meiner Auffassung) nur die innere While-Schleife verlassen. (die äußere dient ja nur zum Init und Shutdown)
Muss ich für die Funktion "in Array einfügen" mit einem Shift-Register in der inneren While-Schleife arbeiten?
RE: In StateMachine Daten zwischenspeichern und manuell speichern
Hallo Chris,
Zitat:Meine Frage ist nun: Wie kriege ich es hin, dass die Daten, die im Measurement-State gesammelt werden, anschließend auch im Report-State ankommen?
Antwort: "Schieberegister"!
Wenn du Daten von einer Iteration einer Schleife in die nächste schieben willst, nimmt man Schieberegister!
Tipp: Wenn du einen "Measurement state" haben willst, solltest du den auch so nennen - und nicht etwa "Program 1"…
Zitat:Wenn ich einfach nur eine lokale Variable zum Datenübertrag nutze, wird ja nur der aktuellste Wert zwischengespeichert.
Wieso? Eine "lokale Variable" bzw. das dahinter stehende Control speichert genau die Daten die DU dort ablegst!
Zitat:Mit einem Array habe ich es auch schon versucht, muss aber gestehen, dass ich das noch nicht ganz durchschaut und ich kein Tutorial bisher entdeckt habe, dass eine ähnliche Funktion beschreibt.
Bei dir scheint es schon beim Umgang mit Arrays ganz allgemein zu hapern. Hast du dir mal die Tutorials angeschaut, die NI für LabVIEW-Anfänger anbietet?
Zitat:die Daten sollen so (zwischen-)gespeichert werden, dass sie in einem anderen Case verfügbar sind.
Korrekt, siehe oben.
Zitat:Also müssen die Daten (nach meiner Auffassung) nur die innere While-Schleife verlassen.
Korrekt, die Daten müssen erst einmal die innere Loop im Measurement-State verlassen. THINK DATAFLOW!
Zitat:(die äußere dient ja nur zum Init und Shutdown)
Aha. Wie kommst du darauf?
Du weißt, was eine Statemachine ist und wie sie funktioniert?
@Freddy:
Zitat:Daten in ein Array schreiben, dafür gibt es die Funktion "IN ARRAY EINFÜGEN".
InsertIntoArray ist zu 80% falsch verwendet, so auch hier bei dir.
Wenn du Daten an ein Array anhängen (oder voranstellen) willst, dann nimmt man BuildArray!
InsertIntoArray ist NUR sinnvoll, wenn Daten an beliebigem Index innerhalb der Arraydaten eingefügt werden sollen!
RE: In StateMachine Daten zwischenspeichern und manuell speichern
Zitat:InsertIntoArray ist zu 80% falsch verwendet, so auch hier bei dir.
Wenn du Daten an ein Array anhängen (oder voranstellen) willst, dann nimmt man BuildArray!
InsertIntoArray ist NUR sinnvoll, wenn Daten an beliebigerm Index innerhalb der Arraydaten eingefügt werden sollen!
Ich habe mal zwei While Schleifen mit Deiner und meiner Array füllen ausprobiert.
Deine Lösung ist um ein Vielfaches schneller.
Danke wieder was dazu gelernt.
RE: In StateMachine Daten zwischenspeichern und manuell speichern
Hallo Gerd,
erstmal danke für die ausführliche Hilfe.
Zitat:Wenn ich einfach nur eine lokale Variable zum Datenübertrag nutze, wird ja nur der aktuellste Wert zwischengespeichert.
Damit meinte ich, dass ohne eine Schieberegister die Daten (innerhalb der inneren While-Schleife) aus dem DAQmx Read.vi in der lokalen Variablen doch immer wieder überschrieben werden.
Mit Schieberegister und der Build Array-Funktion sieht das dann ja natürlich schon anders aus. Hier kann ich dann das erstellte Array mittels einer lokalen Variablen in einem anderen Case wieder abfragen und erhalte alle gesammelten Daten (was ich bis dahin aber noch nicht wusste ;-)).
Zitat: Zitat:
(die äußere dient ja nur zum Init und Shutdown)
Aha. Wie kommst du darauf?
Du weißt, was eine Statemachine ist und wie sie funktioniert?
Ja, ich weiß wie eine Statemachine funktioniert ;-) ich habe mich da scheinbar falsch ausgedrückt. Die äußere While-Schleife hält das Programm schließlich am laufen. Aber die Daten (wie ich es ja bereits geschrieben habe) müssen nur die innere While-Schleife verlassen.
Zitat:Hast du dir mal die Tutorials angeschaut, die NI für LabVIEW-Anfänger anbietet?
Ich habe mir viele Tutorials von NI bereits angesehen und durchgearbeitet. Ich hab aber bisher nicht explizit nach Arrays gesucht, daher auch mein mangelndes Wissen
Ich habe jetzt die Build Array-Funktion mit Shift-Register verwendet. Ist der Ansatz so richtig?
RE: In StateMachine Daten zwischenspeichern und manuell speichern
(26.01.2016 13:47 )ChristophSchöneck schrieb: Ich habe jetzt die Build Array-Funktion mit Shift-Register verwendet. Ist der Ansatz so richtig?
Im Prinzip ja, ABER:
- Du erstellst dir jetzt ein 3D-Array! Engineering Overkill!
- Dein Schieberegister ist uninitialisiert. Wenn du diesen Screenshot als "SubVI" verwendest, dann werden bei jedem Aufruf die neu erfassten Daten zu den schon früher erfassten hinzugefügt. Suboptimal.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
RE: In StateMachine Daten zwischenspeichern und manuell speichern
Hallo Jens,
danke für die Tipps. Ich habe jetzt das DAQmx Read.vi auf Analog 1D DBL NChan 1Samp umgestellt und erhalte nun mit der gleichen Konfiguration ein 2D-Array mit den Messwerten.
Die Initialisierung des Shift-Registers habe ich nun mit einer Konstanten gelöst, die ich an den Eingang des Shift-Registers gesetzt habe. Das funktioniert aber nur mäßig, da mir schlussendlich beim Speichern in der Excel-Tabelle nur eine Reihe an Messwerten angezeigt wird (vermutlich die zuletzt aufgenommene).
Ich stehe ein bisschen auf dem Schlauch...
(Ich hab das neue Programm in einer .llb Datei verpackt, nach Forenanleitung. Ich hoffe es hat geklappt)