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!
Hallo
Ich versuche ein LabVIEW-Programm zu erzeugen, welches mit die Reaktion eines Systems auf eine Rampe
(z.B. 0-10V, in 20s) darstellt.
Ich habe das im Moment alles in eine For-Schleife gepackt.
D.h. aus Schrittweite und Endwert der Rampe berechne ich die Anzahl der Schleifendurchläufe.
In der Schleife wird dann der aktuelle Wert augegben und auch ein neuer Wert gelesen.
Die erscheint mir aber nicht optimal, da
- es problematisch ist eine definierte Abstastrate z.B. 10ms zu erzeugen
- das schreiben von Einzelwerten gegenüber "kontinuierlicher Ausgabe" unnötig viel Zeit beansprucht
Gibt es die Möglichkeit, das VI so abzuändern, dass es (HW-getaktet, z.B. 10 ms) eine Rampe ausgibt und gleichzeitig
(HW-getaktet, 10 ms) die Eingangsgröße darstellt.
Als DAQ-Karte wird die PCI-6221 unter LabVIEW 8.2 verwendet
Studiere die Beispiele unter Signalerfassung ... --> DAQmx --> Synchronisierung --- Multifunktion
z-B Multifunktion AI/AO
Damit Du nicht lange herumraten mußt, wie die Synchronisation funktioniert:
1. AI und AO werdem in getrennten Tasks konfiguriert. AO bekommt seine Startflanke von AI
2) AO bekommt Starterlaubnis, läuft aber nicht an, da die Startflanke fehlt.
3) AI wird gestartet. Da damit auch AO seine Startflanke erhält, beginnen beide synchron zu laufen.
Ich würde Dir empfehlen, auf einem Testboard Ai und AO miteinender zu verbinden oder z.B einen RC-Tiefpass dazwischenzuschalten, damit Du dir ansehen kannst, wie schön es funktioniert.
Hallo Lucki, erst einmal vielen Dank für die schnelle und sehr hilfreiche Antwort!
Habe das Beispiel jetzt so modifiziert, dass eine langsame Rampe ausgegeben wird. Die Ein- und Ausgabe ist jetzt synchron und äquidistant :-) So weit so gut!
Ein Problem ist aber jetzt, dass ich die Eingangsdaten jetzt immer in Blöcken (z.B. 1000) Werte erhalte.
Das ist ein Problem weil:
- ich die gesamten Daten fortlaufend anzeigen will (und nicht nur die letzen 1000 Werte)
- das Signal geglättet werden soll (MA)
- und ich online die Nulldurchgänge zählen will
Gibt es da einen Trick, oder muss ich das jetzt alles Blockweise erledigen?
Vielen Dank!
' schrieb:Studiere die Beispiele unter Signalerfassung ... --> DAQmx --> Synchronisierung --- Multifunktion
z-B Multifunktion AI/AO
Damit Du nicht lange herumraten mußt, wie die Synchronisation funktioniert:
1. AI und AO werdem in getrennten Tasks konfiguriert. AO bekommt seine Startflanke von AI
2) AO bekommt Starterlaubnis, läuft aber nicht an, da die Startflanke fehlt.
3) AI wird gestartet. Da damit auch AO seine Startflanke erhält, beginnen beide synchron zu laufen.
Ich würde Dir empfehlen, auf einem Testboard Ai und AO miteinender zu verbinden oder z.B einen RC-Tiefpass dazwischenzuschalten, damit Du dir ansehen kannst, wie schön es funktioniert.
' schrieb:Ein Problem ist aber jetzt, dass ich die Eingangsdaten jetzt immer in Blöcken (z.B. 1000) Werte erhalte.
Dann setzte halt mal den Wert "Samples To Read" etwas kleiner!
' schrieb:- ich die gesamten Daten fortlaufend anzeigen will (und nicht nur die letzen 1000 Werte)
Für den Anfang, mach etwas in der folgenden Art:
Wenn das läuft, dann denk mal über deine weiteren Fragen nach, zum Glätten gibt es Filter, und Zählen von Nulldurchgängen ist ja wohl dann auch mgl.
MfG, 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!
' schrieb:Für den Anfang, mach etwas in der folgenden Art:
[attachment=34254:Image01.png]
aber nur für den Anfang!<nörgel>
Je nachdem wie lang die Messung läuft und wie viele Samples die Erfassung pro Sekunde liefert läuft mit dem Programm mehr oder weniger schnell dein Hauptspeicher voll.
bei 1000 Hz sind das z.B. 8000 Byte --> ca 7 kB pro Sekunde
bei 100 kHz sind das schon ca. 780 kB pro Sekunde oder 45 MB / Minute
das sollte man immer im Hinterkopf behalten.
Falls das ein "Dauerläufer" ist, ist die Methode mit "build Array" ein echtes Problem und kostet zudem extra Performance weil LV ständig neuen Speicher anfordern muss um das Array zu vergrößern. Besser ist es, einen Ring-Speicher zu verwenden, bei dem ab einer bestimmten Datenmenge die ältesten Werte wieder überschrieben werden.
Zunächst erst mal meine Gratulation, daß Du es gechafft hast. Jetzt geht es nur um Peanuts.
Zu Deinen Problemen:
Zitat:- ich die gesamten Daten fortlaufend anzeigen will (und nicht nur die letzen 1000 Werte)
Das ist nun leider eine Eigenschaft des von Dir (und im Beispiel) verwendete Graphen. Man kann natürlich, so wie hier vorgeschlagen, einen Puffer/Ringpuffer zur Zwischenspeicherung größerer Datenmengen verwenden. Das unmittelbar Naheliegende ist aber, den Signalverlaufsgraphen durch das Signalverlaufsdiagramm (Strip-Chart) zu ersetzen. Dort ist der "Ringpuffer" bereits eingebaut, die Größe das Puffers kannst Du mit der rechten Maustaste ( Historienlänge) wählen. Beachte auch die verschiedenen Aktualisierungsmodi unter "Eigenschaften". (Achtung: Um die Zeit im gewünschten Format anzuzeigen, muß man mit viel Geduld tricksen. Das Normale ist leider das Format Jahr/Monat/tag/Stunde/Minute/sekunde auf drei Stellen nach dem Komma, und das ist das Letzte, was man braucht und eigentlich ist es auch nicht vernünftig anzeigbar. Siehe meine gewählte Einstellung unter "Eigenschaften")
Zitat:- das Signal geglättet werden soll
Es gibt in den Funktionen "Glättungsfilter". Sie glätten den Verlauf, ohne die Datenmenge zu reduzieren. Du könntest auch die Daten z.B 10stückweise einlesen und davon sofort den Mittelwert bilden, das hast Du dann von Anfang an 10 fach weniger Datenpunkte. Allerdings dann dafür sorgen, daß das Diagramm nicht zu oft upgedatet wird, maximal 10 mal pro sekunde. Also z.B 100 gemittelte Punkte sammeln, dann updaten.
Zitat:- und ich online die Nulldurchgänge zählen will
Auch dafür gibt es eine fertige Funktion, bitte selbst suchen.