Forum: Compiler & IDEs CAN-BUS Adressierung / Identifier / Fragen


von Daniel Specht (Gast)


Lesenswert?

Hallo,

wie kann man über den CAN-Bus eine Adressierung realisieren. WEnn ich es 
richtig verstanden habe, tragen alle Nachrichten eindeutige Identifier.
Diese Identifier regeln auch automatisch die Priorität der Nachricht (je 
kleiner die numerische ID, desto höher die Priorität).

Angenommen ich habe ein Touchscreen, welches Eingabedaten für 
verschiedene Geräte liefern kann, wie könnte ich denn sicherstellen, 
dass eine Nachricht die für Gerät A gedacht ist, nicht von Gerät B 
misinterpretiert wird.
Soweit ich gelesen habe, hat man im CAN-Netz keine Adressen, sondern der 
Verkehr wird über die Identifier geregelt. Jeder hört alle Nachrichten 
mit und kann anhand der Identifier relevante Nachrichten an höhere 
Schichten weiterleiten.

1) Wer legt denn die Identifier fest?
2) Kann es passieren, dass zwei Nachrichten den gleichen Identifier 
tragen?
3) Ist der Identifier unique für jede Nachricht oder beschreibt es eher 
einen Nachrichten-Typ? Ich würde letzteres vermuten.
4) Wer schickt die ACK-Nachrichten? Nur die Knoten, die an den 
Nachrichten interessiert waren oder alle Knoten, die generell eine 
nicht-fehlerhafte Nachricht erhalten.

Weiterhin vermute ich, dass eine richtige Adressierung auf höhere 
Schicht erfolgen muss? Also jeder Knoten bekommt eine eindeutige 
Adresse. Ein Frame könnte eine Sender und Empfängeradresse tragen...Gibt 
es da schon CAN-Protokolle für?

Haben eigentlich CAN-Geräte üblicherweise eine Nachrichten-Buffer? Was 
passiert, wenn ein CAn-Gerät zu viele Anfragen bekommt und mit dem 
Verarbeiten der Nachrichten/ Antworten nicht hinterher kommt?

von Rolf M. (rmagnus)


Lesenswert?

Daniel Specht schrieb:
> WEnn ich es richtig verstanden habe, tragen alle Nachrichten eindeutige
> Identifier.

Ja.

> Diese Identifier regeln auch automatisch die Priorität der Nachricht (je
> kleiner die numerische ID, desto höher die Priorität).

Ja.

> Angenommen ich habe ein Touchscreen, welches Eingabedaten für
> verschiedene Geräte liefern kann, wie könnte ich denn sicherstellen,
> dass eine Nachricht die für Gerät A gedacht ist, nicht von Gerät B
> misinterpretiert wird.

Die ID dient nicht dazu, Quelle und Ziel zu definieren, sondern den 
Inhalt. So kann z.B. die CAN-ID 0x123 die Temperatur enthalten, die ID 
0x321 den Status aller Tasten eines Nummernblocks. Von dem Inhalt hängt 
natürlich ab, wer sie dann tatsächlich sendet, also beim Tastenstatus 
eine Tastatur, bei der Temperatur eben der Temperatursensor. Ziel ist, 
wer immer sich für den Inhalt der Botschaft interessiert. Das ist dem 
Absender aber wurscht. Es wird quasi immer ein Broadcast gemacht.

> Soweit ich gelesen habe, hat man im CAN-Netz keine Adressen, sondern der
> Verkehr wird über die Identifier geregelt. Jeder hört alle Nachrichten
> mit und kann anhand der Identifier relevante Nachrichten an höhere
> Schichten weiterleiten.

Ja.

> 1) Wer legt denn die Identifier fest?

Du.

> 2) Kann es passieren, dass zwei Nachrichten den gleichen Identifier
> tragen?

Was meinst du mit "zwei Nachrichten"? Du kannst natürlich eine Nachricht 
mit einer bestimmten ID beliebig oft schicken, aber wenn du Werte mit 
unterschiedlichen Bedeutungen hast, sollten die Botschaften auch 
unterschiedliche IDs haben.

> 3) Ist der Identifier unique für jede Nachricht oder beschreibt es eher
> einen Nachrichten-Typ? Ich würde letzteres vermuten.

Ja.

> 4) Wer schickt die ACK-Nachrichten? Nur die Knoten, die an den
> Nachrichten interessiert waren oder alle Knoten, die generell eine
> nicht-fehlerhafte Nachricht erhalten.

Kommt drauf an, wie du "interessiert" definierst. Der CAN-Controller 
schickt das ACK automatisch. Du kannst also nicht bei einer Botschaft 
sagen, daß du da kein ACK drauf schickst. Die CAN-Controller haben aber 
meistens Message-Filter eingebaut, die dafür sorgen, daß gar nicht alles 
Botschaften weitergereicht werden. Auf die rausgefilterten erfolgt 
meines Wissens kein ACK.

> Weiterhin vermute ich, dass eine richtige Adressierung auf höhere
> Schicht erfolgen muss?

Eine Adressierung sollte im Normalbetrieb nicht nötig sein, sonst ist 
CAN eher der falsche Bus.

> Also jeder Knoten bekommt eine eindeutige Adresse. Ein Frame könnte eine
> Sender und Empfängeradresse tragen...Gibt es da schon CAN-Protokolle für?

Es gibt Transportprotokolle für sowas. Damit könntest du sogar 
IP-over-CAN machen. Aber wenn du das für die reguläre Kommunikation 
brauchst, ist das irgendwie eine Zweckentfremdung des CAN.

> Haben eigentlich CAN-Geräte üblicherweise eine Nachrichten-Buffer?

Das kann ganz unterschiedlich sein. Manche Controller haben "Mailboxen", 
also für jede ID, die empfangen werden soll, einen Puffer, so daß der 
jeweils aktuelle Wert für den Inhalt jeder Botschaft gespeichert ist. 
Andere haben einen kleinen Zwischenpuffer für ein paar Nachrichten. Um 
die ID-Aufteilung muß man sich dann selber kümmern.

> Was passiert, wenn ein CAn-Gerät zu viele Anfragen bekommt und mit dem
> Verarbeiten der Nachrichten/ Antworten nicht hinterher kommt?

Dann gehen sie eben verloren.

von Dieter M. (Gast)


Lesenswert?

zu 4.) jedes Gerät, dass eine Nachricht empfängt, setzt das Akn-Bit. 
Egal ob der Frame für dieses Gerät bestimmt war oder nicht. (also egal 
ob die Filter im CAN-Controller die Nachricht zum µC durchlassen oder 
nicht)

von Daniel Specht (Gast)


Lesenswert?

Vielen Dank für die Antworten.

zu 4)
Ich verstehe den Sinn des ACK-Bits net so richtig.
Wenn alle Empfänger eine ACK-Nachricht schicken, dann hilft es dem 
Sender der ursprünglichen Nachricht nur soweit, dass er davon ausgehen 
kann, dass seine verschickte Nachricht fehlerhaft war/ verloren gegangen 
ist, wenn er im Prinzip überhaupt keine ACK-Nachricht bekommen hat.
Ob eine Nachricht von einem bestimmten Knoten empfangen wurde, kann 
damit nicht festgestellt werden oder?

Zu 1) Auf welcher Schicht werden die Identifier festgelegt? Kann ich auf 
der Applikationsschicht einen Identifier beliebig legen? Kann ich den 
Identifier eine Nachricht auf der Applikationsschicht auch lesen oder 
wird dieser an die Applikationsschicht gar net weitergegeben?

von Rolf M. (rmagnus)


Lesenswert?

Daniel Specht schrieb:
> Wenn alle Empfänger eine ACK-Nachricht schicken, dann hilft es dem
> Sender der ursprünglichen Nachricht nur soweit, dass er davon ausgehen
> kann, dass seine verschickte Nachricht fehlerhaft war/ verloren gegangen
> ist, wenn er im Prinzip überhaupt keine ACK-Nachricht bekommen hat.

Genau dazu ist es ja auch da.

> Ob eine Nachricht von einem bestimmten Knoten empfangen wurde, kann
> damit nicht festgestellt werden oder?

Nein. Wie gesagt interessiert sich der Absender gar nicht dafür, wer 
genau es empfängt. Nur daß es empfangen wurde, interessiert ihn. Es gäbe 
ja nicht mal eine Möglichkeit, einen Empfangsknoten zu identifizieren, 
das es ja keine Adressen gibt.

> Zu 1) Auf welcher Schicht werden die Identifier festgelegt? Kann ich auf
> der Applikationsschicht einen Identifier beliebig legen?

Ja.

> Kann ich den Identifier eine Nachricht auf der Applikationsschicht auch
> lesen oder wird dieser an die Applikationsschicht gar net weitergegeben?

Klar. Woher sollst du sonst wissen, was du mit dem Inhalt der Botschaft 
anfangen sollst?

von rcc (Gast)


Lesenswert?

Daniel Specht schrieb:
> Ob eine Nachricht von einem bestimmten Knoten empfangen wurde, kann
> damit nicht festgestellt werden oder?

Dafür müsste man dann schon ein Protokoll aufm CAN fahren, also z.B. 
Request-Response oder sowas in der Art.

von Matthias L. (Gast)


Lesenswert?

> Ob eine Nachricht von einem bestimmten Knoten empfangen wurde, kann
> damit nicht festgestellt werden oder?

Oder du guckst Dir das Thema CANopen mal an. Dort gibt es für jeden 
Teilnehme eine (mehrere) CAN-ID.


Aber die Festlegung, das eine CAN-ID den Inhalt der Nachricht 
beschreibt, kommt ja aus dem Entwicklungsgebiet des CAN: Auto.

Du kannst diese IDs doch frei vergeben und tun was du willst auf deinem 
CAN-Bus.

von Dieter M. (Gast)


Lesenswert?

Im Auto werden die CAN-Botschaften übrigens meist periodisch wiederholt. 
Je nachdem alle 5ms bis alle 10s.

von Michael K. (Gast)


Lesenswert?

Dieter M. schrieb:
> zu 4.) jedes Gerät, dass eine Nachricht empfängt, setzt das Akn-Bit.
> Egal ob der Frame für dieses Gerät bestimmt war oder nicht. (also egal
> ob die Filter im CAN-Controller die Nachricht zum µC durchlassen oder
> nicht)
Wobei manche einen stillen Modus unterstützen, in dem sie wirklich nur 
lauschen und nichts (auch kein ACK) auf den Bus legen. Empfangen haben 
sie die Nachricht dann trotzdem. Aber mindestens ein Teilnehmer im Bus 
muss das ACK setzen, sonst wird die Nachricht wiederholt (je nach 
Einstellung).

von Daniel Specht (Gast)


Lesenswert?

Rolf Magnus schrieb:
>> Haben eigentlich CAN-Geräte üblicherweise eine Nachrichten-Buffer?
>
> Das kann ganz unterschiedlich sein. Manche Controller haben "Mailboxen",
> also für jede ID, die empfangen werden soll, einen Puffer, so daß der
> jeweils aktuelle Wert für den Inhalt jeder Botschaft gespeichert ist.
> Andere haben einen kleinen Zwischenpuffer für ein paar Nachrichten. Um
> die ID-Aufteilung muß man sich dann selber kümmern.
>
>> Was passiert, wenn ein CAn-Gerät zu viele Anfragen bekommt und mit dem
>> Verarbeiten der Nachrichten/ Antworten nicht hinterher kommt?
>
> Dann gehen sie eben verloren.

Gibt es eigentlich eine Möglichkeit um den Zugriff auf ein bestimmtes 
Steuergerät zu regeln?
Angenommen ich hab Steuergerät A,B,C,D.
B,C,D wollen ständig irgendwelche Information und broadcasten 
Requestnachrichten, die nur A beantworten kann. A kann aber zeitgleich 
nicht mehrere Anfragen beantworten...gibts eine Möglichkeit damit A 
nicht überflutet wird? Meine erste Idee wäre, A hat einen großen Buffer 
und speichert die ganzen Requests, so wie sie eintreffen und beantwortet 
sie eins nach dem anderen. Eine andere Idee wäre eine 
verbindungsorientierte Kommunikation. B,C,D müssen erst eine Session mit 
A aufbauen, damit sie Daten austauschen können. Nur wenn eine Verbindung 
ausgehandelt wurde, erfolgt der eigentlich Datenaustausch. Die 
restlichen Steuergeräte warten solange, bis der Kanal frei wird und 
versuchen wieder eine Verbindung aufzubauen. Gibts im CAN-Bus 
irgendwelche Mechanismen hierzu?

von Alain S. (alain_s)


Lesenswert?

Daniel Specht schrieb:
> Gibts im CAN-Bus
> irgendwelche Mechanismen hierzu?

Nein. Du hast immer noch nicht verstanden was ein CAN-Bus ist, wie er 
funktioniert und wozu man ihn braucht.
Vielleicht ist CAN nicht das richtige für dich.

von Rolf Magnus (Gast)


Lesenswert?

Daniel Specht schrieb:
> Gibt es eigentlich eine Möglichkeit um den Zugriff auf ein bestimmtes
> Steuergerät zu regeln?

CAN selbst bietet dazu keine Möglichkeit.

> Angenommen ich hab Steuergerät A,B,C,D.
> B,C,D wollen ständig irgendwelche Information und broadcasten
> Requestnachrichten, die nur A beantworten kann.

Normalerweise wird das so umgesetzt, daß A seine Daten einfach 
regelmäßig sendet oder immer dann wenn sie sich ändern. Im Auto würde 
dann z.B. das Steuergerät, an dem der Außentemperatursensor hängt, 
einfach einmal pro Sekunde die Temperatur-Botschaft senden. Angefragt 
werden muß da nichts.

> Eine andere Idee wäre eine verbindungsorientierte Kommunikation. B,C,D
> müssen erst eine Session mit A aufbauen, damit sie Daten austauschen
> können. Nur wenn eine Verbindung ausgehandelt wurde, erfolgt der
> eigentlich Datenaustausch.

Im Fahzeug gibt es z.B. für das Flashen von Steuergeräten Protokolle wie 
ISO_15765-2. Aber das gibt es nur für solche Sonderfunktionen. Im 
Regelbetrieb wird das nicht genutzt.

> Die restlichen Steuergeräte warten solange, bis der Kanal frei wird und
> versuchen wieder eine Verbindung aufzubauen. Gibts im CAN-Bus
> irgendwelche Mechanismen hierzu?

Nein. Du versuchst hier offenbar, CAN für etwas anzuwenden, wofür es nie 
gedacht war.

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

Ja, sowas gibt es z.B. in J1939 oder umfassender im darauf aufbauenden 
ISO 11783. CAN war zwar nicht für sowas gedacht aber es wird trotzdem 
gemacht und funktioniert. Genauso wie Ethernet nicht für 
Maschinensteuerungen gedacht war. Es wird trotzdem dafür verwendet.

Matthias

von Andy (Gast)


Lesenswert?

Nochmal zum ACK. Der 0-Pegel ist Dominant. Was bedeutet, wenn ein 
Empfänger kein ACK gibt, dass auch kein ACK im Frame existiert.

von Christopher (Gast)


Lesenswert?

Hi,
da wir hier im Mikrocontroller-Forum sind, solltest du deine 
"Appliktionsschicht" mal beschreiben. Oft ist das der direkte Zugriff 
auf die Register des CAN-Controllers im Mikrocontroller (oder per 
SPI-angebunden, oder oder oder). Wenn du wirklich Angst hast, dass deine 
Kommunikation zu schnell für einen Teilnehmer ist und dieser nicht in 
der Lage ist alle Nachrichten abzuarbeiten, dann musst du selbst einen 
Zwischenspeicher im RAM anlegen. Beispielsweise auf neue Nachrichten per 
Interrupt reagieren, die Daten dann schnell aus den Registern des 
CAN-Controllers in den Ram kopieren (z.B. ein Ringspeicher) und dann 
diesen "langsam" abarbeiten.

Da der CAN mit seinen maximal 1MBit/s aber zur Zeit nicht soo schnell 
ist (CAN FD ist noch nicht so verbreitet) und dann auch noch der 
Großteil der Daten weggeschmissen wird, sollte eine overload so schnell 
auch nicht auftreten.

Achja, wenn du inhaltlich nur PUnkt-zu-Punkt Verbindungen hast, dann 
kannst du für dich ja die CAN-ID als Zieladresse deuten, falls du damit 
besser zurecht kommst. Auch könntest du durch eine Aufteilung des 
Identifiers eine Art Quelle und Ziel definieren. Ein Teilnehmer liest 
dann alle Nachrichten die ein bestimmtes Muster in der Adresse haben. 
Das ist dann glaube ich, so wie CANopen (weiter oben bereits von jmd. 
erwähnt).

von Bronco (Gast)


Lesenswert?

Zum ACK:
Es geht für den einzelnen Knoten nur um die Information "Hänge ich 
(noch) am Bus" bzw. "Ist irgendjemand da, der mich empfängt".
Wenn er eine Message sendet und irgendjemand schickt ein ACK, dann gibt 
es zumindest noch einen anderen Teilnehmer, der erreichbar ist, und um 
mehr geht es auch gar nicht.
Da der CAN nicht für Sender-Empfänger-Kommunikation gedacht ist, bekommt 
man kein ACK von einem bestimmten Empfänger, sondern quasi "vom Bus".

Der Sinn davon ist es, dass bei ausbleibendem ACK der Knoten aufhört, 
aktiv auf den BUS einzuwirken. Damit soll vermieden werden, dass ein 
einzelner Knoten, der irgendein Problem hat, den ganzen Bus blockieren 
kann.
Es geht also nicht darum, dass Knoten A sicher gehen kann, dass seine 
Messages richtig ankommen, sondern dass der Bus vor marodierenden Knoten 
geschützt wird.

von Steffen R. (steffen_rose)


Lesenswert?

Hat ein Knoten (in Error Active) die Nachricht falsch verstanden, ist er 
nicht still, sondern sendet ein Error Frame.

von Markus D. (mowlwurf)


Lesenswert?

Hier gibts eine gute Einführung zum Thema CAN und auch CAN FD:

https://elearning.vector.com/vl_can_introduction_de.html

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.