Wednesday 11 January 2017

Einfache Gleitende Durchschnittliche Labview

Berechnen des gleitenden Durchschnitts Dieses VI berechnet und zeigt den gleitenden Durchschnitt mit einer vorgewählten Zahl an. Zunächst initialisiert das VI zwei Schieberegister. Das obere Schieberegister wird mit einem Element initialisiert und fügt dann kontinuierlich den vorherigen Wert mit dem neuen Wert hinzu. Dieses Schieberegister hält die Summe der letzten x Messungen. Nach dem Teilen der Ergebnisse der Add-Funktion 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 nach jeder Schleife den neuen Wert. Dieses VI ist sehr effizient und schnell, weil es die replace-Element-Funktion innerhalb der while-Schleife verwendet, und es initialisiert das Array, bevor es die Schleife eintritt. Dieses VI wurde in LabVIEW 6.1 erstellt. Ihr Warenkorb ist noch leer. SInce Sie den subVI ein Skalar zu einer Zeit aufrufen, sind Sie nicht bekommen, was Sie wollen, weil das Schieberegister nur erinnert sich die letzten N Skalaren, egal aus welchem ​​Kanal es ist. Ihr Code ist noch sehr ineffizient und gewunden. (Zum Beispiel, warum Sie immer noch mit Insert in Array zu append (sowohl in der mani nad in der sub). (Sie könnten ein reenetrant subVI und eine parallele innerste FOR-Schleife verwenden, aber das scheint übermäßig kompliziert zu) Wenn Sie möchten, Das SubVI benötigt, um ein 2D-Array im SubVI zu behalten. Alles dies wurde zuvor getan. Ich kann Ihre Frustration zu verstehen - mehr, wenn der Kontext der LV-Codierung ist in unserem Leben anders. Für mich als ein Maschinenbauer seine ein Add-on und das, was als eine Zeit passiert. So kann der Code nicht die effizienteste oder eine, die den letzten Tropfen Saft aus der CPU extrahiert. In der Tat in der Maschinensteuerung Anwendungen die ganze CPU nichts Ich denke nicht, dass der Code effizient ist, ist eine Verschwendung von Zeit - ich sage nur, der Kontext ist anders, kurz bevor ich wind down Hier ist ein anderes schnelles und schmutziges eins, das arbeitet, wenn die ersten wenigen Werte ignoriert werden - nicht eine große Sache in einer Datenprotokollierung Anwendung, die Stunden lang läuft. Raghunathan LV2012 zur Automatisierung von Hydraulikprüfständen. Es tut mir leid, dass Sie so eine geringe Rücksicht auf Eleganz und Korrektheit haben, und dass Sie das Gefühl, dass Gut genug ist gut genug ist. Vielleicht, in der Zukunft, werden Sie jemanden, der weiß und versteht LabVIEW und einfach sagen, ihm oder ihr sagen, was Sie tun möchten und lassen Sie sie es für Sie. Allerdings, wenn Ihr Ziel ist (a) sammeln Daten aus N Kanäle mit der Frequenz F (in Hz), sondern um den Mittelwert der M Punkte (so für jeden M Punkte Sie generieren Sie Plot 1 Punkt, der Durchschnitt der M Punkte ), Heres eine gute Möglichkeit, es zu tun: Erstellen Sie eine Producer-Schleife, die die Daten erzeugt, indem Sie Ihre Sampling-Gerät, um Ihnen M Punkte aus N Kanäle, bei der Frequenz F abgetastet. Dies sollte ein 2D-Array (M Zeilen von N Spalten) . Legen Sie diese in eine Warteschlange und wiederholen, immer und immer, bis die Stopp-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-Schleife und führen Sie die von der Producer-Schleife verwendete Warteschlange ein. Dearchivieren Sie das Datenarray - wenn es leer ist, wurden die Warteschlange freigegeben und die Consumer-Schleife beendet. Ansonsten müssen wir die Daten konsumieren (Durchschnitt und Plot). Wir müssen das M-Punkte-N-Kanäle-Array auf ein N-Kanal durch M-Punkte-Array übertragen. Führen Sie dieses Array zu einer For-Schleife (die über die Kanäle schleifen wird), berechnen Sie den Durchschnitt der M-Punkte und geben Sie diesen Durchschnitt aus. Wir wollen diesen (einzigen) Punkt aus allen N Kanälen zeichnen, also übergeben Sie es durch Build Array, um ein 1 durch N Array zu erstellen, und dieses zu zeichnen. Hier ist ein Snippet in LabVIEW 2012, mit dem Sie alles simulieren können (es erzeugt Punkte bei der angegebenen Frequenz, max 1KHz). Ich skaliere auch den Plot, so dass die Zeit in Sekunden ist. Dieses didnt übersetzen gut für das Snippet - ich verwendete wirklich einen gemittelten Dateneigenschaftsknoten dort. Dieses, denke ich, tut, was ich verstehe, dass Sie wirklich wünschten, nämlich, eine Anzeige zu haben, die den Durchschnitt zeigt (mit einer langsameren Plotrate als die Daten). Youll bemerken, dass jeder Kanal einen anderen Offset hat, also, wenn Sie das Diagramm betrachten, sollten Sie 16 Linien sehen, die mehr und glatter sehen, während Sie die Beispiel-Größe erhöhen. Sie müssen die Parameter vor dem Ausführen des Codes angeben, da die Prinzipien von Data Flow (auf denen LabVIEW basiert) Änderungen ignorieren, die Sie an den Controls vornehmen, sobald das Programm ausgeführt wird. Zuerst möchte ich mich bei Ihnen für die ausführliche Antwort und das Code-Snippet bedanken. Ich apprecaite Ihre Absicht zu helfen. Meine frühere Antwort klingt vielleicht ein bisschen grob, aber ich werde die letzte Person sein, um etwas von Hand zu füllen, die halb gebacken oder instabil ist. Lassen Sie mich erklären: Mein Tätigkeitsbereich Öl-Hydraulik und ich habe meine eigene Firma im Jahr 1995 gegründet und als Value-Addition Vorschlag i liefern integrierte Systeme mit Instrumentierung und Software. Wir arbeiten in zwei großen vertcials - WInd Turbinen und Testsysteme. Und bis heute haben wir viele Komplettsysteme geliefert, die in der Automobilindustrie sowohl in Indien als auch in Europa weit verbreitet sind. Aber meine Firma ist nicht eine riesige Organisation und ist eine mittelgroße und hier gibt es einen Haken - es ist neben unmöglich, Experten-LabVIEW-Programmierer zu finden. Indien hat einen riesigen Pool von Software-Ingenieure, aber alle sind in Desktop-Computing und die der Ingenieure in Physical Computing ist fast null oder vernachlässigbar. SO, wenn Klienten zu mir mit neuen Anforderungen kommen (vertrauen Sie mir - alle sind unterschiedlich) Ich nehme die Herausforderung persönlich aber an, ich hängen vollständig von der Unterstützung von der on-line Gemeinschaft ab. Ich habe erfolgreich LV-Code entwickelt, um Daten über CanOpen, Modbus RTU, Profinet und EtherCAT zu erhalten. Mit solchen Abwechslung und kurze Zeit auf den Markt Anforderungen habe ich einfach nicht die Ressourcen, um ein riesiges Team zu liefern. So kocht es unten zur Entwicklung des grundlegenden oder offensichtlichen Codes, der tut, was es soll und wenn der Klient mit ihm OK ist - lassen Sie ihn dort. Sein ein Unterschied zwischen Funktionscode und intelligenten Code und ich war Hinweis auf die früheren. Und nicht die Entwicklung crappy Code Nach Ihrem Beispiel-Code - dieses Produzent Consumer-Modell ist eine regelmäßige, die ich für alle meine Projekte, wo ich Main als Produzent und die Sub VIs als Verbraucher. Mit Datenfluss über Warteschlange. Will studieren es im Detail. Raghunathan LV2012 zu automatisieren hydraulischen Test rigs. Simple Moving Average VI Normalerweise, wenn Leute über einen Moving Average sprechen, bedeuten sie Ersetzen Punkt N mit dem Durchschnitt von M Punkte um Punkt N. Angenommen, ich habe 100 Punkte, deren Werte 1, 2, 3 sind. 100, und ich möchte einen 5-Punkt Moving Average zu tun. Das erste, was zu beachten ist, dass es einen gleitenden Durchschnitt des dritten Punktes ist der Durchschnitt von 1, 2, 3, 4, 5 3. Der Durchschnitt des vierten Punktes ist der Durchschnitt von 2, 3, 4, 5, 6 4. Dies ist jedoch vielleicht ein zu einfaches Beispiel. Wie wäre es mit dem Durchschnitt einer Step-Funktion, 0 von 1 bis 10, dann 20 danach. Wieder, werfen Punkte 1 und 2. Der Mittelwert der Punkte 1-5 (in Punkt 3 gehen) 0 (da alle Punkte sind 0). Ähnlich wie bei Punkt 4, 5, 6,7 und 8. Jedoch ist Punkt 9 der Durchschnitt von 0, 0, 0, 0, 20 4. Wie wäre es mit Punkt 10 Nun, es sollte der Durchschnitt von 0, 0, 0 sein , 20, 20 8, aber erinnerst du dich nicht zu überschreiben Punkt 9 Hmm, scheint, wie müssen wir zwei Kopien des Array (das ist in der Regel teuer) zu halten. Es gibt mehrere Möglichkeiten, dies zu vermeiden. Verstehen Sie, wo das Problem im vorherigen Absatz auftritt Wenn nicht, versuchen Sie dies mit Bleistift und Papier (oder versuchen Sie es in LabVIEW Codierung). Ill geben Ihnen die Antwort, so dass Sie überprüfen können - der gleitende Durchschnitt der Schrittfunktion ist -, -, 0, 0, 0, 0, 0, 0, 0, 4, 8, 12, 16, 20, 20 , 20. -, - (wobei - die leeren Werte an den Enden des Arrays sind, die Punkte, die Sie nicht genügend Nachbarn haben). P. S. - es würde mich nicht wundern, wenn es werent eine LabVIEW-Funktion, die dies für Sie tut. Aber wenn Sie LabVIEW lernen und ein besseres Verständnis davon haben wollen, wie die Algorithmen, die Sie in Arbeit stecken, es nie schaden, zu spielen und es selbst auszuprobieren. Sie könnten sogar kommen mit einer Verbesserung (mehrere von uns haben das getan.). Dank für die Sensibilisierung in Bezug auf die feineren Punkte der Moving Average Methode. Dieses ist schließlich ein statistisches Werkzeug, das hilft, zu sehen, was Sie die Abstraktion der Distraktoren sehen möchten. So ist die Methode verpflichtet, einige Defizite in einigen Situationen oder Kontext haben. Aber ich denke, seine perfekt geeignet für meine Art dof Datenlogging - es ist ein Druck-oder Temperatur-oder Flow-Signal - und ich erwerben bei etwas wie 400 Proben s und verwenden Sie dann eine gemittelte einzelne Probe. Und der Prozess ist ziemlich langsam, da mein Haupt-Code läuft bei nicht mehr als 20 Hz. Also, wenn ich ein 5 Beispiel Mähen durchschnittlich, meine erste Probe kommt 5 x 50ms später, dann für alle 50ms bekomme ich eine gültige Probe. Grundsätzlich bin ich mehr auf Trends und nicht vor Ort Werte betroffen. In diesem gibt es wenig Sorgen über verpasste Proben oder Schurkenwerte. Natürlich würde ich nicht wagen, dies für eine Step-Funktion zu verwenden. Das wäre grausam. Raghunathan LV2012 zur Automatisierung von Hydraulikprüfständen. Nachricht 4 von 15 (838 Ansichten) Re: Simple Moving Average VI 03-30-2016 11:58 PM Es gibt mittleres ptbypt welches das gleiche macht. Sie können den Code überprüfen, wenn Sie möchten. Ein großer Fehler in Ihrem Code ist die Tatsache, dass Sie ständig wachsen und schrumpfen ein bestehendes Array. Sie sollten versuchen, eine Lösung zu finden, die an Ort und Stelle auf einem Array mit fester Größe arbeitet. Mai-Beispiele wurden auf dem Forum im Laufe der Jahre bekannt (siehe hee zum Beispiel). Das Mittel interessiert nicht, wenn die Elemente außer der Ordnung sind, also können Sie das älteste Element einfach ersetzen, egal wo es lokalisiert wird. Außerdem wird das neue Element dem Anfang eines vorhandenen Arrays vorangestellt, das immer viel teurer ist als das Anhängen an das Ende. Kann Ihre Probengröße nicht ändern, sobald das VI ausgeführt wird. Ihr Schieberegister sollte mit einem leeren Array initialisiert werden, kein Array, das bereits ein einzelnes Element enthält, das Null ist. (Diese zusätzliche Null gibt falsche Mittelwerte) Ihr Code sollte in ein subVI gemacht werden, so dass es wieder verwendet werden kann (ähnlich wie die ptbypt-Version). Ihr VI kann nie gestoppt werden, nur abgebrochen. Gute Optimierungstipps. Der Punkt bei der Initialisierung mit Zero hat mich verpasst. Und ja der Benutzer sollte nicht ändern Sie die Stichprobengröße, sobald es läuft. Schließlich werde ich ein SubVI machen und behandeln Dinge wie Stoppen etc .. Was den Punkt der Vorhersage als Anfügen des neuen Wertes auf Array, vielleicht gibt es eine Performance-Strafe, aber angesichts der Größe meiner Array Ich bin mir sicher, die CPU kümmert sich nicht anwyay . Aber für mich muss es so sein, wie ich die endgültigen Daten für die Darstellung eines Tendenz eines physikalischen Parameter. Dank für Ihre Zeit. Raghunathan LV2012 zur Automatisierung von Hydraulikprüfständen. Dank für die Sensibilisierung in Bezug auf die feineren Punkte der Moving Average Methode. Dieses ist schließlich ein statistisches Werkzeug, das hilft, zu sehen, was Sie die Abstraktion der Distraktoren sehen möchten. So ist die Methode verpflichtet, einige Defizite in einigen Situationen oder Kontext haben. Aber ich denke, seine perfekt geeignet für meine Art dof Datenlogging - es ist ein Druck-oder Temperatur-oder Flow-Signal - und ich erwerben bei etwas wie 400 Proben s und verwenden Sie dann eine gemittelte einzelne Probe. Und der Prozess ist ziemlich langsam, da mein Haupt-Code läuft bei nicht mehr als 20 Hz. Also, wenn ich ein 5 Beispiel Mähen durchschnittlich, meine erste Probe kommt 5 x 50ms später, dann für alle 50ms bekomme ich eine gültige Probe. Aha So wollen Sie nicht einen gleitenden Durchschnitt, sondern nur einen einfachen Durchschnitt. Das ist viel einfacher. Heres die Idee (die funktioniert besser mit einem ProducerConsumer Design) - Sagen Sie, dass Sie bei 400Hz abtasten, wollen die Daten bei 400 Hz speichern (dh alle Daten auf Festplatte speichern), wollen aber bei 20 Hz anzeigen (weil Sie Trends, eine längere Zeitbasis usw. sehen wollen). Richten Sie Ihr AD-System, um 20 Samples bei 400 Hz zu sammeln (beachten Sie, können Sie N Kanäle zur gleichen Zeit sammeln, so dass Sie ein 2D-Array von Samples. Sie erhalten die Daten (bei 20 Hz) von der AD (so dass die Producer) , Enqueue es an den Verbraucher. Der Verbraucher beginnt mit dem Schreiben der Daten auf Festplatte (sollte nicht viel Zeit) Nun haben Sie ein 2D-Array - in einem For-Loop, auf einer Kanal-für-Kanal-Basis, durchschnittlich 20 Punkte. Es ist zu beachten, dass dieses Schema (a) alle Daten verwendet, (b) handhabt Multi-Kanal-Daten mit aplomb (und, wenn Sie sind Aus dem Nahen Osten, wo sie wachsen, können Sie auch Ihre Daten mit einer saftigen Pflaume), und (c) können Sie sammeln Sie Ihre Daten aus dem AD-Gerät, speichern Sie Ihre Daten auf der Festplatte halten alle Punkte, und zeigen Sie Ihre Daten auf Den Bildschirm mit allen Ihren Punkten, sondern auch Mittelung zur Verbesserung der visuellen Signal-zu-Rausch-Verhältnis, alle ohne Datenverlust (Ive getan genau dies mit 24 Kanälen bei 1KHz, mit den Daten auf einem Remote-System genommen und an den PC geschickt Über TCPIP, so haben wir auch TCP-Verarbeitung in der Schleife). Willkommen in der spannenden Welt der Datenerfassung und - verarbeitung mit LabVIEW. Vertrauen Sie mir, dies ist ein wunderbares System für diese Art von Arbeit Basierend auf dem Feedback, das ich auf meinem ursprünglichen VI Ich habe die Moving Average Code in einem SubVI verfeinert. Ich habe es dann verwendet, um eine simulierte 10Channel-Daten Durchschnitt - nur um die Dinge einfach zu halten Ich sorgte dafür, dass alle10 Kanäle identische Daten. Man würde dann erwarten, den gleichen gleitenden Durchschnitt für alle 10 Kanäle zu erhalten. Ich bin überrascht, die kleine Varianz merke ich zwischen den Kanälen - im Allgemeinen sind sie in der Nähe, aber nicht genau. Und nur um den Prozess zu erklären, den ich versuche, habe ich auch ein XLS enclsoed. Woher kommt die Variation? Das unitialisierte Schieberegister im Sub VI. Raghunathan LV2012 zur Automatisierung von Hydraulikprüfständen. Missbrauch bei Moderator melden Missbrauch bei Moderator melden Nachricht 9 von 15 (741 Ansichten) Re: Simple Moving Average VI 04-01-2016 10:25 AM Dein Code macht immer noch keinen Sinn. SInce Sie den subVI ein Skalar zu einer Zeit aufrufen, sind Sie nicht bekommen, was Sie wollen, weil das Schieberegister nur erinnert sich die letzten N Skalaren, egal aus welchem ​​Kanal es ist. Ihr Code ist noch sehr ineffizient und gewunden. (Zum Beispiel, warum Sie immer noch mit Insert in Array zu append (sowohl in der mani nad in der sub). (Sie könnten ein reenetrant subVI und eine parallele innerste FOR-Schleife verwenden, aber das scheint übermäßig kompliziert zu) Wenn Sie möchten, Missbrauch bei Moderator melden Nachricht 10 von 15 (725 Ansichten) Antworten mit Zitat


No comments:

Post a Comment