LabVIEWForum.de
CAN Signal/Protokoll bearbeiten - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: CAN Signal/Protokoll bearbeiten (/Thread-CAN-Signal-Protokoll-bearbeiten)

Seiten: 1 2


CAN Signal/Protokoll bearbeiten - Prince Amir - 14.11.2009 10:06

Hallo an alle,

ich bin ein anfänger in sachen CAN und benutze für eine Messung ein CAN Modul (USB TO CAN) von der firma IXXAT. Die LabVIEW anbindung mit der mitglieferten Treiber und VIs. gehts so weit.
bis jetzt kann ich mit der CAN Schnittstelle kommunizieren. (Transmit und Receive). Ich kann mit der Melduns ID und Daten die datenausstausch realisieren. soweit gut.

Mein problem ist, wie kann ich die bekommene Daten in LabVIEW weiterarbeiten. ggf. von Medlungs ID und Daten ( max. 8 Bytes ) auf die Bedeutung von Signal kommen. Ich hab das CAN Protokoll zu der schnittstelle auch. Mein problem ist die LabVIEW darstellung. (bzw. die umwandlung von CAN Protok. zur Dez und separien von Signals.)

kann bitte mir jemand helfen?

ich erkläre ein Bespiel: Generator Leistung will ich in zahlen darstellen. Ich bekomme das per CAN. wie erfolgt diese umwandlung in dez. zahlen.? oder generell einfach jede signal so darstellen das man die bedeutung von signal versteht. (enspricht die umwandlung von CAN Protokoll zur Dez.). Ich will einfach für jedes signal ein Anzeige Element auf dem Frontpanel haben..

entschuldigt mich für schlechte Deutsch.

viele Grüße,
Amir.


CAN Signal/Protokoll bearbeiten - Y-P - 14.11.2009 10:09

Kannst Du ein Bsp. mit dem Datentyp und einem Wert machen. Dann ist es bestimmt kein Problem, den Wert "herauszufiltern".

Gruß Markus


CAN Signal/Protokoll bearbeiten - Prince Amir - 14.11.2009 10:27

' schrieb:Kannst Du ein Bsp. mit dem Datentyp und einem Wert machen. Dann ist es bestimmt kein Problem, den Wert "herauszufiltern".

Gruß Markus

ich schicke hier einfach ein Scrennshot von der DATA Protokoll 5300 für CAN Schnittstelle (was ich eigentlich habe.)
die Werte für Generator Gesamtleistung sind wie folgt( das ist nicht auf dem Screenshot):

Modicon start addr. Start addr. (*1) Databyte 0 (Mux) Databyte Parameter ID Description Multiplier Units

450053 450052 17 3,4,5,6 135 Total gen. power 1 W

aber generell kannst du mir auch sagen, wie ich von auf ganz normalen Dez. werte kommen kann? gibts ein VI dazu?

Grüße,
Amir


CAN Signal/Protokoll bearbeiten - IchSelbst - 14.11.2009 11:48

Hinweis zu CAN:
Ein "CAN-Datensatz" beinhaltet (normalerweise) 8Byte Daten = 64 Bit. Diese 64Bit können ansich beliebig auf Daten verteilt werden. Diese beliebige Verteilung ist aber sehr kompliziert in der Verarbeitung. Man kann z.B. sagen: B3 bis B12 stellen einen Wert dar (z.B. einen Zähler). Wenn du den jetzt als einzelne Variable haben willst musst du also das 64Bit-Wort um 3 Bit nach links schieben und dann mit 0x3FF (10 Bit) verunden (Vergleiche Bild 3).

In deinem Falle könnte es erheblich einfacher werden, wenn alle Werte nämlich an 8Bit-Grenzen beginnen. Guckst du die Tabelle ByteData. Hier liegen immer 16- oder 32-Bit-Werte von.

Der von dir gewünschte Wert beginnt also beim vierten Byte (Indxe 3) und umfasst 4 Byte. Versuch mal folgendes: Mach von dem 8 Byte langen 1DArr of U8 ein Teilarray beginnend bei Index 3 mit der Länge 4. Dieses nun 4 Byte lange 1DArr of U8 gibt du auf einen harten Typcast, dessen Typeingang du auf U32 stellst. Herauskommt dann eine U32-Zahl die deinem Wert entsprechen sollte.
AUßerdem musst du beachten, dass du die Message verwendest, bei der MUX=17 ist. Im Datenarray (1DArr of U8) muss an Index 0 also 17 stehen.

Ob es hierfür geeignete VIs bei IXXAT gibt weis ich nicht. Ich verwende die NI-CAN-Library - da geht nämlich alles automatisch.


CAN Signal/Protokoll bearbeiten - Prince Amir - 14.11.2009 13:50

' schrieb:Hinweis zu CAN:
Ein "CAN-Datensatz" beinhaltet (normalerweise) 8Byte Daten = 64 Bit. Diese 64Bit können ansich beliebig auf Daten verteilt werden. Diese beliebige Verteilung ist aber sehr kompliziert in der Verarbeitung. Man kann z.B. sagen: B3 bis B12 stellen einen Wert dar (z.B. einen Zähler). Wenn du den jetzt als einzelne Variable haben willst musst du also das 64Bit-Wort um 3 Bit nach links schieben und dann mit 0x3FF (10 Bit) verunden (Vergleiche Bild 3).

In deinem Falle könnte es erheblich einfacher werden, wenn alle Werte nämlich an 8Bit-Grenzen beginnen. Guckst du die Tabelle ByteData. Hier liegen immer 16- oder 32-Bit-Werte von.

Der von dir gewünschte Wert beginnt also beim vierten Byte (Indxe 3) und umfasst 4 Byte. Versuch mal folgendes: Mach von dem 8 Byte langen 1DArr of U8 ein Teilarray beginnend bei Index 3 mit der Länge 4. Dieses nun 4 Byte lange 1DArr of U8 gibt du auf einen harten Typcast, dessen Typeingang du auf U32 stellst. Herauskommt dann eine U32-Zahl die deinem Wert entsprechen sollte.
AUßerdem musst du beachten, dass du die Message verwendest, bei der MUX=17 ist. Im Datenarray (1DArr of U8) muss an Index 0 also 17 stehen.

Ob es hierfür geeignete VIs bei IXXAT gibt weis ich nicht. Ich verwende die NI-CAN-Library - da geht nämlich alles automatisch.

vielen Dank für die Antwort IchSelbst,

aber leider muss ich sagen, dass ich nicht so viel verstanen habe (hab leider nicht so viel Erfahrung mit CAN) , wie der Ansatz geht. has du dazu ein Bsp. oder VI was ich mir anschauen kann?

Grüße,


CAN Signal/Protokoll bearbeiten - IchSelbst - 14.11.2009 15:17

' schrieb:has du dazu ein Bsp. oder VI was ich mir anschauen kann?
Noch nicht.

Aber ich wollte ja sowieso noch was sagen zu dem Blockdiagramm, das du im ersten Beitrag gepostet hast.

Nachdem die obere While-Schleife beendet ist, setzt du über eine lokale Variable das Element STOP auf false. (Nebenbei bemerkt: Die Methode, hierzu das invertierte Signal aus der While-Schleife zu verwenden, ist sehr interessant.)

Nur:
Das False-Setzen hat einen erheblichen Nachteil. Möglicherweise wird nämlich die untere While-Schleife nicht mehr beendet (es sei denn man drückt zweimal auf Stopp). Es kann nämlich theoretisch sein, dass die lokale Variable auf false gesetzt wird, noch bevor die zweite While-Schleife erkannt hat, dass die Variable auf true steht. Das liegt daran, weil die beiden Schleifen eben parallel abgearbeitet werden, und man nicht sagen kann, was zuerst verarbeitet wird.
Eine mögliche Lösung: Statt der lokalen Variablen das Property Value verwenden. Dieses dann mit dem allerletzten ERROR OUT sequenzieren.

So, ich kuck ich mal nach einem Muster für "Wert aus Array lesen".


CAN Signal/Protokoll bearbeiten - IchSelbst - 14.11.2009 17:16

So kann man die gewünschten Werte aus dem Datenarray herausholen. Beachte, dass die Daten als Little Endian (siehe das eine Bild "Reihenfolge low Byte/high Byte) vorliegen. Und ein Bild zum Ankucken.

Lv85_img


CAN Signal/Protokoll bearbeiten - thomas.sandrisser - 14.11.2009 19:27

du koenntest nutzen von der CAN conversion library ziehen (beispiele kommen mit)
http://joule.ni.com/nidu/cds/view/p/id/884/lang/en


CAN Signal/Protokoll bearbeiten - schrotti - 14.11.2009 20:09

' schrieb:du koenntest nutzen von der CAN conversion library ziehen

Gibts eigentlich zwischen der 1.0.2 und der 1.0.3 einen Unterschied?


CAN Signal/Protokoll bearbeiten - Prince Amir - 15.11.2009 13:46

' schrieb:So kann man die gewünschten Werte aus dem Datenarray herausholen. Beachte, dass die Daten als Little Endian (siehe das eine Bild "Reihenfolge low Byte/high Byte) vorliegen. Und ein Bild zum Ankucken.

Lv85_img

vielen Dank IchSelbst für deine Mühe.

ich hätte paar Fragen zum Bild. Auf der Linken Seite hat Datenbyte 1 den Wert FF und Datenbyte 2 den Wert 03. wieso sind die nicht auf der Rechten Seite wider beim "Daten 1,2" Kasten zu sehen ? oder habe ich gerad ein Denkfehler oder ist das einfach ein Bsp ?

Soweit dann gut, aber gibts noch ein Schritt damit ich auf das Dez. Wert komme? Richtig verstanden ? Z.B. von diesem Daten auf reales Wert von Temperatur (bsp) oder Generator Leistung wie in meinem Bsp.

Grüße