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
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.
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.
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.
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.
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!
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.