LabVIEWForum.de - CAN-Kommunikation in paralleler While-Schleife

LabVIEWForum.de

Normale Version: CAN-Kommunikation in paralleler While-Schleife
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Guten Morgen zusammen,

ich kommuniziere über einen Peak CAN USB mit verschiedenen Geräten über einen proprietären CAN-Bus. Die eigentlich Schnittstelle in Labview funktioniert schon, d.h. ich kann Nachrichten empfangen und senden. Allerdings ist mein Labview-Programm in Bezug auf die genannte Kommunikation "ablaufgesteuert" aufgebaut. An den entsprechenden Stellen im Programm sende ich Nachrichten und warte dann auf Antworten, um diese zu verarbeiten.

Die genannte Struktur möchte ich nun so anpassen, dass die eigentliche Kommunikation in einer parallelen While-Schleife abläuft. Hier kann ich Nachrichten bereits bezüglich eines bestimmten Befehlsbereichs oder in Bezug auf einzelne Teilnehmer vorfiltern, um nur Nachrichten in meinen Eingangsbuffer zu schreiben, die von Interesse für mich sind. Auf diesen Buffer greife ich dann von meinem Hauptprogramm aus zu, reagiere auf Nachrichten und muss hier vermutlich auch Nachrichten löschen, die nicht relevant sind, um ein Überlaufen des Buffers zu verhindern.

Meine Hauptfrage bezieht sich nun darauf, wie ich den beschriebenen Buffer gestalte (vermutlich als Array von einem Cluster?) und wie die beiden Schleifen (Kommunikation und Hauptprogramm) miteinander kommunizieren bzw. gleichzeitig auf dem Buffer schreiben und lesen können?

Natürlich gibt es zusätzlich einen Ausgangsbuffer, den ich aber dann entsprechend aufbauen kann.

Vielleicht habt ihr ja den ein oder anderen Tipp für mich, wie ich das sinnvoll aufbauen kann.

Im Voraus besten Dank dafür!
Hallo creo,

würde eine Queue für dich ausreichen? Dein CAN-Receiver schreibt in die Queue, deine "Hauptroutine" kann die Nachrichten in dieser Queue nacheinander abarbeiten…

Oder brauchst du einen Buffer, wo du ständig Zugriff auf alle gespeicherten Nachrichten hast? Dann würde ich wohl eine FGV (oder besser gleich eine Klasse) erstellen, die sich um dieses Array of Messages kümmert…
Hallo GerdW,

vielen Dank für die schnelle Antwort!

Vermutlich hast Du Recht und eine Queue reicht vollkommen aus für meine Anwendung. Letztendlich erwarte ich ja eine bestimmte Nachricht, bevor ich im Hauptprogramm "weitermachen" kann. Deshalb kann ich die Nachrichten in der Queue nacheinander abarbeiten und verwerfen, bis ich zur Nachricht komme, auf die ich warte.

Entsprechend wäre das ja dann auch eine Queue für den Ausgang der Nachrichten. Verwende ich lokale Variablen, um den Filter in der CAN-Schleife vom Hauptprogramm aus beeinflussen zu können, oder gibt es da auch eine schönere Lösung?
Hallo creo,

Zitat:Verwende ich lokale Variablen, um den Filter in der CAN-Schleife vom Hauptprogramm aus beeinflussen zu können, oder gibt es da auch eine schönere Lösung?
"Lokale Variablen" zählen für dich also als "schöne" Lösung? Big Grin

Der Standard-QMH von NI verwendet eine Queue, die einen Cluster aus Enum (oder String) und einem Variant benutzt. Mit dem Enum kannst du mitteilen, was der Handler mit der Message machen soll (CAN-Message versenden oder Filter justieren). Im Variant stehen dann die Daten, die der Handler entsprechend dem Enum von Variant zurück zu wasauchimmer konvertieren kann…
Referenz-URLs