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!
ich lese per LabVIEW über eine I/O-Karte den Buffer eines Meßgerätes aus. Dieser Buffer besteht aus 65536 Words. Zum Auslesen muß ich an den Control-Port der I/O-Karte (0x282) eine 1 schreiben und unmittelbar danach eine 0, damit vom Meßgerät das nächste Word an die Schnittstelle gesendet wird und dann mittels InPort16 gelesen werden kann.
Um den gesamten Buffer des Meßgerätes zu lesen, muß ich also nacheinander alle 65536 Words sequentiell lesen, was - wie im angehängten Vi ersichtlich - mit einer for-Schleife passiert.
Das Problem ist nur, daß dies unglaublich langsam passiert. Ein einmaliges Einlesen des Buffers dauert größenordnungsmäßig 1-1,5 Sekunden, tolerierbar wären aber höchstens 0,1 Sekunde.
Hat jemand eine gute Idee?
Gruß,
Michael
</div>
<div align="left">Und ich sollte noch erwähnen, daß das ganze auf einem Rechner mit Windows XP passiert und die I/O-Karte eine ISA-Karte ist ...</div>
so wie ich das sehe wird es nicht schneller gehen.
Hast Du mal in den VI-Einstellungen unter "Ausführung" die Priorität des VI's mal verändert?
Ich weiß nicht, ob das helfen könnte.
Einen ähnlichen Vorschlag wollte ich auch unterbreiten. (hatte mich nur nicht getraut)
Das hatte ich nämlich mal bei NI gesehen.
Wenn ein VI unter Volllast läuft erobert sich Windows ganz rüde die Herrschaft zurück.
Mit dem Timout wird WIN dann vielleicht zufrieden sein.
was meines Wissens nach doch einiges an Performance kostet, ist das automatische Generieren des "Data"-Array am Ausgang der For-Schleife.
Etwas Zeitgewinn sollte es bringen, vor der For-Schleife ein Array der entsprechenden Größe zu generieren, das Array dann über ein Shift-Register in die For-Schleife zu führen und dann in der Schleife das entsprechende Element jeweils über "Replace-Array-Element" zu ersetzten.
Zumindest ist es mal einen Versuch Wert.
MfG, Jens</div>
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
Was ist es für eine Karte? Vielleicht gibt es eine Möglichkeit den Takt von dieser Karte abzugreifen und eine Timed-While-Schleife statt For-Schleife zu nehmen,. dann würde eigentlich alles schneller laufen.
vielen Dank für eure Vorschläge. Ich habe alle durchprobiert und es hat leider keiner funktioniert. Es scheinen tatsächlich die VIs InPort und OutPort zu sein (oder auch nur InPort), die so langsam sind, selbst wenn ich die Priorität meiner VI so hoch setze, daß nichts anderes mehr läuft.
Prinzipiell würde ich den Teil als Alternative gerne in C schreiben. Es gab ein in Linux geschriebenes C-Programm, das genau das gleiche machte, aber 10x so schnell. Blöderweise scheint es in Win XP ja nicht mehr möglich zu sein, mit outp etc. auf die Ports direkt zuzugreifen. Naja, dann muß ich halt immer ne Stunde warten, bis das Spektrum aufgenommen ist
Trotzdem vielen Dank für die Mühe,
Michael
05.09.2006, 14:56 (Dieser Beitrag wurde zuletzt bearbeitet: 05.09.2006 14:57 von Achim.)
du könntest mal die "+2" aus der Schleife rausnehmen, es genügt doch, wenn das nur 1x berechnet wird...zumal da auch ne automatische Formatumwandlung stattfindet (sichtbar am grauen "Coercion Dot"), die kostet auch Zeit. Genauso solltest du die zu sendenden Daten (1 und 0) gleich im richtigen Format I32 senden, da wird nämlich auch jedes Mal umgewandelt! Vielleicht bringts ja was...
Du könntest auch noch versuchen, deine Daten mittels eines Schieberegisters zu sammeln (nicht durch "Indexing"), und versuchs mal ohne das Fehlercluster im Schieberegister!
Gruss
Achim
PS: In LV sind Beispiele vorhanden, wie der Port gelesen wird. Dort kann man Update-Raten im ms-Bereich einstellen, d.h. die Lese/Schreib-VIs sind schon für solche schnellen Lesevorgänge geeignet!
"Is there some mightier sage, of whom we have yet to learn?"
"Opportunity is missed by most people because it is dressed in overalls and looks like work." (Thomas Edison)
05.09.2006, 15:45 (Dieser Beitrag wurde zuletzt bearbeitet: 05.09.2006 15:46 von zhost.)
' schrieb:du könntest mal die "+2" aus der Schleife rausnehmen, es genügt doch, wenn das nur 1x berechnet wird...zumal da auch ne automatische Formatumwandlung stattfindet (sichtbar am grauen "Coercion Dot"), die kostet auch Zeit. Genauso solltest du die zu sendenden Daten (1 und 0) gleich im richtigen Format I32 senden, da wird nämlich auch jedes Mal umgewandelt! Vielleicht bringts ja was...
Du könntest auch noch versuchen, deine Daten mittels eines Schieberegisters zu sammeln (nicht durch "Indexing"), und versuchs mal ohne das Fehlercluster im Schieberegister!
Alles sehr gute Ideen (daß die +2 in der Schleife war, ist ja fast schon peinlich), aber leider hat es ebenfalls alles nichts an Zeitgewinn gebracht. Trotzdem danke!
Zitat:PS: In LV sind Beispiele vorhanden, wie der Port gelesen wird. Dort kann man Update-Raten im ms-Bereich einstellen, d.h. die Lese/Schreib-VIs sind schon für solche schnellen Lesevorgänge geeignet!
Wo finde ich diese Beispiele genau? Konnte im Ni Example Finder leider nichts passendes finden.
Zitat:PS: In LV sind Beispiele vorhanden, wie der Port gelesen wird. Dort kann man Update-Raten im ms-Bereich einstellen, d.h. die Lese/Schreib-VIs sind schon für solche schnellen Lesevorgänge geeignet!
Mir ist gerade aufgefallen, daß ein Lese-/Schreibvorgang tatsächlich nur 0,02 ms dauern kann (oder habe ich mich verrechnet? Ich habe 65536 Schleifendurchläufe, die insgesamt ca. 1,6 Sekunden dauern. Das macht doch 0,02 ms pro Schleifendurchlauf, oder?). Wenn ich mir diese Zahl ansehe, scheint es mir plausibel, daß es hier nicht schneller geht.