Forum: Mikrocontroller und Digitale Elektronik CAN Bus Arbitration


von Bert S. (kautschuck)


Lesenswert?

Hi,

Ich habe momentan irgendwie ein Durcheinander bei folgendem Fall. Es 
geht um einen CAN Bus mit 3 Teilnehmern A,B und M, wobei M der Master 
sein soll und Befehle an die anderen Teilnehmern schickt. A und B 
kommunizieren nur mit M und nicht untereinander.

Nun möchte ich also jedem Knoten eine Message ID zuordnen für den 
Arbitration Prozess:

M = 0x00 //Gewinnt Arbitration immer
A = 0x01
B = 0x02

Wenn nun aber M z.B an A schickt, dann muss doch die Message ID = 0x01 
sein, damit dieser die Nachricht als seine erkennt, wenn jetzt aber 
gleichzeitig A ein Feedback an M senden will, dann gibt das eine 
Kollision, da beide den Arbitration Prozess gewinnen.

Wie löst man dieses Problem?

von Sebastian W. (wangnick)


Lesenswert?

Bert S. schrieb:
> A ein Feedback an M senden

Auch mit Message ID 0x01? Dann erfolgt die Arbitrierung durch den 
restlichen Inhalt der Nachricht. Aber wenn M als Sender immer gewinnen 
soll, dann sollte jede Nachricht mit der Sender-ID beginnen, und danach 
erst die Empfänger-ID folgen, oder?

LG, Sebastian

von Bert S. (kautschuck)


Lesenswert?

Ok, ich glaube ich sehe das durcheinander, zuvor hatte ich mal CANOpen 
verwendet, dort haben die Geräte dann eine eigene Adresse, bei CAN 
alleine ist ja nur eine Message ID vorhanden, sprich empfangen und 
senden sollte auf unterschiedlichen IDs sein.

Dann wäre wohl so etwas schlau:

A hat RX ID 0x01 und TX ID 0x101
B hat RX ID 0x02 und TX ID 0x102

M sendet dann immer an 0x01 und 0x02 und empfängt auf 0x101 und 0x102, 
oder?

von Rainer W. (rawi)


Lesenswert?

Bert S. schrieb:
> M sendet dann immer an 0x01 und 0x02 und empfängt auf 0x101 und 0x102,
> oder?

M sendet nicht "an", sondern M verbreitet die Nachrichten 0x01 und 0x02. 
Wer zuhört, geht M überhaupt nichts an.
A reagiert auf 0x01 mit Message ID 0x101, B reagiert auf 0x02 mit 
Message ID 0x102.

von Bert S. (kautschuck)


Lesenswert?

Rainer W. schrieb:
> Bert S. schrieb:
>> M sendet dann immer an 0x01 und 0x02 und empfängt auf 0x101 und 0x102,
>> oder?
>
> M sendet nicht "an", sondern M verbreitet die Nachrichten 0x01 und 0x02.
> Wer zuhört, geht M überhaupt nichts an.
> A reagiert auf 0x01 mit Message ID 0x101, B reagiert auf 0x02 mit
> Message ID 0x102.

Genau, habe mich da immer noch falsch ausgedrückt.

von Ali K. (teddy50)


Lesenswert?

Reines CAN sendet immer Broadcast während CanOpen und J1939 beides 
können!

von Thomas F. (igel)


Lesenswert?

Bert S. schrieb:
> A,B und M, wobei M der Master sein soll und Befehle an die anderen Teilnehmern 
schickt.
> A und B kommunizieren nur mit M und nicht untereinander.

Bei CAN gibt es keinen offiziellen Master. Alle Knoten sind erst mal 
gleichberechtigt und alle kommunizieren miteinander.


> Nun möchte ich also jedem Knoten eine Message ID zuordnen für den
> Arbitration Prozess:

Arbitriert wird eigentlich eine Botschaft.


> Wenn nun aber M z.B an A schickt, dann muss doch die Message ID = 0x01
> sein, damit dieser die Nachricht als seine erkennt

M schickt nicht explizit an A sondern auf den Bus. Alle Knoten empfangen 
die Botschaft erst mal und senden ein ACK. Erst dann wird im 
Empfangsfilter die Botschaft ausgesondert oder an die Empfangs-Software 
weitergegeben.
Oder man gibt alle empfangenen Botschaften ohne Filter an die Software 
weiter und filtert die unerwünschten erst dort aus. So mache ich es wenn 
die Buslast nur gering ist.

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Sebastian W. schrieb:
> Dann erfolgt die Arbitrierung durch den restlichen Inhalt der Nachricht.

Nein. Arbitrierung erfolgt bei CAN nicht auf dem ganzen Frame.

von Thomas (kosmos)


Lesenswert?

Mich würden mal deine Zeitkriterien interessieren. Da A und B ja nichts 
von sich aus etwas auf den Bus senden, hat doch M alle Zeit der Welt 
Befehle abzuschicken. Und wenn mal gerade eine Antwort von A oder B 
eintrudelt, dann muss er eben die Antwort abwarten, so lange dauert es 
ja nicht.

von Sebastian W. (wangnick)


Lesenswert?

Μαtthias W. schrieb:
> Sebastian W. schrieb:
>> Dann erfolgt die Arbitrierung durch den restlichen Inhalt der Nachricht.
>
> Nein. Arbitrierung erfolgt bei CAN nicht auf dem ganzen Frame.

Du hast recht. Ich lag falsch. Bei Kollisionen im Anschluß an ID und 
RTR-Feld kommt es anscheinend zu Error-Frames, und es setzt sich nicht 
die dominantere Nachricht durch. Danke für die Korrektur!

LG, Sebastian

von Thomas F. (igel)


Lesenswert?

Sebastian W. schrieb:
> Bei Kollisionen im Anschluß an ID

Sowas sollte nie vorkommen: Gleiche CAN-IDs sollten nie von zwei Knoten 
aus gesendet werden.

Bei Verlust der Arbitrierung während der Übertragung der CAN-ID hört der 
Looser einfach auf zu Senden und versucht es zu einem späteren Zeitpunkt 
wieder. Ein Error wird dabei noch nicht gesetzt.

von Frank O. (fop)


Lesenswert?

Rainer W. schrieb:
> Wer zuhört, geht M überhaupt nichts an.

Mit nur einer klitzekleinen Ausnahme : wenn es keiner gehört hat 
(fehlendes ACK), muss der Sender das beachten und sich quasi fragen, 
woran das wohl liegt. Sprich wenn ihm das öfters passiert, muss er damit 
rechnen, dass er Stuss sendet, den niemand versteht und damit aufhören.

Ansonsten ist das richtig, jede ID darf nur von maximal einem 
Busteilnehmer gesendet werden. Was Du vielleicht meinst, sind die RETR 
Frames, mit denen das Senden eines Frames angefordert wird. Es gibt aber 
CAN-Busse, die kommen komplett ohne aus.

Einen Plan, wer was wo wie codiert wann in welcher Botschaft sendet und 
wer sich alles dafür interressiert, braucht man für Software, die 
Quellcode für die Software im Busteilnehmer generiert.

von Rolf M. (rmagnus)


Lesenswert?

Zusammengefasst:

- bei CAN gibt es eigentlich keinen Master oder Slave. Alle Teilnehmer 
sind gleichberechtigt.

- die Botschafts-ID ist keine Kennung des Absenders, sondern des 
Inhalts, also welche Daten in der Botschaft drin stecken. Woher die dann 
kommt, ist zweitrangig.

- es gibt auch kein Senden an bestimmte Teilnehmer. Alle Botschaften 
sind Broadcasts und lesen tut sie jeder, der sich dafür interessiert.

- Arbitrierung hat damit erst mal nichts zu tun. Bei dieser geht es 
darum, dass, falls zwei Knoten genau gleichzeitig eine Botschaft senden 
wollen, die mit der niedrigeren ID durchkommt, während für die andere 
später nochmal ein Versuch unternommen werden muss.

Wenn man etwas anderes als das mit CAN machen will, braucht man eine 
zusätzliche darauf aufsetzende Protokollebene, so wie es z.B. CANopen 
macht.

Frank O. schrieb:
> Einen Plan, wer was wo wie codiert wann in welcher Botschaft sendet und
> wer sich alles dafür interressiert, braucht man für Software, die
> Quellcode für die Software im Busteilnehmer generiert.

Und für Software, mit der man analysiert, was da so auf dem Bus 
umherschwirrt.

: Bearbeitet durch User
von Peter* (nochgast)


Lesenswert?

Hallo,

Rolf M. schrieb:
> Zusammengefasst:........

100 Punkte endlich einer der den Can-Bus versteht.

SW: Vielleicht mal bei Vector reinschauen.

von Clemens S. (zoggl)


Lesenswert?

Rolf M. schrieb:
> Zusammengefasst

Dem bleibt nur noch eines hinzuzufügen: mit einem request kann jeder 
Teilnehmer eine beliebige Nachricht anfordern.

Sg

von Peter D. (peda)


Lesenswert?

Bei gleichem ID versuchen beide Sender, es ewig zu wiederholen, bis die 
Fehlerabschaltung erfolgt. Auf das Datenpaket erfolgt keine Arbitration 
mehr, d.h. da gibt es nur noch Fehlerpakete.

Ich würde CAN2.0B mit 29Bit Identifier nehmen, dann kann man Empfänger- 
und Senderadresse mit hinein packen.

von Thomas (kosmos)


Lesenswert?

Kann man machen, es erhöht aber auch die Buslast, da die Nachrichten 
länger sind.

So ein Hobbyprojekt sollte doch mit 2048 möglichen IDs zurechtkommen.

Da du ja nur ein paar Teilnehmer hast könntest du ja einfach die ersten 
oder letzen Bits der ID als Absenderkennung verwenden

So das du Temp1 von Teilnehmer1 in der ID codieren kannst. Aber meiner 
Meinung ist es uninteressant woher Temp1 kommt, wichtig ist nur das eben 
nur ein Teilnehmer Temp1 sendet und die anderen dann eben Temp2 oder 
Temp3 verwenden müssen.

von Thomas F. (igel)


Lesenswert?

Peter D. schrieb:
> Ich würde CAN2.0B mit 29Bit Identifier nehmen, dann kann man Empfänger-
> und Senderadresse mit hinein packen.

Genau genommen ist das dann aber kein klassischer CAN mehr da du ja dann 
schon ein zusätzliches Sender-Empfänger-Protokoll hinzugefügt hast.

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.