Forum: PC-Programmierung CAN-Nachrichten-ID


von Claude M. (Firma: Claude Manning) (enjei)


Lesenswert?

Hallo zusammen

ich habe ein MCP 2551 Board gekauft, um es mit meinem PIC18F45K80 zu 
verwenden. Ich möchte eine LED, die mit dem MCP-Board verbunden ist, 
über das CAN-Protokoll steuern.

Eine CAN-Nachricht hat verschiedene Felder in einer Nachricht wie Start 
of Frame, Identifier, Control Field, Data Field, CRC, Acknowledgment und 
End of Frame.

Jeder Knoten hat einen eindeutigen Identifikator, und ein Knoten weiß, 
ob eine Nachricht für ihn bestimmt ist, indem er die Nachrichten-ID 
überprüft. Ich bin mir bei der Nachrichten-ID für meinen Fall nicht 
sicher. Was wäre die Nachrichten-ID für meinen Fall und wer entscheidet 
darüber?

von Thomas V. (thomas_v70)


Lesenswert?

Im Endeffekt derjenige der die Messages verwaltet.
Bist du alleine der Verwalter, kannst Du nehmen was Du möchtest.

Vielleicht mal etwas über Arbitrierung auf den CAN Informieren.
https://kfz-aufgaben.de/can/Arbitrierung.455.0.html

von Volker Z. (vzavza)


Lesenswert?

Wenn du nicht selber die Nachrichten-ID verwaltest (Sender und 
Empfänger) dann wahrscheinlich ein höheres Protokoll.
zB. CANopen oder J1939 um mal nur zwei zu nennen.
Dann hast du keine oder nur sehr eingeschränkte Wahlmöglichkeiten.

: Bearbeitet durch User
von René K. (king)


Lesenswert?

Das wurde Dir doch bereits ausführlich erklärt:
https://www.eevblog.com/forum/microcontrollers/can-message-id/

von Sebastian W. (wangnick)


Lesenswert?

Claude M. schrieb:
> Ich möchte eine LED, die mit dem MCP-Board verbunden ist, über das
> CAN-Protokoll steuern.

An das MCP-Board kannst du keine LED anschließen. Da ist nur der 
Transceiver drauf. An dieses Board musst du noch ein Controller-Board 
anschließen, nicht nur für die LED, sondern auch für die Implementierung 
der CAN-Logik. Der Transceiver macht nämlich nur die Umsetzung von 
analoger Busspannung auf digitale Spannungswerte.

Claude M. schrieb:
> Eine CAN-Nachricht hat verschiedene Felder in einer Nachricht wie Start
> of Frame, Identifier, Control Field, Data Field, CRC, Acknowledgment und
> End of Frame.

Ja ...

Claude M. schrieb:
> Jeder Knoten hat einen eindeutigen Identifikator

Nein. Oder vielmehr: Der pure CAN Standard kennt und beschreibt ein 
solches Konzept nicht. Du kannst jedem deiner Knoten einen solchen 
Identifikator irgendwie zuweisen. CAN macht da gar nichts.

Claude M. schrieb:
> und ein Knoten weiß, ob eine Nachricht für ihn bestimmt ist, indem er
> die Nachrichten-ID überprüft

Die meisten Implementierungen des CAN-Protokolls, ob in Hardware oder 
Software, erlauben es, Filter zu definieren, so dass die Anwendung nur 
Nachrichten bekommt die diese Filter passieren. Vielfach operieren diese 
Filter auf dem Identifier-Teil der CAN-Frames.

Du kannst also den Identifier dazu nutzen, eine Empfängeradresse zu 
kodieren. Das ist aber völlig dir überlassen. Es sei denn natürlich, du 
möchtest mit den optionalen höheren Protokollschichten wie CANopen 
kompatibel bleiben.

Dieses Vorgehen hätte allerdings den Nachteil, dass zwei Sendungen an 
denselben Empfänger denselben Identifier hätten, und dann wird die 
Arbitrierungslogik von CAN scheitern.

Alternativ könnte der Sender in der ID auch die Art und Quelle der 
Nachricht kodieren. Und der Empfänger würde die für ihn interessanten 
Quellen und Arten filtern. Es ist dir überlassen.

LG, Sebastian

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

Sebastian W. schrieb:
> Claude M. schrieb:
>> Eine CAN-Nachricht hat verschiedene Felder in einer Nachricht wie Start
>> of Frame, Identifier, Control Field, Data Field, CRC, Acknowledgment und
>> End of Frame.
>
> Ja ...

Allerdings spielen diese bei der Nutzung eigentlich keine Rolle. Um die 
kümmert sich der CAN-Controller.

> Claude M. schrieb:
>> Jeder Knoten hat einen eindeutigen Identifikator
>
> Nein. Oder vielmehr: Der pure CAN Standard kennt und beschreibt ein
> solches Konzept nicht. Du kannst jedem deiner Knoten einen solchen
> Identifikator irgendwie zuweisen. CAN macht da gar nichts.

Eigentlich ist die ID auch eher dafür gedacht, den Inhalt zu 
kennzeichnen. Das heißt, es wird für jede ID definiert, welche Werte 
damit übertragen werden und in welchem Format. Wer die Botschaft sendet, 
ergibt sich daraus eher indirekt (Die Außentemperatur wird natürlich vom 
Außentemperatursensor gesendet), und empfangen tut sich jeder, der sich 
für einen der enthaltenen Werte interessiert.

> Dieses Vorgehen hätte allerdings den Nachteil, dass zwei Sendungen an
> denselben Empfänger denselben Identifier hätten, und dann wird die
> Arbitrierungslogik von CAN scheitern.

Es hat auch den Nachteil, dass der empfangende Knoten entweder nur 
insgesamt 8 Bytes an möglichen Daten empfangen kann oder man die festes 
Zuordnung zwischen ID und Format der Daten über Bord werfen muss. In 
letzterem Fall muss man dann noch ein Transportprotokoll wie z.B. ISO 
15765-2 auf die CAN-Kommunikation oben drauf setzen.

> Alternativ könnte der Sender in der ID auch die Art und Quelle der
> Nachricht kodieren. Und der Empfänger würde die für ihn interessanten
> Quellen und Arten filtern. Es ist dir überlassen.

Das ist in der Regel der bessere Weg.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.