Hallo Leute,
wer meine bisherigen Themen verfolgt hat weiß warscheinlich um was es geht.
Nunja ich generiere Lastsprünge um ein Produkt zu testen. Um die Ergebnisse davon zu sehen nehme ich die Spannungskurve auf und soll daraus verschiedene Werte auslesen.
Den Spannungsverlauf erhalte ich als waveform graph. Aus den verschiedenen Bereichen sollte ich die Werte für Umax/min/soll und die Dauer der Regelung, sowie eine FFT des Lastbereiches zwecks Oberschwingungen auslesen können.
In dem Bild im Anhang ist die Spannungskurve rot dargestellt und in den Zeiten t1 und t2 sieht man wie einer unserer Regler in etwa reagiert.
Das größte Problem hierbei ist jetzt das ganze in die die einzelnen Bereiche aufzuteilen, das will mir einfach nicht gelingen.
Die max/min Werte und eine FFT schaffe ich dann denke ich selbst.
um die Regelungen zu erkennen macht man hier normalerweise eine Erkennung der einer Unterschreitung von 90% der vorherigen Werte bei t1 und bei t2 das gleiche mit einer 10% Überschreitung. Da das Signal sehr verrauscht ausgelesen wird müsste man zusätzlich eine Hysterese einbauen an den Stellen der Erkennung.
Hat jemand schon eine ähnliche Detektion gemacht und kann mir sagen welche Elemente man dafür benutzen könnte? Bin schon dauernd am Suchen unter Signal-Processing finde mich aber nicht wirklich zurecht.
Gruß Domi
Ich bin jetzt selbst einigermaßen weiter gekommen und konnte schon mal den Bereich 1. auftrennen.
Für den Bereich 2 versuche ich bei einer Unterschreitung des Bereichs von Umin zu Umittel um 20% zu triggern auf eine fallende Flanke um damit zu erkennen welche Zeit ich in meinen "Waveform Subset"-Baustein als Startzeit einglesen muss um den Bereich zu trennen.
Das ist mir denke ich von der Logik auch gelunden jedoch kommt folgende Fehlermeldung wie im Bild zu sehen. Scheinbar ist die
Zeit die ich erhalte kein vielfaches von dt. Daraufhin habe ich das Subvi das ihr in dem Bild seht eingefügt das den Wert erst durch dt teilt und ein "Round Toward +Infinity" danach wird es wieder mit dt multipliziert. Damit sollte es ja eigentlich gerundet sein, doch wie ihr in dem Bild "round.vi" zu dem SubVI seht sind es am ende mindestens genauso viele Stellen.
Ich weiß gerade echt nicht mehr weiter
Hoffe Ihr könnt mir helfen?
Gruß Domi
Hallo Domi,
Zitat:sind es am ende mindestens genauso viele Stellen.
Mal überlegen: man multipliziert eine Zahl mit 17 (angezeigten) Stellen in der Mantisse (dein dt im Bild!) mit einer Ganzzahl. Wieviele Stellen wird die Mantisse des Produktes haben?
In meiner Signatur findest du einen Link auf das Basiswissen zum Umgang mit Floatingpoint-Zahlen...
Danke schonmal für die Antwort!
Ich finde es ja gut das du immer Lösungsansätze gibst bei denen man dann selbst gefordert ist, doch diesmal verstehe ich leider überhaupt nicht wo hier der Fehler ist.
Was ich aus dem Text verstanden habe ist das die Matisse und Exponent nur mit einer begrenzten Genauigkeit gespeichert werden und deshalb fehler beim rechnen damit entstehen können. Scheinbar kann dadurch auch ein unpassender Teiler entstehen wie das bei mir wohl der fall ist.
Doch dem weiteren Text wie man das Problem löst konnte ich nciht ganz folgen, scheinbar muss man einen Faktor namens machine epsilon multiplizieren um den eigentlichen Ausdruck zu präzisieren. Wie oder wo ich das bei mir in meinem VI einbinde habe ich leider noch nicht verstanden.
Außerdem wo multipliziere ich denn mit einer Ganzzahl? Die Ausgegebene Zeit an der der Trigger erkannt wird steht bei mir im SubVI als 0.997... ?
Tut mir leid wenn ich mich etwas blöd anstelle aber ich bin wirklich gerade etwas überfordert
Gruß Domi
Hallo Domi,
Zitat:Ich finde es ja gut das du immer Lösungsansätze gibst bei denen man dann selbst gefordert ist
Learning by doing...
Zitat:Außerdem wo multipliziere ich denn mit einer Ganzzahl?
Direkt nach dem
RoundToInf... (Ich habe nicht I32 oder U32 gesagt, nur "Ganzzahl". Auch DBL/SGL können Ganzzahlen darstellen!)
Zitat:doch diesmal verstehe ich leider überhaupt nicht wo hier der Fehler ist.
Der Fehler dürfte wahrscheinlich in der begrenzten Genauigkeit von FP-Zahlen begründet sein. Du hast einen sehr kleinen FP-Wert (dt), der mit einem deutlich größeren Wert (t) verglichen wird. Aufgrund der hohen Anzahl an Stellen in der Mantisse wird es dabei immer zu Rundungsfehlern kommen (das erläutert der verlinkte Text), was wiederum mit der gezeigten Fehlermeldung quittiert wird...
Quick&Dirty-Lösung:
Die Funktionalität von WaveformAbschnittLesen durch ein eigenes subVI erledigen, in welchem man auf Rundungsfehler pfeift! Du brauchst dazu nur das ArraySubset, um deine Werte aus den Y-Daten der Waveform auszuschneiden...
Bitte nochmal deine Werte überprüfen. Es wird "Start value too large" bemängelt. Ist dein Startwert größer als der Zeitpunkt des letzten Samples im Waveform? Einfach mal diese Funktion mit Highlighting und Sonden anschauen...
Da hast Recht, irgendwie wird gar nicht getriggert
Das ist mir davor gar nicht aufgefallen, scheinbar wird der Trigger erst beim letzten Wert erkannt. Oder das "Get XY Value" gibt mir einen falschen Wert aus.
Was bedeutet denn der Wert der aus [56] trigger location augegeben wird?
Ich habe das so interpretiert das es die Nummer bzw. der Index des Zeitwertes im Array ist?
Anbei noch ein Bild des mit Probes bestücktem VI und eines in dem der, zu detectierende Graph zu sehen ist (rot).
Der Graph sieht noch nicht so aus wie auf meiner Zeichnung weiter oben, da die Spannung bzw. der Strom nur so geringfügig geändert werden das der Regler momentan noch "hinterherkommt". So wurde es mir zumindest erklärt.
EDIT: Durch das Screenshots erstellen entdeckt man selbst immer wieder Fehler
in dem Ablaufzeiten Array ist der letzte Wert natürlich 0.499.........habe vergessen es mit dt zu verbinden. Das behebt allerdings nicht mein Problem
Leider kann man auf Grund deines Screeenshots nicht erkennen, welchen Eingang du wirklich an deinem "Round-VI" setzt.
Vermutung
Du übergibst aktuell den Wert "Value", und dt hat als Standardwert = 0. Value geteilt durch Null gibt Inf, mal 0 gibt NaN...
Gruß, Jens
(25.11.2013 13:41 )jg schrieb: [ -> ]Leider kann man auf Grund deines Screeenshots nicht erkennen, welchen Eingang du wirklich an deinem "Round-VI" setzt.
Vermutung
Du übergibst aktuell den Wert "Value", und dt hat als Standardwert = 0. Value geteilt durch Null gibt Inf, mal 0 gibt NaN...
Gruß, Jens
Oh du hast recht tut mir Leid ich habe vergessen dt wieder zu verkabeln, hier nochmal das Bild.
Nun entsteht kein Fehler mehr aber ich verstehe auch noch nicht wieso der Trigger erst am Ende des kompletten Graphen erkannt wird
der rote Spannungsverlauf endet nämlich etwa bei 0.997 und dort wurde auch der Trigger erkannt doch eigentliche müsste er kurz vor 0.1 erkannt werden. Irgendwo ist da noch der Wurm drin
Hallo domi,
der hier übliche Ratschlag lautet:
Häng ein VI an, welches die gezeigten Waveforms als Standardwerte enthält. Dann können wir nicht nur Screenshots anschauen, sonderm mal an echten Daten rumspielen...
Ja das is wohl das Beste
EDIT: hier in dem GEN_Lastsprung_V15.vi ist mal alles drin, also auch mit Pulsgenerator und gespeicherter Aufnahme der Antwort, einfach das gleichnamige VI aus dem Ordner GEN öffen.
Das was ganz unten zu sehen ist, neben "trigger detected?" zeigt (bzw. soll) den gerade ausgewählten Abschnitt (Enum weiter oben) des Spannungsverlaufes. Bisher funktioniert allerdings nur Bereich 1 und 3