Forum: Mikrocontroller und Digitale Elektronik ESP32 mit MAX3051 CAN-Bus mit mehr als 8 Teilnehmer


von Sebastian (Gast)


Lesenswert?

Hallo zusammen,

ich habe mir Platinen mit ESP32 & MAX3051ESA+T bestückt und diese in 
einem CAN-Verbund gebracht.

Meine Busleitung hat 65 Ohm (auf einer Strecke von ~40m). An der Strecke 
hängen 8 Module welche sauber über 100 Stunden miteinander Kommunizieren 
(alle quer Beet).

*Kommunizieren habe ich hier erstmal so definiert, dass alle in einem 
Intervall von ~1 Sekunde eine Nachricht absetzen und alle alle 30-60 
(random) Sekunden nochmal 10 Nachrichten (als Block) absetzen. Jeder 
schreibt ein Logbuch und merkt sich wann das letzte mal einer der 
anderen Module eine Nachricht geschrieben hat. Sobald 3 Sekunden nichts 
kommt, wird ein Log aufgeschrieben (Modul4 hat um 10:27 Uhr nicht 
geantwortet).

Vom Prinzip läuft alles Sauber...

Sobald ich jetzt aber weitere Module an den Bus hänge (Strecke bleibt 
gleich) funktioniert entweder das neue oder eines (oder mehrere) der 
alten Module nicht mehr.

Irgendwie hab ich das Gefühl, dass es hier eine Grenze von 8 Modulen 
gibt?
Ich verwende die Library CAN Version 0.3.1 von sandeepmistry.
Arbeite mit einer Baudrate von 200Kbit (geht aber auch mit 50 nicht 
besser).

hat jemand eine Ahnung, warum der Bus ab der 9. 10.... Platine Probleme 
macht? Und wie kann ich das Umgehen? Ich habe vor etwa 25 dieser 
Platinen auf einer Strecke von 70m zu vernetzen.

Kennt jemand evtl. eine bessere Library. Oder muss ich meine Hardware 
anders aufbauen?

1000 Dank für jeden Tipp

-S

von Falk B. (falk)


Lesenswert?

Sebastian schrieb:
> Sobald ich jetzt aber weitere Module an den Bus hänge (Strecke bleibt
> gleich) funktioniert entweder das neue oder eines (oder mehrere) der
> alten Module nicht mehr.

Was geht denn nicht mehr? Geht GAR nichts mehr?

> Irgendwie hab ich das Gefühl, dass es hier eine Grenze von 8 Modulen
> gibt?

Nicht beim CAN.

> Ich verwende die Library CAN Version 0.3.1 von sandeepmistry.
> Arbeite mit einer Baudrate von 200Kbit (geht aber auch mit 50 nicht
> besser).

Das ist nicht das Problem.

> hat jemand eine Ahnung, warum der Bus ab der 9. 10.... Platine Probleme
> macht?

Nö. Das musst du schon rausfinden. Betreibe eine systematische 
Fehlersuche.

> Und wie kann ich das Umgehen?

Gar nicht. Siehe oben!

> Ich habe vor etwa 25 dieser
> Platinen auf einer Strecke von 70m zu vernetzen.

Das ist an sich kein Problem.

> Kennt jemand evtl. eine bessere Library. Oder muss ich meine Hardware
> anders aufbauen?

Naja, die 65 Ohm Kabel sind eher ungewöhnlich, CAN will eigentlich eher 
um die 100-120 Ohm sehen. Das KANN ein Problem sein, muss aber nicht. 
Hast du deinen Bus beidseitig terminiert?

Ich tippe auf ein Softwareproblem. Vermutlich sind Adressen mehrfach 
vergeben oder deine Protokollsoftware verhaspelt sich anderweitig. Kürze 
die Software soweit zusammen, daß du manuell nur einzelne Nachrichten 
von einem Knoten absetzt. Damit Sendet man nach und nach an alle 
Adressen. Dann prüft man, ob die bei den anderen Knoten ankommen. Dann 
geht's weiter.

von Sebastian (Gast)


Lesenswert?

Hm, danke für die Info, sehe schon, ich muss das mit dem Oszi ran und 
mehr messen.

naja, ich hab vorne und hinten 120Ohm dran, das gibt 60 Ohm und dazu 
noch die Leitung.

Aber genau da ist das Problem mit den Adressen, ich kann bei dieser 
Library keine Adressen zuweisen. Ich kann nur eine Sende-ID verwenden. 
Und ich habe jeden Modul einfach eine Aufsteigende Zahl gegeben
101, 102, 103,... 108, 109!!

und wenn jetzt das 3. Modul ne Nachricht schickt dann sieht diese so 
aus:

ID: 103 - MSG00025
(ich hab da nen Zähler, der bis 99999 zählt und dann wieder bei 0 
anfängt)

die 103 bekommt aber JEDES Modul. Das lässt sich zwar leicht filtern, 
ist aber nicht so, dass Modul 5 Explizit ne Nachricht an Modul 3 senden 
kann (was mir deutlich lieber wäre, aber eben diese Library nicht kann).

Schlimm ist halt, wenn ich dann andere Module entferne, geht wieder 
alles (d.h. die Hardware oder Software sind theoretisch gleich - und 
Fehler sind eher Allgemein bezogen und nicht auf ein "schlechtes Modul" 
zurückzuführen).

Definition von "geht nicht": Es kommunizieren weiterhin 7 oder 8 Module 
miteinander. Welche genau lässt sich schwer sagen, meist sind es "die 
alten". Aber ich hatte auch schon mal den Fall, dass ein altes 
ausgestiegen ist und das neue funktioniert hat. - es hängen aber noch 
weitere Module am Bus welche eben nicht kommunizieren (nichts senden 
aber auch nichts empfangen - ich gehe davon aus, dass diese "beim 
Senden" sich aufhängen, weil die Nachricht nicht verschickt werden kann.

von mh (Gast)


Lesenswert?

Sebastian schrieb:
> die 103 bekommt aber JEDES Modul. Das lässt sich zwar leicht filtern,
> ist aber nicht so, dass Modul 5 Explizit ne Nachricht an Modul 3 senden
> kann (was mir deutlich lieber wäre, aber eben diese Library nicht kann).

Lies Dich mal zum Thema CAN ein...
Bei CAN werden Nachrichten adressiert und keine Geräte/Busteilnehmer.
Ein Teilnehmer kann auch viele Message-IDs senden und/oder empfangen. 
Oder auch nur senden oder nur empfangen.

Jeder Teilnehmer kann prinzipiell alles empfangen, im CAN-Controller 
wird gefiltert, welche Nachrichten denn tatsächlich an den Stack 
weitergereicht werden sollen. Nur wenn bei einem Empfänger die Nachricht 
durch den Filter "passt", wird die Nachricht acknowleged.
Wenn eine Nachricht kein Acknowledge bekommt, weil sich kein Knoten 
dafür interessiert, ist das senderseitig ein Fehler. Wie der Sender das 
handhabt, ist von der Implementierung abhängig - ggf. geht er in einen 
Fehlerzustand und sendet anschließend einfach gar nicht mehr.

von Falk B. (falk)


Lesenswert?

Sebastian schrieb:
> Hm, danke für die Info, sehe schon, ich muss das mit dem Oszi ran und
> mehr messen.

Tu das.

> Aber genau da ist das Problem mit den Adressen, ich kann bei dieser
> Library keine Adressen zuweisen. Ich kann nur eine Sende-ID verwenden.
> Und ich habe jeden Modul einfach eine Aufsteigende Zahl gegeben
> 101, 102, 103,... 108, 109!!

Das sind die Adressen vom CAN. Passt schon.

> und wenn jetzt das 3. Modul ne Nachricht schickt dann sieht diese so
> aus:
>
> ID: 103 - MSG00025
> (ich hab da nen Zähler, der bis 99999 zählt und dann wieder bei 0
> anfängt)

Das ist Unsinn, denn CAN kann im Normalbetrieb nur 2048 Adressen 
ansprechen. Außerdem vergibt man nicht immer fortlaufende Adressen für 
jede neue Nachricht, sondern an sich sind die fest, so wie eine 
Postanschrift.

> die 103 bekommt aber JEDES Modul. Das lässt sich zwar leicht filtern,
> ist aber nicht so, dass Modul 5 Explizit ne Nachricht an Modul 3 senden
> kann (was mir deutlich lieber wäre, aber eben diese Library nicht kann).

Glaub ich nicht. Bei CAN hört und empfängt JEDER Busteilnehmer ALLE 
Nachrichten. Erst durch den Filter wird entschieden, welche auf dem 
Teilnehmer ausgewertet wird oder nicht.

> Schlimm ist halt, wenn ich dann andere Module entferne, geht wieder
> alles

Was geht denn nicht? Siehe oben.

> (d.h. die Hardware oder Software sind theoretisch gleich - und
> Fehler sind eher Allgemein bezogen und nicht auf ein "schlechtes Modul"
> zurückzuführen).

Klingt umso mehr nach einem Softwareproblem.

> Definition von "geht nicht": Es kommunizieren weiterhin 7 oder 8 Module
> miteinander. Welche genau lässt sich schwer sagen,

Das läßt sich SEHR genau sagen, wenn man die Kommunikation mithört. Dazu 
gibt es verschiedene Tools, z.B. CANUSB.

http://canusb.com/

Dort sieht man JEDE Nachricht auf dem Bus, incl. Zeitstempel.

> meist sind es "die
> alten". Aber ich hatte auch schon mal den Fall, dass ein altes
> ausgestiegen ist und das neue funktioniert hat. - es hängen aber noch
> weitere Module am Bus welche eben nicht kommunizieren (nichts senden
> aber auch nichts empfangen - ich gehe davon aus, dass diese "beim
> Senden" sich aufhängen, weil die Nachricht nicht verschickt werden kann.

Du spekulierst. Lass das. Siehe Fehlersuche.

von Falk B. (falk)


Lesenswert?

mh schrieb:
> durch den Filter "passt", wird die Nachricht acknowleged.

In Teutonien, wo sogar der CAN-Bus erfunden wurde, nennt man das 
BESTÄTIGUNG!!

Diese Denglisch Kauderwelsch ist einfach nur widerlich und DUMM!

von Helmut -. (dc3yc)


Lesenswert?

mh schrieb:
> Nur wenn bei einem Empfänger die Nachricht
> durch den Filter "passt", wird die Nachricht acknowleged.

Nein! Ein ACK wird von jedem Knoten erzeugt, wenn die Nachricht korrekt 
mit CRC ist, egal, ob sie später durchs Filter passt oder nicht. Die 
Filterei passiert erst später. Jeder Knoten überprüft jede Nachricht auf 
Korrektheit. Das muss auch so passieren, damit die Prioritätssteuerung 
der Identifier funktioniert.

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.