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 bin neu bei LabVIEW und bin auf ein Problem gestossen, dass ich mit der Suchfunktion des Forums leider nicht lösen kann.
Worum geht es?
Ich arbeite an einem Programm, mit dem man Messdaten analysieren soll. Ich habe dafür mehrere unterschiedliche Messungen gemacht, die jeweils eine Messzeit von etwa 5 Sekunden haben. Im angehängten Bild "Messung" kann man die graphische Oberfläche und die Darstellung des Signals erknennen.
Die weiße Linie gibt die Spannung wieder und somit den Taktzyklus der Maschine.
Momentan stellt er mir die gesamte Messung (ca. 5 Sekunden) dar. Ich brauche für die Analyse allerdings nur einen Taktzyklus. Ich habe deshalb zwei Regler erstellt (oben am Rand von Messung zu erkennen) mit denen ich manuell nur den Ausschnitt eines Taktzyklus erkennen kann. Das ist aber leider nervig und ungenau.
Wobei ich also Hilfe brauche ist ein kleines Programm, dass quasi als Filter fungiert und das Signal auf einen Taktzyklus "zurechtschneidet".
Im Bild "Messung2" ist der Ort zu sehen, wo es implementiert werden soll.
Der eingehende Signalverlauf hat drei Attribute, wobei das erste die Spannung wiedergibt und damit das ausschlaggebende sein soll nach dem gefiltert wird.
Was ist ein Taktzyklus?
Beginn: die SPannung geht von nahezu 0 auf 10
Ende: die SPannung steigt wieder von 0 auf 10
also quasi ein Berg und ein Tal
Ich hoffe Ihr könnt mir helfen und ich habe das Problem verständlich beschrieben.
WIe gesagt ich bin sehr neu und beschäftige mich noch nicht allzulange mit LabVIEW.
Dank und Gruß,
Moritz
Anzeige
15.07.2008, 14:00 (Dieser Beitrag wurde zuletzt bearbeitet: 15.07.2008 14:01 von Grobi.)
Du bestimmst die Periodendauer des Taktes mit dem Baustein: Einzelfrequenz extrahieren.
1/f ergibt dann schonmal die Dauer eines Zyklus.
Dann bestimmst du mit dem Trigger Baustein den Zeitpunkt eines Nulldurchganges.
Anschließend wird ab der ermittelten Position für 1/f das Signal ausgeschnitten.
Du hast nun nur noch einen Taktzyklus.
Obs funktioniert? Keine Ahnung war nur so eine Idee, vielleicht hilft es dir weiter.
Was wohl auch gehen sollte ist einfach beim Array mit dem Taktsignal positive Flanken suchen, die jeweiligen Indexe herausnehmen und anschließend vom Datenarray ein Signal zwischen zwei Flankenindexen herausfiltern.
Das klappt jedoch nur, wenn beide Arrays das gleiche t0, sowie delta_t haben. (was dem Anschein nach bei dir der Fall ist)
A few weeks of developement and testing can save a WHOLE afternoon in the library!
@ Grobi, ich werde versuchen deine Idee umzusetzen und dann hier berichten, ob es funktioniert. Super auch das Bild, wie gesagt bin Laie, werde versuchen das nachzubauen.
@Kvasir, hört sich gut an, leider verstehe ich das aber nicht. Mein Wissen ist wirklich sehr begrenzt, da ich das Programm nur erweitere und nicht selber geschrieben habe. Zudem ist dies meine erste Erfahrung mit LabVIEW. Vielleicht könntest du deine Idee etwas laienhafter darstellen, oder grafisch skizzieren, wie Grobi das gemacht hat.
Nochmals Danke, Berichte über Erfolg/Misserfolg werden folgen...
ich habe eben versucht deine Konstruktion nachzubauen Grobi.
Leider haben sich Probleme ergeben.
Wie man im Anhang erkennen kann, kommt LabVIEW mit den Verbindungstypen nicht so ganz klar. Ich habe versucht das Array irgendwie umzuwandeln, damit es funktioniert, es aber leider nicht hinbekommen.
Weiss jemand, wie das gehen könnte?!
Dank und Gruß,
Moritz
16.07.2008, 09:05 (Dieser Beitrag wurde zuletzt bearbeitet: 16.07.2008 09:12 von Grobi.)
das liegt daran, dass dein Signlaverlauf noch in einem Arary steckt.
Hol mal mit dem Baustein Array indizieren den Signalverlauf (Eingangssignal)
daraus und schließ es dann an die nachfolgenden Bausteine an.
mfG
Robert
edit:
Ich habs grad mal getestet und anstatt des Eingangssignals einen Sinusgenerator angeschlossen.
Es müsste funktioneren. Graph 1 ist vor der Bearbeitung und Graph 2 danach.
Habe das Problem der Verbindungen doch noch selber gelöst, zwar etwas unschöner als Du, aber naja
Wenn ich das Programm jetzt laufen lasse bekomme ich allerdings eine Fehlermeldung --> Anhang.
Kann das vielleicht damit zusammenhöngen, dass meine Messdaten nicht exakt zwischen o und 10 schwanken, sondern 0 ca 0,032446 entspricht und 10 etwa 9,622145 ?! Das sind AUszuüge aus meiner Messreihe.
Habe versucht deine Array Aufschlüsselung zu implementieren, wie füge ich denn nachher alle 8 Signale wieder zu einem Array zusammen?
Dank und Gruß,
Moritz
16.07.2008, 10:11 (Dieser Beitrag wurde zuletzt bearbeitet: 16.07.2008 10:14 von Grobi.)
dein Eingangssignal ist ja nicht zu 100% sauber. Nun ist es so, dass der Baustein "Einzelfrequenz"
dann auch keinen 100% geraden Wert liefert. Somit sind sehr geringe Ungenauigkeiten vorhanden.
Der Baustein "Signalverlaufsabschnitt lesen" schaut nun ob die von dir angegebene Dauer 1/f ein
vielfaches vom dt (zeitlicher Abstand zwischen 2 Abtastpunkten deines Signals) ist. Ist dies nicht
der Fall spuckt er dir einen Fehler aus.
Schließ an den Baustein mit dem Abschnitt lesen einen Fehlerbehandler an den "errour out" an, der
auf kein Dialog steht, damit du nicht bei jedem Durchlauf diese Meldung erhälst.
mfG
Robert
edit:
Zitat:Habe versucht deine Array Aufschlüsselung zu implementieren, wie füge ich denn nachher alle 8 Signale wieder zu einem Array zusammen?
Das kannst du machen indem du "Array erstellen" einfügst, diesen Baustein kannst du nach unten hin aufziehen und deine Signale
dort anschließen.
Thema Fehlermeldung:
Ich habe, genau wie du gesagt hast, einen Fehlerbehadler angeschlossen und keine Fehlermeldung mehr erhalten. Allerdings hat die Fehlermeldung intern dazu geführt, dass die innere große Case Struktur im Programm Signalverlaufsabschnitt lesen nicht auf "False", sondern auf "True" steht. Konkret hat das Programm also die Fehlermeldung nicht mehr ausgespuckt, aber auch sonst nichts gemacht.
Ich habe das Problem gelöst indem ich anstatt des Vergleichs, der eine boolsche Variable ausgegeben hat, einfach eine Variable mit "False" deklariert habe.
(Siehe Bild im Anhang)
Geht das so?
Nun läuft das Programm durch, allerdingsgibt das Programm nichts aus, d. h. anstatt mehrerer Taktzyklen wie am Anfang sehe ich nun keine mehr.
Ich habe mal die Eingänge des Blockes, der den neuen Signalverlauf erstellen soll gemessen:
34: ist das Eingangssignal, welches bearbeitet werden soll
33: entspricht t0 (ich weiss nicht, was das ist)
36: dies ist der Index(0), ab hier soll das neue Signal also starten
37: dies ist die Länge des Arrays
36&37: sie ergeben zusammen die Signalverlaufskomponente, die als 35 dargestellt wird und 0 ist, weil 36 = -37 ist.
Ich denke hier liegt auch irgendwie das Problem, nach meinem Verständnis baut er halt das neue Signal über eine Zeitachse mit dem Wert 0, also keine Ausgabe.
Hast Du eine Idee, woran das liegen könnte. Er scheint ja Probleme damit zu haben die Taktzyklen zu erfassen, vielleicht muss ich die Parameter der Triggerflankenerkennung verändern.
Anbei nochmal ein kleiner Auszug meiner Messdaten als Bild.