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!
03.08.2010, 12:22 (Dieser Beitrag wurde zuletzt bearbeitet: 03.08.2010 12:23 von WolfiB.)
über eine analoge Karte erfasse ich mehrere Signale kontinuierlich mit 1kHz. Diese Teile ich durch die Indizes auf, so dass ich
einzelne Signale habe.
In einer State-Machine läuft mein Ablauf ab. Wenn ich nun in einem bestimmten Case bin soll die Messung genau wie möglich gestartet
werden und dann eine definierte Anzahl an Messwerten (Bsp. 12000) aufnehmen. Bei der Abtastrate von 1kHz würde dies dann genau
12 Sekunden dauern. Die Messwerte sollen dann in einem Array-gespeichert werden.
Reicht es wenn ich hier eine ForSchleife mit Wartezeit 1ms einfüge? Das wird aber nicht genau genug sein, oder?
Wie kann ich dies noch anders, sicherer erstellen?
Vielen Dank.
03.08.2010, 12:36 (Dieser Beitrag wurde zuletzt bearbeitet: 03.08.2010 12:37 von Y-P.)
-------------------------------------------------------------------------- Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
um welches System geht es denn? Bei einem echtzeitfähigen System kann man es grob so machen, unter Windows nicht. Da wirst du nie exakt eine Millisekunde erreichen.
Wenn es z.B. um DAQmx geht, dann liest deine Karte die Werte mit 1 kHz ein und du kannst davon mehrere Werte auf einmal in deine Anwendung holen (z.B. alle 100 Werte eine Übertragung). Die Werte haben dann einen exakten zeitlichen Abstand von 1 ms.
Wenn du das über DAQmx lösen solltest, musst du beachten, dass beim Start der Messung recht viel Zeit vergeht bis zu den ersten Messwert erhältst, sofern du den DAQmx-Task beim Start der Messung erst erstellst. Du kannst her gehen und die Werte kontinuierlich einlesen und in deinem bestimmten Fall die Auswertung vornehmen bzw. die Zuweisung in ein Array. Trifft deine Bedinung nicht zu, ignorierst du die eingelesenen Werte einfach.
Pro Schleifendurchlauf kannst du auch die eingelesenen Werte durchlaufen und ab einem bestimmten Wert die Daten einem Array zuweisen o.ä.
Ich denke, genauere Angaben zur Aufgabenstellung sind hier sinnvoll.
Das ging aber nur mit einem Signal gut. Als ich dies auf 3 erweitert habe kam ab und zu eine Fehlermeldung.
Dann hatte ich gelernt, dass es nur einen Task pro Karte geben darf. Daraufhin hatte ich versucht das ganze in 1 Task zu packen.
Allerdings ist mit hier die Vorgangsweise zu:
- der Trennung der Signale
- sowie die Vorgehensweise zur Aufnahme in ein Array für den definierten Zeitpunkt mit bestimmter Anzahl an Messwerten nicht bekannt.
Die Werte können von mir aus ständig aufgenommen werden, aber nur ab dem Startzeitpunkt in ein Array geschrieben werden.
Wie muss allein die Whileschleife definieren??? Welche Wartezeit???
Steh da grad völlig auf dem Schlauch.
03.08.2010, 13:22 (Dieser Beitrag wurde zuletzt bearbeitet: 03.08.2010 13:28 von dimitri84.)
-Deine 3 Kanäle in einen Task packen geht z.B. so:
... dann brauchst du auch nur eine Schleife.
-Du musst unbedingt die
1) Initialisierung des Tasks
2) Datenerfassung
3) Löschen des Task
in verschiedenen States deiner State-Machine durchführen. Also pro Messung nur einmal Initialisierung und Löschung des Tasks.
-Du musst, wie du schon geahnt hast, N Samples und N Chans bei DAQRead einstellen und z.B. 100 Samples pro Lesezyklus abholen.
-Du brauchst kein Wait.vi! Weg mit dem Metronom - das macht alles der DAQ-Treiber.
-Wieso benutzt du lokale Variablen und platzierst die Controls gefühlte 3 Meter neben dem eigentliche Blockdiagramm. Nimm direkt die Controls!
-Du musst einen Stop-Button erstellen der alles in deinem Programm zum Stillstand bringt. Wenn du mit deinem Auto anhalten willst, betätigst du ja auch ganz normal die Bremse anstatt mit 120 Sachen vorn Baum zu fahren
... als ersten Ansatz
„Sag nicht alles, was du weißt, aber wisse immer, was du sagst.“ (Matthias Claudius)
ich muss aber die jeweiligen Signalkanäle einzeln und zu verschiedenen Zeitpunkten starten können.
Denn die Aufnahme muss teilweise parallel ablaufen.
Zur weiteren Erklärung:
- Es handlet sich um eine Station mit 3 Prüfplätzen
- jeder Prüfplatz macht das gleiche, ist aber völlig autark voneinander
- Die Messung an einem jeweiligen Platz dauert z.B. 15s (Über Frontpanel vorgebbar)
- Daher kann es auch vorkommen, dass P1 startet, 7s später P3, 5s später P2.
Was soll ich da mit einem Stop anfangen? Muss doch die ganze zeit laufen oder?
Nun müssen einfach die Werte der eingelesenen Analogkarte vom Startsignal ab, hierfür setze ich eine Variable in
dem Case davor, in ein Array geschrieben werden. Dies müssen dann ziemlich genau 15000 Werte für 15s Zeit bei
einer Abtastung von 1kHz sein.
Denn aus dem Array heraus muss ich dann Bsp.weise den 7000 Wert auswerten und mit Grenzwerten vergleichen und
gleichzeitig sollen die ganzen Werte noch auf einem Graphen angezeigt werden. Diese Punkte stellen keine Problem dar.
Aber die genaue Aufnahme.
Braucht ihr noch mehr Infos? Würde gerne den noch fehlenden Punkt erklären, wenn noch was fehlen sollte.
kann ich dies so machen wie in diesem Beispiel mit dem 3 Signal (1+2 Signal muss natürlich auch entsprechende ändern)?
Ist dies für die AUfgabe korrekt oder bekomme ich so zeitliche Probleme???
' schrieb:ich muss aber die jeweiligen Signalkanäle einzeln und zu verschiedenen Zeitpunkten starten können.
Denn die Aufnahme muss teilweise parallel ablaufen.
Zur weiteren Erklärung:
- Es handlet sich um eine Station mit 3 Prüfplätzen
- jeder Prüfplatz macht das gleiche, ist aber völlig autark voneinander
- Die Messung an einem jeweiligen Platz dauert z.B. 15s (Über Frontpanel vorgebbar)
- Daher kann es auch vorkommen, dass P1 startet, 7s später P3, 5s später P2.
Es gibt nur einen internen Timer für ai, dehalb können nicht mehrere ai-Tasks gleichzeitig laufen. Allerdings kann man mehrere ai-Tasks (mit jeweils verschiedenen Kanälen) gleichzeitig initialisieren, und man kann sie auch einzeln starten, ohne daß man immer die Tasks neu initialisieren muß. Sie dürfen nur nicht gleichzeitig laufen, d.h. gleichzeitig den Timer beanspruchen wollen.
Deine Aufgabe läßt sich also so nicht lösen. Eine Möglichkeit sehe ich aber: Die Tasks müßten sich gegenseitig verriegeln. D.h. wenn Task 1 läuft, dann wird der Start - falls innerhalb dieser Zeit ein weiterer Startknopf gedrückt wird - von Task 2 oder 3 so lange verzögert, bis Task 1 beendet ist.
@Lucki: Dies ist aber nur so, wenn ich verschiedene Tasks benutze, oder? Dann kann ich also nicht mehrere AI
parallel messen, denn so schnell schalten die ja nicht hin und her, dass ich ohne Wertverluste parallele Messungen erhalte.
Eine "Nacheinanderbearbeitung" ist für diese Anwendung bzw. Anlage nicht tragbar.
Wenn ich aber wie in den Berichten zuvor nur einen Task verwende der alle 3 AI-Signale ständig ausliest, und nur zu den
Messzeiten die Werte in ein Array schreibe, sollte es doch funktionieren, oder?
Wenn ja geht es mir vorallem um die sicherstellung, dass ich genau die Werte ab Start der Messung erhalte, und hier nicht mit
einer Zeitverzögerung und somit verschobenem Wertbild arbeite.
Was hast du denn für eine Startbedingung?
Wenn diese in einer Schleife überprüft wird, wirst du eher schlechte Karten haben. Das liegt daran, dass du bei der hohen Abtastrate mit DAQmx vermutlich nicht jeden einzelnen Wert übertragen kannst, sonder nur blockweise.
Ist das Triggersignal z.B. eine Überschreitung eines bestimmten Messwerts, ab dem du die Werte dann in dein Array schreibst, dann ist dein Vorhaben möglich.