Geschwindigkeitsproblem, VISA Kommunikation mit Messbox U2351A Keysight
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!
13.01.2016, 13:51 (Dieser Beitrag wurde zuletzt bearbeitet: 13.01.2016 14:21 von m.werle.)
Geschwindigkeitsproblem, VISA Kommunikation mit Messbox U2351A Keysight
Halle allesamt,
Habe ein Problem mit der Geschwindigkeit meiner Datenerfassung.
Die Messbox mit der ich über die VISA Schnittstelle kommuniziere, ist die U2351A von Keysight Technology.
Ich benutze die IVI-Gerätetreiber und habe in meinem LabVIEW-Programm, die Treiber-VIs benutzt, um die Messbox anzusteuern.
Die Zyklusdauer meiner Mainschleife, welche die Datenerfassung abwickelt ist schnellstens 100ms lang.
Sampingrate - Aquisition Points - Zyklusdauer
1k - 1k - 1000ms
10k - 1k - 100ms
100k - 1k - 3/4ms, es werden keine Messwerte gelesen
10k - 100 - 100ms; Daten häufen sich im Buffer an, das Programm kommt wohl nicht nach mit auslesen
100k - 10k -
Die zu erwartende Zyklusdauer wäre doch: Aquisition Points / Samplingrate
Bzw. die Updatefrequenz wäre: Samplingrate / Aquisition Points
Warum ist das so langsam? Ist es sinnvoller die normalen VISA OPEN/CLOSE/WRITE/READ-VIs zu benutzen als die im Treiber mitgelieferten polymorphen VIs?
So, hier der Rest an VI's.
Hab die nötigen VIs mal in eine Zip-Datei gepackt.
Laut Datenblatt liegt die max. Samplingrate bei: 250 kSa/s (When multiple channels are used, the sampling rate of each channel is the maximum sampling rate divided by the number of channels used.)
Bei 3 AI-Channel, macht das eine Samplingrate von um die 83 kSa/s.
80 kSa/s bei 8 kSa/Update führen zu einer Zykluszeit von 100ms.
80 kSa/s bei 4 kSa/Update führen auch zu einer Zykluszeit von 100ms. Hier scheint LabVIEW wohl zu langsam zu sein.
80 kSA/s bei 16 kSa/Update führen zu einer Zykluszeit von 200ms.
Leider komme ich nicht auf die unter 100ms zwischen den Updates.
Eine Plausiprüfung ist eigentlich für alle 40ms ausgelegt. Außerdem wird die Regelung ungenauer, wenn mein RK nur alle 100ms Feedback von der Maschine bekommt.
Edit: Nach ein paar Minuten erhöht sich die Zykluszeit deutlich. Jetzt ist sie gerade von 100ms mit der Zeit auf 10s hoch.
Liegt das an dem Waveform-Chart, der die Werte (in diesem VI testweise) anzeigen soll und dafür die stetig wachsende History speichert?
RE: Geschwindigkeitsproblem, VISA Kommunikation mit Messbox U2351A Keysight
Hallo m.,
Zitat:Die Zyklusdauer meiner Mainschleife, welche die Datenerfassung abwickelt ist schnellstens 100ms lang.
Ich habe die Agilent-Funktionen nicht installiert, kann also nichts über deren interne Funktionsweise sagen.
Was mir trotzdem aufgefallen ist:
- Deine Messwertabfragen erfolgen seriell (AI & DI). Bei DAQmx erfolgt sowas üblicherweise parallel in zwei DAQmxTasks: wäre das auch bei Agilent möglich? Andererseits wird hier eine VISA-Verbindung genutzt (warscheinlich ein serieller Port?), sodass die Abfragen auch seriell durchgeführt werden müssen…
- Du machst einige Dinge recht umständlich - und das auch in jeder Iteration! Muss man wirklich Waveforms erstellen, die nur genau ein Sample enthalten (AI_Anpassen_Waveformformat)? Muss man Werte aus einem 2D-Array einzeln mit einer Schleife auslesen, wenn man auch ArraySubset nutzen könnte (gleiches VI)? Hier auch: BuildArray statt InsterIntoArray verwenden…
- Aus dem hier erzeugten Waveform-Array holst du dreimal die gleiche Waveform, um deren Avg, RMS, Peak zu bestimmen. Muss man dafür jedesmal einen eigenen Buffer anlegen? Würde nicht ein Buffer ausreichen und man macht nur die drei unterschiedlichen Berechnungen daran? Außerdem werden diese VIs mit einer Waveform gefüttert, die nur genau ein Sample enthält - sieht für mich nach Overkill aus…
- Aus Avg/RMS/Peak werden wiederum Waveforms erstellt, die nur genau ein Sample enthalten…
- Das "DI_Anpassen_Boolformat ist auch recht umständlich: ein einfaches UND mit einer passenden numerischen Konstante udn ein nachfolgender Vergleich auf <>0 reicht locker aus. Beispiel für Bit 4: Bit4 := (x AND 16) <> 0…
- Einen Peakwert könnte man auch mit ArrayMax(Abs(array)) bestimmen…
Wie (über welche Schnittstelle) ist das Messgerät angebunden? Wie hoch ist die Datenrate, wie sind die Latenzzeiten des Messgerätes? Das trägt auch zur Schleifenzeit bei…
Zitat:Liegt das an dem Waveform-Chart, der die Werte (in diesem VI testweise) anzeigen soll und dafür die stetig wachsende History speichert?
Das könnte ein Grund sein, andererseits hast du die Historie auf 1024 Werte eingestellt und deine Waveforms enthalten nur ein Sample…
Allgemeiner Tipp: Wenn es Probleme bei der Rechengeschwindigkeit gibt, hat sich die Producer-Consumer-Struktur bewährt! Man trennt Datenerfassung von Datenverarbeitung von Datenspeicherung…
P.S.: es ist immer hilfreich, das HauptVI auch entsprechend zu benennen: man findet es dann auch wesentlich leichter…
RE: Geschwindigkeitsproblem, VISA Kommunikation mit Messbox U2351A Keysight
Vielen Dank für die schnelle Rückmeldung. Bin seitdem leider nicht zum Programmieren gekommen.
Kurzinfo zu den VIs:
VISA_Test.vi liest in einer Schleife die AI und DI Daten aus der Messbox aus und liefert die Daten via Notifier an das VI DAQ_Plausi_Add.vi. DAQ_PLausi_Add.vi verarbeitet die Daten nochmals.
(13.01.2016 16:04 )GerdW schrieb: Hallo m.,
- Deine Messwertabfragen erfolgen seriell (AI & DI). Bei DAQmx erfolgt sowas üblicherweise parallel in zwei DAQmxTasks: wäre das auch bei Agilent möglich? Andererseits wird hier eine VISA-Verbindung genutzt (warscheinlich ein serieller Port?), sodass die Abfragen auch seriell durchgeführt werden müssen…
Mh. Ich weiß nicht genau, ob die DI und AI Datenerfassung in zwei seperaten Tasks parallel möglich ist.
(13.01.2016 16:04 )GerdW schrieb: - Du machst einige Dinge recht umständlich - und das auch in jeder Iteration! Muss man wirklich Waveforms erstellen, die nur genau ein Sample enthalten (AI_Anpassen_Waveformformat)? Muss man Werte aus einem 2D-Array einzeln mit einer Schleife auslesen, wenn man auch ArraySubset nutzen könnte (gleiches VI)? Hier auch: BuildArray statt InsterIntoArray verwenden…
So, ok, danke. Ein bisschen angepasst und verbessert. Am Ende bleibt jedoch ein Waveform-Format, damit ich neben dem (gemittelten Messwert) auch einen Zeitstempel habe.
(13.01.2016 16:04 )GerdW schrieb: - Aus dem hier erzeugten Waveform-Array holst du dreimal die gleiche Waveform, um deren Avg, RMS, Peak zu bestimmen. Muss man dafür jedesmal einen eigenen Buffer anlegen? Würde nicht ein Buffer ausreichen und man macht nur die drei unterschiedlichen Berechnungen daran? Außerdem werden diese VIs mit einer Waveform gefüttert, die nur genau ein Sample enthält - sieht für mich nach Overkill aus…
- Aus Avg/RMS/Peak werden wiederum Waveforms erstellt, die nur genau ein Sample enthalten…
- Einen Peakwert könnte man auch mit ArrayMax(Abs(array)) bestimmen…
- Eigentlich zwei unterschiedliche Waveforms, hatte nur den Index noch nicht eingestellt.
Aber du hast Recht, aus den AVG/RMS/Peak-Werten mache ich ebenfalls eine Waveform mit nur einem Sample.
Ich möchte in meiner Anzeige ein Chart mit vielen verschiedenen Plots anzeigen. Deshalb bringe ich all die anzuzeigenden Werte in Waveform Format und bündel diese dann als 1D Array.
- Peak habe ich jetzt mit dem Array Min/Max VI bestimmt.
(13.01.2016 16:04 )GerdW schrieb: - Das "DI_Anpassen_Boolformat ist auch recht umständlich: ein einfaches UND mit einer passenden numerischen Konstante udn ein nachfolgender Vergleich auf <>0 reicht locker aus. Beispiel für Bit 4: Bit4 := (x AND 16) <> 0…
Danke für den Tipp, wird angepasst.
(13.01.2016 16:04 )GerdW schrieb: Wie (über welche Schnittstelle) ist das Messgerät angebunden? Wie hoch ist die Datenrate, wie sind die Latenzzeiten des Messgerätes? Das trägt auch zur Schleifenzeit bei…
USB
Max. Samplingrate der Messbox liegt laut Datenblatt bei 250kSamples/s für einen AI-Channel. Bei 3 AI Channel allerdings bei einem drittel davon je Channel.
(13.01.2016 16:04 )GerdW schrieb: Allgemeiner Tipp: Wenn es Probleme bei der Rechengeschwindigkeit gibt, hat sich die Producer-Consumer-Struktur bewährt! Man trennt Datenerfassung von Datenverarbeitung von Datenspeicherung…
P.S.: es ist immer hilfreich, das HauptVI auch entsprechend zu benennen: man findet es dann auch wesentlich leichter…
Daher VISA_Test.vi für die Datenerfassung. (Daten per Notifier an DAQ_Plausi_Add.vi)
DAQ_Plausi_Add.vi für die Plausiprüfungen und Datenweiterverarbeitung (Daten per Queue an Anzeige.vi)
Anzeige.vi für die Anzeige und die Datenspeicherung (Nicht hochgeladen)
VISA_Test.vi wird wohl noch in DAQ_Main.vi umbenannt.
Das Programm funktioniert schlechter wie letzte Woche. Irgendwie haben sich so einige Fehler eingeschlichen, die letzte Woche noch nicht da waren. Ich bin etwas am rätseln.
Folgenden 3 Fehler sind aufgetaucht: (Meist ist es der erste aufgelistete Timeoutfehler)
Leider funktioniert die Datenerfassung manchmal, manchmal nicht. Die meisten Schleifeniterationen sind Timeouts und brauchen etwas mehr wie die 10s Timeoutgrenze. Zwischendurch kommt es aber immer wieder zu schnellen, fehlerfreien Schleifendurchläufen.
Das AI-Example VI aus den ExampleVIs der Instrument Library funktioniert auch nicht. :bahnhof:
Edit: Oh, das liegt wohl nicht einfach an LabVIEW. Habe Probleme überhaupt mit der Messbox zu kommunizieren.
Wird nur als unbekanntes USB-Gerät identifiziert. Werde mal den Rechner neustarten und schauen, warum das denn der Fall ist.
Edit2: Hat sich komplett geklärt. War vielleicht ein Wackler im USB-Port oder so etwas.
Die 100ms Grenze bleibt trotzdem erhalten. Ist aber auch so beim Example VI für "continous AI data aquisition" aus der Instrumentdriver library so, dass das nicht schneller geht. (Bzw. minimal schneller auf ca. 60 bis 70ms pro Update)
Dann hat sich das fürs erste mal geklärt.
Fehlerliste:
Zitat:Error -1073807346 occurred at VISA Open in Agilent U2300 Series.lvlib:Initialize.vi->VISA_AI_Initialize.vi->VISA_TEST.vi
Possible reason(s):
VISA: (Hex 0xBFFF000E) The given session or object reference is invalid.
Zitat:Error -1073807339 occurred at VISA Read in Agilent U2300 Series.lvlib:Error Query.vi->Agilent U2300 Series.lvlib:Read (AI Waveform Multiple Channels).vi->Agilent U2300 Series AI Continuous Acquisition.vi
Possible reason(s):
VISA: (Hex 0xBFFF0015) Timeout expired before operation completed.
RE: Geschwindigkeitsproblem, VISA Kommunikation mit Messbox U2351A Keysight
Hallo m.,
Zitat:Daher VISA_Test.vi für die Datenerfassung.
Aha: Man erkennt unschwer das Haupt-VI…
Zitat:Folgenden 3 Fehler sind aufgetaucht:
Da sind 4 genannt…
- "Session invalid": du verwendest eine ungültige Referenz?
- "Timeout": Gerät antwortet nicht innerhalb der vorgegebenen Timeout-Zeit (Befehl nicht erhalten, Befehl nicht verstanden, Kommunikationsfehler)
- "query interrupted": Beschreibung steht im Agilent-Handbuch (normalerweise: Du sendest dem Gerät eine Anfrage und noch während der Bearbeitung der Anfrage schickst du schon den nächsten Befehl - leider zu früh für das Gerät!)
- Error85: Du willst mit ScanFromString einen String parsen, der leider nicht dem Formatstring entspricht. Und du machst keine Fehlerbehandlung nach dem ScanFromString, dann würdest du diesen Fehler nämlich softwareseitig abfangen…
Zitat:Das Programm funktioniert schlechter wie letzte Woche.
Leider ist kein VI begefügt, um es zu begutachten…
RE: Geschwindigkeitsproblem, VISA Kommunikation mit Messbox U2351A Keysight
Zitat:- "query interrupted": Beschreibung steht im Agilent-Handbuch (normalerweise: Du sendest dem Gerät eine Anfrage und noch während der Bearbeitung der Anfrage schickst du schon den nächsten Befehl - leider zu früh für das Gerät!)
Der Fehler tritt wohl (auch oder hauptsächlich) auf, wen ich die zwei VIs für Datenerfassung und Datenversendung gleichzeitig am Laufen habe. (Daten versenden findet in Data_Output.vi statt und die Datenerfassung in VISA_Test.vi)
Brauch ich dafür dann Semaphores, damit die eine Funktion erst vollständig abgehakt wird, bevor die nächste umgesetzt wird?
Wenn ich diese beiden tasks (Daten empfangen und versenden) nicht gleichzeitig parallel in zwei seperaten VIs umsetzen kann, ist es dann sinnvoller beides gemeinsam in ein VI zu packen oder in zwei seperaten und dann das Timing mit Semaphores bestimmen?
Ich glaube der String-Error tritt auf, wenn ich keine richtige Verbindung mit der Messbox hab. Dann formatiert er glaube ich einen empty String oder so etwas.
RE: Geschwindigkeitsproblem, VISA Kommunikation mit Messbox U2351A Keysight
Hallo m.,
Zitat:Brauch ich dafür dann Semaphores, damit die eine Funktion erst vollständig abgehakt wird, bevor die nächste umgesetzt wird?
Semaphoren sind hier wohl Overkill.
Ein ordentliches Programmdesign wäre hilfreich: neue Befehle erst versenden, wenn der vorige abgearbeitet ist!
(Üblicherweise melden solche Geräte über igrendeinen Statuswert, ob sie mit der Abarbeitung fertig sind. Den müsste man notfalls abfragen: das ist sicher im Handbuch erläutert!)
Zitat:Ich glaube der String-Error tritt auf, wenn ich keine richtige Verbindung mit der Messbox hab. Dann formatiert er glaube ich einen empty String oder so etwas.
So sehe ich das auch. Dummerweise hast du keine Fehlerabfrage programmiert, sonst würdest du diese Fehlermeldung nicht sehen…
RE: Geschwindigkeitsproblem, VISA Kommunikation mit Messbox U2351A Keysight
Ok, der "invalid VISA ressource"-Fehler tritt auch auf, wenn ich
VISA_Test.vi (Datenerfassung) und
Data_Output.vi (Datenversendung) gleichzeitig laufen lasse.
Der Fehler tritt im später aufgerufenen VI auf.
Ich werde Datenerfassung und Versendung einfach in ein einziges VI packen.
Werde mir wohl nochmal genauer ansehen, wie ich die Daten alle auslese oder versende und das dann alles hintereinander (immer schön mit Zwischenabfragen, ob die letzte Anfrage bereits bearbeitet wurde) ausarbeiten. Dann kommen sich die Querys nicht in die Quere.
Ich melde mich dann die Tage nochmal, wenn das getan ist.
Viele Grüße
Matthias
19.01.2016, 14:44 (Dieser Beitrag wurde zuletzt bearbeitet: 19.01.2016 15:16 von m.werle.)
RE: Geschwindigkeitsproblem, VISA Kommunikation mit Messbox U2351A Keysight
So, meine (vereinfachte) Programmübersicht sieht wie folgt aus:
Anzeige.vi
Zeigt Messwerte in einem Waveform-Chart an. Von hier aus lässt sich die Kommunikation mit der Messbox starten.
VISA_Test.vi (wird später umbenannt)
Initialisierung/Konfiguration der Messbox, danach Datenerfassung sowie Datenversendung in Schleife.
Weitergabe der erfassten Messdaten an DAQ_Plausi_Add.vi via Notifier
DAQ_Plausi_Add.vi
Plausiprüfungen für die erfassten Messdaten, sowie Veränderung des Formats und Erweiterung mit anderen Waveform-Daten
Weitergabe der verarbeiteten Messdaten an Anzeige.vi via Queue
Problem:
x-Achsen Beschriftung des Charts
In den Screenshots sieht man einmal die Initialisierung ("Ini_offset_Waveformchart") sowie die angezeigten Datenpakete ("Add_Data_to_Waveformchart").
Ist ein langes Array aus einzelnen in die Queues gespeicherten Datenpaketen das in einer auto-indexed For-Schleife in den Waveformchart eingelesen wird.
Jedes einzelne Datenpaket ist wiederum ein Array aus 5 Waveformelementen, welche jeweils aus t0, dt und einem value in einem array bestehen.
Meine Waveformchart zeigt mir nach der Initialisierung eine richtige Uhrzeit auf der x-Achse an ("Anzeige_ini"), allerdings das falsche Jahr.
Nach dem Starten der Datenerfassung steht an der x-Achse völliger Humbug ("Anzeige_loop"). Das morgige Datum und eine völlig falsche Uhrzeit. Fortschreiten tut die Zeit allerdings im richtigen Tempo.
Edit: Bilder im nächsten Beitrag
19.01.2016, 14:54 (Dieser Beitrag wurde zuletzt bearbeitet: 19.01.2016 14:54 von GerdW.)
RE: Geschwindigkeitsproblem, VISA Kommunikation mit Messbox U2351A Keysight
Hallo m.,
Zitat:Meine Waveformchart zeigt mir nach der Initialisierung eine richtige Uhrzeit auf der x-Achse an ("Anzeige_ini"), allerdings das falsche Jahr.
Du bist doch derjenige, der bei der Initialisierung das Jahr extra weglässt!
Beim INI-Offset wird explizit nur die Uhrzeit verwendet, um den X-Offset zu berechnen!
Lösung: diese dämliche (und veraltete!) Rechnung durch ein "To DBL" ersetzen…
Zitat:Nach dem Starten der Datenerfassung steht an der x-Achse völliger Humbug ("Anzeige_loop"). Das morgige Datum und eine völlig falsche Uhrzeit. Fortschreiten tut die Zeit allerdings im richtigen Tempo.
Leider kein passendes Bild dazu…
Was man aber sieht: du gibst dir weiterhin alle Mühe, Waveforms zu erzeugen, die nur genau ein Sample enthalten. Ist das nicht etwas umständlich?
Du hast irgendwo einen X-Offset definiert und zeigst jetzt Waveforms an, die ebenfalls einen (korrekten) Timestamp enthalten?
Entweder mit X-Offset arbeiten - oder mit korrekten Timestamps in den Waveforms. Aber nicht beides zusammen…