Guten Tag! Ich bin zurzeit als Werksstudent tätig. Meine derzeitige Aufgabe sieht folgendermaßen aus: Ein Vibrationsaufnehmer gibt in unregelmäßigen Abständen eine aufklingende Schwingung und dann eine abklingende Schwinung aus. Der Pegel beträgt +-10V. Um das Signal analysieren zu können und Aussagen treffen zu können sollen die Daten mittels LabVIEW und einer DAQmx-9205 erfasst werden. Dabei soll das Programm folgende Funktionen unterstützen: 1. Anzeige Life-Signal, 2.Triggern auf eine Vibration(dh wenn aufklingende Schwinung bestimmte Schwelle überschreitet) 3.einstellbare Anzahl an Schwingungen müssen oberhalb einer Grenze liegen damit Trigger Ende, 3. Pre- und Posttrigger , 4. Darstellen des kompletten getriggerten Signals 5.Speichern des getriggerten Signalverlaufs(dh also quasi die auf-und abklingende Schwingung + Pre - und Posttriggersamples), 6. mehrmaliger Programmablauf möglich
Ich bin völliger Anfänger in LabVIEW und habe mich zunächst einmal in die Grundlagen eingearbeitet. Das Life-Signals des Vibrationsaufnehmers darstellen und auf Threshold triggern habe ich mit den DAQmx-Vi's gelöst. Doch nun stehe ich an einem Punkt und komme seit zwei Tagen einfach nicht weiter.
Wie löse ich die anderen Anforderungen?
Wie muss der grundsätzliche Aufbau des Programms aussehen( Schleifen, Sequenzen???)
Da das ganze in 3 Wochen fertig sein muss stehe ich etwas unter Zeitdruck. Ich hoffe ich bekomme von euch hilfreiche Tipps bzw Ansätze!!!!
Hallo,
weißt du nicht, wie du deine Ideen in Code umsetzen sollst? Oder weißt du noch gar nicht, wie du die Aufgabenstellung angehen sollst?
1. hast du schon fertig
2. hast du auch schon fertig
3. Irgendwie unklar formuliert. Vorgabe ist Anzahl der Schwingungen? Zählen könnte man mit einer weiteren Abfrage Ualt>Uschwelle UND Uneu<=Uschwelle (abfallende Flanke) in Ergänzung zu 2, um die positiven Amplituden zu erfassen. Oder die Maxima erfassen (siehe Mathe "Kurvendiskussion" = Extremwerte, Scheitelpunkte)
4. Pre-/Posttrigger unklar formuliert: willst du vor/nach dem eigentlich Triggern lediglich die Schwingung darstellen, aber nicht auswerten? Dann weitere Trigger wie in 2 und 3 definieren
5. Signaldarstellung geht ganz einfach mit einem Chart, Graph oder XY-Diagramm, wenn du die Werte vorher als Array oder Waveform gespeichert hast
6. Speichern in eine Datei? Geht auch ganz einfach mit vorhandenen VIs (Text, binär, tabellenform, ...). Schau mal in Gruppe "File IO"
7. Loop until stop??
Zum allgemeinen Programmaufbau gibt es viele Beispiele. Schau dich mal in deiner Enteicklungsumgebung um. Je nach LV-Version und Paket (ich weiß nicht, womit du arbeitest) gibt es auch viele Beispiele und optionale Tools wie "Signalanalyse", die deine Programmiererfahrung u.U. erheblich vereinfachen können ;-)
Ansonsten bekommt ein Werksstudent bestimmt Unterstützung von einem erfahrenen Betreuer ;-)
Hallo zusammen. Ich habe mal mein ersten Ansatz gepostet. Wie zu erkennen ist möchte ich, wenn der Trigger feuert, dh eine bestimmte einstellbare Schwelle ober- oder unterschritten ist, beginnen die Messwerte in ein Array zu schreiben. Die Abbruchbedingung für das Speichern muss noch erzeugt werden. Doch auch wie sich ein Abbruch bei einer bestimmten Bedingung realsieren lässt ist mir noch unklar. Aber das ist im Moment nicht mein Problem. Mein derzeitiges Problem ist, dass die Start der Speicherung sehr ungenau erfolgt. Habe ich sehr steile Peaks in meinem Signal, liegt der erste Wert in meinem Array deutlisch über der Triggerschwelle. Dh zwischen dem "Feuern" des Triggers und dem Beginn der Datenspeicherung wurden schon neue Samples gelesen.
Wie erreiche ich nun ein sofortiges Speichern nach dem der erste Wert die Triggerschwelle überschritten hat????
Warum erzeugst du nicht einen Impuls für die Datenspeicherung, der mit der Bedingung U>=Startschwelle startet und erst wieder zurückgesetzt wird, sobald U<=Stopschwelle ist. Wenn du die Stopschwelle etwas unter die Startschwelle setzt, kannst du ein "Prellen" durch eventuelles Signalrauschen eliminieren, ähnlich einem Zweipunktregler.
Zitat:Habe ich sehr steile Peaks in meinem Signal, liegt der erste Wert in meinem Array deutlisch über der Triggerschwelle.
Irgendwo musst du ja eine Triggerschwelle festlegen. Wenn deine Flanken zu steil sind, kannst du ja höher Abtasten (=höhere Samplingrate), um den Verlauf genauer aufzulösen.
Zitat:Dh zwischen dem "Feuern" des Triggers und dem Beginn der Datenspeicherung wurden schon neue Samples gelesen.
Du kannst natürlich auch mit dem Trigger eine Datei öffnen und die Werte sofort reinschreiben und wieder schließen, sobald der Stop-Trigger ausgelöst hat. Oder du trennst das Sampling von der Datenspeicherung und übergibst das Array mit den Messwerten an einen separaten Thread (=Loop), z.B. als lokale Variable.
Zitat:Irgendwo musst du ja eine Triggerschwelle festlegen. Wenn deine Flanken zu steil sind, kannst du ja höher Abtasten (=höhere Samplingrate), um den Verlauf genauer aufzulösen.
Ah das leuchtet mir ein. Dh bei steilen Peaks liegen die Samples weiter auseinander, so das es zu dieser großen Abweichung kommt. Kann ich denn mit dem derzeitigen Programm davon ausgehen das der Wert der zum Überschreiten der Triggerschwelle geführt hat auch mein 0. Element im Array ist, also die Speicherung gleichzeitig mit der Triggerung startet?
Zitat:4. Pre-/Posttrigger unklar formuliert: willst du vor/nach dem eigentlich Triggern lediglich die Schwingung darstellen, aber nicht auswerten? Dann weitere Trigger wie in 2 und 3 definieren
Dh ich möchte nachher ein Array, oder eben irgendetwas wo die Daten gespeichert sind, haben was sich zusammensetzt aus:
1. Werten vor Trigger
2. Werten von Trigger Start bis Ende
3. Werten nach Trigger Ende
Im Moment erfasse ich mit dem derzeitigen Programm ja nur Werte von Trigger Start an. Um auch Werte vor dem Trigger-Event speichern zu können müsste die Datenspeicherung doch kontinuierlich erfolgen und hat dann der Trigger gefeuert müsste ich irgendwie eine bestimmte Anzahl an Samples vor dem Triggerereignis extrahieren und daran die Werte nach dem Trigger-Event anhängen.
Oh man ist das kompliziert. Wie gehe ich da am besten vor?
So ich habe mal versucht ein halbwegs lauffähiges Programm zu erstellen. Dh beim Ausführen erledigt es auf den ersten Blick einen Teil der og Anforderungen. Was dem ganzen noch fehlt sind Posttrigger, Retriggerbar und Speicherung der Triggersignale in einer Datei.
Ich möchte gerne mal eure Meinungs zu meinem bisherigen "Werk" hören.
Ist das ganze einigermaßen "professionell" gelöst oder ist es völliger Unsinn das Problem in dieser Art umzusetzen ?
Ich bin für jegliche Art von Kritik und Verbesserungsvorschlägen offen. Schließlich möchte ich was lernen
Negative Kritik:
1. Das VI ist viel zu riesig. Eine Richtlinie ist, dass das Blockdiagramm nicht größer als eine Bildschirmgröße sein soll. Wenn es mal größer sein sollte, dann bitte nach rechts erweitern. Den Rest kann man mit SubVI's machen.
2. Viel zu viele (sinnlose) lokale Variablen, die Du durch Schieberegister oder einfache Durchverdrahtung vermeiden könntest.
3. Viel zu verschachtelt. Bei einer State Machine hast Du eine (!) Whileschleife mit einer Case-Struktur (optional mit einer Eventstruktur) und das war's.
Bei Dir ist eine Sequenz im Case, dieser wiederum in einer Sequenz, welche in einer Whileschleife ist, die sich in einem Case befindet, der auch wieder in einer Whileschleife ist, die Du in einer Sequenz plaziert hast. Das ist schon krass.
Positive Kritik:
Du bist keiner der Homework-Hustler, sondern möchtest echt was lernen. Dazu empfehle ich Dir dringendst, Dich mal mit der Vorgehensweise der LabVIEW-Programmierung zu befassen, am besten auf einem / mehreren Lehrgängen. Wenn nicht, dann schau' Dir einfach mal ein Buch oder diverse Beispiele hier im Forum an.
Gruß Markus
' schrieb:Ich bin für jegliche Art von Kritik und Verbesserungsvorschlägen offen. Schließlich möchte ich was lernen
Zitat:Negative Kritik:
1. Das VI ist viel zu riesig. Eine Richtlinie ist, dass das Blockdiagramm nicht größer als eine Bildschirmgröße sein soll. Wenn es mal größer sein sollte, dann bitte nach rechts erweitern. Den Rest kann man mit SubVI's machen.
2. Viel zu viele (sinnlose) lokale Variablen, die Du durch Schieberegister oder einfache Durchverdrahtung vermeiden könntest.
3. Viel zu verschachtelt. Bei einer State Machine hast Du eine (!) Whileschleife mit einer Case-Struktur (optional mit einer Eventstruktur) und das war's.
Bei Dir ist eine Sequenz im Case, dieser wiederum in einer Sequenz, welche in einer Whileschleife ist, die sich in einem Case befindet, der auch wieder in einer Whileschleife ist, die Du in einer Sequenz plaziert hast. Das ist schon krass.
Das habe ich mir fast gedacht!
Zitat:Du bist keiner der Homework-Hustler, sondern möchtest echt was lernen. Dazu empfehle ich Dir dringendst, Dich mal mit der Vorgehensweise der LabVIEW-Programmierung zu befassen, am besten auf einem / mehreren Lehrgängen. Wenn nicht, dann schau' Dir einfach mal ein Buch oder diverse Beispiele hier im Forum an.
Mir fehlt leider die Zeit und das Geld für solche Lehrgänge. Ein Buch habe ich mir schon besorgt und diverse Beispiele zudem angeschaut. Mh aber anscheinend habe ich dabei nicht viel gelernt
. Allerdings fand ich die Beispiele bisher nicht so komplex wie meine Problemstellung. Aber vielleicht kommt es mir auch nur so schwer vor.
Lerne möchte ich auf jeden Fall was, aber das ist eig mein persönliches Interesse. Die andere Sache ist das das Programm in 3 Wochen laufen muss!
Ist es denn zu empfehlen einen Zustandsautomaten bei meiner Problemstellung zu verwenden?
Ist die Sache an denn an sich gut gelöst (Pretrigger, Trigger, Speichern der Werte in Arrays, 1 Sample pro Zyklus) und nur die Strukturierung ein wenig wüst?????
Guten Morgen zusammen! Ich habe mal begonnen das ganze in einem Zustandsautomaten zu implementieren.
Ich möchte nun gerne mal wissen ob die Vorgehensweise so korrekt ist!
Ist es nötig in jedem Case die Durchverdrahtung der Schieberegister zu erstellen?
Ich bin auf eure Antworten gespannt
Das sieht doch schon mal ganz anders aus.
Du solltest die Schiebergister schon durchverdrahten. Schnell geht das, wenn Du am rechten Tunnel folgendes machst (nach Rechtsklick auf Tunnel, bzw. unausgefülltes Rechteck).
[
attachment=20693]
Dann kannst Du mehrere Cases auf einmal verdrahten.
Gruß Markus
' schrieb:Guten Morgen zusammen! Ich habe mal begonnen das ganze in einem Zustandsautomaten zu implementieren.
Ich möchte nun gerne mal wissen ob die Vorgehensweise so korrekt ist!
Ist es nötig in jedem Case die Durchverdrahtung der Schieberegister zu erstellen?
Ich bin auf eure Antworten gespannt