Hallo,
ich möchte mittels eines cRio-9073 und NI 9215 Daten aufnehmen.
Soweit kein Problem, jedoch kommt nun die Schwierigkeit.
Die Daten sollen getriggert aufgezeichnet werden. Das bedeutet, dass ich eine gewisse Zeit vor dem Trigger aufnehmen will (z.B. 0,5-1,5s vor dem Trigger) und eine variable Zeit danach (0,5-2s).
Der Ansatz ist ein Fifo zu nutzen, in dem die Werde vor dem Trigger gespeichert werden.
Da die Frequenz der Messdatenerfassung und die Erfassungsdauer variabel sein soll müsste ich dazu den FiFo variabel gestalten.
Ein weiteres Problem ist der FiFo an sich, da dieser voll läuft. Ich möchte jedoch ein "Überlaufen" haben, also wenn der FiFo voll ist soll das Schreiben der neuen Daten zu einem entfernen der ältesten führen. Um somit die n neusten Daten im FiFo liegen.
Durch die Größe des FiFo kann somit zum Zeitpunkt des Triggerns die Speicherdaten im Vorlauf gemessen werden.
Also kann mir jemand bei den Problemen Helfen?
Also die Größe des FiFos innerhalb der Vi zu ändern.
Und ein "Überlaufen" der FiFo zu erzeugen.
Vielen Dank,
Markus
Du kannst ja von der "aktuellen" Zeit die Sekundenzahl abziehen, die Dein Pretrigger haben soll. Alles was älter ist, kannst Du aus Deinem FIFO (Array) rausschmeißen.
Gruß Markus
Hab' Dir schnell mal was zusammengeklickt, wie ich das in etwa meine:
[
attachment=33696]
Gruß Markus
Habe auch mal was auf die Schnelle skizziert.
[
attachment=33700]
Es gibt aber noch eine weitere interessante Möglichkeit, einen FIFO zu begrenzen: Bei den Queue-Funktionen gibt es neuerdings das VI "Element verlustbehaftet hinzufügen". D.h. im Klartext: Wenn die Queue voll ist, wird nicht gewartet, sondern das älteste Element fliegt raus.
@Markus82:
Erste Antworten hast du. Trotzdem solltest du deine Frage ein wenig präzisieren.
Du hast deine Frage im Unterforum FPGA gestellt. Geht es also mglw. im DMA-FIFOs zwischen FPGA und RT-Teil des cRIO? Oder was genau?
Gruß, Jens
Hallo,
ersmal danke!
Ich hatte vergessen mitzuteilen, wie ich Daten sammle!
Die FiFo dient natürlich zur Datenübertragung vom Crio zum Hostsystem
Das CRio ist per FPGA programmiert.
Am liebsten wäre mir, dass das CRio die Vor und Nachlaufzeit dem CRio übergeben werden und das FPGA dann die Daten aufzeichnet und dann bei einem Triggersignal die Daten an das Hostsystem sendet.
ICh habe für das System die FPGA Lizenz aber keine Realtimelizens.
Somit muss ich ein FPGA-Programm erstellen, welches mir die Daten überträgt.
Ich würde mich über weitere Hilfe freuen!
(08.05.2011 18:00 )Markus82 schrieb: [ -> ]Ich würde mich über weitere Hilfe freuen!
-- und wir würden uns über eine Kommentierung der bereits gegebenen Hilfen freuen. Oder lagen die so daneben, daß hier die einzig adäquate Antwort "Der Mantel des Schweigens" ist?
Beide Antworten bezogen sich leider nicht auf die FiFos welche zur Datenübertragung eingesetzt werden und sind somit leider nicht nutzbar.
Ich versuche jedoch aktuell das Problem mit dem verlustbehafteten Zufügen zu lösen. Bei dieser Vatiante werden jedoch weiterhin die Daten im Hostsystem verarbeitet, was ich vermeiden wollte.
Ich werde mich melden wenn es funktioniert hat.
Demnach erstmal vielen Dank aber wenn noch jemand ne idee hat sowas direkt im FPGA zu implementieren wäre ich für Vorschläge dankbar!
Wenn die Zeitspanne der Aufzeichnung ( Pretrigger bis Posttrigger ) und die Samplerate bekannt sind, weist Du wie viele Daten pro Trigger anfallen. In dieser Größe legst Du einen FPGA Memoryblock an und baust damit einen Ringspeicher in den die Daten laufen. Nach dem Posttriggerevent schiebst Du die Daten in den Target2Host DMA FIFO.
Hallo,
auf dem FPGA musst du einen Ringpuffer generieren. Solange der Trigger nicht kommt, wird kontinuierlich ein FPGA Memory beschrieben (von Adresse 0 bis N und dann wieder von vorne). Ich habe mir es einfach gemacht: Ich habe ein Memory für Pretriggered Samples und ein FPGA Memory für Posttriggered Samples. Das Memory für die Pretriggered Daten funktioniert wie beschrieben als Ringpuffer, das Memory für die Posttriggered Daten wird nur einmal nach dem Trigger beschrieben.
Vom Host kann jeweils die Grösse der Pre- und Posttriggered Samples angegeben werden. Da auch die Sample-Clock vom Host vorgegeben werden kann, ist somit auch klar wie lange die Pre- und Posttriggered Zeit ist.
Nach der Erfassung können die Daten per DMA zum Host gesendet werden.
Ich hoffe dies Hilft als Ideenanstoss.
Grüsse,
cheggers