LabVIEWForum.de - CANopen Daten erfassen

LabVIEWForum.de

Normale Version: CANopen Daten erfassen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo Leute,

ich erfassen CANopen-Daten mittels einer NI-USB 8502 CAN Schnittstelle. Da LabVIEW CANopen ja nur auf RT Systemen unterstützt musste ich etwas improvisieren, das Ergebnis ist angehangen.

Ohne mich jetzt in Details zu verlieren das Problem aus LabVIEW-Sicht:

Ich bekomme einen Array mit Clustern gleicher CAN-ID aus der ich die acht Datenbytes filtere, in den ersten vier Bytes steht quasi die Adresse der Variablen in welche die vier nachfolgenden Bytes geschrieben werden müssen.

Ich habe es so gelöst, dass die ersten vier Bytes verglichen werden und wenn diese zu einer Variablen passen wird ein "true" ausgelöst und ein "case" gibt die Variable darauf hin zum Beschreiben frei. Das funktioniert auch einwandfrei, aber wenn ich jetzt mit der Variablen weiter rechnen will, bleibt mir nichts anders übrig mit lokalen Variablen zu arbeiten, da ich ja aus dem "case" auch wieder rauskommen will.

Kennt jemand eine bessere Lösung ohne lokale Variablen bemühen zu müssen?

Gruß Titus
Hallo Titus,

Zitat:Ich bekomme einen Array mit Clustern gleicher CAN-ID aus der ich die acht Datenbytes filtere, in den ersten vier Bytes steht quasi die Adresse der Variablen in welche die vier nachfolgenden Bytes geschrieben werden müssen.
Das ist im CANopen-Protokoll so implementiert, zumindest für SDOs…

Zitat:Ich habe es so gelöst, dass die ersten vier Bytes verglichen werden und wenn diese zu einer Variablen passen wird ein "true" ausgelöst und ein "case" gibt die Variable darauf hin zum Beschreiben frei. Das funktioniert auch einwandfrei, aber wenn ich jetzt mit der Variablen weiter rechnen will, bleibt mir nichts anders übrig mit lokalen Variablen zu arbeiten, da ich ja aus dem "case" auch wieder rauskommen will.
Kennt jemand eine bessere Lösung ohne lokale Variablen bemühen zu müssen?
Eine solche Lösung gibt es immer!
Wieviele "Variablen" willst du überhaupt verarbeiten? Willst du wirklich für jede "Variable" eine neue lokale Variable anlegen???

Hast du schon mal eine FGV bemüht? Diese könnte deine "Variablen" verwalten…
Du könntest eine LUT verwenden, um deine "Variablen" zu speichern und auf ihre Werte zuzugreifen…
Wenn es dir bei deiner Frage nur um den DATAFLOW geht, könntest du auch mit TagChannels/Notifier/globalen Variablen arbeiten…

Wenn du mit LabVIEW programmierst, solltest du den Begriff "Variable" nur sehr sparsam verwenden. Es geht immer um Daten und wie man Daten weiterleitet (THINK DATAFLOW!)…

Edit: Vorschlag zum Aufbau einer LUT
[attachment=61795]
Es wird jeweils die aktuellste SDO-Message (pro LUT-Eintrag) im Array im Schieberegister gespeichert…
(Der Check auf das gültige Cmd ist etwas "komisch", außer du erwartest garantiert immer 4 Datenbytes in der Message. Eigentlich verwendet man das, um die Anzahl der gültigen Datenbytes in der SDO-Message zu bestimmen.)
Hallo Gerd,

erst einmal vielen Dank für Deine Tipps und Hinweise, ich habe mich gestern abend nochmal rangemacht und das angehangene VI, auf Basis der FGV, geschrieben. Wie ich die Daten (:-)) dann zusammenfasse und weiter verarbeite werde ich später entscheiden. Aber das eigentliche Problem wurde so schon einmal behoben.

Zum Rest:

Es wird eine definierene Anzahl an SDOs angefragt, so weiß ich was ich was kommen wird, ich musste es nur noch sicher "einfangen", die eigentliche Steuerung erfolgt dann über die PDOs.

Gruß Titus
Referenz-URLs