CAN-Nachrichten-ID

OP (Firma: Claude Manning) #7582414
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?

#7582467
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

#7582822
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren