LabVIEWForum.de
CAN MultipleRead Size Notification - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: Datenkommunikation (/Forum-Datenkommunikation)
+---- Thema: CAN MultipleRead Size Notification (/Thread-CAN-MultipleRead-Size-Notification)

Seiten: 1 2


CAN MultipleRead Size Notification - Slev1n - 09.03.2015 10:09

Hey Leute,

ich hätte mal eine Frage.
Zuerst aber was zum Programm:
Ich lese Daten von einem CAN Bus. In diesem Fall ist nur ein anderes Gerät neben meiner USB 8473s Karte mit am Bus. Dieses Gerät schickt mir mit einer Übertragungsrate von 125kBaud immer wieder 8 unterschiedliche Frames. Also alle paar ms kommen 8 Frames mit 8 unterschiedlichen IDs.

Meine Frage also: Kann man es so einstellen, dass das MultipleRead.Vi solange wartet (z.b. mit ncWaitForState.vi und SetAttr.vi [Multiple Read Size Notification]) bis die Anzahl von Frames die im read puffer sind ein vielfaches von 8 ist?

Damit wäre eine spätere Datenauswertung in einer Tabelle nach Konvertierung mit Hilfe der DBC-File deutlich schöner. Da wenn gerade 20 Frames gelesen werden nicht alle IDs gleich oft vertreten sind und wenn ich die Auswertung in ein Excell File geb, dann sind in manchen spalten halt nur 2 umgerechnete Werte und in manchen 3.
So sieht es dann immer aus: (nur Beispiel)
[attachment=52376]

Bin gespannt ob das machbar ist.

Gruß
Slev1n


RE: CAN MultipleRead Size Notification - GerdW - 09.03.2015 10:31

Hallo slevin,

Zitat:wenn ich die Auswertung in ein Excell File geb, dann sind in manchen spalten halt nur 2 umgerechnete Werte und in manchen 3.
Dann ändere doch deine Auswertung und schreibe in jede Zeile immer die letzten bekannten Werte aller Signale!
Also im Grund genau das, was du vom CAN liest: es gilt immer der zuletzt gelesene Wert eines Signals, bis eine neue Botschaft mit eben diesem Signal eintrifft…


RE: CAN MultipleRead Size Notification - Slev1n - 09.03.2015 11:00

Hey,

Zitat:Dann ändere doch deine Auswertung und schreibe in jede Zeile immer die letzten bekannten Werte aller Signale!

Ich verstehe nicht genau was du meinst. Allerdings muss ich mein Problem glaube ich genauer erklären.
Von diesen 8 Frames konvertiere ich nur 2. Einmal bekomme ich aus dem Frame 4 und einmal 3 Werte, jeweils in einem Array. Wenn ich also beim Auslesen von 20 Frames, 3 mal die 1. ID und 4 die 2.ID konvertiere, habe ich zwei 2D-Arrays. Hierzu 2 Bilder:

Hier sieht man wie die Frames zusammen mit der ID in das SubVi für die Konvertierung gehen.
[attachment=52380]

Hier die Konvertierung.
[attachment=52381]

Dieses Array aus Clustern drösel ich bei der Auswertung wieder auf und schreibe im Excel-File zuerst die Channel Namen in die erste Zeile nebeneinander und danach die "Skalierten Daten" darunter. Dabei packe ich die beiden 2D Arrays nebeneinander und schreibe sie dann in die ExcelFile. Ich glaube mein Problem wäre gelöst wenn ich die Arrays nicht zusammenpacke, sondern einzeln in die ExcelFile nebeneinander schreibe.
Wie ich das machen kann weiß ich allerdings nicht.

Dieses auf ein Vielfaches von 8 warten geht wohl auch nicht oder? Fände ich nämlich auch recht elegant.

Gruß
Slev1n


RE: CAN MultipleRead Size Notification - GerdW - 09.03.2015 11:12

Hallo slevin,

Zitat:Dieses Array aus Clustern drösel ich bei der Auswertung wieder auf
Da ich dein Array und deine ganzen subVIs nicht kenne, kann ich dazu kaum was besseres vorschlagen. Und Bilder lassen sich so schwer debuggen…

Bei meinen CAN-Daten lege ich mir für jedes Signal einen Buffer an, welcher immer den aktuellen (sprich: den zuletzt gelieferten) Wert enthält. Und wenn ich Daten speichern möchte, schreibe ich die gerade aktuellen Daten aus dem Buffer in eine Datei. So erhalte ich in meiner Datei immer Zeilen mit gleich vielen Werten - und eben die gerade aktuellen…


RE: CAN MultipleRead Size Notification - Slev1n - 09.03.2015 14:50

Hey,

tut mir leid, dass ich nur Bilder schicke, aber die Firma für die ich das Programm schreibe möchte nicht, dass ich das ganze VI poste.

Ich poste aber mal ein Bild zur Auswertung, die ist ja sowieso mangelhaft Smile

[attachment=52392]

Die For Schleife wird so oft ausgeführt, wie es Nachrichten IDs gibt, da das Array so viele Cluster enthält, da pro ID ein Cluster mit den konvertierten Daten und dem dazugehörigen Kanalnamen erstellt wird.(siehe obere Bilder)
In der Case Schleife werden im "Case 0" die Kanalnamen in die erste Spalte geschrieben im "Case 1" werden dann die Werte-Arrays hinzugefügt.
Ich persönlich empfinde das ganze als ein wenig kompliziert gestaltet, bin mir sicher ihr habt ne elegantere Lösung.

Gruß

Slev1n


RE: CAN MultipleRead Size Notification - GerdW - 09.03.2015 15:01

Hallo slevin,

Zitat:bin mir sicher ihr habt ne elegantere Lösung.
Zumindest schon mal für das Reshapen deines Arrays:
[attachment=52393]

Zitat:aber die Firma für die ich das Programm schreibe möchte nicht, dass ich das ganze VI poste.
Niemand verlangt das Posten des kompletten VIs mit allen Logos/Labels/whatever.
Was aber immer möglich sein sollte: ein Test-VI (möglichst mit sinnvoll bedateten Eingangswerten) erstellen, welches die entscheidende Routine enthält und das Problem illustriert. Und wenn man dann noch das gewünschte Ergebnis in einem Indicator bereitstellt, lässt sich eine Lösung vorbereiten.
Aber immer nur Bilder von VIs, deren subVIs wir nicht kennen, sind auf Dauer frustrierend…


RE: CAN MultipleRead Size Notification - Slev1n - 09.03.2015 16:41

So jetzt darfst du dich austoben Big Grin

[attachment=52396]
[attachment=52397]
[attachment=52398]


RE: CAN MultipleRead Size Notification - GerdW - 09.03.2015 16:51

Hallo slevin,

es fehlen diverse subVIs aus einer API.llb, die in deiner user.lib liegt! Es fehlen außerdem passende Eingangsdaten!

Kannst du mal den Kern deines "CAN_READ_Test" mit passenden Eingangsdaten bereitstellen?
[attachment=52399]


RE: CAN MultipleRead Size Notification - Holy - 09.03.2015 21:54

Ich denke der einfachste Ansatz wäre ein kleiner Puffer für die empfangenen Nachrichten. Dieser hätte die Funktionalität erst dann Werte weiterzugeben wenn alle 8 Nachrichten da sind und alle zusätzlichen für die nächste Runde zu speichern.


RE: CAN MultipleRead Size Notification - Slev1n - 10.03.2015 10:45

@ Gerd:
Also die Api.llb kann ich gerne raufladen. Das passende Signal wüsst ich spontan nicht wie ich simulieren soll, aber das größere Problem wäre, dass du auch die dbc file zum konvertieren brauchst.
Also wenn du ohne die dbc-file auskommst würde ich dir zufällige can daten frames basteln.
Aber das grundsätzliche Problem würde gelöst werden, wenn ich entweder immer eine Frameanzahl in das Konvertierungs-Vi schicke oder mir einer erklärt wie ich 2D-Arrays nebeneinander in eine Excell-File schreibe ohne sie davor in ein einzelnes 2D-Array zusammenzupacken.

@Holy:
Bewusst habe ich noch nicht mit Buffer gearbeitet, wenn du mir erklärst wie ich es schaffe diesen immer abzuarbeiten, wenn er ein Vielfaches von 8 Frames beinhaltet, wäre ich dir sehr dankbar. Wenn er immer nur 8 abarbeitet, läuft er glaube ich nach der Zeit über.

Gruß
Slev1n

[attachment=52412]

Edit: Habe dir nun 3 Daten Frames simuliert mit zugehöriger ID. Je nach Zufall werden 3 oder 2 Frames "gelesen".
[attachment=52415]