LabVIEWForum.de - Triggersignal auslesen von cDAQ-9178, aber wie?

LabVIEWForum.de

Normale Version: Triggersignal auslesen von cDAQ-9178, aber wie?
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Guten Morgen,

ich bin zur Zeit dabei ein recht altes C++-Programm für Messungen im Explosionsschutz in LabVIEW neu zu entwickeln. Neben leicht veränderten Funktionen wurde auch beschlossen, dass das Osziloskop durch ein "NI cDAQ-9178" mit "NI 9222 (BNC)"-Modulen zu ersetzen. Auch sollen später noch Module zum Messen der Temperatur und der Dehnung folgen, die Module wurden aber noch nicht festgelegt.

Allerdings habe ich noch ein Problem mit dem Trigger. Das Triggersignal kommt von einer externen Quelle, weshalb ich den PFI0-Anschluss dafür verwende. Die Triggerung funktioniert auch schon, wie ich es geplant habe. Das eigentlich Problem ist, dass mein Programm von der Triggerung selbst nichts mitbekommt. Es werden nämlich noch weitere Messgeräte angesprochen, die Regelmäßig ausgelesen werden. Die Messwerte von diesen anderen Messgeräten werden dem Nutzer angezeigt und beim Zeitpunkt der Triggerung soll die Werte nicht mehr aktualisiert werden, um sie am Ende der Messung zu speichern.

Außerdem ist die Dauer der einzelnen Messungen sehr unterschiedlich. Die kürzeste Messung ist 50 ms lang, die längste 10 Minuten. Besonders bei den langen Messung soll das Programm nach der Triggerung anzeigen, wie lange die Messung noch läuft. Dadurch merkt der Nutzer auch, dass das Programm bzw. die Hardware auch getriggert hat und es entsteht auch nicht den Eindruck, dass das Programm abgestürtzt ist. Es ist auch notwendig einen Pretrigger zu verwenden, der 10% der Messdauer oder eine Sekunde lang ist( je nachdem was kürzer ist).

In dem C++-Programm wurden im Sekundentakt die anderen Messwerte und das Statuswort vom Osziloskop abgefragt, wodurch die Triggerung erkannt wurde, und sowas brauche ich nun in LabVIEW für die oben beschriebene Hardware.

Im Momment versuche ich in einem VI mit einem analogen Eingang herauszufinden, wie ich an die Triggerung komme. Da meine bisherigen Lösungsansätze gar nichts gebracht haben, ist dort aktuell auch nichts zum Triggerauslesen drin. Ich möchte erstmal in diesem VI den Boolean "getriggert?" zum Zeitpunkt des Triggerns auf True setzen. Die Messung dort ist 10 s lang und hat einen Pretrigger von 1 s. Später werden es mehrere Kanäle sein und viele Konstanten werden von dem Nutzer direkt oder indirekt eingestellt.

Ich hoffe einer von euch hat eine Idee für mein Problem und danke schonmal im vorraus. Ich habe das VI angehängt und nutze hier LabVIEW 14. Da ich aber weiß, dass nicht alle Forumuser 14 oder neue haben, habe ich noch eine Version für LabVIEW 8 hinzugelgt. Allerdings gab es wegen den polymorphen Funktionen Warnungen beim Speichern.

Mit freundlichen Grüßen,
Markus
Hallo Markus,

herzlich willkommen!

Zitat:Ich möchte erstmal in diesem VI den Boolean "getriggert?" zum Zeitpunkt des Triggerns auf True setzen. Die Messung dort ist 10 s lang und hat einen Pretrigger von 1 s.
Du hast programmiert:
- einen AI-Kanal anlegen mit Messbereich ±1V
- eine endliche Messung mit 1kS/s Samplerate und 10000 zu erfassenden Samples, warum gibst du hier eine steigende Flanke explizit an?
- einen "Referenz"-Trigger, der auf eine steigende Flanke von PFI0 wartet, mit 1000 Samples Pretrigger
Die Hilfe zum Referenztrigger sagt:
Zitat:Konfiguriert den Task so, dass die Erfassung gestoppt wird, wenn a) das Gerät alle Samples vor dem Trigger erfasst hat, b) eine steigende oder fallende Flanke eines digitalen Signals erkannt wird oder c) das Gerät alle Samples nach dem Trigger erfasst hat.
Ist es das, was du willst?
Willst du nicht eher einen Start-Trigger benutzen?

In der Schleife fragst du dann 10kS mit einem Timeout von nur 1s ab. Wie soll das funktionieren bei einer Samplerate von 1kS/s?
Außerdem stoppst du deine Schleife, wenn nicht Fehler 200281 vorliegt. Ist das so gewollt?
Danke für die schnelle Antwort gerdW.

Für mich ist es das erste mal, das ich mit Triggern bei DAQmx arbeite.

Die steigende Flanke beim "DAQmx Timing" hatte keine spezielen Grund und kann meiner Meinung nach wegelassen werden. Ich hatte nur für die ersten Versuche die Konstante gesetzt.

Den Referenztrigger hatte ich es so verstanden, dass ich 1000 Messpunkte(1 s) habe die direkt vor dem Triggersignal aufgenommen wurden und den Rest (9000 = 9 s) nach dem Triggersignal. Ich bekommen dann eine Messung von 10 s heraus, wo das Triggererreignis bei 1 s liegt. Bitte korrigier mich, wenn ich das falsch verstanden habe.

Den Startrigger habe ich nicht gewählt, da es keinen Pretrigger gibt. Die Messung startet ja erst, wenn das Triggersignal kommt und das wäre für die Messungen zu spät, da wichtige Informationen kurz vor der Triggerung verloren gehen können. Deshalb sollen bei den Messungen 10% der Messdauer vor der Triggerung schon aufgenommen werden bzw. 1 s bei langen Messungen.

Der Timeout mit 1 s in der While-Schleife ist beabsichtigt. Es ist nämlich aus Sicht des Programms nicht bekannt, wann das Triggersignal kommt. Es können mehrere Sekunden zwischen Start der Messung und der Triggerung vergehen. Auch kann der Prüfer die Messung noch abbrechen, wenn Sie gestartet wurden. Aus diesem Grund gibt es den Timeout von 1 s, damit man die Messung abbrechen kann, wenn es notwendig ist. Der Fehlercode "-200281" tritt auf, wenn der Timeout abgelaufen ist aber noch nicht alle Messpunkte aufgenommen wurde bzw. noch nicht einmal getriggert wurde. Wenn dieser "Fehler" auftritt und der Stoppbutten nicht gedrückt wurde, dann wird die Schleife wiederholt. Wenn die Messdaten vorliegen (kein Fehler) oder ein anderer Fehler entsteht, dann wird die While-Schleife beendet und die Messwerte können angezeigt werden oder später eine entsprechende Fehlernachricht.

Mit freundlichen Grüßen,
Markus
Hallo Markus,

Zitat:Die Triggerung funktioniert auch schon, wie ich es geplant habe.
Das eigentlich Problem ist, dass mein Programm von der Triggerung selbst nichts mitbekommt.
Doch, dein Programm bekommt die Triggerung mit. Wenn du deine Messwerte hast, weißt du, dass der Trigger 9s vorher eintraf…

Ein Lösung wäre also, die Messdaten deiner "anderen Messgeräte" auch für ca. 10s zu buffern und dann den Wert verwenden, der beim Eintreffen des Triggers aktuell war…
Hallo GerdW,

Ee trifft zwar zu, dass mein Programm das "Ende" der Messung mitbekommt, allerdings ist auch eine Anzeige für die restliche Dauer der Messung gewünscht und die kann man leider nicht nachträglich in der Vergangenheit einblenden. Ich habe in der hochgeladenen VI 10 s für die Messung genommen. Allerdings schrieb ich auch, dass die Messungen 10 Minuten lang sein können, was später durch die Bedienoberfläche eingestellt werden kann. Natürlich hat man keine Lust beim Testen jedes mal 10 Minuten zu warten, weshalb 10 s genommen wurden.

Damit ich die restliche Zeit auch anzeigen kann, muss ich erstmal die Triggerung selbst feststellen. Ansonsten gibt es für den Prüfer keine Rückmeldung innerhalb der nächsten 10 Minuten, dass gertriggert wurde.

In der C++-Version entstand, als es die Restdaueranzeige dort noch nicht gab, zu oft den Eindruck, dass die Software abgestürtzt ist oder dass nicht getriggert wurde. Aus diesem Grund muss es in der neuen LabVIEW-Version diese Anzeige auch weiterhin geben.

Mit freundlichen Grüßen,
Markus
Hallo Markus,

mach mal einen einfachen Test: kannst du den PFI0 als digitalen Input einlesen? Wenn das geht, dann kannst du dies als "Trigger ist angekommen"-Anzeige verwenden.

Der nächste Schritt wäre dann die Aufgabe, wie man den PFI0 sowohl als Referenztrigger als auch als DI gelesen bekommt…
Hallo GerdW,

die Idee hatte ich auch schon, allerdings sehe ich keine Möglichkeit an PFI0 ranzukommen. Der Baustein "DAQmx - Virtuellen Kanal erzeugen" als "Digitale Erfassung" nimmt am Eingang "Leitungen" keine Quelle von diesem Typ an. Das VI ist dann nicht mehr ausführbar.

Zitat:Diese Verbindung ist nicht möglich, da die Datentypen (zum Beispiel "numerisch", "String", "Array" oder "Cluster") nicht zusammenpassen. Öffnen Sie die Kontexthilfe, um zu sehen, was für einen Datentyp die Verbindung haben muss.
Der Typ der Datenquelle ist NI-Anschluss.
Der Typ der Datensenke ist DAQmx - Physikalischer Kanal.

Und wenn ich den Name per Hand ändere gibt es einen Fehler beim Starten des VIs.

Zitat:DAQmx Create Channel (DI-Digital Input).vi:2320001<append>
<B>Gerät: </B>cDAQ1
<B>Name des physikalischen Kanals: </B>PFI0

<B>Task-Name: </B>_unnamedTask<3>

Und bei "AI - Spannung" gibt es die gleichen Fehler.

Mit freundlichen Grüßen,
Markus
Hallo Markus,

schade, war nur eine Idee.
Bei einem simulierten cDAQ9178 konnte ich auch keinen DI-Task erzeugen, der auf PFI0 schaut…

Wenn du den Trigger dann noch zusätzlich als (Digital-)Signal einlesen willst, bleibt wohl nur ein zusätzliches Modul (entweder DIO oder AI).
Oder du rufst einfach mal NI an (089-7413130) und fragst den Support, ob er noch andere Möglichkeiten kennt…
Referenz-URLs