Forum: Mikrocontroller und Digitale Elektronik CAN Bus Low speed Nutzdatenrate


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Dirk F. (dirkf)


Angehängte Dateien:

Lesenswert?

Hallo,
ich möchte ein CAN Bus 2.0A  mit LOW Speed 125 KHz aufbauen.
Es sind 16 CAN Knoten vorhanden, die so oft wie möglich je 2 Integer 
senden sollen.
Stimmt meine Zykluszeitberechnung mit 10 ms ?
Oder werden zwischen zwei Frames oder sonst irgendwann Wartezeiten 
ausgeführt ?
Welche Werte sind in der Praxis zu erwarten?

von Stuff Chef (Gast)


Lesenswert?

Das lässt sich gar nicht so eindeutig sagen, da noch Stuff Bits dazu 
kommen können.

von Falk B. (falk)


Lesenswert?

Dirk F. schrieb:
> Es sind 16 CAN Knoten vorhanden, die so oft wie möglich je 2 Integer
> senden sollen.

Klingt nach Hektik und schlechtem Konzept.

> Stimmt meine Zykluszeitberechnung mit 10 ms ?

Könnte grob hinkommen.

> Oder werden zwischen zwei Frames oder sonst irgendwann Wartezeiten
> ausgeführt ?

Nö, aber wenn alle Knoten unsychronisiert senden wollen, gibt es viel 
Stau (Kollisionen beim Buszugriff) und sie behindern sich gegenseitig. 
Wenn man den Bus dermaßen knapp auslaten will, muss man es cleverer 
machen. Da muss jeder Knoten mithören (was sie sowieso tun) und 
erkennen, wenn der Vorgänger gesendet hat. Dann muss der Knoten senden, 
alle anderen halten die Klappe. Damit erreicht man minimale Kollisionen 
und maximale Busauslastung.

Ich würde die Sache nicht übertreiben wollen und mindesten 10% 
Buskapazität Luft lassen. Sonst kracht es irgendwann, irgendwie.

von Dirk F. (dirkf)


Lesenswert?

Ja OK.
Aber mit welcher Größenordnung kann ich rechnen `?
Werden es eher 11ms oder 20 ms ?

von Falk B. (falk)


Lesenswert?

Dirk F. schrieb:
> Aber mit welcher Größenordnung kann ich rechnen `?
> Werden es eher 11ms oder 20 ms ?

Müssen ja wahnsinnig wichtige Daten sein. Dreh doch einfach die Baudrate 
hoch, das ist einfach!

https://de.wikipedia.org/wiki/Controller_Area_Network#Daten-Frame

Ich zähle hier

19 Bit Header
4x8 Bit Daten
25 Bit CRC+EOF
3 Bit Inter frame gap (min)

Macht in Summe 79 Bit. Passt scho!

von Frank K. (fchk)


Lesenswert?

Dirk F. schrieb:
> Ja OK.
> Aber mit welcher Größenordnung kann ich rechnen `?
> Werden es eher 11ms oder 20 ms ?

Mit effektiven Maßnahmen zur Kollisionsvermeidung (z.B. exakte 
Zeitsynchronisation aller Knoten) sind so gefühlt 12-15ms drin. Ohne 
jegliche derartige Maßnahmen wirst Du exzessiv Kollisionen bekommen und 
vielleicht 50 oder gar 100ms bekommen.

fchk

von Falk B. (falk)


Lesenswert?

Stuff Chef schrieb:
> Das lässt sich gar nicht so eindeutig sagen, da noch Stuff Bits dazu
> kommen können.

Stopfbits kommen nach 5 gleichen Bits eingefügt, also maximal 79/5 = 16 
Bit. Real sind es wohl eher 5 oder weniger, denn so viele gleiche Bits 
gibt es statistisch eher nicht.

von Rolf M. (rmagnus)


Lesenswert?

Falk B. schrieb:
> Nö, aber wenn alle Knoten unsychronisiert senden wollen, gibt es viel
> Stau (Kollisionen beim Buszugriff) und sie behindern sich gegenseitig.

Kollisionen gibt es bei CAN nicht. Aber es kann sein, dass die 
Botschaften mit höherer ID von denen mit niedriger ID verdrängt werden 
und dann lange Zeit nicht dran kommen.

> Wenn man den Bus dermaßen knapp auslaten will, muss man es cleverer
> machen.

Ja, ein einfaches "fire & forget" funktioniert da nicht mehr.

> Da muss jeder Knoten mithören (was sie sowieso tun) und
> erkennen, wenn der Vorgänger gesendet hat. Dann muss der Knoten senden,
> alle anderen halten die Klappe. Damit erreicht man minimale Kollisionen
> und maximale Busauslastung.

Allerdings bleibt dann die Kommunikation komplett stehen, wenn einer der 
Knoten mal nicht da ist.

von Sebastian (Gast)


Lesenswert?

Frank K. schrieb:
> Ohne jegliche derartige Maßnahmen wirst Du exzessiv Kollisionen bekommen

Wieso denn Kollisionen? Die Nachrichten niedriger Priorität verschieben 
sich bei CAN doch einfach nur bis in einen Slot wo sie dann die höhere 
Priorität haben ...

LG, Sebastian

von Falk B. (falk)


Lesenswert?

Rolf M. schrieb:
> Falk B. schrieb:
>> Nö, aber wenn alle Knoten unsychronisiert senden wollen, gibt es viel
>> Stau (Kollisionen beim Buszugriff) und sie behindern sich gegenseitig.
>
> Kollisionen gibt es bei CAN nicht.

Jaja, aber der Buszugriff kommt nicht, bzw. verzögert zustande, wenn 16 
Knoten mit DAUERFEUER versuchen, CAN-Meldungen zu senden!

https://de.wikipedia.org/wiki/Controller_Area_Network#Arbitrierung,_Priorit%C3%A4t

von Falk B. (falk)


Lesenswert?

Rolf M. schrieb:
> Allerdings bleibt dann die Kommunikation komplett stehen, wenn einer der
> Knoten mal nicht da ist.

Tja, wenn beim Token Ring der Token verloren geht, ist Schicht im 
Schacht ;-)
Dann muss der Steiger, ähhh, Master schauen was geht und die Runde neu 
starten.

von Sebastian (Gast)


Lesenswert?

Falk B. schrieb:
> Jaja, aber der Buszugriff kommt nicht, bzw. verzögert zustande, wenn 16
> Knoten mit DAUERFEUER versuchen, CAN-Meldungen zu senden!

Es soll ja nur jeder Knoten einmal alle x ms eine Nachricht mit 32 Bit 
Nutzdaten senden. Wenn x also so gewählt ist dass die Busbandbreite 
nicht völlig ausgefüllt wird dann sollte es auch ohne Synchronisation 
der Knoten funktionieren dass jeder Knoten an die Reihe kommt. 
Jedenfalls habe ich CAN bisher so verstanden (und erlebt).

LG, Sebastian

von Dirk F. (dirkf)


Lesenswert?

Also ich möchte CAN Low Speed machen, weil das Konzept besser von der 
Terminierung her passt. Also mehr als 125 KBit/s geht dann ja nicht.

Es sollen 16 Slaves an eine Master CPU angekoppelt werden.
Buslänge ca. 50 cm.
Da überlege ich doch auf SPI umzusteigen. Sollte einfacher gehen, aber 
hat eben keine automatische Fehlererkennung.

von Falk B. (falk)


Lesenswert?

Dirk F. schrieb:
> Es sollen 16 Slaves an eine Master CPU angekoppelt werden.
> Buslänge ca. 50 cm.

Ach herje!

> Da überlege ich doch auf SPI umzusteigen.

Tu das!

> Sollte einfacher gehen, aber
> hat eben keine automatische Fehlererkennung.

Wozu auch? Bei 50cm bekommt man so stabil hin, da0 das nicht nötig ist.

von Rolf M. (rmagnus)


Lesenswert?

Falk B. schrieb:
> Rolf M. schrieb:
>> Falk B. schrieb:
>>> Nö, aber wenn alle Knoten unsychronisiert senden wollen, gibt es viel
>>> Stau (Kollisionen beim Buszugriff) und sie behindern sich gegenseitig.
>>
>> Kollisionen gibt es bei CAN nicht.
>
> Jaja, aber der Buszugriff kommt nicht, bzw. verzögert zustande, wenn 16
> Knoten mit DAUERFEUER versuchen, CAN-Meldungen zu senden!

Das hab ich ja geschrieben.

Falk B. schrieb:
> Rolf M. schrieb:
>> Allerdings bleibt dann die Kommunikation komplett stehen, wenn einer der
>> Knoten mal nicht da ist.
>
> Tja, wenn beim Token Ring der Token verloren geht, ist Schicht im
> Schacht ;-)

Ja, wer kennt ihn nicht, den Toten Ring? 😉

von Stuff Chef (Gast)


Lesenswert?

Falk B. schrieb:
> Stopfbits kommen nach 5 gleichen Bits eingefügt, also maximal 79/5 = 16
> Bit. Real sind es wohl eher 5 oder weniger, denn so viele gleiche Bits
> gibt es statistisch eher nicht.

Vermutlich eher noch weniger. Nur wenn man schon dabei ist den Bus nahe 
100% auszulasten, ein möglicher Stolperstein.

Falk B. schrieb:
> Jaja, aber der Buszugriff kommt nicht, bzw. verzögert zustande, wenn 16
> Knoten mit DAUERFEUER versuchen, CAN-Meldungen zu senden!

Ähm, wenn jeder Knoten sauber nur seine individuelle ID sendet, sollte 
es gar keine Probleme geben.

Dirk F. schrieb:
> Also ich möchte CAN Low Speed machen, weil das Konzept besser von der
> Terminierung her passt. Also mehr als 125 KBit/s geht dann ja nicht.
> Es sollen 16 Slaves an eine Master CPU angekoppelt werden.
> Buslänge ca. 50 cm.
> Da überlege ich doch auf SPI umzusteigen. Sollte einfacher gehen, aber
> hat eben keine automatische Fehlererkennung.

Muss mit den Daten etwas in Echtzeit passieren? Oder spricht etwas 
dagegen den Overhead zu reduzieren und alle 8 Bytes einer Nachricht zu 
verwenden?

Der Aufwand 16 bzw. 17 Transceiver zu nutzen, nur um schon eine 
"fertige" Fehlererkennung zu haben erscheint mir fragwürdig.
Geld spielt wohl keine Rolle?

von Jens R. (tmaniac)


Lesenswert?

Wenn du mit einem Master und den Rest als Slaves nutzen willst, dann 
kannst du auch mit Request Messages (mit gesetzten RTR Bit) arbeiten. 
Beim Request wird nur der Header gesendet.
Ich gerade überlegen ob der "Empfänger" unmittelbar auffüllt 🤔 Das nutzt 
man sonst so selten 🙈
Jedenfalls bekommt man damit ein gezieltes Frage-Antwort-Verfahren hin.

Bei 50cm Buslänge sehe ich auch kein Problem in der Terminierung bis 
1Mbit 🙄 Im Auto liegen mehrere Meter.

von Sebastian (Gast)


Lesenswert?

Dirk F. schrieb:
> Sollte einfacher gehen, aber hat eben keine automatische
> Fehlererkennung.

CAN erkennt auch nicht alle Fehler. Zum Beispiel ist auch bei CAN nicht 
völlig ausgeschlossen dass eine Nachricht verlorengeht.

Wenn SPI eine Alternative ist, also es einen Master gibt der die Knoten 
reihum abfragen kann, dann ist die Berechnung und Kontrolle einer 
Prüfsumme keine Herkulesaufgabe.

LG, Sebastian

von Homer (Gast)


Lesenswert?

Hi,

ach Gott, bei 50cm Bus kann man ganz entspannt 500kBit nehmen, die auch 
noch mit einer einseitigen Terminierung an nur einem Node (60Ohm) ohne 
Stress arbeiten. Und nein, es gibt keinen Arbitrierungszeitverlust bei 
Kollisionen: Wäre ja schlimm, wenn dem so wäre, dann müsste man ja die 
Nodes synchronisieren, was im z.B. Kfz niemand tut. Bei 17 Nodes und 
121Bit/frame (64bit Nutzdaten). Könnte man dann locker mit 10ms 
Zykluszeit auskommen. Wenn es gesondert gesichert werden soll, dann noch 
Alive-Counter und zusätzliche Checksumme in die Botschaft und das war 
es.

Grüsse
Frank

von Klaus S. (kseege)


Lesenswert?

Dirk F. schrieb:
> Es sind 16 CAN Knoten vorhanden, die so oft wie möglich je 2 Integer
> senden sollen.

Ich kenne den Hintergrund dieser Planung nicht. Sowas macht man mit CAN 
entweder als intellektuelle Fingerübung (wie bekommt man einen Umzug mit 
einem Ferrari erledigt?) oder als verzweifelte Notlösung, wenn man eine 
fehlgeplante Hardware benutzen muß.

Sonst kommen noch irgendwelche Anfänger daher und wollen sowas als 
ernsthafte Lösung verkaufen (auf mikrocontroller.net wurde das aber so 
gemacht!).
Ich schreibe das, weil ich schon einen Professor habe sagen hören, CAN 
sei nicht echtzeitfähig, weil ein hochpriorisierter Dienst den ganzen 
BUS belegen kann. Für den waren nur Interbus-S und ASI echtzeitfähig 
(die für genau die hier anvisierte Problemstellung optimiert sind).

Just my 2 cents

P.S. Für die Anfänger:
CAN ist ein priorisierter BUS. Adressiert werden Dienste, nicht Knoten. 
Im Idealfall haben keine 2 Dienste dieselbe Wichtigkeit.

Beitrag #7277203 wurde vom Autor gelöscht.
von Klaus S. (kseege)


Lesenswert?

Falk B. schrieb:
> wenn alle Knoten unsychronisiert senden wollen, gibt es viel
> Stau (Kollisionen beim Buszugriff) und sie behindern sich gegenseitig.

Das interpretiere ich geringfügig anders. Der mit der höchsten Prio 
setzt sich durch und alle Anderen kommen nicht durch.

Die Unterlegenen müssten den Höchstpriorisierten erkennen und dürfen 
nach ihm nur 1 (in Worten:eine) erfolgreiche Meldung absenden und müssen 
dann die Klappe halten.

Der Höchstpriorisierte muß erkennen, daß er der Häuptling ist und muß 
nach einer erfolgreichen Meldung schweigen und mitzählen, bis 16 
Meldungen durch sind und sendet dann genau einmal wieder und alles geht 
von vorn los. Die 15 niedriger Priorisierten werden von der 
CAN-Arbitrierung auf Linie gebracht, so daß sogar die Reihenfolge der 
Knoten vorherbestimmt ist.

Das sollte eine endlose Kette ohne Unterbrechung ergeben. Sollte ein 
Teilnehmer ausfallen gibt es eine Pause und der Programmierer darf 
aussuchen, welches Verhalten dann dem Problem am Besten angemessen ist 
(neuer Häuptling oder nur Reduktion auf 15 Teilnehmer oder Meldung an 
Hauptstelle oder oder oder).

Gruß Klaus (der soundsovielte)

von Peter D. (peda)


Lesenswert?

Ich komme bei 16*4 Byte Nutzdaten mit Overhead auf etwa 1,5ms.
Wenn also alle Teilnehmer alle 2ms senden, bist Du auf der sicheren 
Seite.
10ms reichen daher dicke.

: Bearbeitet durch User
von Dirk F. (dirkf)


Lesenswert?

Peter D. schrieb:
> Ich komme bei 16*4 Byte Nutzdaten mit Overhead auf etwa 1,5ms.

Bei 125 KBit/s ??????

von Anonymer User (Gast)


Lesenswert?

Peter D. schrieb:
> Ich komme bei 16*4 Byte Nutzdaten mit Overhead auf etwa 1,5ms.
> Wenn also alle Teilnehmer alle 2ms senden, bist Du auf der sicheren
> Seite.
> 10ms reichen daher dicke
125kbit/s : 79 bit/Nachricht : 16 Knoten = 99 Nachrichten / Knoten und s

10ms reichen also nicht. Zumal - wie oben schon jemand anmerkte - Stuff 
bits noch gar nicht berücksichtigt sind.

Generell: "so schnell wie möglich" funktioniert bei CAN nicht, weil dann 
höhere IDs nie zum Zug kommen.
CAN, mit einem CSMA/CA-Buszugriffsverfahren verträgt zwar mehr, aber 
grundsätzlich sollte man einen Bus nur auf 50% Auslastung auslegen.

Geh auf 250kBit, dann gehen 10ms Zykluszeit.

von Dirk F. (dirkf)


Lesenswert?

Anonymer User schrieb:
> Geh auf 250kBit, dann gehen 10ms Zykluszeit.

Um bei der CAN Spezifikation "LOW SPEED" zu bleiben:
125 KBit/s  >>  20 ms mit 50 % Reserve.

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.