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 die letzten Wochen eine Prüfstandsteuerung für einen Motorenprüfstand zusammengestellt.
Funktioniert bis dato auch soweit ganz gut - lediglich mein SubVI zur Datenerfassung und Datenverarbeitung ist sehr langsam und wird immer langsamer.
Dieses SubVI hat unter anderem die Aufgabe aus der Variable SG_N_SOLL_OUT die jeweilige Spannung am Digital Ausgang NI 9263 auszugeben. (Sollsignal für Frequenzumrichter, der dann die Drehzahl dementsprechend regelt)
Der Sondenmonitor zeigt, dass die Variable nur genau alle 10Sekunden abgefragt wird und dann der jeweilige Wert ausgegeben wird. Das ist verständlicherweise viel zu langsam für eine schnelle Drehzahlregelung.
Mein Ziel eine Messdatei mit 10ms Raffer herauszuschreiben funktioniert so leider nicht.
Den Aufruf dieses Sub VI's mache ich ihn einer schnellen Schleife in meinem Hauptprogramm (Siehe Foto Funktionsaufruf im Anhang).
Der Wartebefehl wird von der Variable SG_ABTASTRATE (=10ms) gesteuert.
In meinem SUB VI ist demnach keine Schleife mehr sondern alle DAQ Assistenten zum Aufnehmen der Drucksensoren, Temperatursensoren und Ausgeben der Digital Out (für Relaisschaltungen) sowie Analog Ausgabe für Frequenzumrichter. Desweiteren werden dort alle Variablen in eine Exceldatei exportiert.
Ich habe Euch das Sub VI zur Datenerfassung angehängt.
Ich hoffe Ihr wisst was ich alles falsch gemacht habe bzw. warum dieser Teil des Programms so langsam ist :-)
Vorab Vielen Dank und viele Grüße
Anzeige
29.03.2017, 17:10 (Dieser Beitrag wurde zuletzt bearbeitet: 29.03.2017 17:10 von GerdW.)
Zitat:Der Sondenmonitor zeigt, dass die Variable nur genau alle 10Sekunden abgefragt wird und dann der jeweilige Wert ausgegeben wird.
Aber das hast du doch genau so programmiert!?
Du fragst deine Thermoelemente mit 10Hz Samplerate ab - und fragst gleich 100 Samples ab. Das dauert nach Adam Riese genau 10s!
Zitat:Mein Ziel eine Messdatei mit 10ms Raffer herauszuschreiben funktioniert so leider nicht.
Korrekt.
Dafür müsstest du mit mindestens 100Hz Samplerate arbeiten!
Zitat:Ich hoffe Ihr wisst was ich alles falsch gemacht habe bzw. warum dieser Teil des Programms so langsam ist :-)
Das "warum" ist geklärt…
Zum "was": wenn man ein "schnelles" VI haben will, sollte man auf ExpressVIs verzichten! Es gibt da wesentlich schnellere "Grund"-Funktionen, siehe Links in meiner Signatur!
Außerdem: Ein VI, dessen BD sich über 4 FullHD-Bildschirme erstreckt, gehört verboten! Die Nutzung so vieler (shared) Variablen ist auch fragwürdig…
Außerdem2:
Habe die DAQ Assistenten zum Einlesen der THermoelemente sowie der Drucksensoren (analog In) mit Erfassungsmodus: Kontinuierlich Zu Lesende Werte: 1 und Rate (Hz): 10 eingestellt.
Jetzt sollten doch 10mal pro Sekunde meine Werte für die Temperaturen + Drücke aktualisiert werden und die Erfassung solange laufen bis ich das VI beende. Ist das so korrekt oder habe ich da was falsch verstanden?
Leider bekomme ich nun nach einigen Sekunden Datenaufzeichnung folgende Fehlermeldung:
Wisst Ihr an was das liegt?
Leider habe ich zudem das Problem dass meine Druckanzeigen oft auf 0 fällt. Die Spannung am Analogeingang ist aber konstant und ruhig 1,95 V DC
(Dieses Problem hat komischerweise nur das NI cDAQ NI9220 Analog In, Das Thermo In hat dieses Problem nicht). Im DAQ Assistent sind beide gleich bedatet (Kontinuierlich, zu Les. Werte: 1, Rate 10Hz)
Zu "Ausserdem": Da hast du absolut Recht. Ist auch echt nervig. Aber das Problem ist, dass ich so viele Eingänge habe und so viele Werte in die Messdatei schreiben will, dass das so eine große Datei wird. Ich habe bereits versucht viele Teilfunktionen der Prüfstandssteuerung in Sub VI's zu packen (Temperaturregelung, Nullabgleich, Drehzahlregelung, Datenerfassung/-verarbeitung, Initialisierung). Habt Ihr Ideen wie ich alle Variablen in eine Messdatei bringe und trotzdem eine hohe Geschwindigkeit bekomme? Ich bräuchte eine Abtastrate von 10ms in der Messung.
Die shared Variablen finde ich ehrlich gesagt ganz nützlich, da ich in meinem Hauptprogramm darüber alle Temperatur und Druckanzeigen einfach darstellen kann und in allen Sub VI's auf diese Variablen Zugriff habe.
Zu "Ausserdem2": Habe nun endlich mein Profil aktualisiert mit der aktuellen LV Version :-)
Vorab Vielen Dank für Eure Hilfe :-)
Viele Grüße
30.03.2017, 12:55 (Dieser Beitrag wurde zuletzt bearbeitet: 30.03.2017 12:56 von GerdW.)
Zitat:Jetzt sollten doch 10mal pro Sekunde meine Werte für die Temperaturen + Drücke aktualisiert werden und die Erfassung solange laufen bis ich das VI beende. Ist das so korrekt oder habe ich da was falsch verstanden?
Das ist grundsätzlich korrekt.
Dummerweise muss natürlich das auswertende Programm auch selbst schnell genug sein, um diese Samplerate bedienen zu können. Und da sehe ich bei deinem VI-Monster schwarz…
Zitat:Wisst Ihr an was das liegt?
Ja: du holst die Messwerte nicht schnell genug ab…
Zitat:(Dieses Problem hat komischerweise nur das NI cDAQ NI9220 Analog In, Das Thermo In hat dieses Problem nicht).
Das sind auch zwei komplett verschiedene Messmodule.
Hast du mal die tatsächliche Samplerate des 9220-Moduls geprüft? Wenn man die ExpressVIs weglässt und direkt mit DAQmx-Funktionen arbeitet, bekommt man das ruckzuck mit einer Propertynode heraus - wie in den BeispielVIs gezeigt wird, die mit LabVIEW mitgeliefert werden!
Zitat:Habt Ihr Ideen wie ich alle Variablen in eine Messdatei bringe und trotzdem eine hohe Geschwindigkeit bekomme? Ich bräuchte eine Abtastrate von 10ms in der Messung.
Die Variablen sind normalerweise sehr schnell (wenn sie nicht gerade über das Netzwerk arbeiten müssen). Ich finde es eher extrem unübersichtlich, für jeden Messwert eine eigene globale Variable vorzuhalten. Was soll ich mit meinen Prüfständen machen, wo ich ~300-500 Messwerte etc. verwalte?
Tipps:
- gleichartige Werte könnte man in Arrays zusammenfassen, z.B. ein Array mit allen Temperaturmesswerten usw.
- ich verwende eine Key-Value-Tabelle, die über Variantattribute realisiert wird…
beim Durchschauen des Beispiel VI's von Labview habe ich eines getestet und folgenden Verlauf an meinem Analog Input festgestellt:
Nach Überprüfung im Signalverlaufsdiagramm eines Drucksensors kam folgendes Verhalten:
Die Spannung an der Hardware ist aber Konstant und zeigt nicht dieses Verhalten wie im Graphen.
Hast du eine Idee was hier das Problem ist?
Zum Thema (zu) langsame Datenerfassung:
Mein Analog Input (NI 9220) hat eine Samplerate von 100.000 Samples / s und das Thermo in 75Samples / s (laut Datenblatt)
Heisst doch, dass ich das Analog Input 100.000 mal pro Sekunde nach dem jeweiligen Spannungswert fragen kann. Beim Thermo In nur 75 mal pro Sekunde.
Das Schreiben in Arrrays hatte ich anfangs versucht, hatte aber starke Probleme mit der Umrechnung der einzelnen Kanäle und der Kanalbeschriftung in der Messdatei.
Was würde in meinem Fall mehr Sinn machen? eine Kontinuierliche Erfassung oder Einzelwertmessung mit der Geschwindigkeit der Schleife ?
Momentan stehe ich auf dem Schlauch wie ich das Thema Datenerfassung am besten Lösen soll, sodass es ein wenig schneller wird.
Wichtig wäre:
- Alle Variablen bzw. Messwerte in eine Messdatei (bestenfalls / eigentlich 10ms Raster)
- Anzeige der Druck/Temperatursensoren im Hauptprogramm (Aktuell über Variablen gelößt)
- Umrechnung der Spannungswerte in die korrekten Drücke etc.
Kannst Du mir bite das kurz erklären:
Zitat:Wenn man die ExpressVIs weglässt und direkt mit DAQmx-Funktionen arbeitet, bekommt man das ruckzuck mit einer Propertynode heraus - wie in den BeispielVIs gezeigt wird, die mit LabVIEW mitgeliefert werden!
Was meinst du mit Propertynode? Wäre über hilfreiche Tipps zur Umsetzung der benötigten Funktionen zur Datenerfassung sehr dankbar - Bin aktuell am Verzweifeln bzw. stehe auf dem Schlauch :-)
Vorab Vielen Dank und viele Grüße
03.04.2017, 18:47 (Dieser Beitrag wurde zuletzt bearbeitet: 03.04.2017 18:49 von GerdW.)
Zitat:Beim Thermo In nur 75 mal pro Sekunde. Alle Variablen bzw. Messwerte in eine Messdatei (bestenfalls / eigentlich 10ms Raster)
Dein NI9213 kann maximal und in Summe 75S/s, bei deinen 9 Thermoelementen also effektiv ~8S/s/channel. Das macht nach Adam Riese ~125ms pro Abfrage deiner 9 Thermoelemente oder maximal 8Hz Speicherrate - weit weg von den 100Hz, die du gerne hättest…
Lösung deines Problems: Bei ein vernünftiges Programm und entkoppele deine diversen Schleifen/DAQmx-Tasks! Schnelle Tasks/Hardware dürfen gern im 100Hz-Takt arbeiten, langsame eben in langsameren Schleifen. Datenaustausch über Queues/Notifier/FGVs. Die ganzen SharedVariables nach Möglichkeit auch in eigene Schleifen!
Zitat:Was würde in meinem Fall mehr Sinn machen?
Die Einsteigerkurse zu LabVIEW durchgehen und lernen. Dann eine vernünftige Programmstruktur planen und umsetzen!
Zitat:Das Schreiben in Arrrays hatte ich anfangs versucht, hatte aber starke Probleme mit der Umrechnung der einzelnen Kanäle und der Kanalbeschriftung in der Messdatei.
Weil du zuviel mit ExpressVIs und DDT-Drähten arbeitest!
Nur weil es Klickibunti ist, muss es nicht "enfach/schnell/effizient" sein…
Zitat:Umrechnung der Spannungswerte in die korrekten Drücke etc.
DAQmx bietet Skalierungen, die man direkt auf die Messwerte anwenden lassen kann. Geht ganz einfach und wird in Beispielprogrammen erläutert.
Zitat:Was meinst du mit Propertynode?
Auch das wird in dein Einsteigerkursen behandelt. Und in der (englischen) LabVIEW-Hilfe erläutert, auf Deutsch nennt sich das "Eigenschaftsknoten"…
Tut mir leid für die direkten/harschen Formulierungen, aber deine momentane Arbeitsweise "mal eben was zusammenklicken" passt eben nicht zu dem Anspruch, ein performantes Tool mit 100Hz Samplerate auf ~50 Messkanälen zu erstellen! (Viele der genannten Resourcen findest du über die Links in meiner Signatur!)
ich weiß einen ehrlichen direkten Umgang sehr zu schätzen und bin auch froh darüber. Mein Problem ist, dass ich in sehr kurzer Zeit eine komplette Prüfstandssteuerung bauen musste (nebenbei zum eigentlichen Prüfstandsaufbau). Mittlerweile läuft soweit alles - lediglich Fehler wie die langsame Datenerfassung bin ich aktuell noch am Verbessern. Die LabView Beispiel sind wirklich sehr hilfreich.
Ich würde jetzt den Weg gehen die Erfassung der Thermoelemente sowie Analogeingänge ohne Express VI's zu machen in seperaten SubVI's.
Die Erfassung der Thermoelemente funktioniert sehr gut, schnell und die Werte viel weniger springen wie mit der vorherigen Version. Jetzt brauche ich auch keinen gleitenden Mittelwert mehr.
Ich würde dieses SubVI zur Erfassung der Thermoelemente ohne zusätzliche Schleife in meiner Sequenzstruktur einbauen. Dann wäre nur das reine Datenabfragen in einer schnellen Schleife.
(Habe das SUB VI zur Erfassung der Thermoelemente mal angehängt. Ich wäre über Fehler meinerseits bzw. Tipps sehr dankbar.
Die Erfassung der Analog Eingänge bereitet aktuell noch weitere Probleme und da hätte ich ein paar Fragen dazu:
- Wie kann ich pro Kanal eine benutzerdefiniterte Skalierung in den DAQmx scale Funktionen durchführen? Da meine Drucksensoren verschiedene Bereiche haben, müsste ich verschiedene Umrechnungen durchführen (AI0-AI5: Druck 0-5bar/0-10V AI6: Druck 0-10bar/0-10V AI7: 0-3000 Umdrehungen v. Frequenzumrichter/ 0-10V AI8: MREL aus FU (zur Berechnung des Drehmoments im Frequenzumrichter) )
- Kann man beispielsweise ein Array einfügen und pro Kanal den Umrechnungsfaktor eintragen?
- Die erfassten Signale aller Analog In Kanäle zeigen immer einen kurzen Spannungsabfall. (auch bei Schaltungsart Differentiell)
Ich habe auch das Sub VI Analog_In angehängt, das die Erfassung und Skalierung der Analog Eingänge übernehmen soll.
Die Spannung an der Hardware ist absolut konstant und schwingt absolut nicht.
Habe auch versucht langsamer abzutasten - gleiches Phänomen..
Zitat:Wie kann ich pro Kanal eine benutzerdefiniterte Skalierung in den DAQmx scale Funktionen durchführen?
Generell fügt man eine Skalierung so hinzu:
Zitat:Kann man beispielsweise ein Array einfügen und pro Kanal den Umrechnungsfaktor eintragen?
Wenn man die Kanäle dann in einer Schleife anlegt, kann man für jeden Kanal eine spezielle Skalierung hinzufügen: eine typische Aufgabe für eine Schleife mit Autoindizierung…
das mit der Skalierung über eine Autoindizierung hört sich genau nach dem an was ich brauche. Leider habe ich keine Beispiele dazu gefunden. Ist das so in etwa korrekt?
Ich mache vor die FOR Schleife die Arrays mit den jeweiligen Werten für die Kanäle 0-8 (Physikalische Kanäle, Namen, Skalierung, etc.)
Der Ausgang meckert hier noch, da aus der Schleife ein Array ausgegeben wird und ein Daq Task erwartet wird.
Könntest du mir bitte kurz zeigen wie man das mit der kanalspezifischen Skalierung umsetzen kann?
Bezüglich der langsamen Datenerfassung habe ich nun die Druck und Temperatureingänge ohne Express VI's in separaten SUB VI's umgesetzt. Ist viel schneller und die Werte sind jetzt viel stabiler. Das Problem mit dem kurzzeitigem Abfallen der Spannung bei den Analog Eingängen ist auch behoben. Vielen Dank dafür!! :-)
Nun hänge ich jedoch noch an der Datenspeicherung. Diese wollte ich in einem extra Sub VI und ebenfalls ohne Express VI's umsetzen. Hier habe ich das Problem dass ich die Werte aus den Variablen in eine Messdateischreiben will. Den Header mit den Kanalnamen zu schreiben bringe ich noch hin. Die Werte danach machen mir Probleme, da ich die Aktuelle Uhrzeit + Relative Zeit seit Messstart sowie die Werte der Druck- und Temperatursensoren und die Werte der Schalter (Boolesche Werte in 0/1) rausschreiben will. Das klappt aufgrund unterschiedlicher Datentypen nicht. Das Ändern aller Werte auf String funktionierte auch nicht. Die Werte der booleschen Variablen (0 / 1) werden gar nicht mit rausgeschrieben..
Könntest du mir kurz erklären - oder hast du ein Beispiel - wie man in meinem Fall eine so große Messdatei erzeugt? Die Werte werden in verschiedenen SUB VI's ausgelesen und immer in Variablen geschrieben. (Bei den Variablen fehlt dann aber leider der Zeitstempel und Kanalname)
Ich bräuchte die aktuelle Uhrzeit, absolute Zeit seit Messstart + Kanalnamen
Ist es vielleicht sinnvoll aus jedem SubVI die ausgelesenen Werte für Temperatur, Druck, etc. extra in ein Array oder ähnliches zu schreiben und kann man die Arrays dann alle so zusammenfügen, dass man sie sauber in die Exceldatei exportieren kann? (Problem ist, dass ich ja in der Excel Datei die erste Spalte zb. als "Text" Datentyp bräuchte für den Zeitstempel und die restlichen als "Zahlen"
Aktuell scheitert es bei der Prüfstandssteuerung hauptsächlich nur noch an der zu erstellenden Messdatei..