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 versuche derzeit 8 analoge Kanäle mit einem cRIO und zwei 9215 Modulen einzulesen, zu bearbeiten und auf einem Windows Host anzuzeigen und zu loggen.
Dabei ergeben sich mehrere Probleme, vielleicht kann mir hier einer helfen da ich gerade nicht weiterkomme.
Auf dem FPGA wird von allen Kanälen der RMS Wert und von 1-2 Kanälen noch eine FFT berechnet.
Diese Daten möchte ich jetzt zu meinem RT-VI übergeben.
Ich verwende dafür einen DMA-FIFO der in einer for-Schleife die 8 Kanäle nacheinander in den FIFO schreibt.
Auf dem Bild sind es noch 16, aber die 8 RAW-Werte würden reichen.
Bei 100kS/s und einer RT-VI Schleifendurchlaufzeit von etwa 50ms ergibt sich eine FIFO-Größe von min 40.000 Werten.
Ist das realistisch? Gibt es eine andere Möglichkeit?
Und wie kann ich diese Werte zu meinem Windows-Host übertragen? Im Moment verwende ich eine Netzwerkvariable mit FIFO.
Aber erstens scheint mein RT-VI durch das schreiben der Variable erheblich ausgebremst zu werden und zweitens scheinen mir Werte verloren zu gehen.
Sind hier TCP/IP oder Netzwerkstreams zu bevorzugen? Was ist schnell genug für mindestens 8*100kS/s?
Das erste Problem konnte ich mittlerweile lösen. Ich habe nicht gewusst das man die FIFO-Grösse in dem RT-VI gesondert einstellen kann.
Diese habe ich jetzt auf dem FPGA auf 2047 und innerhalb des RT-VIs auf 85.000 gestellt. Jetzt funktioniert es wie es soll.
Mein zweites Problem konnte ich noch nicht lösen. Sobald ich versuche die Netzwerkvariable innerhalb des RT-VIs zu schreiben (Boolesch 2 auf dem Bild), geht
die CPU-Auslastung auf 100% und die Durchlaufzeit ist nicht mehr gewollte 50ms, sondern eher 250.
Nochmal meine Frage: Gibt es einen effektiven/verlustfreien Weg die Daten vom RT-VI zum Windows Host zu übertragen?
Pro Schleifendurchlauf werden max. etwa 80.000 Werte aus dem FIFO gelesen.
Das RT-VI soll unabhängig vom Windows Host laufen können.
Von der Funktion wäre eine Netzwerkvariable schon optimal. Aber das scheint bisher nur bis etwa 10kS/s zu funktionieren.
dir ist schon klar, dass du da 80k*8byte = 640kB alle 50ms übers Netzwerk schieben willst? Und das der kleine cRIO nur einen 266MHz Prozessor hat? (Oder waren es 400MHz, bin zu faul zum nachgucken...)
- Probier doch mal, nur die Daten eines Sensors zu übertragen. Wenn das funktioniert, nimmst du 2 Sensoren usw.
- Neben Netzwerkvariablen könntest du auch Netzwerkstreams ausprobieren...