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 hoffe ich bin hier im richtigen Unterforum. Wenn nicht, bitte entschuldigt.
Bin ein ziemlicher Neuling mit Labview, also falls ich ein paar sehr doofe Fehler gemacht habe, entschuldigt auch bitte dies.
Ich habe folgende Frage:
Ich messe mit dem DAQ-Assi die Ausgangsspannung einer Stromzange. Jede sekunde möchte ich den Mittelwert des Spannungssignals in einem 30 zeiligen Array speichern. Der neuste Wert soll immer an das Ende des Array angehängt werden und der erste Wert soll gelöscht werden. Dadurch soll das Array immer nur 30 Zeilen lang sein.
Nun möchte ich, dass die Messung abbricht, wenn kein alle Werte des Arrays kleiner als 1 sind. Dazu lasse ich immer das Maximum des Arrays auslesen.
Leider funktioniert das nicht, wie gewünscht, in der Array werden immer ganz viele Nullen geschrieben.
Das VI soll übrigens später einmal in eine Sequenz eingepflegt werden.
Kann mir einer sagen, was ich falsch mache oder wie ich es besser machen kann?
Anbei das VI.
Vielen Dank.
VG
Anzeige
20.11.2015, 16:38 (Dieser Beitrag wurde zuletzt bearbeitet: 20.11.2015 16:39 von GerdW.)
Zitat:Jede sekunde möchte ich den Mittelwert des Spannungssignals in einem 30 zeiligen Array speichern.
Das machst du aber nicht. Du liest mit dem DAQAssi jede 0.1s neue Werte ein…
Zitat:Der neuste Wert soll immer an das Ende des Array angehängt werden und der erste Wert soll gelöscht werden. Dadurch soll das Array immer nur 30 Zeilen lang sein.
Du willst also einen Ringbuffer. Ich befülle den wie im Anhang eher am Anfang, ist einfacher…
Zitat:Nun möchte ich, dass die Messung abbricht, wenn kein alle Werte des Arrays kleiner als 1 sind.
KEIN Wert oder ALLE?
Auch der Kommentar in deinem VI ist irreführend: momentan stoppst du, wenn das Maximum im Buffer kleiner als 1 ist!
Zitat:Leider funktioniert das nicht, wie gewünscht, in der Array werden immer ganz viele Nullen geschrieben.
Dann solltest du prüfen, wo die Nullen herkommen!
Du hantierst z.B. mit vielen unglücklich gewählten Datentypen: erst DDT, dann Waveform - warum?
Du willst doch einen Mittelwert (skalar) von mehreren Messwerten (Array) bilden: mach das doch einfach!
Zitat:Das VI soll übrigens später einmal in eine Sequenz eingepflegt werden.
"Sequenzen" ist ein Reizwort!
Besser ist THINK DATAFLOW! oder eine Statemachine!
P.S.: DAQmx ist auch ohne DAQAssi ganz einfach, siehe Links in meiner Signatur…
danke für deine Hilfe.
Ja, das mit diesem "Rotary Array"-Block macht es natürlich deutlich einfacher. Den kannt ich vorher nicht.
Ja, sorry hatte mich im VI-Kommentar als auch im Post verschrieben... (war etwas in Eile).
Also Ziel des Ganzes ist es die Schleife zu stoppen, wenn die Messwerte der letzten 30Sekunden kleiner als 1 sind. Also falls die letzten 29 Messwerte kleiner sind und der 30. wieder über 1 müssen wieder 30 Messwerte überprüft werden.
Das mit den verschiedenen Datentypen DDT und Waveform war nicht unbedingt so gewollt, wusste einfach nicht wie ich es anders machen sollte. Außerdem versteh ich auch nicht so ganz den Unterscheid bzw. warum denn dann plötzlich am Ausgang der Mittelwertbildung eine Waveform ist. Vielleicht kann mir das ja mal jemand schnell erklären.
Das mit der State machine klingt recht interessant. Gibt es hier gute Beispiele für die bessere Verständis?
Vorgestern hatte ich schon ein alternatives VI gemacht, dann aber hatte ich keine Zeit mehr zum posten.
Der Grundgedanke ist: Mit dem 30 zeiligen Array auf dem Frontpanel, bei dem die Messwerte ständig weiterrutschen, wird das Gehirn des Betrachtes überfordert sein. Man kann da nichts Vernünftiges mehr herauslesen. Besser wäre es doch, die Daten als Streifendiagramm darzustellen. Und wenn man die Historienlänge auf 30 eintstellt, dann wird alles ganz einfach, weil der Ringpuffer entfällt.
Zitat:Und wenn man die Historienlänge auf 30 eintstellt, dann wird alles ganz einfach, weil der Ringpuffer entfällt.
Wenn man von der RaceCondition und dem erzwungenen Wechsel in den UI-Thread absieht: Ja.
Ich hätte eher die PtByPt-DataQueue empfohlen. Oder gleich das PtByPt-MaxMin…
(Die bisherige Lösung mit Schieberegister und Array-Handling bietet aber den ungleich höheren Lerneffekt. )
(23.11.2015 09:25 )GerdW schrieb: Wenn man von der RaceCondition und dem erzwungenen Wechsel in den UI-Thread absieht: Ja.
Die RaceCondition ist kein Argument gegen Lösung an sich. Es handelt sich hier um einen Flüchtigkeitsfehler von mir, der mit einer winzig kleinen Codeänderung behebbar ist.
Und selbstverständlich verbietet es sich, Eigenschaftsknoten in einer zeitkritischen Hauptschleife dauernd aufzurufen. Diese Schleife ist das aber nicht: sie wird nur ein Mal pro Sekunde durchlaufen, wodurch das Argument gegenstandslos wird. Der Zeitverbrauch von weniger als 1 ms für den Aufruf des Eigenschaftsknotens spielt da keine Rolle.
Und den Lerneffekt, der darin besteht, dass eine Lösung auch überraschend einfach sein kann, möchte ich auch nicht unterschätzt haben wollen
Verstehe ich das richtig, dass beim While-Schleifen Durchlauf Nummer 31 in der Case-Struktur überprüft wird ob das Maximum aller bisherigen Werte kleiner als 1 sind? Wenn ja erhält die While-Schleife das True zum stoppen ansonsten False.
Ein paar Fragen habe ich aber noch
1. Ich verstehe nicht ganz, warum die Schleife 1 Sek. pro Durchlauf benötigt. In der Schleife ist doch eine Wait von 200ms?
2. Warum ist der Fehler-Ausgang der History-Property an die While-Schleife angeschlossen?
3. Ich würde in Zukunft gerne den Zeitbereich der Messwertüberprüfung variabel einstellen können. Also zum Beispiel anstatt 30 Sekunden möchte ich die letzten 30 Minuten überwachen. Ist dies mit dieser Methode im Moment so möglich?
3. Nein.
Oben stehen ja schon andere Optionen, die dies aber erlauben…
(Es wäre schön, wenn nicht unwesentliche Randbedingungen gleich vorab genannt würden.)
(23.11.2015 15:52 )Marbec schrieb: Verstehe ich das richtig, dass beim While-Schleifen Durchlauf Nummer 31 in der Case-Struktur überprüft wird ob das Maximum aller bisherigen Werte kleiner als 1 sind? Wenn ja erhält die While-Schleife das True zum stoppen ansonsten False.
Richtig, aber da die Null mitgezählt wird, wären es sogar ab Arraylämge 32. Ab Arraylänge 30 sollte die Überprüfung beginnen, also sollte man in dem Case besser die beiden Bereichs "..28" und "29.." haben
Zitat:1. Ich verstehe nicht ganz, warum die Schleife 1 Sek. pro Durchlauf benötigt. In der Schleife ist doch eine Wait von 200ms?
Die 1 Sek bezieht sich auf Deine eigene Aussage in #1. Das Wait von 200ms habe ich nur genommen, damit das Beispiel nicht so langweilig ist
Zitat:2. Warum ist der Fehler-Ausgang der History-Property an die While-Schleife angeschlossen?
Die History muß gelöscht werden, bevor das Programm in die Schleife eintritt. Das wird damit erreicht. Allerdings wird das vielleicht nur ein fauler Programmierer so machen. Denn man würde glatt 30 sec länger zum Programmieren brauchen, wenn man "History löschen" und "Schleife" in die zwei Cases einer Sequenzstruktur setzen würde. Das empfinde ich aber irgendwie sauberer, und solche Fragen nach dem Warum des Ganzen könnten dann gar nicht erst aufkommen.
Zitat:3. Ich würde in Zukunft gerne den Zeitbereich der Messwertüberprüfung variabel einstellen können. Also zum Beispiel anstatt 30 Sekunden möchte ich die letzten 30 Minuten überwachen. Ist dies mit dieser Methode im Moment so möglich?
Wie Gerd schon sagte, ist das nicht möglich. Die History-Länge läßt sich im Programm nicht ändern. Das heißt aber nicht, dass Du auf das Diagramm verzichten müßtest oder dass das Programm dann merklich komplizierter würde. Wie Gerd auch schon sagte, wäre es wünschesnwert, wenn Du Deine Anforderungen möglichst zeitig und vollständig klar benennen würdest.
Jetzt weiß man von Dir z.B nicht einmal, ob du das Diagramm nun haben willst oder ob Du lieber bei der usprünglichen Array-Darstellung bleiben willst.