Forum: Mikrocontroller und Digitale Elektronik CAN-Bus - automatische Teilnehmeradressierung


von Thomas T. (runout)


Lesenswert?

Hallo Gemeinde,

ich habe hier im Forum schon gesucht und das Gewünschte nicht gefunden.
Es geht um eine CAN-Bus_2.0A-Anwendung mit ca. 20 Teilnehmern.
Diese müssen unterscheidbar sein und idealerweise am Strang in 
aufsteigender Reihen folge (1-20) erscheinen.

Die Crux ist jetzt, dass die CAN-Nodes in rauher Umgebung betrieben 
werden
und physisch eigentlich nur ein vergossenen Klötzchen sind.

Es gibt keine Drehschalter und keine Mäuseklaviere um eine 
Teilnehmeradresse zu vergeben.

Im Auslieferungszustand könnte per Definition die Teilnehmeradresse "0" 
sein.
Meines Wissens gibt es eine "Daisy Chain"-Lösung, bei der alle 
Teilnehmer mit einer
ankommenden und einer abgehenden Digitalleitung nacheinander aktiviert 
werden.

Wenn sie eine gültige Teilnehmeradresse haben oder eine von einem Master
erhalten haben schalten sie die abgehenden Digitalleitung ein,
und der nächste Teilnehmer mit Teilnehmeradresse "n+1" kommt an den Bus.

Weiterhin könnte man eine Art Analogschalter für den weiterführenden 
CAN-Strang in Betracht ziehen.
Der weiterführende CAN-Strang wird dann eingeschaltet, wenn der aktuelle 
Teilnehmer eine gültige ID hat (oder ausgehandelt hat).

Was aber, wenn der Fall auftritt, dass zwei Teilnehmer exakt die gleiche 
CAN-ID haben?

Also z.B. "Teilnehmer n" ID = 4 = OK; "Teilnehmer n+1" ID = 4 = falsch

Ist dann noch der Fall unterscheidbar und können die Nodes eine 
"richtige" Teilnehmeradresse beziehen?

Ein Tipp wäre hilfreich.

Grüße
Runout

von Harald A. (embedded)


Lesenswert?

Alle Geräte haben eine Input- und eine Output-Leitung für Daisy-Chain 
(im folgenden DC genannt). Alle Geräte sind am CAN verbunden und senden 
ohne gültige ID-Vergabe erstmal nichts sondern hören nur zu.

1. Beim Eintreffen einer Nachricht zur ID-Neuvergabe auf z.B. 0x7F0 (auf 
die alle Geräte IMMER hören) vergessen alle Geräte ihre ID und schalten 
ihren eigenen DC-Ausgang logisch "1". Das erste Geräte hat den 
DC-Eingang offen und sieht logisch "0".
2. Jetzt wird auf 0x7F0 dazu aufgefordert, die erste ID zu vergeben. Das 
Gerät, dass noch nicht konfiguriert ist UND dessen Eingang auf "0" ist, 
akzeptiert  die Nachricht (im ersten Moment das erste Gerät). 
Konfiguriert seine eigene ID UND deaktiviert seinen Ausgang.
3. Der Erfolg kann auf z.B. 0x7F1 gemeldet werden oder der Master macht 
einfach mit einer gewissen Wartezeit weiter.
4. Das Spiel wiederholt sich, bis keine Antwort mehr kommt (oder wenn 
keine Antwort vom Knoten vorgesehen ist, einfach nach Nmax Messages).
5. Der Master meldet oder gleicht ab, wie viele Knoten gefunden wurden. 
Ggf. gibt es noch einen Funktionstest

Anmerkungen:
- Mit jeder neuen ID-Vergabe kann eine spezifische ID vergeben werden 
oder man gestaltet es so, dass einfach durchnummeriert wird.

- Ich würde davon absehen, dieses Spiel jedesmal beim Start zu 
durchlaufen. Besser die Geräte merken sich ihre Konfiguration. Man macht 
einen gesonderten Ablauf bei der Inbetriebnahme, damit der ganze Ablauf 
unter Beobachtung abläuft.

von Gerd E. (robberknight)


Lesenswert?

CAN hat keine Teilnehmeradressen.

Du hast Message-IDs und die müssen eindeutig sein. Die Message-IDs sind 
aber nicht bestimmten Nodes zugeordnet. Jeder Node kann beliebige 
Message-IDs senden und auf beliebige Message-IDs reagieren.

Du kannst natürlich entscheiden bestimmte Message-IDs bestimmten Nodes 
zuzuordnen, sowohl was den Empfang als auch Versand angeht.

Mein Vorschlag: verpass jedem Node bei der Herstellung eine 
unveränderbare GUID, also global eindeutige ID. Viele Microcontroller 
haben sowas schon fertig eingebaut, kann man aber z.B. auch als EEPROMs 
fertig vorprogrammiert kaufen.

Jetzt lässt Du immer jeden Node alle paar Sekunden seine GUID mit einer 
bestimmten Message-ID seine GUID senden. Den genauen Abstand zwischen 
den Nachrichten absichtlich mit etwas Zufall versehen. Wenn man jetzt 
eine Weile auf dem Bus lauscht bekommt man die GUIDs aller 
angeschlossenen Geräte.

Und dann vergibst Du eine Message-ID mit der ein Gerät per GUID gezielt 
angesprochen werden kann. Damit kannst Du dann z.B. eine LED an dem 
Gerät aufleuchten lassen um es von den anderen zu unterscheiden. Und 
genauso ihm eine individuelle Message-ID zuordnen über die es dann in 
Zukunft angesprochen werden kann.

Alternativ kann man natürlich auch die GUIDs jedes Nodes auf einen 
Barcode drucken und auf jeden Node aufkleben, auflasern etc.

von Stephan S. (plonk)


Lesenswert?

Können die Nodes zur Konfiguration vom Bus genommen werden?
Es gibt im CANopen z.B. das LSS-Protokoll, das ist für genau so eine 
Konfiguration gemacht.

MfG

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.