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 habe mir über die letzten Wochen am Beispiel "Continuous Measurement Data Logger" eine QHM-Struktur aufgebaut --> resultierend aus diesem Thema.
Irgendwann soll die Kamera da eingebunden werden...
Folgende Situation:
Ich lese einen DAQmx-Task mit 3 Kanälen (2 Thermoelementen und 1 Umgebungsdruck), lasse mir die Messung via Notifier anzeigen und speichere alles via Queue in eine TDMS-Datei. Das klappt alles.
Frage:
Wie kriege ich es bei meinen Messdaten (somit auch bei meinem Graphen) hin, dass sie bei einer absoluten Zeit mit t0 = 0 starten?
Kann ich die Zeit auch als Wertespalte in der TDMS-Datei (geöffnet via Excelimport) abspeichern lassen und wenn ja, wie?
In meinen Graphen möchte ich eine Temperatur-Rampe (s. Bild) einfügen, um visuell während der Messung abgleichen zu können, ob sich die gemessene Temperatur entsprechend der externen Regelung verhält. Letzten Endes ist damit die Laufzeit einer Messung auch vorgegeben und ich würde den Anzeigegraphen gerne so auf der x-Achse skalieren, dass er dieses Zeitfenster zeigt und Stück für Stück mit Werten aus dem Notifier gefüllt wird. Geht das mit dem Ansatz eines QHM?
Anbei ist mein komplettes Projekt und ein Bild des Graphen wie er irgendwann mal aussehen soll...
Schon mal vielen Dank für eure Hilfe!
VG
Abongile
Anzeige
26.05.2017, 07:59 (Dieser Beitrag wurde zuletzt bearbeitet: 26.05.2017 08:33 von Abongile.)
Projektfortsetzung mit "Lösung" der anfänglichen Thematik
Hallo wertes Forum,
wie bereits im ersten Post beschrieben, mein Programm zeichnet 2 Thermoelemente und den Atmosphäredruck in einem Ofen auf. Mit dem Ofen werden verschiedene Temperaturregime abgearbeitet.
Das "erste Problem", den Graphenursprung auf 0 zu setzen, habe ich lösen können, indem ich die Waveform auflöse und 0 als Beginn eintrage. Das funktioniert, allerdings muss ich nun mit einem Schleifenregister arbeiten, dass sich der Graph fortlaufend füllt und nicht immer nur einen einzelnen Wert anzeigt. (Weiß wer warum? ^^)
Ich möchte nun in meinen Graphen eine Temperatursollkurve eintragen, so dass visuell mit Erfassung der Messdaten direkt abgeglichen werden kann, ob sich die Temperatur im Ofen so entwickelt wie eingestellt.
Ich habe eine Lösung dafür "entwickelt", in dem ich ein Array mit den Daten der Sollkurve fülle und dieses Array iteriere und dann in eine Waveform umwandele, clustere, und in einen Value-Knoten des Diagramms schreibe, welche ich wiederum im Display Loop auslese und somit anzeigen kann. Das 1. Bild zeigt mein Userinterface zum Eintragen der Werte sowie eine dargestellte Sollkurve im HauptUI.
Das klappt so prinzipiell, jedoch erhalte ich bei Beenden des Programms die Fehlermeldung "Error 1122 occurred at Wait on Notification in ..." (s. Bild 3) mit Bezug auf den Eigenschaftsknoten "Messung Value" (unten links im 3. Bild) und ich verstehe nicht ganz was der Eigenschaftsknoten mit dem Notifier zu tun hat. Kann mir das jemand erklären?
Alles in allem sagt mir der Fehler auch, es gäbe vielleicht eine bessere Variante diese Aufgabe zu lösen. Hat jemand eine Idee? Der aktuelle Stand des Projekts ist angehängt, falls jemand reinschauen will.
Ein Graph zeigt immer nur an, was er an Daten bekommt. Wenn du alte Daten anzeigen willst, musst du dir diese merken.
Wozu die "value"-Property des Graphs? Warum hier kein Schieberegister?
Wieso fügst du den Sollwert-Plot so umständlich dazu? Warum nicht einfach ein Schieberegister dafür verwenden und vor dem Graph die aktuellen Messwerte und den Sollwertplot per BuildArray zusammenfassen?
Zitat:"Error 1122 occurred at Wait on Notification in ..."
Da wurde der Notifier wohl irgendwo gelöscht, während an anderer Stelle noch darauf gewartet wird…
Und da du die Fehlerbehandlung aktiviert hast, wird der der Fehler eben angezeigt, sobald du dich nicht mehr selbst drum kümmerst!
Zitat:Ein Graph zeigt immer nur an, was er an Daten bekommt. Wenn du alte Daten anzeigen willst, musst du dir diese merken.
Okay. Aber wenn ich einfach die Waveform in den Graphen übergebe, zeigt er mir ja auch die "alten Daten" an und da habe ich die alten Daten in kein Schieberegister o.ä. geschrieben. Sobald ich die Waveform jedoch auseinandernehme und eine neue daraus baue, ist das nötig. Darauf zielte die Frage ab. Daher besser formuliert:
Wo merkt sich der Graph die alten Einträge der Waveform, welche ich direkt aus dem Notifier holen könnte?
Zitat:Wozu die "value"-Property des Graphs? Warum hier kein Schieberegister?
Wieso fügst du den Sollwert-Plot so umständlich dazu? Warum nicht einfach ein Schieberegister dafür verwenden und vor dem Graph die aktuellen Messwerte und den Sollwertplot per BuildArray zusammenfassen?
Wie meinst du das?
Ich erzeuge den Plot für die Sollwerte ja im UserInterface Loop und schreibe den Plot, welchen ich aus den Einträgen in Bild 1 erzeuge, indem ich zwischen den Einträgen iteriere und daraus einen Signalverlauf baue, in meine "Settings"-Typdef. Dann muss ich diesen Signalverlauf in ein passendes Format ändern (s. Bild 2), um ihn im Graphen anzeigen zu lassen und bilde ein entsprechendes Cluster
Meine Schwierigkeit lag dann darin, wie kriege ich dieses Cluster nun rüber in den Displayloop und nach viel rumprobieren hat das mit der "value"-Property geklappt. Du sagst jetzt, das geht per Schieberegister? Wo müsste das hin?
Sorry, wie man merkt, ist mein geringes Halbwissen immer noch nicht ausreichend, um sinnvoll aus deinen Beiträgen zu lernen und ich kriege nicht genug "Ressourcen" freigeräumt, um mich mal für 2-4 Wochen durchgängig mit LabVIEW zu beschäftige.
Zitat:Aber wenn ich einfach die Waveform in den Graphen übergebe, zeigt er mir ja auch die "alten Daten" an und da habe ich die alten Daten in kein Schieberegister o.ä. geschrieben.
Das kann ich nicht nachvollziehen…
Momentan liest du aus einem Notifier aus und bekommst dort deine neue Waveform - allerdings wartest du hier unbegrenzt auf "neue" Messwerte. Und dann werden die neuen Messwerte im Graph dargestellt!
Zitat:Sobald ich die Waveform jedoch auseinandernehme und eine neue daraus baue, ist das nötig. Darauf zielte die Frage ab.
Ich sehe den Zusammenhang hier nicht!
Du willst dir vorherige Messdaten merken und machst das im Schieberegister - so wie es sein sollte…
Zitat:Wo merkt sich der Graph die alten Einträge der Waveform, welche ich direkt aus dem Notifier holen könnte?
Ein Graph merkt sich nichts.
Bitte stelle ein VI bereit, welches das Gegenteil beweist!
Zitat:wie kriege ich dieses Cluster nun rüber in den Displayloop und nach viel rumprobieren hat das mit der "value"-Property geklappt.
Diese "value"-Property holt sich die Daten aus dem Graph selbst. Wie kommst du darauf, dass du "diesen Cluster rüber in die Displayloop" bekommst?
Zitat:Du sagst jetzt, das geht per Schieberegister? Wo müsste das hin?
Nach nochmaligem Draufgucken verstehe ich die Logik dahinter nicht.
Es wird der erste Plot vom Graph nochmal vor alle anderen Plot gestellt?
Zitat: Zitat:
Aber wenn ich einfach die Waveform in den Graphen übergebe, zeigt er mir ja auch die "alten Daten" an und da habe ich die alten Daten in kein Schieberegister o.ä. geschrieben.
Das kann ich nicht nachvollziehen…
Momentan liest du aus einem Notifier aus und bekommst dort deine neue Waveform - allerdings wartest du hier unbegrenzt auf "neue" Messwerte. Und dann werden die neuen Messwerte im Graph dargestellt!
Zitat:
Sobald ich die Waveform jedoch auseinandernehme und eine neue daraus baue, ist das nötig. Darauf zielte die Frage ab.
Ich sehe den Zusammenhang hier nicht!
Du willst dir vorherige Messdaten merken und machst das im Schieberegister - so wie es sein sollte…
Zitat:
Wo merkt sich der Graph die alten Einträge der Waveform, welche ich direkt aus dem Notifier holen könnte?
Ein Graph merkt sich nichts.
Bitte stelle ein VI bereit, welches das Gegenteil beweist!
Ich hatte es früher so:
Da brauchte ich kein Schieberegister Die Frage ist vom Prinzip her aber nicht sehr wichtig. Nur allgemeines Verständnis.
Bezüglich dem Soll-Plot:
Ich versuche mal rüberzubringen, wie ich mein Programm verstehe, dazu nochmal das Bild mit Erklärung hinzugefügt.
Wenn ich im DisplayLoop den Propertynode nicht nochmal aufrufe und zusammenführe, wie im Bild beschrieben, wird er von den eingehenden Messdaten überschrieben :/
Ja, da war das ja auch noch ein Chart - und kein Graph!
Zitat:Bezüglich dem Soll-Plot: Ich versuche mal rüberzubringen, wie ich mein Programm verstehe, dazu nochmal das Bild mit Erklärung hinzugefügt.
Wieso baust du eine QMH, wenn du dann hinterher Daten "quer" über direkte Zugriffe auf Indicators hin- und herschiebst?
Diese zweiten Zugriff auf den Graph hatte ich bisher nicht übersehen - ich hatte einfach nicht mit einer solchen Umgehung der QMH-Struktur gerechnet…
Wenn schon QMH, dann richtig!
1. Eine Message für den Soll-Plot: Der Sollplot wird in der Display-Loop in einem Schieberegister gespeichert.
2. Eine Message für die Messdaten: die Displayloop baut die Plots für den Graphen, basierend auf diesen Messdaten-Messages auf…
Zitat:Wenn schon QMH, dann richtig!
1. Eine Message für den Soll-Plot: Der Sollplot wird in der Display-Loop in einem Schieberegister gespeichert.
2. Eine Message für die Messdaten: die Displayloop baut die Plots für den Graphen, basierend auf diesen Messdaten-Messages auf…
Meinst du vielleicht eine Queue/Notifier jeweils?
Aber kann ich denn so einen kompletten Plot in einen Notifier packen oder muss ich den dann in der selben Frequenz, wie die Messdaten entstehen, einspielen?
Oder meinst du ich soll den Notifier durch eine Message ersetzen? Ist das schnell genug?
Eine Message ist doch zum "Steuern" der Loops da, oder?
Das ist einer der Hauptunterschiede von Charts und Graphs.
Wichtiger noch: bitte immer die korrekten Namen verwenden, damit keine Vewirrung aufkommt…
Zitat:Oder meinst du ich soll den Notifier durch eine Message ersetzen? Ist das schnell genug?
Eine Message ist doch zum "Steuern" der Loops da, oder?
Ja, ich würde sowas über eine Message machen - genau dafür hast du doch einen QMH gebaut!?
Über Messages kann man Steuerbefehle übertragen - das kann aber auch der Befehl "Hier kommen Soll-Plot-Daten" sein. Und neben einem Befehl kann man ja auch gleich Daten mitschicken…
Zur "Schnelligkeit": wie oft musst du denn den Sollplot übertragen? Passiert sowas nicht einmalig zum Start einer Messung - und ist damit überhaupt nicht relevant für die "Schnelligkeit" der Abarbeitung?