Hallo Leute,
ich habe ein Problem mit der Datenerfassung bei dem Programm an dem ich gerade arbeite. Leider bin ich mir nicht sicher ob ich das Programm hier aus rechtlichen Gründen hochladen darf, deshalb versuche ich es zu erklären.
Meine Grundstruktur ist der Standardzustandsautomat erweitert mit einer Eventstruktur in einem Case in den immer wieder gesprungen wird, sozusagen der GUI-Update-Case.
Dazu gibt es noch einen Init-Case der am Anfang durchlaufen wird und einen Signal Generieren- und Signal Auswerten- Case die immer nacheinander durchlaufen werden.
Über die Eventstruktur ist es nun möglich eine Single oder Kontinuierliche Messung zu starten. Dabei wird SignalGen und SignalAqu jeweils einmal oder beliebig oft (bis gestoppt wird) durchlaufen.
Mein Problem dabei ist allerdings, dass ich nie genau weiß was gerade im Speicher liegt oder was mit dem verwendeten Ringpuffer (? ist das richtig) in der Zeit passiert in der wieder in den GUI-Update-Case gehüpft wird.
Mein Betreuer meinte ich müsse mir im Eigenschaftsknoten zu DAQmx - Lesen die Option "Neugenerierung" mal genau ansehen und im Internet suchen ob ich ein Whitepaper zur Erklärung der Speicherbelegung bei Kontinuierlicher Messung finde.
Leider ist er erst wieder nächste Woche da und ich konnte bisher nichts passendes finden.
Habt ihr dazu eine Erklärung für mich oder ein Tutorial oder ähnliches?
Funktionieren tut es jedenfalls momentan nicht auch nicht mit eingebauter "Neugenerierung".
Ich erhalte folgenden Fehler:
" Mögliche Ursachen:
Es wurde versucht, einen Wert nach dem zuletzt erzeugten Wert zu schreiben. Die Generierung wurde gestoppt. Daher wird der Wert, der durch die Kombination von Position und Offset angegeben wurde, nicht mehr verfügbar.
Geben Sie Position und Offset so an, dass nur Werte bis zum zuletzt erzeugten Sample ausgewählt werden, aber nicht danach. Das zuletzt erzeugte Sample kann ermittelt werden, wenn die Gesamtzahl der Samples ermittelt wird, nachdem die Erzeugung gestoppt wurde.
Es wurde versucht, ein Sample zu schreiben: 1000
Eigenschaft: RelativZu
Zugehöriger Wert: Aktuelle Schreibposition
Eigenschaft: Offset
Zugehöriger Wert: 0
Task-Name: _unnamedTask<16> "
Gruß Domi
Ok hier habe ich nun das Programm hochgeladen, ich denke das ganze bringt sont nichts.
Mitlerweile erhalte ich einen anderen Fehler, aber ich denke das Grundsätzliche Problem bleibt. Ich weiß leider nicht wie ich die Messung und Auswertung einstellen muss damit beides kontnuierlich im Hintergrund weiter läuft.
Für die "Single" (Button) Messung könnte man das ganze auch auf "Endliche Anzahl" stellen.
Für die "Continuous" (Button) Messung (als wiederholung von GUI -> Signal Gen -> Signal Aqu) natürlich theoretisch auch, da sie ja programmatisch neu gestartet wird.
In der Praxis ist es aber leider so, dass ich noch ein Vdd Signal ausgeben muss und die beiden AO der NI-PXI-4461 Karte simultan aktualisiert werden d.h. das Vdd Signal wird kurz unterbrochen und ich habe bei jedem durchlaufen der GUI -> Signal Gen -> Signal Aqu Schleife ein Einschwingfehler meines Lautsprechers.
So waren meine Überlegen jedenfalls bisher. Deshalb versuche ich das ganze in einem Kontinuierlichen Modus weiterlaufen zu lassen.
Gruß Domi
Hallo domi,
Zitat:Ich weiß leider nicht wie ich die Messung und Auswertung einstellen muss damit beides kontnuierlich im Hintergrund weiter läuft.
Wenn es kontinuierlich (und unabhängig von User-Aktionen!) laufen soll, sollte es nicht in einer Schleife mit dem GUI-Handling platziert sein…
- Dein AI-Task wird nicht gestartet…
- Die Tasks werden nirgends gestoppt…
OK also das mit dem AI-Task hatte ich vergessen
Aber der Rest funktioniert jetzt (nach langem tüfteln) auch so, auch ohne den Task zu stoppen was mir warsch. die Auch die ausgegebene Spannung kurz unterbrechen würde?
Nunja zumindest lese ich ein Sinussignal wenn ich eines hineingebe. Leider habe ich noch diverse Fehler durch Glitching und Phasensprünge durch den Ringbuffer den ich noch nicht genau einstellen konnte.
Leider gibt es zum Thema Ringbuffer und dem Einstellen über die zugehörigen Eigenschaftsknoten- Funktionen kaum etwas im Netz.
Hatte hier jmd schonmal ein ähnliches Problem?
Ich habe dazu bisher nur folgendes gefunden:
Continuous Acquisition and Generation with Finite Buffer Size
Analog Output - siehe ab Seite 19 (Regeneration)
Um das Problem einzeln zu beheben habe ich noch ein VI gebastelt mit dem ich es einzeln betrachten kann (siehe Anhang).
Sollte jemand von euch noch mehr Informationen darüber haben würde ich mich sehr freuen sie zu hören.
Wenn nicht versuche ich euch hier mit meiner Lösung am Laufenden zu halten
Ok das mit der kontnuierlichen DAQ Statemachine funktioniert!
Dazu müssen allerdings die in einem Init State konfigurierten AO und AI auf Kontnuierlich gestellt werden.
- Für den Output muss die Eigenschaft "Neugenerierung zulassen" eingestellt sein
- Für den Input muss die Eigenschaft "Relativ zu" -> "Zuletzt empfangenes Sample" konfiguriert sein da ihr bei allen anderen Lesemarken zeitliche Probleme bekommt und die Samples teilweise schon aus dem Puffer verschwunden sind bevor ihr Sie lesen könnt, dabei spuckt LabVIEW dann immer einen Fehler aus.
- Zudem müsst ihr den Task in der Init Starten und mit einem Default wert beschreiben (DAQmx Write mit z.B. 0V)! dürft ihn aber in den anderen States nicht mehr stoppen. Wenn Ihr stoppen wollt müsst ihr einfach wieder 0V rausschreiben d.h. der Task läuft weiter aber für euch ist es wie ein Stop.
So ich hoffe das hilft jemandem weiter der mal vor dem selben Problem steht.
Anbei habe ich noch eine andere Frage:
Kann man bei den DAQmx Elementen die initialisierten Kanäle einzeln ansprechen? Also z.B. habe ich ai0:1 initialisiert und möchte in einem Case in ai0 einen Sinus schreiben und in einem anderen Case in ai1 eine DC Spannung, je nachdem was der User drückt?
Morgen Leute,
hier habe ich nun mal mein Projekt hochgeladen. Um es zu verwenden braucht ihr irgendein DAQ-Device mit jeweils 2 AO und AI die ihr verbinden müsst.
Ich habe noch folgendes Problem. Wenn ich eine Single Messung tätige (Knopf mit grünem Pfeil im FP) und als Einstellung z.B. 10 Perioden bei 100 kHz habe, also nur eine sehr geringe Periodenanzahl ausgebe, bekomme ich das Signal nicht ganz in die Ausgabe.
Dadurch wird vorallem meine FFT fehlerhaft.
Leider kann ich mir nicht vorstellen was man hier machen kann. Zum einen werden wohl zu wenig Ausgabesamples berechnet dafür das der Puffer 6800 Werte fasst. Das ist aber nicht das eigentliche Problem, denn stelle ich den Buffer kleiner (z.B. einfach genau auf die Sample Anzahl #s) sehe ich zwar theoretisch nur die passende Länge des Signals, ich habe aber eine leichte zeitliche Verzögerung bzw. glitching (oder wie man das nennt).
Habt ihr eine Idee was ich dagegen machen kann ohne alles komplett umzubauen oder die Init immer neu zu starten je nach Messung?
Gruß Domi
Hallo domi,
und was genau sollen wir mit der Projektdatei anfangen?
Sie enthält NUR die Projektbeschreibung - aber keine VIs...
Oh Entschuldigung! Ich habe schön länger keine Projektdateien mehr hochgeladen und wohl vergessen wie das geht.
Ich habe jetzt einfach die komplette Hierarchie in einen neuen Ordner gespeichert den ihr im Anhang findet, ich hoffe so ist damit etwas anzufangen.
Das Hauptprogramm ist das .vi im Ordner "Domi"
Mit der Voreinstellung bei 1kHz und davon 10 angezeigte Perioden müsste mein Problem eigentlich ersichtlich werden.
Unter der Anzeige "#s" sieht man die Anzahl der, je nach Periodenanzahl generierten Samples.
Klar bei 10 Samples ergibt das hier 680 Samples und mein Schreib- und Lesebuffer ist auf 6800 gestellt. Da ich vor und nach der Ausgabe der Perioden ein 0V Signal schicke ist verständlich wieso der Graph in der Single Messung so aussieht.
Aber bei mehr Perioden brauche ich eben die Speichergröße von 6800 und außerdem habe ich immernoch diesen "Glitching" effekt das mein Signal nicht jedesmal an der gleichen Stelle im Ringpuffer ausgelesen wird d.h. selbst wenn ich das Aufnahmefenster kleiner machen würde kann ich nicht sicher sein mein Signal auch in diesem Fenster zu finden.
Achja die Init würde ich eigentlich ungern wiederholen. Damit würde sich das Problem ja vill auch beheben lassen? Also wenn die Init je nach "Single" oder "Continuous" Messung wiederholt wird.
Wenn ihr mir helfen könnt wäre ich echt froh, wenn nicht probiere ich einfach weiter. Wenn alle Stricke reißen werde ich einfach in den Spec's des Programms angeben das so niedrige Perioden nicht gewählt werden dürfen.
Das ist zwar eh fast nie der Fall aber für die Validierung als Ergebnisse meiner BA wäre es nötig
Hallo domi,
Zitat:Zum einen werden wohl zu wenig Ausgabesamples berechnet dafür das der Puffer 6800 Werte fasst.
Würde es helfen, wenn du den Buffer notfalls mit Nullen auf die Größe von 6800 Samples auffüllst, wenn mal weniger Ausgabesamples berechnet werden?
Leider nicht
das ist eigentlich genau das was ich schon mache. Doch da ich den Buffer immer komplett auslese habe ich diese OV auch in der Anzeige.
Um das Problem zu Lösen müsste ich immer nur genau so viele Samples aus dem Speicher holen wie ich als Sinus geschreiben habe, gleichzeitig aber auch diesen willkürlichen Verschiebungseffekt beim Lesen aus dem Speicher unterbinden.