LabVIEWForum.de
Maximale Arraygröße an Messkarte - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: Hardware (/Forum-Hardware)
+---- Forum: NI Hardware (/Forum-NI-Hardware)
+---- Thema: Maximale Arraygröße an Messkarte (/Thread-Maximale-Arraygroesse-an-Messkarte)

Seiten: 1 2


Maximale Arraygröße an Messkarte - LarsO - 12.07.2013 12:41

Hi,
ich habe mir eine NI karte (6221 37 Pin) besorgt um Spannungen auszugeben und synchron Daten zu lesen. Das klappt auch alles sehr gut.

Meine Frage bezieht sich auf die Kombination aus Hard- und Software. Die Karte hat vermutlich einen internen Speicher, an den ich ein Array schicken, was die Karte dann mit der entsprechenden Rate abarbeitet. Meine Frage ist nun, was passiert, wenn das Array so groß ist, dass es den Speicher übertrifft.
Werden die Daten dann Stück für Stück gelesen, oder wie kann ich mir das vorstellen? Ich finde auch keine Angabe wie groß der Speicher für die Analoge-Spannungsausgabe bzw. die Analoge-Spannungsmessung ist. Wäre nett, wenn mich da jemand aufklären könnte.

Gruß Lars


RE: Maximale Arraygröße an Messkarte - GerdW - 12.07.2013 13:42

Hallo Lars,

Zitat:Ich finde auch keine Angabe wie groß der Speicher für die Analoge-Spannungsausgabe bzw. die Analoge-Spannungsmessung ist.

Einfach mal in die Specs reinschauen: "Output FIFO size 8,191 samples shared among channels used"

Zitat:Wäre nett, wenn mich da jemand aufklären könnte.
Ich habe das Manual gerne für dich gelesen! Big Grin Rtmfx


RE: Maximale Arraygröße an Messkarte - Holy - 13.07.2013 04:28

(12.07.2013 12:41 )LarsO schrieb:  Meine Frage bezieht sich auf die Kombination aus Hard- und Software. Die Karte hat vermutlich einen internen Speicher, an den ich ein Array schicken, was die Karte dann mit der entsprechenden Rate abarbeitet. Meine Frage ist nun, was passiert, wenn das Array so groß ist, dass es den Speicher übertrifft.
Werden die Daten dann Stück für Stück gelesen, oder wie kann ich mir das vorstellen?

Die Daten werden dann, je nach Einstellung, zu einem bestimmten Zeitpunkt in den Speicher der Karte geladen. Darum musst du dich aber nicht kümmern, da ein DAQmx Write die Daten erstmal in den Arbeitsspeicher bringt und um die korrekte Befüllung des internen FIFO-Speichers der Treiber sich selbst kümmert. Deine Aufgabe ist es primär dafür zu sorgen das neue Daten rechtzeitig angelegt wurden. Weiterhin wäre auch noch die Buffer Regeneration abzuschalten. Die sorgt normalerweise dafür, dass der Inhalt des Puffers immer wieder erneut ausgegeben wird.


RE: Maximale Arraygröße an Messkarte - LarsO - 14.07.2013 10:31

Danke schon mal für die Antworten. (Das Manuel habe ich gelesen und ich bin auch auf den FIFO gestoßen, aber wenn ich nicht weiß was das ist (auch wiki hält sich da "bedeckt") kann ich damit wenig anfangen.)

Mal ein Beispiel (nur für mein Verständnis):
Ich habe gebe dem "Write" ein Array von 1000*1000 Punkten (10^6 samples to Write).
Dann werden diese erst in den Arbeitsspeicher geladen und der Treiber sorgt für die Abarbeitung des Arrays und schickt die Daten (Blockweise oder einzeln?) an die Karte.
Die gibt dann die Spannungen entsprechend der Rate aus.

1) Da ich das Array nur einmal schreibe, interessiert mich das Regeneration doch gar nicht oder?
1.1) Welcher Buffer ist bei der Regeneration gemeint? Der der Karte oder des Arbeitsspeichers?

2) Wenn die Write-Rate sehr hoch ist (100kHz), kann es dann zu Problemen mit dem Übertragen der Daten vom Arbeitsspeicher auf die Karte kommen und die Synchronisation zwischen Read und Write behindern?
Dass das Übertragen der Daten vom Arbeitsspeicher in die Karte so lange dauert, dass der Takt "verloren" geht.
3) Findet die Datenübertragung per DMA statt?


Gruß Lars


RE: Maximale Arraygröße an Messkarte - Holy - 14.07.2013 12:07

(14.07.2013 10:31 )LarsO schrieb:  1) Da ich das Array nur einmal schreibe, interessiert mich das Regeneration doch gar nicht oder?
Nach Ausgabe der letzten Daten könnte es schon relevant werden weil er dann einfach den letzten Inhalt des FIFOs immer wieder ausgibt.

(14.07.2013 10:31 )LarsO schrieb:  1.1) Welcher Buffer ist bei der Regeneration gemeint? Der der Karte oder des Arbeitsspeichers?
Der Karten-FIFO

(14.07.2013 10:31 )LarsO schrieb:  2) Wenn die Write-Rate sehr hoch ist (100kHz), kann es dann zu Problemen mit dem Übertragen der Daten vom Arbeitsspeicher auf die Karte kommen und die Synchronisation zwischen Read und Write behindern?
Dass das Übertragen der Daten vom Arbeitsspeicher in die Karte so lange dauert, dass der Takt "verloren" geht.
Was verstehst du unter Write-Rate? Wenn du meinst 10^6 Datenpunkte 100.000 mal je Sekunde zu übertragen dürfte das deine CPU, RAM und den jeweils involvierten Bus überfordern. Was meinst du hier mit Synchronisation zwischen Read und Write? Solltest du für AO und AI den selben Sampletakt verwenden, würde das auf der Karte direkt laufen und dadurch nicht beeinflusst werden. Wenn die Synchronisation in Software läuft bekommst durch Ressourcenauslastung natürlich Probleme. Im Allgemeinen ist mir bei 2.) unklar auf was du wirklich abzielst.

(14.07.2013 10:31 )LarsO schrieb:  3) Findet die Datenübertragung per DMA statt?
Ja


RE: Maximale Arraygröße an Messkarte - Lucki - 14.07.2013 15:08

Zu ergänzen wäre noch, dass Dich die karteninternen FIFOs normalerweise gar nicht zu interessieren brauchen - von Spezialfällen mal abgesehen. Im PC legt Labview einen zweiten Puffer an, und das ist in der Regel der eigentliche Puffer in Richtung Benutzer.
Dessen Größe (bis hin zu gigantisch) kann man mit DAQmx selbst festlegen; oder man läßt den Anschluss offen, dann verwaltet er sich von selbst und das ist meistens optimal.

Zwischen Karten- und PC-Puffer findet im Hintergrund ein intelligentes Zusammenspiel statt, und das ist der Grund, warum der Benutzer von der Existenz des kleinen internen Kartenpuffers in der Regel gar nichts wissen muss.

Man muss alllerdings sagen, dass es jetzt immer mehr Messkarten mit USB gibt. Der Datenaustausch zwischen Karten- und PC-Puffer läuft dann über den FLaschenhals USB (2.0?) und nicht direkt über DMA. Hier sollte man schon etwas tun. Z.B sollte bei kontinuierlischer schneller periodischer Datenausgabe die Samplegröße in den Kartenpuffer passen - dann ist der USB-Kanal dafür schon mal völlig entlasstet.

Deine Vorstellung, dass bei Pufferüberlauf einfach unbemnerkt Daten verloren gehen könnten, ist falsch. Selbstverständlich kommt es dann zu einer handfesten Fehlermeldung und Abbruch des Programms.

Ganz wichtig ist die Synchronisation der Daten - Ein- und Ausgaberaten mit dem Puffer bei kontinuierlichem Betrieb. Dafür solltest Du Beispiele studieren. Das Prinzip ist, dass DAQmx Write bzw. DAQmx Read wartet, bis wieder Daten in den Puffer hineingehen bzw die angeforderte Anzahl von Samples im Puffer ist. (Dass Anfänger das nicht richtig kapiert haben, erkennt man u.a. daran, das sie ein "Wait" in der Erfassuns/Ausgabeschleife haben).

Um zu Deiner Frage nach der maximalen Arraygröße zu kommen: Sie ist so groß, wie Du in DAQmx dafür Puffergröße eingerichtet hast. Das Maximum ist gegeben durch das Memory Deines PCs. Der kleine Puffer auf der Messkarte dient nur als Zwischenpuffer, er wird gewöhnlich automatisch auf untere Ebene verwaltet und hat zu Deiner Frage keinen direkten Bezug.


RE: Maximale Arraygröße an Messkarte - LarsO - 14.07.2013 21:37

Zu Holy:
Zitat:Nach Ausgabe der letzten Daten könnte es schon relevant werden weil er dann einfach den letzten Inhalt des FIFOs immer wieder ausgibt.
Ist der "letzte Inhalt" das Array im FIFO Speicher oder der letzte Wert im FIFO Speicher?

Zitat:Im Allgemeinen ist mir bei 2.) unklar auf was du wirklich abzielst.
Ich möchte Spannungen ausgeben (2 Kanäle, einen für die x-Richtung, eine für die y-Richtung). Damit verfahre ich zwei Piezos in der Ebene und möchte an jedem "angefahrenen" Punkt zwei verschiedene Spannungen synchron zur Ausgabe messen. Dabei ist es sehr wichtig, dass Anfahren und Lesen synchron sind, sodass ich jedem Messwert (z, w) auch einem Messpunkt zuordnen kann [ z(x,y); w(x,y) ].
Jetzt ist das Array was ich verfahre jedoch sehr viel größer als der FIFO Speicher und ich hatte die Befürchtung, dass das Lesen dem Takt folgt, das Schreiben jedoch nicht, weil das Array noch auf die Karte transferiert werden muss und es somit zu einer Verschiebung von Lese und Schreiberate kommt.
Bildlich dargestellt:
----------------------------------------- Lesen
++++++++ ++++++ +++++ Schreiben (Lücken auf Grund der Übertragung des Arrays an die Karte)


Aber durch das DMA wird dies dann vermutlich nicht so sein, da die Daten nicht "transferiert" werden müssen.

Zu Lucki direkt habe ich keine Fragen Wink

Wenn die Daten nicht zwingend direkt auf der Karte gepeichert werden (wegen DMA), kann ich dann die Daten, die ich während des Synchronen Lesens bzw Schreibens erfasse auch an den PC streamen, sodass ich die Daten gleich auswerten kann, ohne auf das ganze Array warten zu müssen bzw. ohne den Takt und die Synchronität zu beeinflussen?


RE: Maximale Arraygröße an Messkarte - Holy - 14.07.2013 21:50

Inhalt bezieht sich hierbei auf den Inhalt des FIFOs, d.h. das "Array" im FIFO. Das könnte dann natürlich aber auch die Länge 1 haben.

Die Herausforderung an deiner Ausgabe ist hierbei Erfassung und Ausgabe zu synchronisieren. Die Standardeinstellungen führen zu einem eigenen Sample Clock für die Ausgabe und für die Erfassung. Das müsstest du explizit anders konfigurieren. Du könntest deinem Erfassungstask explizit den AI/SampleClock als Taktquelle geben. Dann noch vor dem Start des Erfassungstask den Ausgabetask mit den ersten Daten beschicken und danach starten und dann geht alles mit Start des Erfassungstasks richtig los. Relevant ist hierbei sicher noch der Punkt, dass zwischen deiner Ausgabe und der echten Reaktion deiner Hardware noch Zeit vergeht. Ob das für deine Betrachtungen aber relevant ist, kannst denke ich du am besten bewerten.
Die Übertragung der neuen Ausgabedaten in den FIFO erfolgt abhängig von der Konfiguration. Konfigurierbar sind hierbei Zeitpunkte wie "mehr als die Hälfte im FIFO frei" oder z.B. "FIFO nicht voll". Somit ist es problemlos möglich eine lückenlose Ausgabe zu realisieren.


RE: Maximale Arraygröße an Messkarte - Lucki - 15.07.2013 09:04

Die Synchronisation von Ein- und Ausgabe gehört in die Kategorie "Labview-Meisterkurs". Du schreibst: "das klappt sehr gut", und stellst gleichzeitig zu diesem Thema Fragen eines ahnungloser Anfängers. Hier passt irgendetwas nicht zusammen. Gern würde ich das VI mal sehen.

So habe ich mich in das Thema eingearbeitet:
1. Das Beispiel in
Signalerfassung mittels Hardware / DAQmx / Synchronisation
suchen, welches meiner Anwendung am Nächsten kommt.
2. Das Beispiel studieren, mit Hardware laufen lassen und damit herumspielen, bis ich es restlos verstanden habe.
3. Das Beipiel in mehreren Iterationen ändern, immer nur in minimalen Schritten, bis es genau meiner Aufgabenstellung entspricht.

NB: In keinem Labview - Lehrbuch wird dieses wichtige Theam behandelt, nicht mal andeutungsweise. Das kann daran liegen, dass die Autoren Theoretiker sind und vor Lötkoben, realer Hardware und realer Außenwelt eher Abneigung empfinden.


RE: Maximale Arraygröße an Messkarte - LarsO - 15.07.2013 17:09

Ich habe nochmal Messungen angestellt und musste feststellen, dass die Erfassung und die Ausgabe genau einen Tak auseinander liegen. Er misst einen Takt, bevor er anfängt zu schreiben. (Dieses Programm habe ich aus einem Beispiel "zusammengebastelt".) Oder es liegt daran, dass er es "gleichzeitig" ausgibt und er dadurch noch den alten, statt den neuen Wert misst. Einen Takt vorher Schreiben, dann Lesen wäre aber besser...dann stimmt die zuordnung der Punkte wenigstens...

Jetzt tritt aber noch ein neues Problem auf:
Ich will/muss die Daten live sehen bzw. auswerten, die ich messe. Bekomme ich das dort noch eingebaut ohne dass ich die Zuordnung (z(x,y)) verliere?

Im Anhang ist auch das Programm (die For-Schleife ist nur zur erzeugung einer Geraden, die ich ausgebe und synchron messe).

PS: Ich hoffe, dass ich euch mit den Fragen nicht zu sehr nerve, aber wie ihr selbst schon sagt ist die Literatur zu dem Thema rel. mager...