Probleme mit "Verstrichene Zeit" Baustein und Array-Addition - Druckversion +- LabVIEWForum.de (https://www.labviewforum.de) +-- Forum: LabVIEW (/Forum-LabVIEW) +--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein) +--- Thema: Probleme mit "Verstrichene Zeit" Baustein und Array-Addition (/Thread-Probleme-mit-Verstrichene-Zeit-Baustein-und-Array-Addition) |
Probleme mit "Verstrichene Zeit" Baustein und Array-Addition - antonym - 30.07.2015 09:56 Hallo Forum, ich habe in meinem VI einen DAQmx Read und lese mehrere Thermoelemente damit aus. Nach einer gewissen Zeit (wenn Temperatur eingeschwungen), möchte ich die Messdaten (Array) über ein Schieberegister aufeinanderaddieren und dann das Ergebnis durch die Anzahl der Messdurchgänge teilen. Jetzt sollte ich einen Array voller Mittelwerte haben. dieses Array mittele ich dann erneut über die Mean-Funktion und erhalte letztendlichen einen gemittelten Wert über die Zeit. Nun habe ich das "Warten bis eingeschwungen" über den Baustein "verstrichene Zeit" und einer Case-Struktur gelöst. Allerdings bekomme ich dann als Mean am Ende NaN angezeigt. Danach habe ich ewig nach der Fehlerquelle gesucht, und dann ist mir aufgefallen, dass wenn ich die Verstrichene Zeit-Bausteine "Warten bis Eingeschwungen" und "warten" gegen eine True Konstante ersetze, das Addieren der Arrays einwandfrei, und somit auch die Mittelung am Ende funktioniert. Was hat denn der Baustein Verstrichene Zeit mit dem Addieren von Arrays zu tun?! Bekommt man das irgendwie gelöst? Ich habe bereits schon versucht die Uhrzeit zu Beginn einzulesen und dann bei jedem Durchgang nochmals die Zeit einzulesen, um ein delta-t zu bilden.(also ohne den verstrichene Zeit Baustein) Allerdings funktioniert dann die Mittelung auch nicht. Es scheint so, dass das Addieren der Arrays nur funktioniert wenn kein Zeitbaustein vor der Addierung geschaltet ist. Anbei mein VI, bitte nicht wundern wenn manche Case/while-Strukturen keinen Sinn machen. Ich habe den Inhalt des Vis aus einem größeren Vi kopiert, welches diese Schleifen (mit weiterem Inhalt, den ich hier gelöscht habe) benötigt. Viele Grüße und vielen Dank im voraus! RE: Probleme mit "Verstrichene Zeit" Baustein und Array-Addition - GerdW - 30.07.2015 10:06 Hallo antonym, Zitat:Danach habe ich ewig nach der Fehlerquelle gesuchtHast du dabei auch mal Debugging mittels Sonden gedacht? Tipp: Eine mögliche Fehlerquelle sind immer wieder "default if unwired"-Tunnel an Case-Strukturen. Fragen: - Warum musst du deine Waveforms in DDT umwandeln? - Warum verwendest du SplitSignal, um an die Elemente eines Arrays zu kommen? Dafür gibt es eigentlich IndexArray… - Wenn du nicht alle Messkanäle brauchst: ArraySubset… - Warum fragst du keine feste Sampleanzahl bei DAQmxRead ab? - Warum fragst du Waveforms ab, wenn du hinterher eigentlich mit einem Array of DBL arbeiten willst? - Bist du dir bei den ganzen Typumwandlungen zu und von DDT sicher? Wirklich? Ein Array of Waveforms (=2D-Array of Samples) wird zu DDT und das dann zu einem Array of DBL (=1D-Array of Samples)!? - Brauchst du wirklich 3mal ElapsedTime in einem VI? RE: Probleme mit "Verstrichene Zeit" Baustein und Array-Addition - antonym - 30.07.2015 11:56 Hallo GerdW, nein Debugging habe ich nicht gemacht, da ich so auf den Fehler gestoßen bin. Das mit dem "Default if unwired" werde ich mir noch anschauen evtl. liegt da was im Argen. Zitat:- Warum fragst du Waveforms ab, wenn du hinterher eigentlich mit einem Array of DBL arbeiten willst?Die Waveforms benötige ich , da ich nebenher noch einen Graph anzeigen lasse und zudem die Messwerte mit jeweiliger Zeit in eine Excel-Datei schreibe. Bei DBL fehlt mir der Zeitwert. Und Umwandeln in DBL muss ich, da die Mean-Funktion keine Dynamischen Daten "frisst".(oder etwa doch?) Zitat:- Warum verwendest du SplitSignal, um an die Elemente eines Arrays zu kommen? Dafür gibt es eigentlich IndexArray…Das mit dem Split Signal war zugegeben eher Bequemlichkeit, da ich mir nicht sicher bin wie der Aufbau des Arrays der Messdaten (mit zugehöriger Zeit pro Sample) aussieht. Zitat:- Wenn du nicht alle Messkanäle brauchst: ArraySubset…Ich brauche schon alle Messkanäle, nur einer (Umgebungstemperatur) geht separat auf eine Überwachungsfunktion. Zu der Samplezahl, da frage ich einen Wert auf Anforderung ab (pro Kanal) Zitat:- Warum musst du deine Waveforms in DDT umwandeln? Zitat:- Bist du dir bei den ganzen Typumwandlungen zu und von DDT sicher? Wirklich? Ein Array of Waveforms (=2D-Array of Samples) wird zu DDT und das dann zu einem Array of DBL (=1D-Array of Samples)!? Darüber habe ich mir noch keine Gedanken gemacht. ich habe, von der Graph-Anzeige, keinen Unterschied in der Darstellung zwischen DDT und Array of Waveforms erkannt. die Mittelung am Ende passt ja auch, wenn ich die "verstrichene Zeit" Bausteine gegen True Konstanten ersetze. Hauptsächlich verwende ich DDT aus dem Grund, weil ich eigentlich die Temperaturwerte in einem SubVI (siehe Anhang) auslese und dieses gibt mir eben mit dem "data" Baustein die Werte im DDT Format ins Haupt-VI aus. Kann man das abändern?(bin noch nicht so LabView erfahren) Zitat:- Brauchst du wirklich 3mal ElapsedTime in einem VI?Jein, einmal zum Warten bis mein Signal eingeschwungen ist und einmal um eine feste Messzeit, in der die Werte zur Mittelung "aufgezeichnet" werden, zu gewährleisten. Den ersten ElapsedTime brauche ich nicht.(den habe ich nur aus Testzwecken aktuell drin, kann auch ein Boolesch sein.) RE: Probleme mit "Verstrichene Zeit" Baustein und Array-Addition - GerdW - 30.07.2015 11:59 Hallo antonym, Zitat:Zu der Samplezahl, da frage ich einen Wert auf Anforderung ab (pro Kanal)Nein, tust du nicht. Einfach mal die Hilfe zur Funktion lesen… Und wenn du das tun würdest, bräuchtest du weder Waveforms noch Mittelwert-Berechnung. Oder wie sinnvoll ist der Mittelwert über ein Sample? (Du willst doch einen Mittelwert pro Messkanal, oder?) Zitat:Kann man das abändern?Ja, durch Verzicht auf ExpressVIs. Oder indem man explizit in einen sinnvollen Datentyp umwandelt! Zitat:Hauptsächlich verwende ich DDT aus dem Grund, weil ich eigentlich die Temperaturwerte in einem SubVI (siehe Anhang) auslese und dieses gibt mir eben mit dem "data" Baustein die Werte im DDT Format ins Haupt-VI aus.Du liest ein Array of Waveform und stellst es in einem Graph/Chart dar, der auf DDT als Datentyp gestellt ist. Selber schuld… Lösche diesen Graph und ersetze ihn durch einen "normalen" Indicator! (In einem subVI braucht man eh keinen Chart/Graph…) RE: Probleme mit "Verstrichene Zeit" Baustein und Array-Addition - antonym - 30.07.2015 12:33 Hallo GerdW, (30.07.2015 11:59 )GerdW schrieb: Nein, tust du nicht. Doch, ich lese pro Kanal einen Messwert (Temp. und Zeit) auf Anforderung aus (So ist es auch im NI MAX eingestellt) Die Mittelung benötige ich, da ich über eine Zeit X alle gemessenen Werte aufzeichnen und anschließend mitteln will. Dazu addiere ich der Einfachheit halber die Messwerte im DBL Array bei jedem Case-Durchlauf aufeinander (Array(t=0) + Array(t=1) + ... ). Nun habe ich nach Zeit X ein Array voller aufaddierten Messdaten, dieses Array teile ich durch die Anzahl der Messungen und ich erhalte ein Array voller Mittelwerte über die Zeit. Anschließend mittele ich die einzelnen Array-Werte über die Mean-Funktion und erhalte einen einzigen Mittelwert. Zitat:Lösche diesen Graph und ersetze ihn durch einen "normalen" Indicator! (In einem subVI braucht man eh keinen Chart/Graph…) Der Graph ist später nicht im SubVI sondern im HauptVI und wird später unbedingt benötigt, da ich anhand des Temperaturverlaufs auch optisch die Regelung der gemessenen Temperatur überprüfen möchte. Aber nochmal zurück zur eigentlichen Frage: gibt es irgendeinen möglichen Grund wieso der ElapsedTime Baustein meine Array-Addition stört? Mit Boolesch Konstanten funktionierts ja. RE: Probleme mit "Verstrichene Zeit" Baustein und Array-Addition - GerdW - 30.07.2015 13:11 Hallo antonym, Zitat:Der Graph ist später nicht im SubVI sondern im HauptVIJa eben. Und warum brauchst du dann einen Graph im subVI??? Zitat:gibt es irgendeinen möglichen Grund wieso der ElapsedTime Baustein meine Array-Addition stört?Ich wiederhole mich ungern: Zitat:Tipp: Eine mögliche Fehlerquelle sind immer wieder "default if unwired"-Tunnel an Case-Strukturen.und Zitat:Hast du dabei auch mal Debugging mittels Sonden gedacht? Zitat:Dazu addiere ich der Einfachheit halber die Messwerte im DBL Array bei jedem Case-Durchlauf aufeinander (Array(t=0) + Array(t=1) + ... ).Warum berechnest du in der Schleife nicht einfach den Mittelwert direkt? Du brauchst nur einen Zähler für die schon gesammelten Werte: Mittelwert(i) = ( Mittelwert(i-1)*(i-1) + NeuerWert ) / i So z.B.: [attachment=53740] Zitat:Doch, ich lese pro Kanal einen MesswertLeider sieht man nicht, wie der Task definiert wurde. Im VI sieht man nur, dass du "-1" Samples vom DAQmxRead abfragst - und was das bedeutet, sagt dir die Hilfe zur Funktion! RE: Probleme mit "Verstrichene Zeit" Baustein und Array-Addition - antonym - 30.07.2015 13:50 Zitat:Ja eben. Und warum brauchst du dann einen Graph im subVI??? aktuell nur für Testzwecke. Zitat:Warum berechnest du in der Schleife nicht einfach den Mittelwert direkt? Aus Gründen der Numerik ist es besser nicht bei jedem Schleifendurchgang zu addieren und zu multiplizieren/dividieren (Rundungsfehler!) Daher will ich zuerst addieren, und am ende erst dividieren. Wenn die Schleife einmal pro Sekunde ausgeführt wird dann sind das bei 5Minuten Messdauer 300 Durchgänge. D.h. ich rechne 300 mal Mittelwert(i) = ( Mittelwert(i-1)*(i-1) + NeuerWert ) / i Mit jedem Rechenzeichen geht statistisch ein weiterer Fehler ein. Besser ist es, ich addiere alle zuerst auf und teile ein bis zwei mal ganz am Ende. Zitat:Leider sieht man nicht, wie der Task definiert wurde.Oh das muss ich mir ansehen, kann natürlich sein, dass ich das vergessen habe. Also ich habe jetzt den Fehler gefunden. Wie du bereits sagtest, war es der "Standard verwenden, wenn nicht verbunden" Tunnel/Knoten. Ich habe es jetzt so gemacht für den Case: False [attachment=53741] Erstaunlich wie einfach und banal manchmal die Lösung sein kann :-) Vielen Dank!!! |