Can-bus

hallo.

ich hab hier eine wunderschöne zusammenfassung der can-bus-grundlagen. da heißt’s:
die nachrichten werden durch identifier unterschieden. der niedrigste identifier besitzt die höchste priorität.
so weit, so gut.
dann is da ein beispiel zur arbitrierung mit zwei stationen. die eine besitzt den identifier 652 hex, die andere 65b hex.
mein fazit: jede am bus hängende station hat einen fest eingestellten identifier, d.h. die priorität der von dieser station ausgehenden nachrichten ist von vornherein festgelegt.

jetz heißt’s aber weiter: „der remote frame dient zur anforderung von nutzdaten. ein remote frame wird vom sender der nutzdaten durch das aussenden eines data frames beantwortet. remote frame und entsprechender data frame haben den gleichen identifier.“

also wie jetzt? teilnehmer 5 fordert von teilnehmer 7 daten an. also sendet 5 eine nachricht mit identifier 7, damit 7 auch weiß, „aha, da will einer was von mir“. dann sendet 7 eine nachricht mit identifier 7 aus.
frage: wie weiß 5 jetzt, daß diese nachricht für ihn bestimmt ist und nicht für jemand anderen?
oder überhaupt: wie weiß ein teilnehmer, daß die auf dem bus befindlichen daten für ihn bestimmt sind, wenn sie doch mit dem identifier des senders belegt sind?

gruß

michael

der bisher nur mit dem iic-bus zu tun hatte. und da is die sache ein bißchen klarer.

Hallo,
hab zwar nicht alle Einzelheiten des CAN-Bus im Kopf, aber
werde mal versuchen das problem zu klären.

ich hab hier eine wunderschöne zusammenfassung der
can-bus-grundlagen. da heißt’s:
die nachrichten werden durch identifier unterschieden. der
niedrigste identifier besitzt die höchste priorität.
so weit, so gut.

Das entscheidende ist eben, daß nicht die Teilnehmer am BUS
eine Geräteadr. haben (wie z.B. RS485 oder I2C) sondern die
zu versendenden Nachrichten haben Identifier.

dann is da ein beispiel zur arbitrierung mit zwei stationen.
die eine besitzt den identifier 652 hex, die andere 65b hex.
mein fazit: jede am bus hängende station hat einen fest
eingestellten identifier, d.h. die priorität der von dieser
station ausgehenden nachrichten ist von vornherein festgelegt.

Nein, ich denke das Beispiel ist mißverständlich. Die Identifier
beziehen sich wohl nur auf den Inhalt der Nachrichten, die von
den beiden Stationen versendet werden sollen.

jetz heißt’s aber weiter: „der remote frame dient zur
anforderung von nutzdaten. ein remote frame wird vom sender
der nutzdaten durch das aussenden eines data frames
beantwortet. remote frame und entsprechender data frame haben
den gleichen identifier.“

Ja, die unterscheiden sich eben durch ein zusätzliches Bit,
das sagt obv es „Anfrage“ oder „Antwort mit Daten“ ist

also wie jetzt? teilnehmer 5 fordert von teilnehmer 7 daten
an. also sendet 5 eine nachricht mit identifier 7, damit 7
auch weiß, „aha, da will einer was von mir“. dann sendet 7
eine nachricht mit identifier 7 aus.

So funktioniert CAN eben nicht.
Beispiel:
Teilnehmer 5 fordert eine bestimmte Information an („NA3“).
Wer „NA3“ die liefert, ist dem Teiln.5 egal.
Alle Teilnehmer hören die Anfrage von Teiln.5 nach „NA3“ und
müssen für sich entscheiden, ob sie die geforderte Nachricht
parat haben.
Falls Teiln. 7 die Antwort „NA3“ hat, wird er versuchen
durch die Arbitrierung den BUS zu besetzen um dann die
geforderte Nachricht zu senden.

frage: wie weiß 5 jetzt, daß diese nachricht für ihn bestimmt
ist und nicht für jemand anderen?

Teiln. 5 wird genau wie alle anderen Teilnehmer die Nachricht
hören und am Identifier die Nachricht „NA3“ erkennen und somit
intern weiterverarbeiten.
Zusätzlich kann aber auch jeder andere Teilnehmer die Nachricht
„NA3“ verwerten, wenn er damit was anfangen kann.

oder überhaupt: wie weiß ein teilnehmer, daß die auf dem bus
befindlichen daten für ihn bestimmt sind, wenn sie doch mit
dem identifier des senders belegt sind?

siehe oben und schau Dir noch mal die Erklärungen zum
CAN-Bus an. Da sollte es entsprechend beschrieben sein.

Die Nachricht wird eben am Identifier erkannt, welcher zwar
vom Sender mit gesendet wird aber es ist keine Geräteadresse
sonder eine vorher festgelegte Nummer einer bestimmten
Nachricht. Damit ist auch klar, daß jeder die Nachricht
senden kann und jeder eine gesendete Nachricht empfangen
und verwerten kann.
In der Industrie gibt es für die Vergabe der Identifier sogar
Tabellen, in denen viele vorkommende Nachrichten schon ein
Standard-Identifier zugeordnet ist.

der bisher nur mit dem iic-bus zu tun hatte. und da is die
sache ein bißchen klarer.

Ja, CAN-BUS funktioniert anders. Sehr interessant finde ich die
Methode der BUS-Arbitrierung. Damit werden BUS-Konflikte aus-
geschlossen (im Gegensatz zu anderen BUS’sen).
Gruß Uwi

hallo uwe.

erstmal danke für die ausführliche antwort :smile:

So funktioniert CAN eben nicht.
Beispiel:
Teilnehmer 5 fordert eine bestimmte Information an („NA3“).
Wer „NA3“ die liefert, ist dem Teiln.5 egal.
Alle Teilnehmer hören die Anfrage von Teiln.5 nach „NA3“ und
müssen für sich entscheiden, ob sie die geforderte Nachricht
parat haben.

also weiß jeder teilnehmer von vornherein, nachrichten mit welchem identifier er versenden kann/darf? will sagen: jedem teilnehmer ist eine reihe von für ihn in frage kommenden identifiern bekannt.
wenn TN7 den request-rahmen NA3 liest, muß er nachschauen „steht ident. 3 in meiner liste?“. und wenn das nicht der fall ist, sendet er auch nix. außerdem weiß er überhaupt nix davon, daß die anforderung von TN5 kommt. richtig?

Die Nachricht wird eben am Identifier erkannt, welcher zwar
vom Sender mit gesendet wird aber es ist keine Geräteadresse
sonder eine vorher festgelegte Nummer einer bestimmten
Nachricht. Damit ist auch klar, daß jeder die Nachricht
senden kann und jeder eine gesendete Nachricht empfangen
und verwerten kann.
In der Industrie gibt es für die Vergabe der Identifier sogar
Tabellen, in denen viele vorkommende Nachrichten schon ein
Standard-Identifier zugeordnet ist.

ok. also beispiel: die wischersteuerung im auto soll den wischer einschalten. das weiß sie aber nur, wenn sie ne entsprechende nachricht kriegt. und das heißt, sie muß vorher daten anfordern, und zwar mit einer für die wischersteuerung gedachten priorität (=identifier).
die zuständige „hauptsteuerung“ sagt sich: „dem teil kann geholfen werden“ und verschickt eine nachricht mit dem selben identifier, womit der wischer weiß: „aha, da is das, was ich haben wollte“. richtig so?
oder kann die „hauptsteuerung“ auch daten an den wischer senden, ohne daß dieser was angefordert hat?

dann schreibst du

Zusätzlich kann aber auch jeder andere Teilnehmer die
Nachricht „NA3“ verwerten, wenn er damit was anfangen kann.

also doch keine identifier-liste für jeden teilnehmer? wie weiß aber dann ein anderer teilnehmer, ob er mit einer nachricht was anfangen kann? wird das im datenfeld unterschieden?

und was passiert, wenn zwei sender eine nachricht mit demselben identifier verschicken wollen, aber mit unterschiedlichem datenfeld? dann gibt’s doch nen fehler…

sorry, aber ich bin da immer noch net ganz durchgestiegen… :smile:=)

gruß

michael

also weiß jeder teilnehmer von vornherein, nachrichten mit
welchem identifier er versenden kann/darf? will sagen: jedem
teilnehmer ist eine reihe von für ihn in frage kommenden
identifiern bekannt.

Ja, hinter einem CAN-BUS-Teilnehmer steht in der Regel ein
Mikroprozessorsystem, das die Nachrichten für sich herausfiltert.
Meist wird auch ein spezieller CAN-Prozessor benutzt, in dem
auch Filtermasken gesetzt werden können, so daß das nachfolgende
System nicht von einer Nachrichtenflut überschwemmt wird.
So kommen nur vorgefilterten Nachrichten zur Auswertung.

wenn TN7 den request-rahmen NA3 liest, muß er nachschauen
„steht ident. 3 in meiner liste?“.

Ja, so soll es sein.

und wenn das nicht der fall
ist, sendet er auch nix. außerdem weiß er überhaupt nix davon,
daß die anforderung von TN5 kommt. richtig?

Ja, wie gesagt wird primär nicht danach geschaut, wer der
Absender ist, sondern es wird die Nachricht anhand des
Identifiers erkannt.
Allerdings ist es doch so, daß ein Teil des Identifier
als Kennung für den sendenden Teilenenhmer reserviert ist.
(7bit = max.128 CAN-Teilnehmer am BUS).
Dies ist wohl auch deshalb notwendig, damit es keine
BUS-Konflikte gibt, wenn 2 Teilnnehmer die gleiche Nachricht
versenden wollen.

Die Nachricht wird eben am Identifier erkannt, welcher zwar
vom Sender mit gesendet wird aber es ist keine Geräteadresse
sonder eine vorher festgelegte Nummer einer bestimmten
Nachricht.

Wie gesagt, muß ich hier doch noch ergänzen, daß im Identifier
auch eine Gerätekennung drin ist.

Damit ist auch klar, daß jeder die Nachricht
senden kann und jeder eine gesendete Nachricht empfangen
und verwerten kann.
In der Industrie gibt es für die Vergabe der Identifier sogar
Tabellen, in denen viele vorkommende Nachrichten schon ein
Standard-Identifier zugeordnet ist.

ok. also beispiel: die wischersteuerung im auto soll den
wischer einschalten. das weiß sie aber nur, wenn sie ne
entsprechende nachricht kriegt. und das heißt, sie muß vorher
daten anfordern, und zwar mit einer für die wischersteuerung
gedachten priorität (=identifier).

Priorität ist nicht gleich Identifier.
Aber der Identifier bestimmt, in welcher Reihenfolge die
Teilnehmer bei gleichzeitigen BUS-Anforderungen zum Zuge kommen.

In dem Beispiel würde ich eher annehmen, daß ein Regensensor
festgestellt hat, daß es mit einer bestimmten Stärke regnet.
Außerdem wird natürlich die Stellung des Wischerschalters
(manuelles Auslösen) relevant sein.

Dann werden diese Nachrichte einfach mit dem entsprechenden
Identifier auf den BUS gegeben.
Alle Teilnehmer am BUS hören die Nachricht und entscheiden
für sich, ob sie irgendwie reagieren müssen.
-> Die Wischersteuerung sagt sich: „Diese Nachricht ist in
meiner Liste“ und wird also wischen.
-> Das ESP-System wird evtl. seine Parameter auf
„nasse Straße“ optimieren usw.

die zuständige „hauptsteuerung“ sagt sich: „dem teil kann
geholfen werden“ und verschickt eine nachricht mit dem selben
identifier, womit der wischer weiß: „aha, da is das, was ich
haben wollte“. richtig so?

So rum ist es nicht sinnvoll (siehe oben).
Die Wischersteuerung meldet selbstständig sofort auftretende
Fehler, ansonsten muß sie nicht ständig plappern.

oder kann die „hauptsteuerung“ auch daten an den wischer
senden, ohne daß dieser was angefordert hat?

Logisch, das muß auch gehen.
Jeder kann Nachrichten versenden, wenn es seine Aufgabe ist.

dann schreibst du

Zusätzlich kann aber auch jeder andere Teilnehmer die
Nachricht „NA3“ verwerten, wenn er damit was anfangen kann.

also doch keine identifier-liste für jeden teilnehmer? wie
weiß aber dann ein anderer teilnehmer, ob er mit einer
nachricht was anfangen kann? wird das im datenfeld
unterschieden?

Wenn ein Teilnehmer einen Identifier nicht in seiner Liste
der zu behandelnden Nachrichten hat, dann braucht er auch
nichts machen.
Jeder Teilnehmer muß nur eine Liste der für ihn relevanten
Nachrichten haben.

und was passiert, wenn zwei sender eine nachricht mit
demselben identifier verschicken wollen, aber mit
unterschiedlichem datenfeld? dann gibt’s doch nen fehler…

Das wäre so, aber wie oben schon gesagt, wird im Identifier
auch eine Kennung für jeden Teilnehmer hinterlegt.
Damit bekommt auch immer der Teilnehmer zuerst den BUS,
welcher die höhere Priorität hat (auch wenn die Art der
Nachricht die gleiche ist).

sorry, aber ich bin da immer noch net ganz durchgestiegen…

-)=)

Wird schon werden.
Gruß Uwi

1 Like

hallo uwe.

danke für die hilfe. jetz is die sache doch ein bißchen klarer. hab dir ein sternchen gegeben :wink:

gruß

michael

Oooooch …
… eeen Sternchen für so viel Streß :wink:
Aber na gut, mache geben gar keins obwofl man
sich die Finger wundschreibt.
Gruß Uwi

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

… eeen Sternchen für so viel Streß :wink:
Aber na gut, mache geben gar keins obwofl man
sich die Finger wundschreibt.
Gruß Uwi

naja… ich kann leider nur eins vergeben :smile: kann höchstens die anderen artikel noch besternen…
aber ein sternchen oder zwei… es ist doch die geste an sich, die zählt :smile:

gruß

michael