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!
bin seit ein paar Tagen stolzer Besitzer eines NI-USB6211 und mache jetzt meine ersten Gehversuche damit. Habe mal ein kleines Beispiel VI zusammen gebastelt, das verdeutlichen soll, wie ich das später in mein richtiges Programm integrieren möchte. Ich habe hier insgesamt drei Tasks. Davon sind zwei zum Messen, einer zum Schalten eines Digitalen Ausgangs (zum Ein- bzw. Ausschalten einer Spannungsquelle). Die Reihenfolge in der die einzelnen VIs aufgerufen werden, schaffe ich über das Fehlercluster. Vor jeder Messung aktiviere ich den digitalen Ausgang, warte kurz (mit eigenem Warte Sub-Vi) und messe dann. Anschließend schalte ich wieder ab bis die nächste Messung startet. Meine Fragen dazu:
1. Wenn ich die Abtastrate hoch einstelle, bekomme ich mit der "Lampe" die Fehlermeldung, dass Werte verloren gehen. Sehe ich das richtig, dass das nur an der Lampe liegt, weil ich dadurch sehr langsam im Auslesen der Werte bin und so mein Buffer überläuft?
2. Wenn ich einen Task, wie hier den digitalen Ausgang, während der kompletten Messung benötige.. würdet ihr den dann stoppen bis ihr ihn wieder benötigt oder einfach durchlaufen lassen, so wie ich jetzt im Beispiel?
3. Bei der ersten Messung könnte ich die 5 Sekunden Messdauer ja auch erreichen, indem mir bei der Abtastrate von 1000Hz 5000 Werte verlange. Das mache ich hier aber nicht, weil ich zumindest nach jeder Sekunde die Möglichkeit haben möchte die Messung abzubrechen. Gibt es eine andere Möglichkeit so ein DAQ-Lesen VI abzubrechen?
4. Bei der zweiten Messung führe ich in jedem Schleifendurchlauf noch ein paar andere Aufgaben aus bevor ich messe. Das ist hier durch ein Warte-VI dargestellt. Danach starte ich mein Auslesen und stoppe den Task bis ich im nächsten Durchlauf nach Ablauf des Warte-Vis wieder starte. Bekomme ich so genau die Messwerte, die nach dem Ende der Wartezeit auftreten? Das VI zur Vorgabe der Abtastrate ist hier in der Schleife, da ich über die Anzahl der Samples meine Messzeit variieren möchte.
5. Und die letzte Frage: an einer Stelle in meinem Programm werde ich nur einen Messwert pro Schleifendurchlauf benötigen. Gleichzeitig wird in dieser While-Schleife noch ein anderer Sensor ausgelesen (nicht über die NI-Karte). Optimal wäre es natürlich, wenn ich das Hardware getaktet umsetzen könnte. Leider gibt mir das andere Gerät aber keinen Trigger aus. Kann ich dann einfach nur ein Sample auslesen und davon ausgehen, dass die Werte ziemlich genau zur selben Zeit aufgenommen wurden, da die beiden VIs in der selben Schleife fast gleichzeitig ausgerufen werden? Welche Rolle spielt dann meine Abtastrate von der NI-Karte, da meine Abtastrate ja dann eigentlich von der Zeit der Abarbeitungszeit der Messschleife in der beide VIs liegen vorgegeben wird.
Ist ziemlich viel Text geworden.. hoffe ich konnte halbwegs verdeutlichen wo meine Probleme liegen. Danke für die Unterstützung.. ihr helft mir wirklich sehr!!!
1. Die "Lampe" heißt in LabVIEW-Sprech "Execution Highlighting", dann weiß auch jeder, was du meinst. Antowrt: Ja.
2. Wozu willst du einen Task, denn du ständig "während der kompletten Messung" benötigst, stoppen?
3. DAQmxTaskStop oder DAQmxTaskClear...
4. Du bekommst die Messwerte, die nach dem Starten des Tasks auftreten. Wenn du den Task erst nach der Wartezeit startest, bekommst du also auch erst die Messwerte, die nach der Wartezeit auflaufen, geliefert...
5. Wenn du beim anderen Messgerät einfach nur auf einen Messwert warten musst, bleibt dir wohl nichts anderes übrig, als mit dem zeitlichen Versatz von ein paar Millisekunden zu leben. (Wobei bei USB das "paar Millisekunden" durchaus dreistellig werden kann...)
zu 3. hätte ich noch eine Frage, weil mir nicht ganz klar ist, wie das funktionieren soll. Nehmen wir an, ich habe eine Abtastrate von 1000Hz und möchte 8000 Samples. Das bedeutet ja dann das mein Programm 8 Sekunden im DAQ-Lesen VI "hängt". Muss ich dann parallel eine While-Schleife laufen lassen, die meine Stop-Bedingung abfragt und dann gegebenenfalls das DAQmxTaskStop dazu schaltet?
Nur wie komme ich aus der While-Schleife wieder raus, wenn das DAQ-Lesen-VI beendet ist? Fehler des VIs auslesen und wenn es OK ausgibt per Melder in die Schleife geben?
(07.11.2013 19:08 )creo_123 schrieb: Nur wie komme ich aus der While-Schleife wieder raus, wenn das DAQ-Lesen-VI beendet ist? Fehler des VIs auslesen und wenn es OK ausgibt per Melder in die Schleife geben?
Das kommt vor, wenn Du z.B 1000 Werte erzeugst und du holst bei jedem Schleifendurchlauf 300 Werte aus dem Buffer ab. Dann sind beim letzten Mal nur noch 100 Werte im Buffer, das DAQmxRead erwartet aber wie bei jedem vorangegangenem Durchlauf 300 Werte. (Stop funktioniert dann auch nicht, solange DAQmxRead wartet)
Lösung: passenden Timeout anschließen, den Fehler abfangen, weitermachen als sei nichts geschehen.
Die bessere Lösung ist aber, die Anzal der gelesenen Samples, die Anzahl Schleifendurchläufe und Gesamtzahl der Samples so abzustimmen, dass kein Rest bleibt. Und für den Fall der Fälle, wenn etwas schief läuft, Timeoutfehler trotzden beobachten, um gegebenenfalls aus der Schleife auszusteigen statt darin hängen zu bleiben.
Gruß Ludwig
Ich verlasse die Schleife nur wenn ich Stop drücke.. wenn das DAQ-Lesen-VI normal abschließt wird die Schleife ja nicht beendet und läuft immer weiter. Deshalb dachte ich, ich könnte irgendwie das "OK" vom DAQ-Lesen-Fehler in die Schleife als Abbruchbedingung geben.
Stehe aber momentan allgemein etwas auf dem Schlauch ehrlich gesagt. Wo genau werden denn die Daten erzeugt und wo abgerufen. Ich gebe ja nur die Abtastrate vor und sage dann dem DAQ-Lesen, dass es mir eine bestimmt Anzahl ausgeben soll. Hab ich beispielsweise 1000 Hz als Abtastrate und möchte 100 Samples, dann läuft mein DAQ lesen doch einfach nur 0,1 Sekunden. Dann kann es doch eigentlich keinen Fehler geben. Oder bezieht sich der Fehler, den Lucki gemeint hat, nur auf einen vorzeitigen Abbruch des DAQ-Lesen durch Stop? Den Fange ich doch eigentlich auch jetzt schon ab..
08.11.2013, 10:47 (Dieser Beitrag wurde zuletzt bearbeitet: 08.11.2013 16:40 von Lucki.)
(08.11.2013 07:12 )creo_123 schrieb: Ich verlasse die Schleife nur wenn ich Stop drücke.. wenn das DAQ-Lesen-VI normal abschließt wird die Schleife ja nicht beendet und läuft immer weiter. Deshalb dachte ich, ich könnte irgendwie das "OK" vom DAQ-Lesen-Fehler in die Schleife als Abbruchbedingung geben.
Für eine While-Schleife stimmt das natürlich. In Deinem VI gibt es aber eine For-Schleife mit Bedingungsanschluß, und die kann außer mit der Stop-Taste auch bei Errechen von i=N beendet werden.
Zitat:Stehe aber momentan allgemein etwas auf dem Schlauch ehrlich gesagt. Wo genau werden denn die Daten erzeugt und wo abgerufen. Ich gebe ja nur die Abtastrate vor und sage dann dem DAQ-Lesen, dass es mir eine bestimmt Anzahl ausgeben soll. Hab ich beispielsweise 1000 Hz als Abtastrate und möchte 100 Samples, dann läuft mein DAQ lesen doch einfach nur 0,1 Sekunden. Dann kann es doch eigentlich keinen Fehler geben. Oder bezieht sich der Fehler, den Lucki gemeint hat, nur auf einen vorzeitigen Abbruch des DAQ-Lesen durch Stop? Den Fange ich doch eigentlich auch jetzt schon ab..
Die Karten muss man sich als System mit eigenem Mikroprozessor vorstellen, das Erzeugen der Daten geschiehrt völlig autark. Die Daten werden in einen Puffer geschrieben. Die Puffer ist z.Teil auf der Karte selbst und zum größeren Teil im PC. Das Management dieser beiden Puffer muss Dich im Allgemeinen nicht interesseiren, es gibt für Dich nur einen Puffer, von dem aus Du die Daten mit DAQmxRead (ganz, kleckerweise in mehreren Raten, oder einzeln) abholst.
Was ich meine: Es gibt keinen "Vorzeitigen Abbruch mit Stop". Solange DAQmx auf die Daten wartet, weil sich die gewünschte, auf einmal zu lesende Anzahl noch nicht im Puffer befindet, kann die Schleife nicht auf den Stop-Knopf reagieren. Es gibt nur die umgekehrte Gefahr: Hängenbleiben (Bis zum Timeout) in der Schleife: Wenn DAQmxRead wartet und versucht Daten zu lesen, die sich nicht mehr im Puffer befinden und auch nicht mehr reinkommen, weil entsprechend der eingestellten finiten Anzahl die Erzeugung auf der Karte beendet ist.
Ah ok.. dann guck ich mal, ob ich das mit dem Abbruch irgendwie anders gelöst bekomme..
noch eine letzte Frage zu diesem Thema (hoffe ich^^): bin mir nicht sicher wie genau das Auslesen abläuft. Nehmen wir mal an ich starte den Task, warte eine Sekunde und lese dann einen Wert aus. Bekomme ich dann den ersten Wert aus dem Puffer (der dann schon eine Sekunde "alt" ist) oder genau den Wert der zum Zeitpunkt des Auslesens auftritt? Ich möchte in diesem Fall ja immer nur einen Wert pro Schleifendurchlauf auslesen und die eigentliche Frage ist dann, ob es sinnvoller ist den Task in jedem Schleifendurchlauf vor dem Auslesen zu starten und danach wieder zu stoppen (wie auf dem Screenshot) oder ihn nur einmal vor der Schleife zu starten. Außerdem ist mir auch nicht ganz klar, wie ich in diesem Fall das DAQmx-Timing am beste konfiguriere.