Hallo liebe LabView Gemeinde,
ich wurde im Rahmen einer Tätigkeit als Hiwi ins kalte Wasser geworfen und muss jetzt mit LabView arbeiten. Ich bin eigentlich Maschinenbauer und entsprechend viel Ahnung habe ich von Informatik. Also bitte entschuldigt wenn ich ein bisschen unbeholfen wirke.
Nun zu meinem Problem, es geht darum bei einem Versuch, der mehrere Tage am Stück läuft, eine Temperaturüberwachung durchzuführen. Dazu gibt es Tempsensoren die an einen analogen Messverstärker angeschlossen sind, dieser wird von LabView ausgelesen. Diese Daten werden in Paketen à 200 Eintragen pro Sensor gebündelt und dann weitergegeben. Wenn ich jetzt also ein Graph einbaue geht die Zeitachse immer nur bis 200 und der Graph aktualisiert sich ständig (siehe Anhang). Um jetzt die letzten 24h darstellen zu können müsste also irgendwie eine Schlange eingebaut werden die z.B. alle 5min für jeden Sensor einen Wert speichert und dann folglich für jeden Sensor 288 Einträge hätte und dann immer den ältesten Wert rauswirft. Diese Schlange muss dann noch als Graph dargestellt werden. Jetzt meine Frage: Wie mache ich das in Labview?
Das vi darf ich hier leider nicht hochladen, habe aber ein Screenshot der entsprechenden Stelle gemacht (siehe Anhang). Signalverlaufsgraph 2 soll der 24h Graph werden.
Hallo,
statt eines Graphen kannst du einfach ein Signalverlaufsdiagramm verwenden. Dann mit Rechtsklick auf das Diagramm und unter Historienlänge die Anzahl der Datenpunkte einstellen. Fertig.
Das wäre das einfachste...
Gruß
Und wenn du schon am Quellcode arbeitest, hier noch ein paar VorschlägeFragen:
- müssen die ganzen Lokalen Variablen sein? (sie bergen die Gefahr der "Race Conditions")
- Bitte richte die Elemente ein wenig aneinander aus (oft als "Aufräumen" bezeichnet); es gibt auch eine Funktion dazu, die man ausprobieren kann (dieser Besen mit dem LabVIEW-Addierer oben rechts)
- Wenn du ein Array indizieren willst, und dabei sowieso von Index 0 bis n gehst, brauchst du keine Konstanten anschließen, siehe Snippet
[
attachment=44468]
Übrigens, bin auch Maschinenbauer, und komme halbwegs mit LV klar. Also keine Scheu
Bei Fragen einfach Fragen.
Gruß
Danke schon mal für deinen Tipp, aber habe ich da nicht unendlich große Datenmengen? Die Abtastrate der Messkarte sind 25 Microsekunden, da kommt in 24h ja schon einiges zusammen. Oder kann ich bei dem Diagramm auch einstellen das er alle 5 min ein wert nimmt und mir entsprechend 288 anzeigt?
Die lokalen Variablen müssen sein, da es einen solchen Filmstreifen für den Hinweg und einen für den Rückweg gibt, man aber logischer Weise nicht jede Anzeige doppelt haben möchte. Die Variablen stellen nur Anzeigeelemente dar.
Das mit dem Array muss glaube ich doch so sein, da ich ja von der Messkarte die Werte für alle Sensoren bekomme und die dann in ein Array schreibe welches dann jeden Sensor an einer Position speichert. Und dann muss ich doch wenn ich die einzelnen Sensoren separat anzeigen möchte die Position des Array mit dem entsprechenden Wert anzeigen lassen, oder habe ich da was falsch verstanden?
Das mit dem aufräumen ist ein guter Tipp so was habe ich schon gesucht, sah vorher noch schlimmer aus
aber von Hand das ganze ohne Einrasten zu machen ist doch sehr langwierig.
Guten Morgen,
also ich hab nicht alles verstanden, von dem was du geschrieben hast, aber ich antworte mal so gut ich kann:
25µs entspricht ja 40kHz. Das sind eindeutig zu viele Daten für ein Plot, wenn dieser 24h anzeigen soll. Sind ja immerhin ca. 3,5Milliarden Werte! Ein Dbl hat 8Byte, also wären das ca. 27,5GB an Daten für einen Kanal (unkomprimiert).
Die Frage ist doch, wofür brauchst du diese hohe Abtastrate. Wenn du sie z.B. nur für eine OnlineAnalyse brauchst, dann würde ich sie zum Speichern verringern, so, wie du selbst schon vorgeschlagen hast: Indem man einfach X Werte zu einem Wert mittelt. Oder kannst du sogar einfach die Abtastrate herunter setzen?
In einem Diagramm sind eh nie mehr Datenpunkte sichtbar, als es Pixel breit ist. Daher würde ich entweder:
- die gemittelten Datenpunkte (1Wert/Minute z.B.) ODER
- die letze "hochgenaue" Analyse (sofern es sowas bei dir gibt) in hoher Auflösung darstellen.
Zu dem Signalverlaufsdiagramm noch ein Satz: Die Historienlänge sagt, wie viele Werte in den "Puffer" des Diagramms passen und dargestellt werden können. Wenn der Puffer voll ist, dann wird der älteste Wert entfernt, um Platz für den neuen zu machen.
Zu dem Snippet von mir mit dem einfachen Indexieren von Arrays: Probier es doch einfach mal aus! Die drei dargstellten Varianten machen alle das gleiche! Du musst die "Adresse" im Array nicht angeben, wenn du eh von 0..n-1 Anschlüsse aufziehst.
Zum Aufräumen: Ich glaube in neuen LabVIEW-Versionen kann man auch Teilbereiche aufräumen lassen, indem man vorher die Elemente markiert und dann erst den Button klickt.
Es wäre außerdem immernoch hilfreich, deinen Quellcode zu sehen. Du könntest deine hochgeheimen SubVI's ja einfach nicht hochladen oder entsprechende Bereiche aus dem Blockdiagramm entfernen.
Gruß
Das das zu viele Daten sind ist mir auch klar, deshalb will ich ja alle 5min einen Wert abgreifen und im Diagramm darstellen. Das sind dann pro Sensor 288 Daten in 24h, das sollte im Rahmen liegen. Dazu brauche ich eine Schleife mit 5min Wartezeit. Die ein Wert pro Sensor abgreift und in eine Schlange mit 288 Einträgen speichert. Diese Schlangen müsste ich dann zusammenführen und als Diagramm, am besten mit der Uhrzeit zu der der Wert erfasst wurde, darstellen. Aber wie ich das genau umsetzten soll erschließt sich mir nicht wirklich. Das VI darf ich nicht hochladen. Aber das Bild zeigt den Interessanten Bereich, der Rest ist uninteressant für mein Problem.
Moin,
könntest du nicht eine Abfrage einbauen, die nur alle 5min (wenn deine Schleife zB 100mS läuft, bei jedem 300. Durchlauf) ausgeführt wird und dann den aktuellen Wert in einen Graphen schreibt?
Grüßle
S.
Der Versuchsstand wird zur Zeit umgebaut, deshalb kann ich nichts ausprobieren.
@Schwand: habe ich bei deiner Lösung nicht immer nur einen Wert im Graph?
Ich wollte auch erst mal abklären ob man das was ich brauche realisieren kann, bevor ich mich da ewig einarbeite und es am ende so gar nicht geht.
Also nochmals die Anforderungen:
von 10 Sensoren deren Werte über eine Messkarte eingelesen werden. Soll im 5min Takt pro Sensor ein Wert ausgelesen werden. Dieser Wert soll dann für 24h gespeichert werden. So dass ich nach 24h Laufzeit immer die Werte der letzten 24h von jedem der 10 Sensoren in einem Diagramm sehe. Also 10 Kurven in einem Graph. Am besten mit der jeweiligen Uhrzeit zu der der Wert ausgelesen wurde.
Mein Ansatz:
Ich habe ja für jeden der 10 Werte schon eine Anzeige. Dieses Signal will ich abgreifen und in eine Schleife "leiten". Die Schleife speichert im 5min Takt 1 Wert in eine Schlange mit 288 Einträgen. Am besten wäre wenn jedem Wert dann noch Datum und Uhrzeit zugeordnet werden würde, dann müssten aber alle 10 Schleifen exakt Zeitgleich laufen. Dann sollte ich 10 Schlangen mit je maximal 288 Werten haben. Und diese 10 Schlangen sollen dann in ein Diagramm.
Wenn das einfacher geht nur raus damit. Ich hab von Informatik echt soviel Ahnung wie die Kuh vom Eierlegen.
Für die Anzeige würde ich einen Art Ringpuffer verwenden der alle anzuzeigenden Datenpunkte und Zeitwerte enthält. Hierbei lässt sich die Besonderheit das NaN nicht geplottet wird sehr gut nutzen um permanente Speicherallokierungen zu vermeiden. Im Anhang findest eine mögliche Implementierung für sowas.
Hier mal ein Vorschlag mit dem schon erwähnten Signalverlaufsdiagramm. Hat den Vorteil, dass man den internen Ringpuffer des SV.-Diag. direkt als Speicher hat und sich nicht mit Eigenbastelei eines solchigen herumschlagen muss.
[
attachment=44586]