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 würde mich sehr freuen, wenn Ihr mir helfen könntet. Aber zuerst möchte ich meinen Dank an Euch ausdrücken, dass Ihr Eure Zeit opfert um mehr oder weniger fremden LabVIEW- Nutzern zu helfen.
Ich schreibe gerade meine Abschlussarbeit. Ich sags lieber vorher, dass ich leider in meinem Studium nur sehr wenig mit Elektrotechnik und gar nicht mit LabVIEW zu tun hatte.
Jedenfalls ist es so, dass ich mit LabVIEW folgende Schritte abarbeiten soll:
- Erzeugen eines fünfzyklischen Sinus- Signals, dass mit einem Hanningfenster gefenstert wurde
- dieses soll über DAQ an einen Piezo weitergegeben werden (allerdings habe ich diesen Schritt erstmal ausgelassen, da ich noch nicht über die Treiber etc. und somit die DAQ- Vis verfüge)
- die Piezos sind in ein Bauteil integriert und erzeugen dort Körperschallwellen
- an einer anderen Stelle im selben Bauteil sind andere Piezos angebracht, die die Wellen messen
- die gleiche Messung soll viele Male (20- 50 mal) unter identischen Bedingungen durchgeführt werden, um Rauschen etc. ausgleichen zu können (im Anschluss ist eine Mittelung dieser Signalverläufe durchzuführen und in einem Graphen darzustellen)
An diesem Schritt komme ich leider nicht weiter. Das Erzeugen des Signals hatte mich bereits einige Zeit gekostet, aber ich hatte es allein hinbekommen.
Ich hatte das Forum schon durchforstet, weil es ja einige ähnliche Beispiele gibt, nur enthalten die so viele andere Elemente, dass ich hier noch vom hundertsten ins Tausende komme und es mir schwerfällt die dortigen Erkenntnisse auf meinen konkreten Fall zu übertragen.
Meine gegenwärtigen eigenen Überlegungen sind folgende:
- ich muss sicher einen For LOOP verwenden, der mit Schieberegister arbeitet
- das ganze muss doch sicherlich über Arrays erfolgen, da mit diesen doch sicher am besten mathematische Operationen durchgeführt werden können
- ich könnte vielleicht für die Mittelwertbildung diese MEAN- Funktion verwenden
E hakt an folgenden Punkten:
- ich habe es leider nicht hinbekommen am Ausgang des Hanningfensters, ein zweidimensionales Array zu erzeugen (mein Vorgehen war mit RMT an Ausgang gehen und Create- Indicator)- jedenfalls wurde nur ein 1D- Indicator ausgegeben – zumind. stelle ich mir vor, dass dann jedem t eindeutig eine Amplitude zu gewiesen werden kann->deshalb 2D
- ist sicher ne blöde Frage, aber bei der Schleife wie sie gegenwärtig ist, wird da wirklich 10 mal hintereinander (N=10) dieses gefensterte Sinussignal erzeugt, weil auf dem Graphen ja immer nur ein einiger fünfzyklischer Abschnitt zu sehen ist
- wenn ich ein Schieberegister verwenden würde, was schreibe ich denn da links an dieses Pfeilsymbol vom Schieberegister, müsste da ein mit Nullen besetztes Array stehen?
Ich würde mich wahnsinnig freuen, wenn ihr mir helfen könntet. Ich habe es mir hier wirklich nicht leicht gemacht mit diesem Posting und bin schon eineinhalb Wochen dabei, mich hier in LabVIEW reinzufuchsen. Da ich unter Zeitdruck stehe, würde ich mich über schnelle Antworten freuen. Also besonders über eure eigenen Lösungsvarianten, da manches was ich hier geschrieben habe, sicher falsch ist. Es wäre schön, wenn Ihr auch für den Anfang ein bisschen was in das VI schreiben könntet. Natürlich nicht zu viel, ist ja meine eigene Abschlussarbeit, die ich hier machen muss.
Vielen Dank!!
Viele Grüße
LabVIEW Beginner
PS: In dem angehängten VI habe ich mal zwei Varianten der Signalerzeugung reingehängt, denn ich weiß zwar nicht genau warum, aber ich habe im Forum gelesen, dass die Express- VI nicht so beliebt sind, obwohl sie m. E. sehr praktisch sind.
Anzeige
17.08.2012, 20:15 (Dieser Beitrag wurde zuletzt bearbeitet: 17.08.2012 20:19 von GerdW.)
Zitat:ich weiß zwar nicht genau warum, aber ich habe im Forum gelesen, dass die Express- VI nicht so beliebt sind
Ich bin einer derjenigen, die immer mal wieder von den ExpressVIs abraten. Hat vielleicht damit zu tun, dass ich mit LabVIEW angefangen habe, bevor es diese gab...
Dein VI ist aber ein gutes Beispiel zum Erklären der Ressentiments: beide gezeigten Versionen erzeugen gleiche Daten. Bei der Version ohne ExpressVI sieht man aber sofort, welche Einstellungen der Programmierer vorgenommen hat, während man beim ExpressVI erst doppel-klicken muss und dann wartet, bis sich der Einstelldialog geöffnet hat...
Der zweite Kritikpunkt ist, dass man mit den ExpressVIs auf genau die Dinge festgelegt ist, die NI dort vorgesehen hat. Sobald man nur eine Winzigkeit davon abweicht, muss man selbst programmieren - und diese Winzigkeit ist schneller da, als man vorher denkt...
Zitat:nicht hinbekommen am Ausgang des Hanningfensters, ein zweidimensionales Array zu erzeugen
Wie stellst du dir das vor? Du wendest eine Fensterfunktion auf ein Signal an: warum sollte sich der Datentyp des Signals ändern?
Zitat:zumind. stelle ich mir vor, dass dann jedem t eindeutig eine Amplitude zu gewiesen werden kann->deshalb 2D
Dein "t" ist durch die Samplerate und den Arrayindex gegeben: t= dt*Arrayindex
Zitat:wenn ich ein Schieberegister verwenden würde, was schreibe ich denn da links an dieses Pfeilsymbol vom Schieberegister, müsste da ein mit Nullen besetztes Array stehen?
Das kommt darauf an, was du haben willst...
Es gibt initialisierte und uninitialisierte Schieberegister. Wenn initialisiert, dann wird bei jedem neuen Aufruf der Schleife das Register neu initialisiert. Wenn nicht, dann sammeln sich die Daten im Register an:
Im Beispiel werden die Daten aneinander angefügt, wenn du dagegen mehrere Durchläufe mitteln willst, solltest du die Daten zu einem 2D-Array zusammenfügen. Einfach mal einen Rechtsklick auf das BuildArray machen und die passende Option (ab)wählen...
Du schreibst zwar, was gesendet und was gemessen wird, über den Sinn und Zweck des ganzen Experiments, d.h. welche Information letztlich daraus gewonnen werden sollen, schreibst du aber nichts.
Es ist aber zu vermuten, das die Messung der Laufzeit zwischen gesendetem und empfangenem Signal der entscheidende Parameter ist.
Sollte das der Fall sein, dann genügt es nicht, Senden und Empfangen einfach irgendwie zu starten. Die beiden Tasks müssen exakt synchron gestartet werden. Das ist die eigentliche Herausforderung bei dieser Aufgabe, das andere, also z.B. Deine Frage zur Mittelwertbidung aus mehreren Exprimenten, ist dagegen ein Klaks.
Als Einarbeitung in die Materie empfehle ich, in den Beispielen
Signalerfassung mittels Hardware
--> DAQmx
--> Synchronisation
--> mehrere Funktionen
das passendste Beispiel zu suchen und genau zu studieren.
Als nächsten Schritt dann das Beispiel so modifizieren, dass es genau Deine Aufgabe erfüllt.
Und wie Gerd schon sagte: Mit Express-Vis kommst Du hier nicht weiter.
18.08.2012, 10:23 (Dieser Beitrag wurde zuletzt bearbeitet: 18.08.2012 10:36 von LabView Beginner.)
Aha, ich glaube ich sehe ein bisschen klarer als vorher.
Zitat:Wie stellst du dir das vor? Du wendest eine Fensterfunktion auf ein Signal an: warum sollte sich der Datentyp des Signals ändern?
Also es ist so, dass sowohl beim reinen Sinussignal als auch beim gefensterten Signal immer ein 1D- Array erzeugt wird? Wie mir jetzt erst richtig klar wird (ich habe mir die 500 Werte des Arrays mal richtig angesehen), handelt es sich, wenn ich am Ausgang des Hanning- Fensters ein 1D- Array ausgeben lasse, definitiv um die Amplitudenwerte der Schwingung, und zwar 500 Werte, gemäß der eingestellten 500 Abstastungen. Gestern dachte ich noch, er würde Zeitwerte in das Array schreiben .
So wie ich das verstehe, reicht ja dieses 1D- Array aus. Da mittele ich einfach die Werte aller 1D- Arrays eines Messblocks der erwähnten 20 bis 50 Messungen (mehr dazu habe ich unten geschrieben=).
Bloß interessehalber, wie kann man denn das von dir erwähnte Array
Zitat:Dein "t" ist durch die Samplerate und den Arrayindex gegeben: t= dt*Arrayindex
für die Zeit ausgeben lassen?
Zitat: Du schreibst zwar, was gesendet und was gemessen wird, über den Sinn und Zweck des ganzen Experiments, d.h. welche Information letztlich daraus gewonnen werden sollen, schreibst du aber nichts.
Es ist aber zu vermuten, das die Messung der Laufzeit zwischen gesendetem und empfangenem Signal der entscheidende Parameter ist.
Es geht im Allgemeinen darum, Faserverbundbauteile auf Schäden zu überwachen, also sprich ist in dem Bauteil mit einlaminierten Piezos ein Schaden macht sich das an einer veränderten Übertragungsfkt. der Übertragungsstrecke zwischen sendenden und empfangenden Piezo bemerkbar. Meine Aufgabe spielt sich aber auf geringerem Niveau ab. Da es sich um spezielle Piezos handelt, soll deren Verhalten erstmal untersucht werden. Also es handelt sich nur darum, zu sehen, was denn in welcher Form überhaupt von den ausgesendeten Wellen bei den empfangenden Piezos ankommt. Es ist deshalb nicht wichtig, dass Sender und Empfänger exakt gleichzeitig aktiviert werden, d.h. dass die Zeitfkt. zur exakt gleichen Zeit aufgezeichnet wird. Allerdings muss der Abstand zwischen den beiden Zeitaufzeichnungen konstant sein, denn ich will ja Messreihen unter gleichen Bedingungen durchführen, um eine Mittelung der Messwerte einer Übertragungsstrecke hinzubekommen (ich spreche von den erwähnten 20 bis 50 Messungen pro Übertragungsstrecke). Also dass je Abtastung auch immer die gleiche Amplitude der idealen Welle (plus Anteil durch Rauschen) dargestellt wird. Dass also keine Verschiebung auf der Zeit- bzw. Abstastungsachse auftritt. Ich kann mir vorstellen, dass je mehr einzelne Messungen des gesamten Messblocks (20 bis 50 Messungen) gespeichert werden, die Zeit ansteigt, die die CPU braucht. Macht die sich auf die eigentliche Messung bemerkbar, also sprich dass der Zeitabstand zwischen Aktivierung des Senders und der Empfängers ansteigt? Und wenn ja, was kann ich dagegen tun?
Da werde ich mich mit den neuen Erkenntnissen mal an die Lösung der Mittelwert- Geschichte machen und hoffe, dass ihr mir bei auftretenden Problemen nochmals helfen könnt.
achso, was mir noch einfällt:
entschuldigung, ich hoffe, das führte nicht zu Verwirrungen: den Signalgenerator, den ich in dem beigefügten Vi eingefügt habe, stellt das empfangene Signal dar. Denn ich wusste nicht, wie ich jetzt ein empfangenes Signal am besten darstellen kann, da ich wie bereits geschrieben noch nicht über die DAQ- Buttons verfüge (denn ich habe noch nicht den zugehörigen Treiber)
Ich hab jetzt mal ein etwas umfangreicheres VI versucht zu entwickeln. Allerdings gibt es einen Fehler drin. Ich vermute mal, es hängt mit der fehlenden Funktionalkität meines For Loop zusammen. Denn mir scheint es nicht so, als würde er hier 10mal ein Signal aussenden. Eher einmal.
Denn im Endeffekt wird im Moment für den Durchschnitt aller Messungen dasselbe Array bzw. Graph ausgegeben wie das Array bzw. Graph des gegenwärtigen Abschnitts des Messbblocks.
Wie könnte ich das lösen? Also ich will halt einmal auf Start drücken, und es werden viele Male hintereinander im Bauteil die Signale erzeugt, ohne dass ich da nochmals zwischendurch irgendwo klicken muss. Und zwischen den Abschnitten habe ich eine Wartezeit von 1000ms mal eingestellt über diese Armbanduhr, in der Hoffnung, dass das so richtig ist.
Eine Anmerkung: ich habe hier mal noch den Express- Signalgenerator verwendet, um auch eine Rauschkomponente mit drin haben, denn dies ermöglicht mir, einzelne Signalverläufe auseinander halten zu können.
19.08.2012, 13:50 (Dieser Beitrag wurde zuletzt bearbeitet: 19.08.2012 13:53 von GerdW.)
Mache dich bitte mit LV-Grundlagen wie Autoindizierung vertraut! Außerdem einfach mal die Kontexthilfe aufmachen und die dort angezeigten Funktionsnamen verwenden, dann weiß jeder sofort, wovon du redest...
Dein Beispiel sieht (nach kurzem, automatischen Aufräumen) so aus:
- die innere FOR-Loop addiert ein Array 10mal auf, dies könnte man durch eine einfache Multiplikation auch erreichen
- die äußere FOR-Loop läuft zehnmal durch, erzeugt jedesmal ein verrauschtes Signal, welches dann (betragsmäßig) verzehnfacht wird
- jetzt kommt's: durch den nicht-indizierenden Ausgangstunnel der äußeren Schleife wird nur das Array des letzten Durchlaufs nach außen gegeben (DATAFLOW!) und wieder durch 10 geteilt (also der Effekt der inneren FOR-Loop wieder aufgehoben).
Jetzt bitte nochmal mit dem vergleichen, was du eigentlich erreichen willst...