Forum: Mikrocontroller und Digitale Elektronik CAN Adressierungproblematik


von Fabian B. (fabs)


Lesenswert?

Hi Leute,
 Vorstellung:
ich habe an einem CAN Bus mehrere Geräte.
Jetzt will ich mit einem Tastendruck an einem beliebigen Gerät alle 
anderen Geräte aufwecken. Dazu würde ich z.B. MSG-ID 1 nehmen und damit 
allgemein ON signalisieren.
 Jetzt dürfen ja eigentlich keine zwei Sender die gleiche ID benutzen 
können, weil dann Kollisionen auftreten.
 Fällt jemandem eine intelligente Lösung dazu ein, ohne dass ich z.b. 
sage alle Nachrichten IDs von z.B. 1-15 sind ON-Messages und jedes Gerät 
nimmt seine "eigene ON-ID"?
 Diese Problematik tritt ja immer auf, wenn ich eine "Anweisung" von 
mehreren Stellen versenden kann und nicht nur "selbst produzierten 
inhalt" kund tun will.
CANopen scheint ja eine Lösung zu haben, aber die Beschreibung auf der 
Webseite http://www.can-cia.org find ich nicht gerade verständlich.

Ich bin gerade am evaluieren von Bus Systemen.
Eckdaten: Kabellänge >20m möglich, >100kbit/s, Multimaster-Fähig
Vielleicht hat ja jemand noch andere Anregungen.

Gruß
Fabian

von peterguy (Gast)


Lesenswert?

Wenn du für den Wakeup unterschiedliche IDs verwendest, hätte das den 
Vorteil, daß du über diese Nachrichten die Teilnehmer auch schlafen 
schicken könntest. So funktioniert das z.B. im automotive Bereich, das 
Stichwort heißt hier NetzwerkManagement.

Rein zum Aufwecken ist die ID doch egal, da die CAN Transceiver den 
Wakeup generell bei CAN Bus Aktivität auslösen. Du könntest den 
Aufweckenden Knoten auch einfach seine normalen Botschaften senden 
lassen und alle würden aufwachen.

von Fabian B. (fabs)


Lesenswert?

Das Wakeup war hauptsächlich als Beispiel gedacht...is schwer zu 
erklären.
Ich hab halt das Problem, dass mehrere Geräte prinzipiell die gleiche ID 
senden können müssten und ich suche nach einem Ausweg, da die Geräte 
per-se erstmal nicht wissen wen es sonst noch im Netz gibt.
Anderes Beispiel:
 Ich will einen Motor einschalten der an einem CAN-Bus-Teilnehmer hängt. 
Der Einschalt-Befehl kann von beliebigen unabhängigen anderen 
Teilnehmern kommen, die nichts von einander wissen müssen. Wie kann ich 
hier effizient dafür sorgen, dass ich keine gleichen IDs von 
unterschiedlichen Teilnehmern aufm Bus habe?

Gruß
Fabian

von schobbe (Gast)


Lesenswert?

Hallo,

CAN ist doch Nachrichten ID basiert.

Siehe Wikipedia:
Der Objektidentifier kennzeichnet den Inhalt der Nachricht, nicht das 
Gerät. Zum Beispiel kann in einem Messsystem den Parametern Temperatur, 
Spannung, Druck jeweils ein eigener Identifier zugewiesen sein. Die 
Empfänger entscheiden anhand des Identifiers, ob die Nachricht für sie 
relevant ist oder nicht.

Zudem dient der Objektidentifier auch der Priorisierung der Nachrichten.

Du musst die Filter der Geräte am Bus entsprechend konfigurieren so, 
dass sie auf die Nachrichten reagieren.

Im Grunde ist also JEDE Nachricht eine Broadcast Nachricht. D.h. du 
kannst eine Nachricht "WECKE ALLE" definieren und bei den Geräten 
bekannt machen so dass alle darauf reagieren.

Nächtle :-)

von Fabian B. (fabs)


Lesenswert?

Das ist schon klar, kenne den Artikel ;-)

Aber in diesen Beschreibungen geht es immer nur um das Broadcasten 
"selbst produzierter" Daten. CAN muss doch aber auch als Steuerbus 
nutzbar sein, also, dass ein Gerät sagt "mach-das". Und wenn jetzt 
dieses "mach-das" von mehreren, einander unbekannten, Geräten kommen 
könnte, habe ich u.U. Arbitierungsprobleme.
Wie löse ich das? Wie machen das die Leute bei HomeAutomation... da 
gibts doch auch viele Lichtschalter, die eine Lampe einschalten wollen. 
Da müsste dann ja jeder Schalter eine eigene ID zum versenden haben, 
damit nix kollidiert.

Gruß
Fabian

von peterguy (Gast)


Lesenswert?

Gute Frage, wie man das löst. Ich glaube auch, daß es zu 
Arbitrierungsproblemen kommen kann, wenn die Knoten die selbe ID senden.
In meinen Augen gibt es mehrereMöglichkeiten:

1. Du verwendest unterschiedliche IDs
2. Du verwendest nur eine ID und trägst den Arbitrierungsproblemen 
Rechnung, indem z.B. der Dateninhalt weggelassen wird (DLC = 0). In dem 
Fall wäre es ja theoretisch egal, ob es Kollisionen gibt.
3. Du baust ein eigenes Protokoll auf, das auf CAN zurückgreift. So 
könntest du z.B. eine Ringbotschaft definieren, die immer die selbe ID 
hat, aber im ersten Datenbyte den Empfänger enthält. Wenn der Empfänger 
die Botschaft empfangen hat, so sendet er ebenfalls auf der ID, aber mit 
einer anderen Empfänger Adresse. Das ganze funktioniert natürlich nur, 
wenn keiner der Empfänger fehlt.

Bei der HomeAutomation gehen die Lichtschalter doch sicherlich erst an 
einen Zentralen Rechner, der dann die Verknüpfung zu den Aktuatoren ( 
z.B. Licht) herstellt. Da wird es doch schon so sein, daß jeder 
Teilnehmer seine eigene ID hat, oder?

von schobbe (Gast)


Lesenswert?

Warum sollte es zu Arbitrierungsproblemen kommen?

Nehmen wir an Gerät A und Gerät B legen die selbe Botschaft auf den Bus.

Beide Nachrichten sind doch identisch.. also genau die gleiche Bitfolge, 
genau die gleichen dominanten und rezessiven Pegel. Da wird ja nix 
destruktiv zerstört.. die Nachricht gelangt auf den Bus!

CAN ist doch CSMA/CA... und nicht CSMA/CD wie bei Ethernet! Dort 
entsteht Müll auf der Leitung ("JAM").. und nach ein zufälligen Zeit 
wird die Aussendung wiederholt.

CAN ist "Collision Avoidance" Kollisions Vermeidung. Da gibts sowas net.

ALso können meiner Meinung nach beide GEräte die gleiche Nachricht ohne 
Probleme senden.

von peterguy (Gast)


Lesenswert?

> Nehmen wir an Gerät A und Gerät B legen die selbe Botschaft auf den Bus.
>
> Beide Nachrichten sind doch identisch.. also genau die gleiche Bitfolge,
> genau die gleichen dominanten und rezessiven Pegel. Da wird ja nix
> destruktiv zerstört.. die Nachricht gelangt auf den Bus!

Jup, die Probleme treten erst auf, wenn die Nutzdaten unterschiedlcih 
sind. Deswegen schrieb ich ja, der Dateninhalt sollte gleich ganz 
weggelassen werden.

von schobbe (Gast)


Lesenswert?

Ah, ok.

Gerät A und Gerät B könnten ja intelligente Sensoren sein, die einen 
Aktor GErät C ansprechen, welcher die Temperatur regelt.

Mhm, wenn beide Geräte nun berechtigt sind Gerät C mit der gleichen ID 
zu steuern hat man meiner nach ein grundsätzliches Problem.

Z.B.

Gerät A sendet: Temperatur auf 25 °C regeln
Gerät B sendet: Temperatur auf 40 °C regeln

Gerät C würde dann versuchen einmal auf 25 °C zu regeln und dann wieder 
auf 40 °C.

Das ist so als wollten 2 Leute "gleichzeitig" einen Lichtschalter 
benutzen, der eine möchte das Licht einschalten, der andere aber aus.

Aber grundsätzlich ist es möglich.
Es kommt meiner Meinung nach zu Konflikten, aber nicht zu Kollisionen. 
Ansonsten entscheiden die Bits der Parameter über die Priorität.. ;-)

von Willivonbienemaya .. (willivonbienemaya)


Lesenswert?

Ich hatte mal ein sehr ähnliches Problem. Jeder Teilnehmer hat eine 
eigene ID. Für eine Sonderfunktion wurde eine bestimmte ID + Length = 0 
gesendet, wie oben schon mal erwähnt. Das hat jeder Teilnehmer 
verstanden und Arbitrierungsprobleme gibts dann auch nicht. Hat 
wunderbar funktioniert.

von TommyS (Gast)


Lesenswert?

Es gibt ja auch immer noch die Möglichkeit der Maskierung/Filterung. 
Können beispielsweise die Microchip CAN-Controller (wobei ich wetten 
könnte, daß alle anderen marktüblichen das auch können).

Dann nimmst Du im Identifier die ersten x Bit als gleiche 
"Wake-Up-Adresse" und die restlichen Bits zur eindeutigen 
Identifizierung der Message. Musst dazu halt die richtigen Masken/Filter 
setzen.

Grüße,
TommyS

von Gast333 (Gast)


Lesenswert?

Verwende extended CAN-IDs mit 29Bit und definiere davon (z.B.) die 
oberen Bits als Zieladresse und die unteren Bits als Absendeadresse.
Beispiele:
Teilnehmer1 schickt an Teilnehmer2 die ID 0x00020001 (anschliessend 
Nutzdaten).
Teilnehmer 57 schickt an Teilnehmer 99: 0x00990057...

Der Empfänger maskiert die unteren Bits einfach aus, um zu prüfen, ob 
die Nachricht für ihr bestimmt ist. Damit hast du dann keine Probleme 
mit 2 gleichen IDs auf dem Bus.

von Fabian B. (fabs)


Lesenswert?

Danke schomal für die vielen Antworten. Jedem Teilnehmer eine eigene 
ID verpassen, wollte ich eigentlich vermeiden, da das ja dem Sinn der 
Message-ID-Basierten Kommunikation entgegenläuft,  Da muss ich dann u.U. 
ja meine Maske auf FFF (alles egal) setzen. Aber ein Teil, z.b. 6 Bits 
könnte man als eindeutige Adresse nehmen und die vorderen 5 Bit geben 
noch den Nachrichteninhalt an...so könnte man etwas vorfiltern.
Aber eine Methode die hinteren 6 Bits "automatisch" zu ermitteln hat 
scheinbar noch keiner, oder? Ich will vermeiden, dass ich in jedem Gerät 
6 Dip-Switches haben muss und bei falscher Bedienung doch wieder Mist 
passiert.
DeviceNET hat laut Beschreibung ja irgendeine intelligente Methode um 
automatisch eindeutige Adressen zu wählen, aber ich finde das nirgends 
genauer beschrieben.

Aber nochmal zur HA zurück. Ich habe z.B. 20 Lichtschalter in der 
Wohnung. Muss ich die dann alle per Software, oder Schalter auf eine 
eindeutige ID setzen und jede Lampe lauscht dann auf allen diesen IDs 
(via Maske), oder geht das dort anders?

Gruß
Fabian

von Fabian B. (fabs)


Lesenswert?

CANopen scheint es auch so zu machen, dass die CAN-ID zum Teil aus einer 
eindeutigen Node-ID besteht...ne andere Möglichkeit sehe ich jetzt 
erstmal auch nicht.

Trotzdem wäre interessant wie das die leute aus der Home Automation 
lösen, weil man mit dieser Methodik entweder immer sehr viele 
Nachrichten verarbeiten muss (weiter Filter) oder auf wenige Nodes 
beschränkt ist.
Kennt sich da keiner aus?

Gruß
Fabian

von Holger T. (holgert)


Lesenswert?

> Trotzdem wäre interessant wie das die leute aus der Home Automation
> lösen, weil man mit dieser Methodik entweder immer sehr viele
> Nachrichten verarbeiten muss (weiter Filter) oder auf wenige Nodes
> beschränkt ist.
> Kennt sich da keiner aus?
>

Naja, die 29bit einer extended MsgID sind ja eine ganze Menge, da kann 
man einiges mit machen. Ich habe neben Ziel- und Senderadresse (je 8 
bit, so ähnlich wie Gast333 es beschreibt) auch 5 bit für eine 
Gruppenadresse reserviert, sowie weitere 5-bit, die die Art der 
Nachricht (z.B. Temperatur, Uhrzeit o.ä) beschreiben.

Als Controller verwende ich Atmel AT89C51CCxx. Der hat 15 Message 
Objekte zur freien Verwendung. Eines ist für TX reseviert, bleiben 14 
mögliche zum Empfang von Nachrichten. Da kann ich also 14 verschiedene 
Filter setzen z.B:
MO1: empfange alle Nachrichten, die an Gruppe 0b00001 gerichtet sind
MO2: empfange alle Nachrichten, die an "meine" Node-ID gerichtet sind
MO3: empfange alle Nachrichten, die von Node-ID soundso kommen
MO4: empfange alle Nachrichten deren Inhalt Temperaturwerte sind
oder etwas komplexer zu MO4
MO4(a): empfange alle Nachrichten deren Inhalt Temperaturwerte sind und 
an Gruppe 0b01000 gerichtet sind
...usw

vielleicht hilft das weiter.

Gruß
-Holger

P.S. Mit welchen Parametern die Message-Objekt-Filter zu initialisieren 
sind, steht natürlich im E(E)PROM, dann braucht man keine DIP-Switches.

von Fabian B. (fabs)


Lesenswert?

Die Nachricht von Gast333 hab ich vorhin gar nicht gesehn, die hat sich 
wohl mit meiner Zeitlich grad überschnitten.
Aber die Anregungen sind erstmal gut, danke!
Jetzt muss ich mir "nur noch" eine Methode zum automatischen 
vergeben/erkennen der "eigenen" ID überlegen...also wie lernen die 
Geräte welche ID noch frei ist.

Gruß
Fabian

von Holger T. (holgert)


Lesenswert?

> Jetzt muss ich mir "nur noch" eine Methode zum automatischen
> vergeben/erkennen der "eigenen" ID überlegen...also wie lernen die
> Geräte welche ID noch frei ist.

Das dürfte schwierig machbar sein *). Gib' jedem Knoten vorab eine 
eindeutige Adresse! Die kann (wie schon erwähnt) im EEPROM liegen 
zusammen mit allen weiteren Filterparametern.

-Holger

*) und ich sehe auch keinen Sinn darin. Wie willst Du dann einen 
bestimmten Knoten erreichen, wenn dessen ID dynamisch zugewiesen wurde, 
woher weißt Du dessen ID?

von Gast333 (Gast)


Lesenswert?

Noch was: Überschätze die Hardwarefiltermöglichkeiten nicht. Es ist in 
aller Regel kein Problem eine Softwarefilterung im CAN-RX-Interrupt zu 
machen. Ein solcher Interrupt kann sehr kurz gehalten werden, wenn die 
Botschaft nicht für den Knoten bestimmt ist (Laufzeit nur wenige µs; ich 
sag mal max.5..10µs; dürfte für die meisten µC mit integriertem 
CAN-Interface hinkommen).
Bei einer Baudrate von 100kBit/s bekommst du ~1 Botschaft pro ms, d.h. 
du hast durch deine Softwarefilterung eine Auslastung deines Prozessors 
von max. 0.5..1% (bei 100% Buslast!), die du durch Hardwarefilterung 
sparen könntest - also vernachlässigbar wenig.

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.