Hallo,
ich möchte mittels Weil-Schleife eine Buffer-Abfrage machen.
Es wird von der Hardware jede 800 µs einen Wert in Buffer geschrieben.
Ich habe mit dem LabVIEW über einen DLL den Zugriff auf dem Hardware-Buffer.
Diese DLL wird bei mir in eine Weilschleife immer wirder aufgerufen, leider schaft meine Weilschleife max 510 Abfragen in eine Sekunde.
Das ist leider zu langsam, da der LabVIEW lansamer aus der Buffer liest als der Buffer von Hardware beschrieben wird, so dass ich die aktuelle Werte aus dem Buffer mit Verspätung lese. Was ich brauche ist eine Möglichkeit die Abfrage der Buffer auf um 1500 oder mehr pro Sekunde zu realisieren.
Hat jemand eine Idee? Vielen Dank im Vorauß!
Diplomand
Hallo Diplomand,
dein VI schafft bei mir ~15Mio Durchläufe in einer Sekunde. Dummerweise hat es mit deiner Frage überhaupt nichts zu tun...
Zitat:Es wird von der Hardware jede 800 µs einen Wert in Buffer geschrieben. Ich habe mit dem LabVIEW über einen DLL den Zugriff auf dem Hardware-Buffer.
Wie groß ist der Buffer?
Zitat:Was ich brauche ist eine Möglichkeit die Abfrage der Buffer auf um 1500 oder mehr pro Sekunde zu realisieren.
Falsch. Was du brauchst, ist die Möglichkeit, mehrere Samples auf einmal aus dem Buffer zu lesen. Beispielsweise 150 Samples alle 0,1s...
Als CLAD solltest du das wissen!
Dein Bsp.-VI hilft uns nur wenig bei der Lösung deines Problems.
Die Schleife läuft hat bei mir mehr als 11 Mio. Durchläufe pro Sekunde.
Gruß, Jens
P.S.: Was machst du alles in deinem realen Programm und bei der DLL-Abfrage?
EDIT: Gerds Rechner ist offenbar schneller als meiner.
Bei mir, mit meinem mittelmäßigen AMD-Pozessor, schafft Dein VI mehr als 10e6 Durchläufe. Bei jeder neuen Version von LV wurde vor allem auch die Geschwindigkeit verbessert. Wahrscheinlich benutzt Du von Deinen verschiedenen LV-Versionen ausgerechnent die älteste.
Hallo,
vielen Dank für Ihre Antworten.
Leider ich habe einen fremden DLL mit dem ich die Werte aus der Hardware-Buffer auslese und der kann nur die einzelnen Werte auslesen, also es gibt keine Möglichkeit ganze oder teil Buffer zu lesen.
Weiter falls ich keinen delay in meine Weilschleife einbaue, dann ist die Prozesorlast um 80 % und die Lesezugriff über DLL auf der Buffer zu häufig,so dass der Programm nicht mehr richtig funktioniert.
Also noch einmal, ich brauche einen Lesezugriff von 1500 bis 2000 pro Minute, nicht mehrere Million Mals.
Schöne Grüße aus Dortmund
Hallo Diplomand,
mögliche Lösungen auf einem "stinknormalen" Windows-PC:
1. Lese 2 Werte pro Schleifendurchlauf und warte dann bis zur nächsten Millisekunde. Nachteil: Jitter...
2. Suche hier im Forum nach HPC ("High Performance Counter") oder "warten Mikrosekunden". Irgendjemand hatte mal ein (prozessorintensives) Beispiel gepostet, um auch unter Windows im Mikrosekundenbreich zu warten. Vorteil ggü. Lösung eins: geringfügig geringerer Jitter bei allerdings deutlich höherer CPU-Last.
3. Schreib dir eine Wrapper-DLL, um die Abfrage evtl. genauer zu takten und die Daten , wie vorgeschlagen, in einem Buffer zu sammeln...
Anmerkungen:
- Falls deine DLL einfach zu langsam ist (du schreibst: nur ~500 Durchläufe pro Sekunde"), wird die Schleife auch ohne Wartezeiten kaum schneller werden...
- Wartet der DLL-Call evtl. auf einen neuen Wert im Buffer? Oder bekommst du sofort den zuletzt gelesenen Wert zurückgemeldet?
Quintessenz:
- "Scheiß DLL"
- Unter Windows ist es schwer, Schleifen unter 1ms zu takten. Und noch schwerer, dies mit geringem Jitter hinzubekommen...
Zitat:Lesezugriff von 1500 bis 2000 pro Minute
Reden wir jetzt über nur noch 25 bis 33 Hz Samplerate??? Dann ist das oben genannte hinfällig und du nimmst einfach eine Wartezeit von 40ms in die Schleife...
Hallo Gerd,
vielen Dank für deine Vorschläge, die werde ich gleich ausprobieren.
Zitat:Lesezugriff von 1500 bis 2000 pro Minute
Lesezugriff von 1500 bis 2000 pro Sekunde, mein Fehler.
Grüß
Hi
Ich gebe mal ein paar Stichworte, den Rest musst Du selbst machen.
Einzelwertauslese via DLL in einer For-Schleife auslesen. Einzelwerte werden mit InPlace-Relace-Array-Element in einem Buffer-Array, das im aufrufenden VI mit der notwendigen Größe erzeugt wird, gesammelt. Dieses SubVI wird mit Priorität Subroutine aufgerufen.
Das Buffer Array wird auf allen Ebenen in Shift-Registern gehalten. Die gesammelten Daten können dann als Block weiterverarbeitet werden.
Gruß Holger