10.09.2017, 23:04
Beitrag #1
|
Rick2017
LVF-Neueinsteiger
Beiträge: 6
Registriert seit: Sep 2017
2016
2015
EN
Schweiz
|
NI USB 6251, DAQ, Frequenz bleibt nicht konstant über die Messdauer
Hallo
Ich habe drei Sensoren über den NI USB 6251 angeschlossen und mittels DAQmx ausgelesen.
Zwei der Sensoren wurden über den DAQmx kalibriert.
Die gewünschte Frequenz liegt bei 10Hz. Es sollen 10 Messpunkte pro Sekunde weiter gegeben werden.
Die Messwerte werden einem Array per Shift-Register übergeben, weiterverarbeitet und direkt durch einen Messgraphen dargestellt.
Mit dem Write Delimited Spreadsheet.vi sollen die Messwerte der: Zeit (Time Stamp), Volumen(Gewicht), Speed, Dichte und Temperatur abgespeichert werden.
Das Problem ist, dass ich keine konstante Frequenz von 10Hz realisieren kann. Anfänglich werden 10 Messpunkte pro Sekunde aufgezeichnet, allerdings nicht konstant. Nach 10 Minuten werden ca. 7 bis 8 Messpunkte pro Sekunde aufgezeichnet und gegen 20- 30 Minuten nach Mess-Start sind es bloss noch 6 Messpunkte, die pro Sekunde aufgezeichnet und nach Messende
abgespeichert werden.
Ich habe Versuche durchgeführt, die Sampels per Channel etc. herabzusetzen, ein Filter SUB.vi deaktiviert, jedoch ohne erfolg. Ich konnte keine konstante Abtastrate bzw. eine Frequenz von 10 Hz erreichen.
Ich wäre froh für einen Input, möglicherweise liegt das Problem in der Struktur.
Sollte ich eine Consumer-Producer Struktur wählen? Oder habe ich einen anderen Fehler eingebaut?
MessprogrammTrinkversuch.vi (Größe: 208,67 KB / Downloads: 300)
FluessigkeitsMessung.zip (Größe: 457,98 KB / Downloads: 261)
|
|
|
11.09.2017, 07:48
(Dieser Beitrag wurde zuletzt bearbeitet: 11.09.2017 07:54 von GerdW.)
Beitrag #2
|
GerdW
______________
Beiträge: 17.469
Registriert seit: May 2009
LV2021
1995
DE_EN
10×××
Deutschland
|
RE: NI USB 6251, DAQ, Frequenz bleibt nicht konstant über die Messdauer
Hallo Rick,
herzlich willkommen im Forum!
Zitat:Die gewünschte Frequenz liegt bei 10Hz. Es sollen 10 Messpunkte pro Sekunde weiter gegeben werden.
Leider stellst du diese 10Hz nirgends (beim DAQmx) ein.
Du hast da ein Metronom, welches deine Schleife mit 100Hz takten soll - aber wer garantiert dir das?
Wenn du exakt 10S/s haben willst, solltest du DAQmx entsprechend konfigurieren. (Schau mal in die Links in meiner Signatur…)
Zitat:Anfänglich werden 10 Messpunkte pro Sekunde aufgezeichnet, allerdings nicht konstant. Nach 10 Minuten werden ca. 7 bis 8 Messpunkte pro Sekunde aufgezeichnet und gegen 20- 30 Minuten nach Mess-Start sind es bloss noch 6 Messpunkte, die pro Sekunde aufgezeichnet und nach Messende abgespeichert werden.
Das spricht dafür, dass du irgendwo ein Array aufbaust, welches immer größer wird. Das verlangsamt dann dein VI…
Zitat:Mit dem Write Delimited Spreadsheet.vi…
Leider hast du deine subVIs nicht bereitgestellt…
Edit: hast du ja in dem ZIP gemacht.
Und da haben wir auch den Übeltäter: "Drink_measurement_subVI" fügt ständig neue Werte in dein 2D-Array ein! (Warum eigentlich InsertIntoArray statt BuildArray?)
Dein ganzes VI ist sehr unübersichtlich:
- nirgends gerade Drähte
- viele lokale Variablen
- für meinen Geschmack zu viele Verschachtelungen und Sequenzen
- bei der Statemachine gibt es CoercionDots und undefinierte Zustände…
- dein "rounding significants" ist größtenteils Blödsinn…
|
|
|
11.09.2017, 11:47
Beitrag #3
|
Rick2017
LVF-Neueinsteiger
Beiträge: 6
Registriert seit: Sep 2017
2016
2015
EN
Schweiz
|
RE: NI USB 6251, DAQ, Frequenz bleibt nicht konstant über die Messdauer
Hallo GerdW
Danke für die schnelle Antwort.
Ich werde sofort das Drink_measurement_(SubVI).vi abändern und BuildArray statt InsertIntoArray wählen.
In dem Drink_measurement_(SubVI).vi, wollte ich das Index-Array mit den aktuellen Werten Weight, Density, Temperature, Volumen
ergänzen. Ohne das InsertIntoArray sehe ich noch nicht wie ich z.B. die Position 0 (Time Cst.) aus dem Index Array mit dem Graph Multiplier und dem Build Array verbinde.
In dem rounding_Significants(SubVI) muss ich noch mal über die Bücher.
Anschliessend nehme ich mir die Einstellung der Frequenz vor und melde mich mit den Resultaten zurück.
MessprogrammTrinkversuch.vi (Größe: 208,27 KB / Downloads: 268)
Drink_measurement_(SubVI).vi (Größe: 42,53 KB / Downloads: 252)
Write Delimited Spreadsheet_modifier (DBL).vi (Größe: 15,52 KB / Downloads: 247)
FilterV1_Cell(SubVI).vi (Größe: 112,27 KB / Downloads: 268)
rounding_Significants (SubVI).vi (Größe: 41,19 KB / Downloads: 276)
|
|
|
11.09.2017, 14:11
Beitrag #4
|
GerdW
______________
Beiträge: 17.469
Registriert seit: May 2009
LV2021
1995
DE_EN
10×××
Deutschland
|
RE: NI USB 6251, DAQ, Frequenz bleibt nicht konstant über die Messdauer
Hallo Rick,
Zitat:Ich werde sofort das Drink_measurement_(SubVI).vi abändern und BuildArray statt InsertIntoArray wählen.
Das wird das Problem nicht lösen.
Grundproblem bleibt das ständig wachsende Array - das geht in einem langlaufenden Programm überhaupt nicht!
- Du musst dieses Array in seiner Länge begrenzen.
- Du musst Daten schon in der Schleife wegspeichern.
- Du kannst Dinge per Producer-Consumer-Schema entkoppeln.Damit läuft dann deine DAQmx-Schleife ungebremst, die Queue übernimmt die Datenpufferung, wenn der Consumer nicht schnell genug ist (solange das RAM ausreicht)…
|
|
|
11.09.2017, 23:19
Beitrag #5
|
Rick2017
LVF-Neueinsteiger
Beiträge: 6
Registriert seit: Sep 2017
2016
2015
EN
Schweiz
|
RE: NI USB 6251, DAQ, Frequenz bleibt nicht konstant über die Messdauer
Hallo GerdW
Merci für den Tipp. Mit der Producer Consumer Struktur funktioniert es, 10 Messwerte por Sekunde
bei Laufzeiten von über 30 Minuten zu generieren. In dem Drink_measurement_(SubVI).vi habe ich die InsertIntoArray durch BuildArray ersetzt.
Das main: TrinkvolumenKopie.vi ist provisorisch.
Meine Resultate sind in den beiden txt files ersichtlich.
TrinkvolumenKopie.vi (Größe: 200,37 KB / Downloads: 251)
TrinkvolumenKopie.vi (Größe: 200,37 KB / Downloads: 251)
Bis auf die erste Messung der Sekunde 0 ( der Timerstart ist noch nicht fix), erhalte ich die 10 Messpunkte und die Startwerte pro folgender Sekunde bewegen sich in einem Range von 0.032 bis 0.037. In dem ersten txt file
gab es auch etwas grössere Unterschiede.
Die Frage ist ob ich noch etwas zusätzlich an dem DAQ einstellen muss?
Die Kalibrierung über den DAQ Assistant habe ich mit 1000 Sampels per Channel und einer rate von 1000 gemacht.
Die Einstellungen der Timing Settings, in der Configuration des DAQ Assistant, habe ich mit
Acquisition Mode: Continuous Samples
Samples to Read: 100
Rate (Hz): 1000
vorgenommen. Die Advanced Timing settigns habe ich per default auf sample Clock Type: Internal und
Timeout 10 (s) belassen.
Dementsprechend habe ich: Zeit (s) = "Samples to Read: 100" * 1 / Rate [1kHz]
Wenn ich jetzt wie in dem DAQmx rate auf 10'000 setze und die samples to read auf 1000
bin ich ja bei 10 Hz. Die number of samples per channel in dem DAQmx Read.vi ist mit 1000 festgelegt.
Du hast mir den Tipp gegeben die 10S/s einzustellen, hast du damit etwas anderes gemeint?
TrinkvolumenKopie.vi (Größe: 200,37 KB / Downloads: 251)
SensorsLog (SubVI).vi (Größe: 42,59 KB / Downloads: 250)
TestMessungConsumerProducer.txt (Größe: 669,09 KB / Downloads: 260)
TestMessungConsumerProducer2.txt (Größe: 66,33 KB / Downloads: 277)
Drink_measurement_(SubVI).vi (Größe: 33,09 KB / Downloads: 265)
|
|
|
12.09.2017, 07:22
Beitrag #6
|
GerdW
______________
Beiträge: 17.469
Registriert seit: May 2009
LV2021
1995
DE_EN
10×××
Deutschland
|
RE: NI USB 6251, DAQ, Frequenz bleibt nicht konstant über die Messdauer
Hallo Rick,
Zitat:Wenn ich jetzt wie in dem DAQmx rate auf 10'000 setze und die samples to read auf 1000 bin ich ja bei 10 Hz. Die number of samples per channel in dem DAQmx Read.vi ist mit 1000 festgelegt.
Das ist korrekt so, (fast) alles ok.
Beim DAQmxTiming brauchst du keine "samples per channel" vorgeben, das macht der Treiber intern meist besser.
Zitat:Du hast mir den Tipp gegeben die 10S/s einzustellen, hast du damit etwas anderes gemeint?
Nein, ich meinte genau das, was du jetzt eingestellt hast!
Zum VI:
- die Queue wird mit einer Array-Konstante definiert, deren Index auf 1Mio steht - obwohl es sich um ein leeres Array handelt. Das ist sehr verwirrend und trägt nicht zur Code-Dokumentation bei! Warumnimmst du nicht einfach InitArray, um ein leeres 2D-Array zu definieren?
- dein "Drink_measurement"-subVI versucht immer noch, ein 2D-Array aufzubauen - obwohl es am Input immer das vorher definierte leere 2D-Array bekommt und du die Daten (richtigerweise) nicht mehr im Array sammelst! Du baust also ein Output-Array aus einem leeren Input und 5 neu berechneten Werten: warum nicht einfach ein 1D-Array aus den 5 neuen Werten erzeugen? (Das würde den Rest des Vis auch vereinfachen…)
- In der Producer-Loop setzt du in jeder Iteration eine Property deines Graphen - im 10Hz-Takt. Sowas ist i.A. unsinnig…
- das RoundingSignificants ist immer noch unsinnig: ein Float auf 1 Nachkommastelle runden zu wollen erzeugt neue Ungenauigkeiten, da Floats Zehnerbrüche nicht exakt darstellen können. Formatiere einfach die entsprechende Anzeige wie gewünscht - oder rechne mit Integerwerten…
- Generell solltest du dein Vi auch mal aufräumen, AutoCleanup kann dabei helfen…
|
|
|
12.09.2017, 11:23
Beitrag #7
|
Rick2017
LVF-Neueinsteiger
Beiträge: 6
Registriert seit: Sep 2017
2016
2015
EN
Schweiz
|
RE: NI USB 6251, DAQ, Frequenz bleibt nicht konstant über die Messdauer
Hallo GerdW
Danke für die Unterstützung.
Die Frequenz und das Speichern der Messwerte funktioniert super.
Das 2D Array in dem Drink_measurement_2(SubVI) war uhrsprünglich
unteranderem für die Darstellung des Graphen gedacht.
Jetzt möchte ich den Graphen der Messwerte wieder darstellen können. Die Frage ist, ob ich die
Werte aus der Queue auslesen kann in einer weiteren Schleife
denn jetzt habe ich das Buffer-Problem nicht mehr, aber auch keine kontinuierlichen Werte die
ich in einem Graphen darstellen kann.
Falls du mir einen Tipp geben könntest währe ich froh.
Gruss Rick
Drink_measurement_2(SubVI).vi (Größe: 33,11 KB / Downloads: 232)
TrinkvolumenKopieFreqTop - Copy.vi (Größe: 198,42 KB / Downloads: 269)
SensorsLog (SubVI).vi (Größe: 41,88 KB / Downloads: 253)
|
|
|
12.09.2017, 11:40
Beitrag #8
|
GerdW
______________
Beiträge: 17.469
Registriert seit: May 2009
LV2021
1995
DE_EN
10×××
Deutschland
|
RE: NI USB 6251, DAQ, Frequenz bleibt nicht konstant über die Messdauer
Hallo Rick,
du könntest einen Chart statt des Graphen verwenden.
Oder im Consumer ein Array mit den Plotdaten in einem Schieberegister speichern - diesmal dann aber die Länge des Arrays auf vernünftige Werte begrenzen!
|
|
|
15.09.2017, 14:47
Beitrag #9
|
Rick2017
LVF-Neueinsteiger
Beiträge: 6
Registriert seit: Sep 2017
2016
2015
EN
Schweiz
|
RE: NI USB 6251, DAQ, Frequenz bleibt nicht konstant über die Messdauer
Hallo GerdW
Danke für den Hint.
Ich kann die Daten wie gewünscht speichern.
Jetzt muss ich aber nochmals im nachhinein die Volumenwerte ändern.
Gibt es eine elegantere Lösung für den Zwischenpeicher meiner Tabelle,
statt einen Link zu meinem abgespeicherten File zu erstellen, um es zu öffnen und die
Werte aus entsprechender Spalte mit einer Formel zu verändern?
Das Programm schliesst ja erst definitiv das Write file wenn ich Stop drücke.
Gruss Rick
PS: Das rounding muss ich immer noch löschen.
Trinkvolumen_Do01.vi (Größe: 173,37 KB / Downloads: 259)
DrinkCalc (SubVI).vi (Größe: 16,02 KB / Downloads: 260)
FilterV1_Cell(SubVI).vi (Größe: 137,04 KB / Downloads: 267)
SensorsLog (SubVI).vi (Größe: 41,85 KB / Downloads: 224)
|
|
|
15.09.2017, 19:31
|
GerdW
______________
Beiträge: 17.469
Registriert seit: May 2009
LV2021
1995
DE_EN
10×××
Deutschland
|
RE: NI USB 6251, DAQ, Frequenz bleibt nicht konstant über die Messdauer
Hallo Rick,
Zitat:Jetzt muss ich aber nochmals im nachhinein die Volumenwerte ändern.
Wenn es im "Nachhinein" geschieht, kannst du die Datei ja einlesen und bearbeiten…
Zitat:Gibt es eine elegantere Lösung für den Zwischenpeicher meiner Tabelle, statt einen Link zu meinem abgespeicherten File zu erstellen, um es zu öffnen und die Werte aus entsprechender Spalte mit einer Formel zu verändern?
Welche Tabelle? Ich sehe keine im VI…
Wie erstellst du einen Link? Wozu einen Link?
Kannst du dein Problem nochmal genauer beschreiben?
|
|
|
| |