CAN Bus Arbitration

OP #7514804
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?

OP #7514820
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?

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

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

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

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

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

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

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

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