Forum: Mikrocontroller und Digitale Elektronik Can Bus interface reagiert nicht. Was mache ich falsch?


von Felix K. (felix_k299)


Lesenswert?

Ich habe ein MeanWell BIC-2200 Netzteil das ich gerne per CANBus steuern 
möchte. Die Spezifikation findet man hier:
https://www.meanwell.com/Upload/PDF/BIC-2200-E.pdf
Ich nutze einen RasPi mit Can/RS485 HAT von Waveshare und habe alles 
soweit konfiguriert, dass ich mit cansend senden und per candump diese 
Nachricht auch empfangen kann. Dieser Part scheint also zu 
funktionieren.
Das CanHat ist mit 250000kbits konfiguriert und per Can_High und Can_low 
sowei Ground_Aux mit den Netzteil verbunden.

Ich versuche nun seit längerem das Netzteil zu einer Antwort zu bewegen 
aber nicht funktioniert.
Ich sende z.b. "cansend 000C0300#0000", um den Status abzufragen und 
sollte eine Antwort mit vom Netzteil mit dem byte "01" erhalten, aber 
nichts wird empfangen. Nur wiederrum die gesendete Nachricht.

Der Canbus ist beim Raspi mit 120ohm terminiert.
Hat einer von euch netten Menschen noch eine Idee?
Vielen Dank schonmal :)

von Falk B. (falk)


Lesenswert?

Felix K. schrieb:

> Das CanHat ist mit 250000kbits konfiguriert

Sicher nicht, denn das wären 250 Mbit ;-)

> und per Can_High und Can_low
> sowei Ground_Aux mit den Netzteil verbunden.

OK

> Der Canbus ist beim Raspi mit 120ohm terminiert.
> Hat einer von euch netten Menschen noch eine Idee?

Wie sieht das Signal auf dem Bus aus? Richtige Adresse beim Ansprechen 
verwendet?

von Sebastian (Gast)


Lesenswert?

Felix K. schrieb:
> Der Canbus ist beim Raspi mit 120ohm terminiert.

Der Widerstand zwischen CANH und CANL sollte 60 Ohm betragen. Fehlen die 
120 Ohm am Netzteilende des Busses?

LG, Sebastian

von Sebastian (Gast)


Lesenswert?

Felix K. schrieb:
> Nur wiederrum die gesendete Nachricht.

Hängt beim Empfang ein ACK vom Netzteil hinter der gesendeten Nachricht?

LG, Sebastian

von Falk B. (falk)


Lesenswert?

Sebastian schrieb:
> Der Widerstand zwischen CANH und CANL sollte 60 Ohm betragen.

Das stimmt, zum Test mit kurzem Kabel geht es aber auch mit 120 Ohm. Nur 
ganz ohne Terminierung geht es nicht, denn der rezessive Pegel wird nur 
dadurch hergestellt.

von Harald A. (embedded)


Lesenswert?

Felix K. schrieb:
> Nur wiederrum die gesendete Nachricht.
>
Du empfängst die gesendete Botschaft? Dann stimmt schon mal 
grundsätzlich etwas nicht. Aus Versehen so eine Art loopback aktiviert?

von Felix K. (felix_k299)


Lesenswert?

Bei ausgeschaltetem Netzteil bekomme ich im Candump das gesendete nicht 
zurück. Mittlerweile hab ich das Netzteil acuh zum Antworten bewegt. 
Allerdings reagiert es komsicherweise nur auf ein Kommando:
und zwar auf
000C0300#0000
darauf bekomme ich zuerst zweimal meine anfrage zurück.
und dann bei jedem weiteren mal einmal die anfrage und die korrekt 
Antwort mit 00 00 01 (Netzeil aktiv).
Hier der candump log:
1
  can0  000C0300   [2]  00 00
2
  can0  000C0300   [2]  00 00
3
4
  can0  000C0300   [2]  00 00
5
  can0  000C0200   [3]  00 00 01
6
7
  can0  000C0300   [2]  00 00
8
  can0  000C0200   [3]  00 00 01
9
10
  can0  000C0300   [2]  00 00
11
  can0  000C0200   [3]  00 00 01

Die Kommunikation funktioniert also grundsätzlichs, nur finde ich es 
auch komisch dass ich immer die Anfrage zurück bekomme, vieleicht ein 
Art Signalverstärker für nachfolgende Netzteile, weil man ja viele 
Netzteile parallel und per Can dann in Reihe schalten kann... hmm
Loopback ist aus. Wenn das Netzteil aus ist, bekomme ich auch keinerlei 
Reaktion in candump wenn ich etwas sende.

Jetzt nur das Problem: Kein anderes Kommando funktioniert.
cansend 000C0300#0062 sollte z.b. die Temperatur als Antwort 
zurückbringen, es passiert aber nicht. Sondern etwas sehr komisches:

candump zeigt wie aus einer Art Zwischenspeicher folgendes:
1
  can0  000C0300   [2]  00 62
2
  can0  000C0200   [3]  00 00 01
3
4
  can0  000C0300   [2]  00 62
5
  can0  000C0200   [3]  00 00 01
6
7
  can0  000C0300   [2]  00 62
8
  can0  000C0300   [2]  00 62

zweimal die ANtwort auf eine vorhereige Anfrage und dann weider das 
verhalten dass einfach wie beim Repeater das Originalkommando wiederholt 
wird. Ich versteh das nicht :/

Ich rufe das can Interface mit
1
sudo ip link set can0 type can bitrate 250000
2
sudo ifconfig can0 up

auf, also kein loopback.

von Harald A. (embedded)


Lesenswert?

„Signalverstärker“ kann nicht sein, es dürfte kein zweiter Teilnehmer 
einfach die Botschaft unter der gleichen ID noch einmal spiegeln. Das 
müsste irgendwie aus dem lokalen System kommen. Ansonsten hast Du bei 
dem 0x62 vermutlich Low- und High-Byte vertauscht, kann das sein?

Kommando 0x0062 ist auf dem CAN Bus 62 00

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

Harald A. schrieb:
> Felix K. schrieb:
>> Nur wiederrum die gesendete Nachricht.
>>
> Du empfängst die gesendete Botschaft? Dann stimmt schon mal
> grundsätzlich etwas nicht.

Das kommt auf die Einstellung des CAN-Controllers an. Jeder 
CAN-Controller liest beim Senden die gesendete Botschaft auch wieder 
zurück. Das muss er schon alleine wegen der Arbitrierung tun. Je nach 
Einstellung kommt die dann auch wieder als Empfangene Botschaft an oder 
wird unterdrückt.

Felix K. schrieb:
> Loopback ist aus. Wenn das Netzteil aus ist, bekomme ich auch keinerlei
> Reaktion in candump wenn ich etwas sende.

Das sollte auch nicht funktionieren, weil dann keiner das Ack setzt. 
Dann gilt die Botschaft als nicht erfolgreich gesendet.

> Ich rufe das can Interface mit
> sudo ip link set can0 type can bitrate 250000
> sudo ifconfig can0 up
>
> auf, also kein loopback.

Wo hast du es denn ausgeschaltet? Unter 
https://docs.kernel.org/networking/can.html heißt es:

"The loopback functionality is enabled by default to reflect standard 
networking behaviour for CAN applications. Due to some requests from the 
RT-SocketCAN group the loopback optionally may be disabled for each 
separate socket. See sockopts from the CAN RAW sockets in RAW Protocol 
Sockets with can_filters (SOCK_RAW)."

von Harald A. (embedded)


Lesenswert?

Ich muss mich korrigieren, wenn ich mich richtig erinnere zeigt candump 
auch die eigenen gesendeten Nachrichten.

EDIT: Zeitgleich mit der Antwort von Rolf

EDIT2: Der CAN Controller INTERN liest natürlich mit, CANSEND und 
CANDUMP sind als Systemfunktionem aber nach meinem Verständnis nicht auf 
der Ebene sondern bedienen den CAN Controller ja nur. Ich kann mich aber 
erinnern, dass ich dieses Verhalten von candump schon einmal etwas 
schräg fand.

: Bearbeitet durch User
von Felix K. (felix_k299)


Lesenswert?

Dann ist das ja schonmal normal, dass man die Nachrichten im Candump 
sieht. wenn man loopback noch zusätzlich aktiviert, dass sehe ich die 
Nachrichten auch wenn das Netzteil aus ist.
Komischweise funktioniert die Kommunikation, also die Antowrt auf diese 
eine Nachricht, die funktioniert (000c0300#0000-->000c0200#000001), nur 
ohne Terminale Wiederstände, was für mich keinen Sinn macht, da das 
Raspi Bord angeblich keinen an Bord hat und in der SPezifiaktion vom 
Netzteil dazu auch gar nichts gesagt wird. :/

Andererseits frage ich mich, wieso wenn eine Nachricht ein Ergbnis 
bringt, alle anderen ins leere laufen und doppelt im Candump erscheinen. 
Einmal wohl das selbst gesendete und das andere veilleucht die 
Reflektion beim Netzteil, weil ohne Wiederstand :( .
Ich probiere mal paar andere wiederstände, irgendwas ist faul.

EDIT: Danke auf jeden fall schonmal für die Ideen.
EDIT2: Aha, ich messe im Pi-HAT einen wiedestand von 120 ohm, ist dort 
also wohl schon auf der platine

: Bearbeitet durch User
von Harald A. (embedded)


Lesenswert?

Felix K. schrieb:
> ohne Terminale Wiederstände, was für mich keinen Sinn macht, da das
> Raspi Bord angeblich keinen an Bord hat und in der SPezifiaktion vom
> Netzteil dazu auch gar nichts gesagt wird. :/

Standard ist bei CAN Teilnehmer kein integrierter Widerstand, man kann 
als Hersteller ja nicht wissen, ob es das physikalische Ende des Busses 
ist.
>
> Andererseits frage ich mich, wieso wenn eine Nachricht ein Ergbnis
> bringt, alle anderen ins leere laufen und doppelt im Candump erscheinen.


> Einmal wohl das selbst gesendete und das andere veilleucht die
> Reflektion beim Netzteil, weil ohne Wiederstand :( .
> Ich probiere mal paar andere wiederstände, irgendwas ist faul.

Es gibt keine Reflektion von Nachrichten aufgrund eines falschen 
Widerstandes. Das physikalisch offene Ende (die „Reflexion“) kann keine 
Nachrichten speichern.

Andere Widerstände sind Blödsinn, bei ganz kurzen Kabeln kann es auch 
mal ohne Widerstand funktionieren, ist aber eher ein Zufallsprodukt.

120Ohm an beiden Enden oder auch nur an einem Ende bei kurzen 
Verbindungen sind absolut in Ordnung.

: Bearbeitet durch User
von Harald A. (embedded)


Lesenswert?

Drehe doch erstmal Low- und Highbyte, mein obiger Beitrag ist 
offensichtlich (bei dir) verschütt gegangen.

von Rolf M. (rmagnus)


Lesenswert?

Harald A. schrieb:
> Felix K. schrieb:
>> ohne Terminale Wiederstände, was für mich keinen Sinn macht, da das
>> Raspi Bord angeblich keinen an Bord hat und in der SPezifiaktion vom
>> Netzteil dazu auch gar nichts gesagt wird. :/
>
> Standard ist bei CAN Teilnehmer kein integrierter Widerstand, man kann
> als Hersteller ja nicht wissen, ob es das physikalische Ende des Busses
> ist.

Es gibt auch welche mit schaltbaren Widerständen, entweder per Jumper 
oder sogar per Software. Aber wenn im Handbuch nix dazu steht, würde ich 
auch davon ausgehen, dass keiner da ist. Kann man aber einfach mit einem 
Multimeter nachmessen.

> 120Ohm an beiden Enden oder auch nur an einem Ende bei kurzen
> Verbindungen sind absolut in Ordnung.

Ja. Ganz ohne funktioniert es fast nie, bei zu vielen Widerstanden 
gibt's irgendwann auch Probleme, weil die Last zu groß wird, aber 
ansonsten ist CAN da sehr robust.

von Felix K. (felix_k299)


Lesenswert?

Oh mein gott,
vielen Dank.
Das macht natürlich Sinn. Ich habe keine Ahnung von CAN und scheitere an 
solchen Basics. Das hat geklappt und erklärt auch warum 00 00 als 
kommando funktioniert. Dass kann man ja drehen und wenden, wie man will 
und es bleibt das selbe :)

Ich habe also Low und High Byte nicht richitg angeordnet ;)

Danke euch udn besonders dir, Harald!

von Felix K. (felix_k299)


Lesenswert?

Genau, das Netzteil hat keinen schaltbaren oder festen Wirderstand aber 
beim Board habe ich mit Multimeter 120 gemessen, auch wenn ich auf der 
Website von Waveshare zu diesem modell nix zu einem Widerstand finde.

: Bearbeitet durch User
von Harald A. (embedded)


Lesenswert?

Felix K. schrieb:
> Genau, das Netzteil hat keinen schaltbaren oder festen Wirderstand aber
> beim Board habe ich mit Multimeter 120 gemessen, auch wenn ich auf der
> Website von Waveshare zu diesem modell nix zu einem Widerstand finde.

Bereits fest eingebauter Widerstand ist häufig bei RS485 oder CAN 
Shields, die für „allgemeinen Experimentierbedarf“ entworfen wurden, der 
Fall. Vermutlich wollen die Entwickler damit das Erfolgserlebnis für 
Gelegenheitsuser erhöhen, die dem Widerstand nicht so viel Bedeutung 
zumessen. Der Widerstand ist ja eben nicht nur ein reiner 
Terminierungswiderstand sondern auch ein Arbeitswiderstand, damit sich 
die Pegel am Bus überhaupt ausbilden können (wie Falk schon schrieb). 
Jaja, ganz ohne Widerstand kann es auch funktionieren, aber nur in sehr 
engen Grenzen.

Ein erfahrener Anwender erarbeitet sich die beste Lage der Widerstände 
sowieso noch einmal genauer.

: Bearbeitet durch User
von Rudolph R. (rudolph)


Lesenswert?

Felix K. schrieb:
> aber
> beim Board habe ich mit Multimeter 120 gemessen, auch wenn ich auf der
> Website von Waveshare zu diesem modell nix zu einem Widerstand finde.

Die haben den Schaltplan im Wiki: 
https://www.waveshare.com/w/upload/1/1d/RS485_CAN_HAT_Schematic.pdf -> 
R12.

von Sebastian W. (wangnick)


Lesenswert?

Felix K. schrieb:
> Andererseits frage ich mich, wieso wenn eine Nachricht ein Ergbnis
> bringt, alle anderen ins leere laufen und doppelt im Candump erscheinen.

Du könntest auch einen Logik-Analysator an RXD des SN65HVD230 bzw. an 
RXCAN des MCP2515 klemmen und dir dort die Vorgänge auf dem CAN-Bus im 
Detail ansehen. Da wird vieles dann doch noch klarer.

LG, Sebastian

: Bearbeitet durch User
von Udo E. (grisu74)


Lesenswert?

Hallo,

ich benutze einen esp32 mit mcp2515.
Leider bekomme ich keine Antwort von Lader. Meanwell npb 1700.

Bekomme ich hier noch Hilfe?

Gruß Udo

von Alexander (alecxs)


Lesenswert?

Du meinst sicher einen TJA1050 als fertiges Modul über SPI mit der 
entsprechenden Arduino Library.

von Udo E. (grisu74)


Lesenswert?

Hallo,

ich mache das ganze über esphome.
Im mcp2515 ist ein TJA1050 verbaut soweit ich das verstehe.

Ich habe 2 Gegenstellen zum Test aufgebaut und die Kommunikation 
funktioniert hier.
Der BUS funktioniert also.
Hi und Low-bit kann ich nicht drehen, da ich einen Fehler bei 0x8000 
bekomme.
Da der Wert über 255 ist.

Aber 8ch bekomme auf die 0x0000 auch keine Antwort. Deswegen Versuche 
ich hier mein Glück.
Die Verkabelung zum Lader checke ich heute nochmal. Angeschlossen sind 
CanH CanL und GND.
Gruß Udo

von Alexander (alecxs)


Lesenswert?

auf den Modulen sind Jumper drauf für die Terminierung, damit mal 
rumspielen

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Wer mit CAN Bus experimentiert, dem empfehle ich einen zusätzlichen CAN 
Adapter zu kaufen, damit hat man eine unabhängige Kontrolle was 
tatsächlich auf dem Bus übertragen wird.

Der von der Firma PEAK-System ist relativ günstig, die Software sehr gut 
und die bieten sogar eine API mit dem man eigene Programme schreiben 
kann.
https://www.peak-system.com/PCAN-USB-FD.365.0.html

Ich habe von denen mehrere, weil die mir so gut gefallen und ich habe 
auch schon ein paar Programme dafür selbst für den PC geschrieben.
Der Link zeigt auf einen USB Adapter der FD-CAN fähig ist und kompatibel 
zu CAN. Es gibt einen "nur CAN" Adapter, den empfehle ich jedoch nicht 
zu kaufen, da FD-CAN die Zukunft ist und man nur einmalig Geld dafür 
ausgeben möchte.

von Alexander (alecxs)


Lesenswert?

Machst Du hier Schleichwerbung für PEAK-PCAN? Da ist auch nix anderes 
drin wie auf dem Arduino Modul, nur Faktor 10 teurer.

: Bearbeitet durch User
von Udo E. (grisu74)


Lesenswert?

Das Modul ist mir zu teuer. :-)

Also der Jumper ist aktiviert. Sprich terminiert.
Das Kabel zum Lader ist ca 5cm lang. Sollte also nichts stören.
Meanwell habe ich schon angeschrieben. Leider keine Antwort.

An dem Lader hängt kein Akku.
Das sollte aber nicht das Problem sein oder?
DIP Schalter sind auf programmieren gestellt.

Was ich nicht genau kapiere sind die Adressen oder IDs

Charger to controller message ID
Controller to charger message ID
Controller broadcasts to charger message ID
Message ID
0x000C00XX
0x000C01XX
0x000C01FF

Welche Adresse hat der Lader

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Udo E. schrieb:
> Welche Adresse hat der Lader
Laut deinem Manual im Kapitel 5.10.2 ist da nichts mit 000c00xx und 
000co1xx dabei...

: Bearbeitet durch Moderator
von Udo E. (grisu74)



Lesenswert?

Sorry,

ich hatte vergessen zuschreiben das es sich um ein NPB 1700 handelt.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Felix K. schrieb:
> Allerdings reagiert es komsicherweise nur auf ein Kommando:
> und zwar auf
> 000C0300#0000
> darauf bekomme ich zuerst zweimal meine anfrage zurück.
Eigentlich kannst du deine Anfrage nicht "zurückbekommen", denn CAN 
funktioniert nicht wie eine übliche serielle Schnitte mit 2 Teilnehmern. 
CAN funktioniert so, dass irgendwer auf dem Bus irgendeine Message mit 
einer bestimmten ID auf dem Bus sendet. Und wenn es mindestens 1 
Teilnehmer auf dem Bus gibt, der diese ID kennt und die Message brauchen 
kann, dann legt der das ACK auf den Bus.

Felix K. schrieb:
> Ich nutze einen RasPi mit Can/RS485 HAT von Waveshare und habe alles
> soweit konfiguriert, dass ich mit cansend senden und per candump diese
> Nachricht auch empfangen kann.
Geschickt ist es immer, wenn man 2 solcher Geräte miteinander verbinden 
und untereinander kommunizieren kann. Dann weiß man schon mal, dass die 
eigene Hardware tut.

> noch eine Idee?
Ich würde erst mal sicherstellen, dass der CAN-Bus hardwaremäßig gut 
funktioniert. Also mit dem Oszi die Pegel und Flanken sowie das Timing 
auf beiden Busleitungen kontrollieren. Und dann noch schauen, was sich 
überhaupt auf dem Bus tut und ob da irgendwas ausser deiner eigenen 
Message auf dem Bus unterwegs ist.

EDIT zum Thema Oszi:
wenn du den Bus beidseitig mit 120R terminierst und einen 4R7 Widerstand 
in die beiden Busleitungen schleifst, dann kannst du mit dem Oszi leicht 
erkennen, welcher der beiden Teilnehmer grade das dominante Bit auf den 
Bus legt.
1
                                 Oszi
2
                          Kanal A    Kanal B
3
                             |          |
4
                             v          v
5
    CanHi ----o-------------------4R7---------------o---- CanHi
6
              |                                     |
7
      A      120R                                 120R      B
8
              |                                     |
9
    CanLo ----o-------------------4R7---------------o---- CanLo

: Bearbeitet durch Moderator
von Alexander (alecxs)


Lesenswert?

Udo E. schrieb:
> Also der Jumper ist aktiviert. Sprich terminiert.

Und warum?

von Udo E. (grisu74)


Lesenswert?

Alexander schrieb:
> Udo E. schrieb:
>> Also der Jumper ist aktiviert. Sprich terminiert.
>
> Und warum?

Ich habe den Jumper auch schon deaktiviert. Gleiches Ergebniss.

Das System Can Bus habe ich verstanden.
Ich habe eine ID und sende einen Command. Die Gegenstelle oder der 
Teilnehmer antwortet nur wenn er das in seinem Code hinterlegt hat.

Ich habe 2 ESP32 die miteinander kommunizieren können.
Nur die Kommunikation mit dem Lader funktioniert leider nicht.

von Helmut -. (dc3yc)


Lesenswert?

Lothar M. schrieb:
> Und wenn es mindestens 1
> Teilnehmer auf dem Bus gibt, der diese ID kennt und die Message brauchen
> kann, dann legt der das ACK auf den Bus.

Nein, das ACK wird immer dann gesendet, wenn mindestens ein Empfänger 
die Richtigkeit der Message auf dem Bus incl. CRC bestätigen kann, egal, 
ob der Identifier bzw. die Message für ihn gedacht ist oder nicht.

: Bearbeitet durch User
von Udo E. (grisu74)


Angehängte Dateien:

Lesenswert?

Helmut -. schrieb:
> Lothar M. schrieb:
>> Und wenn es mindestens 1
>> Teilnehmer auf dem Bus gibt, der diese ID kennt und die Message brauchen
>> kann, dann legt der das ACK auf den Bus.
>
> Nein, das ACK wird immer dann gesendet, wenn mindestens ein Empfänger
> die Richtigkeit der Message auf dem Bus incl. CRC bestätigen kann, egal,
> ob der Identifier bzw. die Message für ihn gedacht ist oder nicht.

Dann ist meine Message nicht richtig??

Ich sende 0x0080 das ist laut Anleitung der Herstellername zum lesen.

von Alexander (alecxs)


Lesenswert?

was bedeutet R und R/W? klingt für mich nach read/write. was du machst 
ist W schreiben oder?

Terminierung mal gemessen? Wieviel Ohm? Soweit ich mich erinnere ist da 
ein 500 Ohm Widerstand auf dem Modul verbaut.

: Bearbeitet durch User
von Udo E. (grisu74)


Lesenswert?

Alexander schrieb:
> was bedeutet R und R/W? klingt für mich nach read/write. was du machst
> ist W schreiben oder?
>
> Terminierung mal gemessen? Wieviel Ohm? Soweit ich mich erinnere ist da
> ein 500 Ohm Widerstand auf dem Modul verbaut.

R und W ist Lesen und Schreiben.
Manche Werte können nur gelesen werden.

Aber so weit bin ich noch lange nicht.

von Alexander (alecxs)


Lesenswert?

Erstmal würde ich die Rate checken und dann bruteforcen. Kann ja am Code 
liegen, dass zwei ESP32 miteinander reden heißt ja nichts.

von Udo E. (grisu74)


Lesenswert?

Alexander schrieb:
> was bedeutet R und R/W? klingt für mich nach read/write. was du machst
> ist W schreiben oder?
>
> Terminierung mal gemessen? Wieviel Ohm? Soweit ich mich erinnere ist da
> ein 500 Ohm Widerstand auf dem Modul verbaut.

Also Wiederstand ist 120 Ohm zwischen CanH und CanL

von Alexander (alecxs)


Lesenswert?

also wenn Du sicher bist Du sendest mit 250 kbps und 29-bit und Du hast 
die Kabel nicht vertauscht, dann bleibt nur der Griff zum Oszilloskop.

: Bearbeitet durch User
von Sebastian W. (wangnick)


Angehängte Dateien:

Lesenswert?

Alexander schrieb:
> also wenn Du sicher bist Du sendest mit 250 kbps und 29-bit und Du hast
> die Kabel nicht vertauscht, dann bleibt nur der Griff zum Oszilloskop.

Alternativ, wie gesagt, ein Logikanalysator am RX-Pin des Transceivers, 
in diesem Fall am TJA1050.

LG, Sebastian

von Alexander (alecxs)


Lesenswert?

oder gleich direkt an den ESP32 anschließen ohne SPI

von Udo E. (grisu74)


Lesenswert?

Ich schreibe jetzt direkt ein Programm über Arduino. Danach berichte ich 
nochmals. Ich hoffe das klappt besser.

von Alexander (alecxs)


Lesenswert?

Nimm doch erstmal die fertige SPI Bibliothek <mcp2515.h> direkt alles 
selbst schreiben kannst du ja immer noch.

: Bearbeitet durch User
von Udo E. (grisu74)


Lesenswert?

Hallo,

ich probiere jetzt erst Mal MCP-CAN
https://github.com/coryjfowler/MCP_CAN_lib

Nur mit der Pinbelegung muss ich noch rumspielen, da ich einen NodeMCU 
ESP32 verwende.

von Matej L. (matej_l)


Lesenswert?

Hi there,
I've struggled for the past few days with similar issue. I was using 
mcp_can library and after checking that all the registries were setup 
correctly and all my hardware was fine and and and....checking 
everything!
I then realised with the help of meanwell support that in CANbus you 
have to swtich the LSB with MSB!

When you send the command, let's say for IOUT_SET (0x0030), you have to 
send it with the two bytes in the opposite order, like so:

byte data[] = {0x30, 0x00};

Hope this helps someone as I was banging my head for a long time!

von Udo E. (grisu74)


Lesenswert?

Hallo,

mittlerweile habe ich das Problem gelöst.

Es war ein Wahnsinns weg um am Schluss doch festzustellen, das am Anfang 
alles richtig war!!!

Hier die Lösung.

Der ESP32 funktioniert super mit dem MCP2515.
Hierzu nutze ich ESPHome in meinem Homeassistant.

Wie in dem letzten Post schon steht, muss das LowBIT als 1. abgefragt 
werden.
Das habe ich aber schon in einem Post von einer anderen Seite gelesen.

Ich habe mir mit einem Arduino UNO ein CanHack Board gebastelt.
Darüber konnte ich mittels der Software CanHacker Befehle zum Ladegerät 
senden und auch visualisieren.
Komischerweise funktionierte das. Nur über ESP32 eben nicht.

Dann hatte ich die Idee mal statt extendet-ID eine normale ID zu senden.
Und siehe da. es funktionierte.

Um das ganze kurz zu machen, habe ich zum Schluss dem MCP2515 getauscht 
und musste feststellen, das er das Problem war.

Mit einem anderen funktioniert alles perfekt.
Falls jemand Interesse hat, helfe ich gerne, da ich hier echt am 
verzweifeln war.

Gruß Udo

von Giuseppe M. (drdigital)


Lesenswert?

Hallo Udo,
ich habe mir ebenfalls ein Meanwell NPB-1700-24 bestellt.
Ich würde dieses ebenfalls gerne mit Home Assistent oder IP-Symcon 
nutzen bzw. regeln.
Da Canbus für mich komplett neu ist, wollte ich mich schon mal etwas 
einarbeiten.
Gibt es irgendwo eine Anleitung von Dir wie Du das mit ESP Home gemacht 
hast?

Gruß
Giuseppe

von Udo E. (grisu74)


Lesenswert?

Hallo Giuseppe,

ich kann dir da gerne helfen.
Anleitung ist in meinem Kopf.
Allerdings nur mit homeassistant.
Es gibt auch noch einiges das du über die CAN Steuerung wissen musst. 
Das Ladegerät muss eingestellt werden.

Wie weit bist du.

Gruß Udo

von Giuseppe M. (drdigital)


Lesenswert?

Hallo Udo,
Danke für die schnelle Antwort.
Aktueller Stand ist Ladegerät bestellt, Lieferung wird aber leider noch 
dauern.
Wie geschrieben wollte ich aber schon mal alles vorbereiten und mich in 
Canbus etwas einarbeiten.
Ich habe mehrere ESP32 und Arduinos da und habe auch schon das ein oder 
andere mit ESP Home gemacht. Von den MCP2515 habe ich einen 3-Pack hier 
und einen Waveshare USB to Can habe ich ebenfalls bestellt, dürfte 
Morgen eintreffen.
Homeassistant ist vollkommen ok für mich, wichtig ist, dass ich mal 
einen Startpunkt habe. Eine Beispiel ESP Home Yaml wäre z.B. ganz cool 
dann könnte ich mir die genauer ansehen und versuchen zu verstehen.

Gruß
Giuseppe

von Udo E. (grisu74)


Lesenswert?

Hallo,

du benötigst auf jeden Fall die CAN Anleitung vom Ladegerät.
Ich habe einen ESP32 mit MCP2515. Und das funktioniert.

Hier mal ein kleiner Teil meiner Config.
1
spi:
2
  id: McpSpi
3
  clk_pin: GPIO18
4
  mosi_pin: GPIO23
5
  miso_pin: GPIO19
6
7
time:
8
  - platform: homeassistant
9
    on_time: 
10
      seconds: /5
11
      then: 
12
        - canbus.send: 
13
            canbus_id: my_mcp2515
14
            use_extended_id: True
15
            data: [0x30, 0x00]
16
            can_id: 0x000C0103
17
        - lambda: |-
18
           ESP_LOGD("CAN Strom abfragen","",""); 
19
        - delay: 
20
            milliseconds: 100
21
22
canbus:
23
  - platform: mcp2515
24
    id: my_mcp2515
25
    spi_id: McpSpi
26
    cs_pin: GPIO5
27
    clock: 8MHZ
28
    bit_rate: 250KBPS 
29
30
    on_frame: 
31
    - can_id: 0x000C0003
32
      #can_id_mask: 0x1fffffff   
33
      use_extended_id: true
34
      then: 
35
      - lambda: |-
36
          if(x[0]==0x88 and x[1]==0x00) {
37
          int seriennummer =int((x[2]) & (x[3]));
38
          int wert2 =int(x[2]);
39
          int wert3 =int(x[3]);         
40
          ESP_LOGD("main", "Antwort von 00 Hex: %x %x ",  wert2, wert3);
41
          }
42
      - lambda: |-
43
          if(x[0]==0xC1 and x[1]==0x00) {
44
          int systemstatus =float(float((int((x[2])+( (x[3])<<8))))/100);
45
         
46
          ESP_LOGD("main", "Der SYSTEM_SATUS ist %f", systemstatus);
47
          } 
48
      - lambda: |-
49
          if(x[0]==0x30 and x[1]==0x00) {
50
          float leistung =float(float((int((x[2])+( (x[3])<<8))))/100);
51
          id(ladestrom_ampere).publish_state(leistung);
52
          ESP_LOGD("main", "Der Ladestrom ist %f", leistung);
53
          }

von Giuseppe M. (drdigital)


Lesenswert?

Hallo Udo,
Danke, werde es am Wochenende mal testen.
Manual vom Netzteil mit den Canbus Adressen/Befehlen usw. habe ich mir 
schon heruntergeladen.
Werde mir mal einen Testaufbau mit zwei Canbus ESP32 erstellen
und die ersten versuche starten.
Falls ich irgendwo hänge, melde ich mich wieder.

Gruß
Giuseppe

von Giuseppe M. (drdigital)


Lesenswert?

Hallo Udo,

habe nun die ersten Tests gemacht.
Mit zwei ESP32 und Canbus Transceiver SN65HVD230.
Senden und empfangen klappt schon mal.
Ich habe mir auch Deinen Codeschnipsel oben angesehen und die 
Bedienungsanleitung vom Netzteil.
In Deinem Beispiel oben ist das Auslesen des Ladestroms drin.
1
time:
2
  - platform: homeassistant
3
    on_time: 
4
      seconds: /5
5
      then: 
6
        - canbus.send: 
7
            canbus_id: my_mcp2515
8
            use_extended_id: True
9
            data: [0x30, 0x00]
10
            can_id: 0x000C0103
11
        - lambda: |-
12
           ESP_LOGD("CAN Strom abfragen","",""); 
13
        - delay: 
14
            milliseconds: 100
Könntest Du mir noch den Codeschnipsel senden wie man den Ladestromwert 
setzt?

Reicht es wenn einfach bei data an die 0x30 der gewünschte Wert 
angehängt wird?

von Udo E. (grisu74)


Lesenswert?

Hallo Giuseppe,

ich habe den Ladestrom über einen Schieberegler gelöst.
Dadurch kann ich den Ladestrom je na übrigen Sonnenstrom automatisch 
ändern.

hier mal der Code:
1
number:
2
  - platform: template
3
    optimistic: True
4
    max_value: 50
5
    min_value: 10
6
    step: 1
7
    id: "ladestrom"
8
    name: "Ladestrom"
9
    on_value: 
10
        then:
11
          - if:
12
              condition:
13
                  lambda: |-
14
                    return (id(ladestrom).state == 10);
15
              then:
16
                    - lambda: |-
17
                         ESP_LOGD("10 Ampere","id(ladestrom).state", int(id(ladestrom).state));
18
                         uint32_t can_id = 0x000C0103;
19
                         bool use_extended_id = 1;
20
                         std::vector< uint8_t > data{ 0x30, 0x00, 0xE8, 0x03 };
21
                         id(my_mcp2515)->send_data(can_id, use_extended_id, data);
22
          - if:
23
              condition:
24
                  lambda: |-
25
                    return (id(ladestrom).state == 11);
26
              then:
27
                    - lambda: |-
28
                         ESP_LOGD("11 Ampere","id(ladestrom).state", int(id(ladestrom).state));
29
                         uint32_t can_id = 0x000C0103;
30
                         bool use_extended_id = 1;
31
                         std::vector< uint8_t > data{ 0x30, 0x00, 0x4C, 0x04 };
32
                         id(my_mcp2515)->send_data(can_id, use_extended_id, data);

von Giuseppe M. (drdigital)


Lesenswert?

Hallo Udo,
vielen Dank.
Jetzt verstehe ich wie ich die Werte ans Netzteil senden kann.
Damit müsste ich es hinbekommen.
Ich muss bei mir halt noch den Überschuss, den ich ja AC seitig habe, 
noch umrechnen für DC Seite und dann möchte ich ebenfalls automatisiert 
den Akku Ladestrom einstellen.

Wenn das Netzteil endlich da ist und ich das ganze in die Praxis 
umgesetzt habe, gebe ich noch mal Rückmeldung.

Gruß
Giuseppe

von Giuseppe M. (drdigital)


Lesenswert?

Kurze Zwischeninfo.
Netzteil ist leider noch nicht da.

Aber ich ich habe schon einiges mit Canbus getestet.
Wie ich geschrieben hatte würde ich bevorzugt IP-Symcon 
(https://www.symcon.de/de/) einsetzen.
Deshalb habe ich esp-idf-can2mqtt ausprobiert
(https://github.com/nopnop2002/esp-idf-can2mqtt).
Damit kann ich Canbus Befehle über das ESP Gateway mit IPS senden und 
empfangen.
Aktuell versuche ich esp-idf-can2mqtt auf einen Olimex EVB Bord zu 
packen.
Dann hätte ich ein Ethernet Gateway mit can2mqtt und mqtt2can.
Damit kann ich mein Projekt sicherlich realisieren.
Nochmals vielen Dank für die sehr hilfreiche Unterstützung.
Wenn das Projekt fertig ist, gebe ich noch mal Rückinfo.

Gruß
Giuseppe

von Giuseppe M. (drdigital)


Lesenswert?

Hallo,
ich brauche wohl doch noch weitere Hilfe.
Wie geschrieben, versuche ich can2mqtt auf den Olimex EVB zu flashen.
Ich bin auch soweit gekommen, dass es tatsächlich läuft, aber eben nur 
per WLAN. Ich würde aber gerne LAN nutzen. Deshalb die Frage hier in die 
Runde, kennt sich hier jemand gut mit der ESP IDF aus und könnte mich in 
die richtige Richtung führen damit ich den Olimex LAN Treiber in das 
can2mqtt Projekt einbinden kann?
https://github.com/OLIMEX/ESP32-EVB/tree/master/SOFTWARE/ESP-IDF%20examples/ESP32-EVB_Ethernet_v5.1.1

: Bearbeitet durch User
von Giuseppe M. (drdigital)


Angehängte Dateien:

Lesenswert?

Netzteil ist zwischenzeitlich angekommen.
Olimex EVB hat per WLAN und MQTT wie erwartet funktioniert.
Da ich es aber unbedingt mit LAN realisieren wollte,
habe ich mir ein Can to Eth Gateway besorgt.
https://www.waveshare.com/wiki/2-CH-CAN-TO-ETH
Damit kann ich nun den Ladestrom mit meiner Smarthome Software regeln 
(siehe Bild).

von Philipp C. (e61_phil) Benutzerseite


Lesenswert?

Hallo zusammen,

ich habe heute mein NPB-450 erhalten und wollte es auch bedarfsgerecht 
steuern.

Das Kommando 0x0030 (IOUT_SET) scheint keinen wirklichen Einfluss auf 
den Ladestrom zu haben. Gesetzt wird es aber wohl richtig, weil ich den 
gesetzten Wert auch zurücklesen kann.

Über 0x00B0 (CURVE_CC) kann ich den Ladestrom steuern (ergibt auch Sinn, 
solange sich das Ladegerät in der Konstantstromphase befindet), aber 
hier wird eine neuer Wert erst übernommen, wenn ich den Lader einmal 
aus- und wieder einschalte.

Ist das bei euch genauso?

Viele Grüße
Philipp

von Giuseppe M. (drdigital)


Angehängte Dateien:

Lesenswert?

Hallo,
Worüber ich ganz zu Beginn gestolpert bin ist, dass Netzteil hat von 
Haus aus Ladekurve eingestellt. Du musst das aber abschalten und auf 
Manuelle Ladekurve gehen.
Bit 7 musst auf 0 stellen, erst dann nimmt er Ladestromänderungen per 
Canbus an.
Die 3 DIP Schalter müssen auf off sein und der Jumper für Remote On/Off 
sollte dran bleiben.
Wenn das BIT 7 auf 0 gestellt hast nicht vergessen das Netzteil Stromlos 
zu machen und neu zu starten.

von Philipp C. (e61_phil) Benutzerseite


Lesenswert?

Giuseppe M. schrieb:
> Hallo,
> Worüber ich ganz zu Beginn gestolpert bin ist, dass Netzteil hat von
> Haus aus Ladekurve eingestellt. Du musst das aber abschalten und auf
> Manuelle Ladekurve gehen.
> Bit 7 musst auf 0 stellen, erst dann nimmt er Ladestromänderungen per
> Canbus an.
> Die 3 DIP Schalter müssen auf off sein und der Jumper für Remote On/Off
> sollte dran bleiben.
> Wenn das BIT 7 auf 0 gestellt hast nicht vergessen das Netzteil Stromlos
> zu machen und neu zu starten.

Vielen Dank, darüber bin ich jetzt auch zufällig gestolpert :)

Was auch viel gebracht hat, war das aktuelle Datenblatt online 
anzuschauen. Dort sind viele Dinge erklärt, die in dem Manual, welches 
beim Netzteil dabei war gar nicht erwähnt sind (z.B. was sofort 
umgesetzt wird und was erst beim aus- und einschalten).

Leider kann mein Netzteil das Schreiben ins EEPROM noch nicht 
abschalten. Kennt jemand eine Quelle, aus der man ein NPB bekommt, 
welches schon die neueste Firmware hat?

Hat jemand schon versucht den Strom noch kleiner einzustellen, als es 
eigentlich vorgesehen ist? Der Trucki-Stick, der in vielen Youtube 
Kanälen angepriesen wird scheint dies zu können. Wenn ich es richtig 
verstehe, dann wird dazu die Spannung reduziert.

Viele Grüße
Philipp

von Udo E. (grisu74)


Lesenswert?

Hallo,

warum möchtest du das Ladegerät nicht kleiner einstellen?
Bei meinem sind es 10A. Das entspricht ca. 200-300W.

Was ist die kleinste Stufe bei deinem?

Gruß Udo

von Philipp C. (e61_phil) Benutzerseite


Lesenswert?

Udo E. schrieb:
> warum möchtest du das Ladegerät nicht kleiner einstellen?
> Bei meinem sind es 10A. Das entspricht ca. 200-300W.
>
> Was ist die kleinste Stufe bei deinem?

Ich würde es gerne nahezu von 0A einstellen können. Ich habe aktuell ein 
450W 12V Ladegerät. Dieses startet bei 5A. Ich habe nicht das 750W 
Modell genommen, weil dies bei noch größerem Strom startet (wobei das 
passender gewesen wäre).

Aktuell kann ich zwischen 5A und 25A einstellen. Das entspricht ca. 75W 
bis 380W.

Verwendet hier noch jemand ESPHome um das NFB zu steuern? Ich benutzte 
einen MCP2515 CAN Controller an einem ESP32 mit ESPHome. (Vielen Dank 
für den Code, das hat den Einstieg sehr erleichtert, Udo!)

Ab und zu lese ich zB bei der Akkuspannung 18V zurück. Hier scheint ab 
und zu etwas nicht ganz sauber in der Kommunikation zu sein.

Viele Grüße
Philipp

von Matej L. (matej_l)


Lesenswert?

Hey,

You won't be able to set the charging current below the minimum that is 
stated in the datasheet.
I haven't used ESPHome but my code in c++ works well for setting and 
reading, have no problems with that. You'd have to either hook up a 
logical analyser or or look into the controller's response somehow else. 
I guess you sorted out the termination correctly? Keep in mind that NPBs 
have an internal termination resistor already.

Matej

von Udo E. (grisu74)


Lesenswert?

Wenn du noch Hilfe benötigst, melde dich einfach.
Ich war lange auf der Suche nach der richtigen Verkabelung usw.
Ich nutze das ganze über ESP Home an Homeassistant.

Hier noch ein Tipp.
Falls du ein BMS verwendest, würde ich das Entladen schon bei unter 5% 
beenden, da das Ladegerät sonst Macken bezüglich der Erkennung des Akkus 
macht.
Ich schalte das Ladegerät auch nicht aus, sonder nutze die ein/aus 
Funktion über den CANBus.

Gruß Udo

von Giuseppe M. (drdigital)


Lesenswert?

Hallo,
hier mal Link in dem ich meine Umsetzung / Regelung genauer beschrieben 
habe.
https://community.symcon.de/t/canbus-ladegeraet-in-symcon-einbinden/136578
Vielleicht hilft es den ein oder anderen weiter.

Gruß
Giuseppe

von Philipp C. (e61_phil) Benutzerseite


Lesenswert?

Hallo,

Matej L. schrieb:
> You won't be able to set the charging current below the minimum that is
> stated in the datasheet.

Kleinere Ströme sind möglich, wenn man VOUT reduziert und diese einfach 
nur wenige 10mV über die aktuelle Batteriespannung setzt.

Udo E. schrieb:
> Falls du ein BMS verwendest, würde ich das Entladen schon bei unter 5%
> beenden, da das Ladegerät sonst Macken bezüglich der Erkennung des Akkus
> macht.

Mein BMS hat leider keine Schnittstelle. Ich habe zwei 12V 100Ah Akkus 
parallel (12V, weil ich dafür schon einiges hatte). Ich würde nun bei 
12,0V abschalten, um die Akkus nicht zu weit zu entladen.
Laden würde ich am NPB bei 14,0V einstellen.

Giuseppe M. schrieb:
> https://community.symcon.de/t/canbus-ladegeraet-in-symcon-einbinden/136578
> Vielleicht hilft es den ein oder anderen weiter.

Super! Genau sowas habe ich anfangs gesucht und leider nicht gefunden.

Viele Grüße
Philipp

von Matej L. (matej_l)


Lesenswert?

Ah ok, guess you want to trickle charge? My application is different, as 
I use the charger to do emergency charging with a backup gasoline 
generator. Meaning I want to pump as much as safely possible in the 
shortest period of time.

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.