Labview Moving Average Vi


Berechnen von Moving Average Dieses VI berechnet und zeigt den gleitenden Durchschnitt mit einer vorgewählten Nummer an. Zuerst initialisiert das VI zwei Schieberegister. Das obere Schieberegister wird mit einem Element initialisiert und fügt dann den vorherigen Wert kontinuierlich mit dem neuen Wert hinzu. Dieses Schieberegister hält die Summe der letzten x Messungen. Nach dem Teilen der Ergebnisse der Additionsfunktion mit dem vorgewählten Wert berechnet das VI den gleitenden Mittelwert. Das untere Schieberegister enthält ein Array mit der Dimension Average. Dieses Schieberegister hält alle Werte der Messung. Die Ersatzfunktion ersetzt den neuen Wert nach jeder Schleife. Dieses VI ist sehr effizient und schnell, weil es die ersetzen Element-Funktion innerhalb der while-Schleife verwendet, und es initialisiert das Array, bevor es in die Schleife eintritt. Dieses VI wurde in LabVIEW 6.1 erstellt. Lesezeichen amp ShareMean PtByPt. vi verlässt kein Fenster von Daten zu einem Zeitpunkt Problem: Ich versuche, durchschnittliche Teilmengen von 100 Punkten zu einem Zeitpunkt von einem kontinuierlichen eingehenden Signal zu durchschnittlich. Das Problem ist, dass die Mean PtByPt. vi die ersten 100 Punkte (0hellip99) und dann die nachfolgenden 100 Punkte (1. 100) die Wiederverwendung von 99 der gleichen Werte verglichen werden. Statt eines bewegten Fensters durchschnittlich möchte ich die Blockmittelung der Daten implementieren, das heißt, ich möchte die Daten in Stücke zerlegen und den Durchschnitt jedes Stücks Daten erfassen. Lösung: Die Standardfunktionalität des Mean PtByPt. vi gibt nicht den Durchschnitt jedes Stücks von Daten. Vielmehr, wie in der Problemanweisung beschrieben, für eine gegebene Fenstergröße n, bedeutet Mittel PtByPt. vi die Punkte 0 bis n-1, dann die Punkte 1 bis n, dann die Punkte 2 bis n1, also und so weiter. Um die Blockdurchschnittung durchzuführen, müssen Sie einen Workaround-Code schreiben. Sie sollten eine Modulberechnung auf der Iterationszählung der Schleife durchführen, um zu bestimmen, wann man durchschnittlich und wann Daten ohne Mittelwert weitergeben müssen. Durch die Berechnung der Iterationszahl i mod n, Wenn i0, ist das Ende des Fensters erreicht und der mittlere PtByPt. vis-Durchschnitt ist korrekt. Wir speichern diesen Wert dann in einem Array oder Indikator. Bei der nächsten Iteration wird der Mod-Wert gleich 1 sein, der den Mean PtByPt. vi zurücksetzt und ihn für die nächste Teilmenge von n Punkten vorbereitet. Der Trick ist zu erkennen, dass die durch die Blockmittelung erhaltenen Mittelwerte eine Teilmenge des bewegten Fensterdurchschnitts sind, die von Mean PtByPt. VI durchgeführt wird. In einigen Fällen möchten Sie vielleicht, dass alle Daten auf der Vorderseite aktualisiert werden, während nur die Mittelwerte protokolliert werden, wie in der obigen Problemanweisung beschrieben. Sie können diese Funktion in ähnlicher Weise durchführen, nämlich durch Ausführen eines Modul-Vorgangs auf der Iterationszählung und Auswählen eines Falles in einer darauf basierenden Fallstruktur. Bitte verweisen Sie auf das Community-Beispiel unter Related Links für weitere Informationen, wie dies zu tun und Beispiel-Code, der analysiert und konvertiert dynamische Daten und führt die oben genannten Funktionen. Ihr Code macht noch keinen Sinn. Setzen Sie den SubVI ein Skalar zu einer Zeit an, Sie bekommen nicht, was Sie wollen, weil das Schieberegister nur die letzten N Skalare erinnert, egal welcher Kanal es ist. Dein Code ist immer noch sehr ineffizient und gewunden. (ZB warum bist du noch mit Insert in Array zu append (beide in der Mani nad in der Sub). (Sie könnten ein reenetrant subVI und eine parallele innerste FOR-Schleife verwenden, aber das scheint auch übermäßig kompliziert) Wenn Sie wollen, um zu tun Das SubVI muss in einem 2D-Array im SubVI aufbewahrt werden, das alles schon früher, ich kann deine Frustration verstehen - mehr wenn der Kontext der LV-Codierung in unserem Leben anders ist Ingenieur in der Maschine steuert die gesamte CPU nichts aus. Die Maschine ist nicht in der Lage, den letzten Tropfen Saft aus der CPU zu extrahieren Ich habe nicht sagen, effizienter Code ist eine Verschwendung von Zeit - ich sage nur, dass der Kontext anders ist, kurz bevor ich mich abwickle Hier ist eine andere schnell und schmutzig, was funktioniert die Arbeit die ersten paar Werte ignoriert werden - nicht eine große Sache in einer Daten-Logging-Anwendung, die stundenlang läuft. Raghunathan LV2012 zur Automatisierung von Hydraulikprüfständen. Es tut mir leid, dass Sie so eine niedrige Rücksicht auf Eleganz und Korrektheit haben, und dass Sie das Gefühl, dass gut genug ist gut genug ist. Vielleicht werden Sie in der Zukunft jemanden, der LabVIEW kennt und versteht, und sagen Sie ihm (oder ihr), was Sie tun wollen und lassen Sie es für Sie tun. Wenn es aber Ihr Ziel ist, (a) Daten von N Kanälen bei der Frequenz F (in Hz) zu sammeln, sondern den Mittelwert von M Punkten anzuzeigen (also für jeden M Punkte erstellst du 1 Punkt, den Durchschnitt der M Punkte ), Heres eine gute Möglichkeit, es zu tun: Erstellen Sie eine Producer Loop, die die Daten erzeugt, indem Sie Ihre Sampling-Gerät, um Ihnen M Punkte aus N Kanäle, abgetastet bei Frequenz F. Dies sollte ein 2D-Array (M Zeilen von N Spalten) . Setzen Sie dies in eine Warteschlange und wiederholen Sie, über und über, bis die Stop-Taste gedrückt wird. Nach dem Verlassen der Producer Loop, senden Sie eine weitere leere 2D-Array (youll sehen, warum in einem Moment). Erstellen Sie eine parallele Consumer Loop und füttern Sie die von der Producer Loop verwendete Warteschlange. Dequeue the Data Array - wenn es leer ist, wurden fertig, so lassen Sie die Warteschlange und stoppen Sie die Consumer Loop. Andernfalls müssen wir die Daten verbrauchen (Durchschnitt und Plot). Wir müssen das M-Punkte-N-Kanal-Array auf ein N-Kanal durch M-Punkte-Array umsetzen. Fügen Sie dieses Array zu einem For Loop hinzu (das über die Kanäle schleifen), berechnen Sie den Durchschnitt der M Punkte und geben Sie diesen Durchschnitt aus. Wir wollen diesen (einzelnen) Punkt von allen N Kanälen aufzeichnen, also gib es durch Build Array, um eine 1 von N Array zu machen, und plot dies. Hier ist ein Snippet in LabVIEW 2012, mit dem du all das simulieren kannst (es erzeugt Punkte bei der angegebenen Frequenz, max 1KHz). Ich skaliere auch das Plot so, dass die Zeit in Sekunden ist. Das hat sich nicht gut für das Snippet übersetzt - ich habe eigentlich einen Averaged Data Property Node dort benutzt. Dies, denke ich, tut, was ich verstehe Sie wirklich wollte, nämlich eine Anzeige zu haben, die den Durchschnitt zeigt (bei einer langsameren Plotrate als die Daten). Youll bemerken, dass jeder Kanal einen anderen Offset hat, also wenn man sich die Handlung ansieht, sollten Sie 16 Zeilen sehen, die immer glatter aussehen, während Sie die Sample Size erhöhen. Sie müssen die Parameter angeben, bevor Sie den Code ausführen, da die Prinzipien von Data Flow (auf denen LabVIEW basiert) die Änderungen ignoriert, die Sie an den Controls machen, sobald das Programm läuft. Zuerst möchte ich mich für die ausführliche Antwort und das Code-Snippet bedanken. Ich apprecaite Ihre Absicht zu helfen. Meine frühere Antwort klang vielleicht ein bisschen grob, aber ich werde die letzte Person sein, um etwas abzuräumen, das halb gebacken oder instabil ist. Lassen Sie mich erklären: Meine Tätigkeitsphase Ölhydraulik und ich habe meine eigene Firma im Jahr 1995 gegründet und als Wert Ergänzungsvorschlag Ich versorgen integrierte Systeme mit Instrumentierung und Software. Wir betreiben in zwei großen vertices - WInd Turbinen und Testsysteme. Und bis jetzt haben wir viele Komplettsysteme geliefert, die in der Automobilindustrie hier sowohl in Indien als auch in Europa weit verbreitet sind. Aber meine Firma ist keine riesige Organisation und ist eine mittelgroße und hier gibt es einen Fang - es ist neben unmöglich, erfahrene LabVIEW Programmierer zu finden. Indien hat einen riesigen Pool von Software-Ingenieuren, aber alle sind in Desktop-Computing und die Ingenieure in Physical Computing ist fast null oder vernachlässigbar. Also, wenn die Klienten zu mir kommen mit frischen Anforderungen (vertrauen Sie mir - alle sind anders) Ich nehme die Herausforderung persönlich aber zu liefern Ich bin ganz abhängig von der Unterstützung von Online-Community. Todate Ich habe erfolgreich LV-Code entwickelt, um Daten über CanOpen, Modbus RTU, Profinet und EtherCAT zu erhalten. Mit solch Vielfalt und kurzer Zeit, um Marktanforderungen Ich habe einfach nicht die Ressourcen, um ein riesiges Team zu liefern. Also es kocht auf die Entwicklung von grundlegenden oder offensichtlichen Code, der tut, was es ist, und wenn der Client ist OK mit ihm - lassen Sie es dort. Es ist ein Unterschied zwischen funktionalen Code und Smart-Code und ich war auf die früheren Hinweis. Und nicht entwickeln crappy code Kommen zu Ihrem Beispielcode - dieses Produzent Verbrauchermodell ist eine regelmäßige, die ich für alle meine Projekte verwende, wo ich Main als Produzent und die Sub-VIs als Verbraucher habe. Mit Datenfluss über Warteschlange. Wird es im Detail studieren. Raghunathan LV2012 zur Automatisierung von Hydraulikprüfständen.

Comments