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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
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.

von Fabian B. (faeibson)


Lesenswert?

Hallo zusammen,
ich hoffe, dass in diesem Thread noch was los ist.

@grisu74 ich versuche es im Moment eigentlich, glaube ich, fast genau 
wie du.
Ich habe ein NPB-750-24 und versuche dieses anzusteuern mit einem dieser 
China-Boards mit MCP2515/TJA1050 an einem ESP32(S3). Dass mir der 
Transceiver allein auch gereicht hätte und der ESP CAN bzw. TWAI 
anbietet, habe ich erst danach mitbekommen, aber seis drum, jetzt 
versuche ich das eben über SPI.

Und (noch) ohne Level Shifter, sondern mit 4,7kOhm an MISO. Allerdings 
gehen mir langsam die Ideen aus. Da du aber geschrieben hast, du hattest 
auch einige Versuche nötig mit der Verkabelung, versuche ichs mal und 
hoffe auf den entscheidenden Tipp, um um den Level Shifter/extra 
umsteigen auf Transceiver + wieder andere Implementierung mit ESP-CAN 
rumzukommen und einfach das vorhandene MCP2515 Modul zu verwenden.

- CANH und CANL sind mit dem MCP verbunden, GND (Signal, Pin 4 am NT) 
mit dem ESP.
- Der MCP am ESP mit CS (GPIO10), MOSI (GPIO11), SCK (GPIO12), MISO 
(GPIO13), sowie VCC an 5VBUS und natürlich GND.
- ESPHome wirft keine Fehler bei der CAN/SPI Initialisierung, außer wenn 
ich was an der Verkabelung (zum falschen) ändere, also da gehe ich 
aktuell mal vom richtigen aus und dass sich was mit den Pins in die 
Quere kommt, 10-13 sollte auch safe sein
- Pins 7 und 8 am NT sind gebrückt, die DIPs alle auf off (und waren nie 
anders). Beim aus- und wieder einstecken des Steckers schaltet das NT 
auch kurz in den Charging Modus, mangels Akku aber gleich wieder aus - 
aber den brauchtest du ja auch nicht zum Testen, richtig?
- Sender ID 0x000C0103, Receiving ID 0x000C0003, 8MHz Clock und 250 kbps 
in ESPHome gecheckt (A0 und A1 sind unverbunden, also high laut Manual)
- ich habe alle möglichen Nachrichten schon implementiert, aber erstmal 
würde mir eine einfache Antwort auf 0x0000 (OPERATION) schon reichen, 
das sollte ja klappen auch ohhne Bit 7 der CURVE_CONFIG auf 0 gesetzt zu 
haben.

Du hattest geschrieben, du hast den MCP2515 letztlich tauschen müssen, 
von welchem zu welchem bist du da gegangen, oder hattest du zwei gleiche 
von denen einfach einer blöd war?

Vielen Dank im Voraus!
Gruß Fabian

von Udo E. (grisu74)


Lesenswert?

Hallo.

Ich hatte 2 MCP2515.
Einer war anscheinend defekt.
Oder es lag an meinem Versuchsaufbau.
Seitdem ist alles perfekt.

Gruß Udo

von Fabian B. (faeibson)


Lesenswert?

Hallo, ach danke für die schnelle Antwort. Okay, ich habe auch zwei und 
der zweite macht die selben Faxen, bzw. halt gar nichts. Mir fällt auf, 
dass die Spannung an CANH und CANL nahezu identisch sind. Das kommt mir 
merkwürdig vor.
Ich bin jetzt auch bald kurz davor alles einfach fest zu verlöten.. 
Davor prüfe ich noch die selbe Pinbelegung wie bei dir.

Das GND(Signal) am NT hast du einfach vom ESP genommen oder kommt das 
bei dir auch von der MCP-Platine?
Hast du den INT-Pin vom MCP belegt/angesteuert?

von Udo E. (grisu74)


Lesenswert?

Fabian B. schrieb:
> Hallo, ach danke für die schnelle Antwort. Okay, ich habe auch zwei und
> der zweite macht die selben Faxen, bzw. halt gar nichts. Mir fällt auf,
> dass die Spannung an CANH und CANL nahezu identisch sind. Das kommt mir
> merkwürdig vor.
> Ich bin jetzt auch bald kurz davor alles einfach fest zu verlöten..
> Davor prüfe ich noch die selbe Pinbelegung wie bei dir.
>
> Das GND(Signal) am NT hast du einfach vom ESP genommen oder kommt das
> bei dir auch von der MCP-Platine?
> Hast du den INT-Pin vom MCP belegt/angesteuert?

Hallo,

CAN H und L müssen gleiche Spannung haben. GND ist sozusagen in der 
Mitte.

Das Ladegerät hast du richtig eingestellt?
Die Dipschalter und die Brücke?

Genaueres müsste ich erst noch nachsehen.
Mein ESP läuft noch mit Probeverkabelung. Ich würde die Kabel nochmals 
prüfen. Ich schicke dir meine Belegung.
Dauert allerdings ein wenig.
Nicht aufgeben.

Gruß Udo

von Fabian B. (faeibson)


Lesenswert?

Hi, Udo hmm ok. Den MCP hast du aber schon auch an +5V oder? Das Board 
soll ja angeblich 5V benötigen, der MCP scheint sich an und für sich 
aber auch mit 3,3V zu begnügen. Dann wäre das Logic Level gleich 
erledigt... oder benötigt das NPB explizit einen 5V Pegel? Da find ich 
jetzt nichts dazu...

Das Ladegerät würde ich als richtig eingestellt bezeichnen, immer und 
immer wieder hab ich die Pins geprüft.
- die 3 DIPs sind auf links wie im Originalzustand (off).
- Pin 7 und 8 sind gebrückt also Remote ON ist short
- CANL an 12 und CANH an 11, GND vom ESP an Pin 4... Der Rest ist frei.

Ich dank dir ganz herzlich schonmal im Voraus und keine Eile, aufgegeben 
wird nicht bis es sich beugt :D Ich bin gespannt auf deine Verkabelung.

von Udo E. (grisu74)


Lesenswert?

Fabian B. schrieb:
> Hi, Udo hmm ok. Den MCP hast du aber schon auch an +5V oder? Das Board
> soll ja angeblich 5V benötigen, der MCP scheint sich an und für sich
> aber auch mit 3,3V zu begnügen. Dann wäre das Logic Level gleich
> erledigt... oder benötigt das NPB explizit einen 5V Pegel? Da find ich
> jetzt nichts dazu...
>
> Das Ladegerät würde ich als richtig eingestellt bezeichnen, immer und
> immer wieder hab ich die Pins geprüft.
> - die 3 DIPs sind auf links wie im Originalzustand (off).
> - Pin 7 und 8 sind gebrückt also Remote ON ist short
> - CANL an 12 und CANH an 11, GND vom ESP an Pin 4... Der Rest ist frei.
>
> Ich dank dir ganz herzlich schonmal im Voraus und keine Eile, aufgegeben
> wird nicht bis es sich beugt :D Ich bin gespannt auf deine Verkabelung.

GND nicht anschließen.
Nur CAN H und L

Es gibt kein GND bei CAN

von Thomas F. (igel)


Lesenswert?

Fabian B. schrieb:
> CANH und CANL sind mit dem MCP verbunden

Ich hoffe doch mit dem TJA-Transceiver...
Eine GND-Verbindung braucht man bei CAN normalerweise nicht.

> Den MCP hast du aber schon auch an +5V oder? Das Board
> soll ja angeblich 5V benötigen, der MCP scheint sich an und für sich
> aber auch mit 3,3V zu begnügen.

Der MCP2515 würde auch mit 3,3V funktionieren, aber der TJA-Transceiver 
braucht 5V. Deshalb betreibt man die China-CAN-Boards mit 5V.

Den MOSI vom ESP kann man bei 3,3V direkt an den MCP2515 klemmen. Der 
MCP erkennt die 3,3V als High-Pegel.
Den MISO vom MCP zum ESP, also von 5V Ausgang auf 3.3V Eingang spendiert 
man einen Widerstand in Reihe, 4k/ wie du hast passt auch.

INT schliesst man an wenn man CAN-Botschaften interruptgesteuert 
empfangen will.

: Bearbeitet durch User
von Fabian B. (faeibson)


Lesenswert?

Danke euch..
- GND hatte ich zuerst auch gar nicht dran, dann damit versucht, jetzt 
wieder weg, leider immer noch ohne Erfolg
- MCP bleibt dann wie er ist auf 5V mit dem 4,7k an MISO
- INT ist und bleibt unverbunden..
- beide MCP Module machen ähnlich wenig
- ich habe sogar den 5V auf 3,3V LDO vom ESP aufgemotzt, um hier einen 
eventuellen Spannungsabfall/-engpass auszuschließen, wobei der ESP32 mit 
sonst gar nichts außer einem SPI doch wohl nicht exorbitant Strom ziehen 
sollte
- ein zweites NPB werde ich noch ausprobieren

ich ziehe langsam in Betracht, dass ich wohl vielleicht einfach zwei 
Mist-MCPs bekommen habe. Aber noch glaub ich nicht ganz dran :D

von Udo E. (grisu74)


Lesenswert?

Fabian B. schrieb:
> Danke euch..
> - GND hatte ich zuerst auch gar nicht dran, dann damit versucht, jetzt
> wieder weg, leider immer noch ohne Erfolg
> - MCP bleibt dann wie er ist auf 5V mit dem 4,7k an MISO
> - INT ist und bleibt unverbunden..
> - beide MCP Module machen ähnlich wenig
> - ich habe sogar den 5V auf 3,3V LDO vom ESP aufgemotzt, um hier einen
> eventuellen Spannungsabfall/-engpass auszuschließen, wobei der ESP32 mit
> sonst gar nichts außer einem SPI doch wohl nicht exorbitant Strom ziehen
> sollte
> - ein zweites NPB werde ich noch ausprobieren
>
> ich ziehe langsam in Betracht, dass ich wohl vielleicht einfach zwei
> Mist-MCPs bekommen habe. Aber noch glaub ich nicht ganz dran :D

Ich mach morgen mal ein Bild von meinem Aufbau. Dann kannst du genau 
vergleichen.

Die Befehle stimmen auch?

Gruß Udo

von Alexander (alecxs)


Lesenswert?

Udo E. schrieb:
> GND nicht anschließen.
> Nur CAN H und L
> Es gibt kein GND bei CAN

was erzählt ihr denn da, natürlich gibt es GND über gemeinsame Masse

von Fabian B. (faeibson)


Lesenswert?

das mit der Masse muss wohl noch geklärt werden, ich habe dann auch 
nachgelesen dass es eigentlich ein 3-Wire Aufbau sein sollte, aber gut, 
wenn es bei Udo ohne GND geht.. hm

bei den Nachrichten sehe ich keinen Fehler.
für OPERATION habe ich bspw. folgenden Template-Button
1
button:
2
  - platform: template
3
    id: get_operation_status
4
    name: Get operation status
5
    on_press:
6
      - canbus.send:
7
          canbus_id: can_mcp2515
8
          data: [0x00, 0x00]
9
      - lambda: |-
10
          ESP_LOGD("main", "CAN get OPERATION (0x0000)", "");

ich glaube da kann nicht viel falsch laufen, da ich ja einfach nur 
0x0000 sende..

wobei canbus wie folgt definiert ist:
1
spi:
2
  id: mcp2515_spi
3
  clk_pin: GPIO12
4
  mosi_pin: GPIO11
5
  miso_pin: GPIO13
6
canbus:
7
  - platform: mcp2515
8
    id: can_mcp2515
9
    spi_id: mcp2515_spi
10
    cs_pin: GPIO10
11
    can_id: 0x000C01FF
12
    use_extended_id: true
13
    clock: 8MHZ
14
    bit_rate: 250KBPS 
15
    on_frame: 
16
    - can_id: 0x000C0003
17
      can_id_mask: 0x1fffff00
18
      use_extended_id: true
19
      then: 
20
      - lambda: |-
21
          std::string b(x.begin(), x.end());
22
          ESP_LOGD("main", "Received: %s", &b[0]);

die can id habe ich gerade zwischenzeitlich auch mal in 0x000C01FF 
geändert statt 03, als Controller to Charger Broadcast wie im Manual 
angegeben. Andert auch nix. Dann noch die can_id_mask dazu genommen beim 
on_frame, um die letzten 2 Stellen zu ignorieren. Auch ohne Erfolg.
Wenn ich ein bisschen an den Kabeln rüttel, meldet der ESP sofort einige 
angebliche Nachrichten, also irgendwas tut es ja...

Mal nochmal zur Sicherheit: Pins 7 und 8 müssen SHORT sein am Netzteil, 
richtig?

: Bearbeitet durch User
von Luca E. (derlucae98)


Lesenswert?

Udo E. schrieb:
> GND nicht anschließen.
> Nur CAN H und L
> Es gibt kein GND bei CAN

Wenn man sich den Transceiver zerschießen will, nur zu. Natürlich 
benötigen CAN H und CAN L ein Bezugspotential.

von Udo E. (grisu74)


Lesenswert?

GND macht hier keinen Sinn, da kein gemeinsames Potential.
Den Wiederstand 120Ohm hast du gebrückt?

Gruß Udo

von Fabian B. (faeibson)


Lesenswert?

guten Morgen!
den 120er auf dem MCP muss man brücken? ne, das wusste ich noch nicht.. 
wird getestet.

bin gestern noch mit Flussmittel über ESP und MCP drüber um eventuelle 
kalte Lötstellen o.ä. zu eliminieren, leider war offenbar bereits alles 
gut.. ein Wechsel auf ESP8266 stünde heute noch an.

von Philipp C. (e61_phil) Benutzerseite


Lesenswert?

Hallo bei mir sieht das funktionierende Setup so aus:

canbus:
  - platform: mcp2515
    id: my_mcp2515
    spi_id: McpSpi
    cs_pin: GPIO27
    bit_rate: 250KBPS
    can_id: 123

    on_frame:
    - can_id: 0x000C0003
      #can_id_mask: 0x1fffffff
      use_extended_id: true
      then:
      - lambda: |-
          if(x[0]==0x30 and x[1]==0x00) {
          float leistung =float(float((int((x[2])+( (x[3])<<8))))/100);
          ESP_LOGD("main", "Der Ladestrom ist %f", leistung);
          }

ich habe die Mask auskommentiert und einfach in den Lambdas nach der 
Nachricht geschaut (ist nicht nur das hier reinkopierte)

Viele Grüße
Philipp

von Soul E. (soul_eye)


Lesenswert?

Thomas F. schrieb:
> Ich hoffe doch mit dem TJA-Transceiver...
> Eine GND-Verbindung braucht man bei CAN normalerweise nicht.

Die braucht man genau dann nicht, wenn alle Steuergeräte die gleiche 
Masse haben. So ist das im Auto.

Am Labortisch liegt der eine Teilnehmer über den USB auf 
Schutzleiter-Potential, und der andere über die Masseklemme des Oszis. 
Das tut es auch, zumindest wenn PC und Oszi an der selben 
Steckdosenleiste hängen. Falls sich in der Firma IT-Strom und Versorgung 
des Labortisches erst im Keller treffen, können die beiden Schutzleiter 
auch mal 10 V auseinander sein. Dann funktioniert es ein paar Tage und 
plötzlich wird der Controller heiss.

Daher besser die Masse mitführen.

Das Signal bei CAN ist U_CAN = (U_CANH - U_GND) - (U_CANL - U_GND). 
Mathematisch gesehen kürzt sich U_GND raus. Physikalisch gesehen werden 
aber beide Spannungen gegen Masse gemessen.

von Fabian B. (faeibson)


Lesenswert?

also den 120 Ohm Widerstand auf dem MCP zu brücken hat auch nichts 
geändert.
GND nun doch mal an Pin 4 hinzufügen? schadet ja nicht?

@e61_phil danke, sieht bei mir ja quasi genauso aus. Udo hat die Vorlage 
ja dankenswerterweise schon gepostet, daran habe ich mich auch 
orientiert.

Danke an alle Kommentatoren.

von Fabian B. (faeibson)


Lesenswert?

Also, GND wieder an Pin 4, keine Änderung, auch mit dem ESP8266 (GPIOs 
12-15) kommt nix an, jetzt würde ich noch einen anderen ESP32 
ausprobieren oder gleich einen 74HCT125 Level Shifter dazwischen 
hängen...

von Udo E. (grisu74)



Lesenswert?

Hallo,

anbei mein Aufbau.

Gruß Udo

von Udo E. (grisu74)


Angehängte Dateien:

Lesenswert?

Hier noch eine Idee.

Ich sende an die 103!!

Bitte nochmal prüfen.

von Fabian B. (faeibson)


Lesenswert?

danke an alle und besonders dich Udo für deine Mühe. Achtung, jetzt 
wird's peinlich. Ich habe falsch verstanden, was du meintest mit den 
Widerstand brücken... Wenn man den Jumper (J1) setzt, dann geht's auch. 
Mir war nicht klar, dass der Widerstand sonst vom Bus getrennt ist. 
Heilige Sch...

Ich hoffe, das wird wenigstens zukünftigen Lesern einige blöde 
Fehlersucherei ersparen!

Danke nochmal!

Zusätzlich, um auch was sinnvolles beizutragen, würde ich gerne noch 
teilen, wie ich meine SET_IOUT Funktion umgesetzt habe - nämlich mit 
einer Template Number als Ziel-Stromvorgabe. Sieht aus wie folgt:
1
number:
2
  - platform: template
3
    optimistic: yes
4
    max_value: 22.5
5
    min_value: 4.5
6
    step: 0.1
7
    id: target_current
8
    name: Target charging current
9
    set_action:
10
      - delay:
11
          milliseconds: 100
12
      - button.press: set_current
13
14
button:
15
  - platform: template
16
    id: set_current
17
    name: Set charging current
18
    on_press:
19
      then:
20
        if:
21
          condition:
22
            lambda: |-
23
              return (id(target_current).state);
24
          then:
25
            - lambda: |-
26
                uint32_t can_id = 0x00C0103;
27
                bool use_extended_id = 1;
28
                float x = float(id(target_current).state);
29
                uint16_t current = x*100;
30
                ESP_LOGD("main", "Target current is %f, must become %d then %02x", x, current, current);
31
                uint8_t hex1 = current >> 8;
32
                uint8_t hex0 = current | hex1;
33
                std::vector<uint8_t> data{0x30, 0x00, hex1, hex0};
34
                ESP_LOGD("main", "CAN set IOUT_SET (0x0030) to %f (%02x %02x)", x, hex1, hex0);
35
                float curr = float(float((int((hex0) + ((hex1) << 8)))) / 100);
36
                ESP_LOGD("main", "Charging current set to %f Amps", curr);
37
                id(can_mcp2515)->send_data(can_id, use_extended_id, data);
38
            - delay:
39
                milliseconds: 100
40
          else:
41
            - lambda: |-
42
                ESP_LOGD("main", "Target current is invalid, skip", "");
43
  - platform: template
44
    id: bit7_disable
45
    name: Switch to PSU mode
46
    on_press:
47
      - canbus.send:
48
          canbus_id: can_mcp2515
49
          data: [0xB4, 0x00, 0x04, 0x00]
50
      - lambda: |-
51
          ESP_LOGD("main", "CAN set CURVE_CONFIG (0x00B4) Bit 7 = 0 (0x0004), please power cycle NPB afterwards", ""); 
52
  - platform: template
53
    id: bit7_enable
54
    name: Switch to Charger mode
55
    on_press:
56
      - canbus.send:
57
          canbus_id: can_mcp2515
58
          data: [0xB4, 0x00, 0x84, 0x00]
59
      - lambda: |-
60
          ESP_LOGD("main", "CAN set CURVE_CONFIG (0x00B4) Bit 7 = 1 (0x0084), please power cycle NPB afterwards", "");

In meinem Fall (NPB-750-24) kann ich laut Manual zwischen 4,5 und 22,5 A 
einstellen, entsprechend habe ich die Template Number begrenzt. Bei 
Änderung wird automatisch der Template Button gedrückt, der dann das 
Kommando absetzt und den Wert der Number in Hex übersetzt. Vielleicht 
kanns ja jemand gebrauchen.

Dazu habe ich zwei Template Buttons für den CURVE_CONFIG Bit7 Toggle 
eingebaut.

Habe noch mehr Spielereien eingebaut... bei Fragen gerne fragen.

von Udo E. (grisu74)


Lesenswert?

Da braucht dir nichts peinlich zu sein.
Bei mir war es auch nur eine Kleinigkeit.

Gruß Udo

von Philipp C. (e61_phil) Benutzerseite


Lesenswert?

Vielen Dank euch hier für das Teilen, dieser Thread hat mir damals auch 
geholfen.
Den Strom stelle ich bei mir direkt über eine Number ohne extra Button:

number:
  - platform: template
    name: "Charge Current"
    unit_of_measurement: "A"
    optimistic: true
    min_value: 5
    max_value: 25
    step: 0.01
    mode: box
    id: iout_set
    on_value:
      then:
        - lambda: |-
            int setpoint = id(iout_set).state * 100;
            byte a = setpoint;
            byte b = setpoint >> 8;
            uint32_t can_id = 0x000C0103;
            bool use_extended_id = 1;
            std::vector< uint8_t > data{ 0x30, 0x00, a, b };
            id(my_mcp2515)->send_data(can_id, use_extended_id, data);


PS: Mein Lader kann 5-25A

Wie oft setzt ihr bei euch den Strom um das EEPROM nicht zu schnell zu 
zerstören?

: Bearbeitet durch User
von Udo E. (grisu74)


Lesenswert?

EEPROM Zerstören??

Ich setze sekündlich den Ladestrom rauf oder runter.
In 1 A Schritten, da ich ja die überschüssige Sonnenenergie nutzen 
möchte.

Gruß Udo

von Philipp C. (e61_phil) Benutzerseite


Lesenswert?

Die Konfiguration wird wohl bei jedem Setzen im EEPROM abgelegt. Bei 
neuerer Firmware kann man das auch über CAN abschalten. Mein Lader kann 
das leider noch nicht. Ich meine im Handbuch steht irgendwo etwas von 4 
Millionen Schreibzyklen oder so.

Warum in 1A Schritten? Der Lader kann doch auch 0,1A?

Noch eine Sache: Es gibt einen Trucki-Stick, der wohl auch unter dem 
minmalen Ladestrom des Laders gehen kann. Ich denke, dass er das über 
die Spannungsbegrenzung macht. Ich habe damit mal gespielt und bei so 
auch Ladeströme unter 5A einstellen können. Nutzt das jemand von euch?

: Bearbeitet durch User
von Fabian B. (faeibson)


Lesenswert?

das EEPROM hab ich noch im Blick und die Begrenzung. Hast du da einen 
kurzen Tipp wie der Befehl wäre? Hab in meinem Manual dazu nichts 
gefunden aber es mal irgendwo gelesen.

Gleiches gilt für die Spannungsbegrenzung. Das wollte ich mir auch noch 
ansehen, jedoch noch nichts weiter. Mein Akku ist auch noch gar nicht 
da. Also wenn ich mit SET_VOUT etwas runtergehe nimmt SET_IOUT auch 
geringere Werte entgegen?

Sind auf jeden Fall zwei Dinge die ich noch umsetzen will.

PS: Code kannst du hier auch einfach in [ code ] Tags setzen für die 
Formatierung. Danke fürs Teilen!

: Bearbeitet durch User
von Obelix X. (obelix)


Lesenswert?

Philipp C. schrieb:
> Wie oft setzt ihr bei euch den Strom um das EEPROM nicht zu schnell zu
> zerstören?

Ich habe nicht den ganzen Thread durchgelesen aber ...

Man muss ja nicht immer in die gleiche Speicherstelle schreiben. Es gibt 
Techniken (Software) die das über den gesamten Speicher verteilt und ihn 
erst löscht wenn er voll ist. So kann die Lebensdauer vervielfacht 
werden.

von Philipp C. (e61_phil) Benutzerseite


Lesenswert?

Obelix X. schrieb:
> Ich habe nicht den ganzen Thread durchgelesen aber ...
>
> Man muss ja nicht immer in die gleiche Speicherstelle schreiben. Es gibt
> Techniken (Software) die das über den gesamten Speicher verteilt und ihn
> erst löscht wenn er voll ist. So kann die Lebensdauer vervielfacht
> werden.

Machen Sie vermutlich auch, um auf die genannten 4 Million zu kommen.

Wenn man 1x pro Sekunde schreibt sind das nur 4 Millionen Sekunden. 
Gehen wir mal davon aus, dass man maximal 10h am Tag diese Regelung 
laufen hat, dann macht das

4e6s / (10 * 3600) = 111 Tage

Damit wäre das Teil wohl nach einem Jahr hin.

https://www.meanwell.com/Upload/PDF/NPB,NPP-E.pdf in dem Manual auf S. 6

SYSTEM_CONFIG und dann Bit 10 EEP_OFF

"Bit 10 EEP_OFF: Disable to write voltage and current parameters to 
EEPROM
0= Write the voltage and current parameters into EEPROM in real time
(Default)
1= Disable to write the voltage and current parameters into EEPROM in 
real
time
Please refer to Chapter 6.4.4 for details."

Leider kann meiner das noch nicht. Es taucht in meinem Handbuch auch 
nicht auf. Ich habe es trotzdem mal probiert, aber leider geht es 
wirklich nicht.

In 6.4.4.  steht dann:

"Description of EEP_OFF:
1. When the EEP_OFF, the bit 10 of the high byte of SYSTEM_CONFIG is 0 (
default) : These seven commands 0xB0 to B3, 0xB9, 0x20, and 0x30 are
written into EEPROM in real time.
2. When the EEP_OFF, the bit 10 of the high byte of SYSTEM_CONFIG is 1:
These seven commands: 0xB0 to B3, 0xB9, 0x20, and 0x30 cannot write
into EEPROM."

Die Anzahl der Zyklen habe ich auf die schnelle nicht gefunden



Zum Laden bei kleinerem Strom: Nein, einfach die Spannung reduzieren 
gibt einem keinen weiteren Einstellbereich beim Strom, aber bei 
entsprechend kleiner Spannnung fließt einfach weniger Strom und den 
liefert das Ladegerät bis zu gewissen Grenzen dann auch, auch wenn der 
unter dem einstellbaren Minimum liegt.

: Bearbeitet durch User
von Fabian B. (faeibson)


Lesenswert?

danke, ich habe noch zwei "buttons" eingefügt zum EEPROM bit setzen in 
der SYSTEM_CONFIG:
1
  - platform: template
2
    id: mw_eeprom_enable
3
    name: "${mw_name} enable writing to EEPROM (0x00C2)"
4
    on_press:
5
      - canbus.send:
6
          canbus_id: can_mcp2515
7
          data: [0xC2, 0x00, 0x03, 0x00]
8
      - lambda: |-
9
          ESP_LOGD("${mw_name}", "CAN set SYSTEM_CONFIG (0x00C2) Bit 10 = 0 (0x0003), please power cycle NPB afterwards", ""); 
10
  - platform: template
11
    id: mw_eeprom_disable
12
    name: "${mw_name} disable writing to EEPROM (0x00C2)"
13
    on_press:
14
      - canbus.send:
15
          canbus_id: can_mcp2515
16
          data: [0xC2, 0x00, 0x03, 0x04]
17
      - lambda: |-
18
          ESP_LOGD("${mw_name}", "CAN set SYSTEM_CONFIG (0x00C2) Bit 10 = 1 (0x0403), please power cycle NPB afterwards", "");

scheint bei meinem zu klappen, jedenfalls gibt SYSTEM_CONFIG nachher den 
geänderten Output zurück. Bei dir bleibt er einfach bei high byte = 0?

: Bearbeitet durch User
von Philipp C. (e61_phil) Benutzerseite


Lesenswert?

Fabian B. schrieb:
> Bei dir bleibt er einfach bei high byte = 0?

Ja, leider schon. Ich teste heute Abend deinen Code aber noch einmal.

Aktuell habe ich ein 12V System mit 400Ah LFP (4x 100Ah) daran einen NPB 
480-12. Ich würde gerne auf den NPB 1700-12 gehen, aber natürlich ungern 
einen für 400EUR bestellen um dann zu merken, dass der das auch nicht 
abschalten kann.

Womit macht ihr die Einspeisung? Und welche Akkuspannung nutzt ihr?
Ggf. wäre ein Umbau bei mir ohnehin sinnvoll.

Viele Grüße
Philipp

: Bearbeitet durch User
von Fabian B. (faeibson)


Lesenswert?

Ah Mist.. okay.. ärgerlich. Ich habe das Netzteil direkt aus China 
geordert und die Sache war mir gar nicht bewusst, hatte jetzt einfach 
Glück. Das Herstellungsdatum habe ich ausgelesen, 27.05.2024.

Ich habe geplant auf 8x 100Ah LiFePo zu gehen. Warte aber aktuell noch 
auf die Lieferung, hängt wohl im Zoll. Entsprechend habe ich ein 
NPB-750-24 und einen SoyoSource GTN-1000W-24. Abgerundet wird's von 
einem JK B2A8S20P BMS.

Den WR versuche ich jetzt auch noch anzusprechen über RS485, soll beides 
der selbe ESP32S3 übernehmen.

Mach das alles aber auch zum ersten Mal, entsprechend kann ich leider 
gar keine Aussagen treffen, vor allem Mangels Akku noch, alles nach 
bestem Wissen nach Recherche zusammengetragen :D

Welchen WR und BMS hast du?

von Udo E. (grisu74)


Lesenswert?

Hallo,

Ich habe das NPB 1700-24.
Hier finde ich nichts über EEP_OFF

Gruß

von Fabian B. (faeibson)


Lesenswert?

Udo E. schrieb:
> Hier finde ich nichts über EEP_OFF

du kannst ja mal 0x00C2 senden und schauen was zurückkommt:
1
      - lambda: |-
2
          if(x[0] == 0xC2 and x[1] == 0x00) {
3
            int config = int(x[2] + (x[3] << 8));
4
            char buf[7];
5
            sprintf(buf, "0x%04X", config);
6
            id(ts_mw_system_config).publish_state(to_string(buf));
7
            ESP_LOGD("${mw_name}", "Got SYSTEM_CONFIG: %i (Hex: %02X %02X)", config, x[3], x[2]);
8
          }

oder die Firmwareversion und Herstellungsdatum abfragen mit 84 bzw. 86:
1
      - lambda: |-
2
          if(x[0] == 0x84 and x[1] == 0x00) {
3
            float fw_rev = float(x[2])/10;
4
            char buf[5];
5
            sprintf(buf, "%.02f", fw_rev);
6
            id(ts_mw_mfr_revision).publish_state(to_string(buf));
7
            ESP_LOGD("${mw_name}", "Got MFR_REVISION_B0B5: %f / (Hex: %02X)", fw_rev, x[2]);
8
          }
9
      - lambda: |-
10
          if(x[0] == 0x86 and x[1] == 0x00) {
11
            std::string mfr_date = "";
12
            mfr_date += (char)x[2];
13
            mfr_date += (char)x[3];
14
            mfr_date += (char)x[4];
15
            mfr_date += (char)x[5];
16
            mfr_date += (char)x[6];
17
            mfr_date += (char)x[7];
18
            id(ts_mw_mfr_date).publish_state(mfr_date);
19
            ESP_LOGD("${mw_name}", "Got MFR_DATE_B0B5: %c%c%c%c%c%c", x[2], x[3], x[4], x[5], x[6], x[7]);
20
          }

Ich habe FW Rev 1.6 und Datum wie gesagt 240527

von Fabian B. (faeibson)


Lesenswert?

Philipp C. schrieb:
> Zum Laden bei kleinerem Strom: Nein, einfach die Spannung reduzieren
> gibt einem keinen weiteren Einstellbereich beim Strom, aber bei
> entsprechend kleiner Spannnung fließt einfach weniger Strom und den
> liefert das Ladegerät bis zu gewissen Grenzen dann auch, auch wenn der
> unter dem einstellbaren Minimum liegt.

Ja gut, also mit VOUT runtergehen leuchtet mir ein, aber wie(so) sollte 
deswegen der Ladestrom auch sinken?

Leider kann man IOUT ohne Akku nicht setzen, bzw. READ_IOUT ergibt immer 
0, sodass ich da im Moment das effektive Minimum noch nicht herausfinden 
kann. Bei der Spannung sind es ziemlich genau 21 Volt, die das Netzteil 
noch zulässt. Allerdings krieg ich damit ja auch keinen 8-Zellen LFP 
Akku voll..

Irgendwas scheine ich da noch nicht verstanden zu haben, aber eine 
andere Lösung/Möglichkeit die Ladeleistung zu reduzieren erschließt sich 
mir auch nicht? Und wirklich weit runter käme man damit ja auch nicht.

Ich hatte bei der o.g. Funktion zum Ladestrom setzen übrigens einen 
Dreher bei hex0/hex1.. Ups. Hier korrekt, mit dem Analogon zur 
Spannung/VOUT_SET:
1
  - platform: template
2
    id: mw_set_voltage
3
    name: "${mw_name} set charging voltage"
4
    on_press:
5
      then:
6
        if:
7
          condition:
8
            lambda: |-
9
              return (id(mw_target_voltage).state);
10
          then:
11
            - lambda: |-
12
                uint32_t can_id = id(global_can_sender_id);
13
                bool use_extended_id = 1;
14
                float x = float(id(mw_target_voltage).state);
15
                uint16_t voltage = x*100;
16
                ESP_LOGD("${mw_name}", "Target voltage is %f, must become %d then %02x", x, voltage, voltage);
17
                uint8_t hex1 = voltage >> 8;
18
                uint8_t hex0 = voltage | hex1;
19
                std::vector<uint8_t> data{0x20, 0x00, hex0, hex1};
20
                ESP_LOGD("${mw_name}", "CAN set VOUT_SET (0x0020) to %f (%02x %02x)", x, hex1, hex0);
21
                float v = float(float((int((hex0) + ((hex1) << 8)))) / 100);
22
                ESP_LOGD("${mw_name}", "Charging voltage set to %f V", v);
23
                id(can_mcp2515)->send_data(can_id, use_extended_id, data);
24
            - delay:
25
                milliseconds: 100
26
          else:
27
            - lambda: |-
28
                ESP_LOGD("${mw_name}", "Target voltage is invalid, skip", "");
29
  - platform: template
30
    id: mw_set_current
31
    name: "${mw_name} set charging current"
32
    on_press:
33
      then:
34
        if:
35
          condition:
36
            lambda: |-
37
              return (id(mw_target_current).state);
38
          then:
39
            - lambda: |-
40
                uint32_t can_id = id(global_can_sender_id);
41
                bool use_extended_id = 1;
42
                float x = float(id(mw_target_current).state);
43
                uint16_t current = x*100;
44
                ESP_LOGD("${mw_name}", "Target current is %f, must become %d then %02x", x, current, current);
45
                uint8_t hex1 = current >> 8;
46
                uint8_t hex0 = current | hex1;
47
                std::vector<uint8_t> data{0x30, 0x00, hex0, hex1};
48
                ESP_LOGD("${mw_name}", "CAN set IOUT_SET (0x0030) to %f (%02x %02x)", x, hex1, hex0);
49
                float curr = float(float((int((hex0) + ((hex1) << 8)))) / 100);
50
                ESP_LOGD("${mw_name}", "Charging current set to %f Amps", curr);
51
                id(can_mcp2515)->send_data(can_id, use_extended_id, data);
52
            - delay:
53
                milliseconds: 100
54
          else:
55
            - lambda: |-
56
                ESP_LOGD("${mw_name}", "Target current is invalid, skip", "");

Würde dann noch eine Funktion schreiben, der man einfach die 
Ladeleistung vorgibt, die dann je nach dem den Strom setzt und ggf. auch 
noch mit der Spannung runtergeht. Dafür brauchts dann aber erstmal den 
Akku hier, wie gesagt.

: Bearbeitet durch User
von Udo E. (grisu74)


Lesenswert?

[06:53:10][D][CAN SYSTEM_CONFIG abfragen:090]:
[06:53:10][D][${mw_name}:343]: Got SYSTEM_CONFIG: 2 (Hex: 00 02)
[06:53:11][D][CAN Firmware abfragen:189]:
[06:53:11][D][${mw_name}:325]: Got MFR_REVISION_B0B5: 1.100000 / (Hex: 
0B)
[06:53:11][D][CAN HSD abfragen:198]:
[06:53:11][D][${mw_name}:336]: Got MFR_DATE_B0B5: 231128

Kann damit jemand was anfangen?

Gruß Udo

von Fabian B. (faeibson)


Lesenswert?

Hallo Udo,
dann ist dein Netzteil wohl vom 28.11.23 mit der FW Rev. 1.10 und damit 
leider zu alt für die EEPROM Funktion :(
Trotzdem würde ich einfach mal versuchen, SYSTEM_CONFIG mit 0x0403 zu 
setzen wie oben geschrieben. NT neustarten und nochmal kucken, was bei 
der Abfrage von SYSTEM_CONFIG dann raus kommt.

von Philipp C. (e61_phil) Benutzerseite


Lesenswert?

Fabian B. schrieb:
> Ja gut, also mit VOUT runtergehen leuchtet mir ein, aber wie(so) sollte
> deswegen der Ladestrom auch sinken?

Weil Du eine Spannung zwischen der Zelle und dem Ladegerät brauchst, 
damit Strom fließen kann.
Die Spannung musst Du dann natürlich auch nachführen, darum benutze ich 
das bisher nicht. Zudem fängt es bei mir auch schon bei etwa 70W an.

Fabian B. schrieb:
> Würde dann noch eine Funktion schreiben, der man einfach die
> Ladeleistung vorgibt, die dann je nach dem den Strom setzt

Das mache ich in Home Assistant. Ich rechne da einfach aus welchen Strom 
ich für die gewünschte Leistung setzen muss.

von Mark S. (markjoe)


Lesenswert?

Dear people of this thread,

Thanks a million! I also ordered a MeanWell NPB (-1700-48) for my DIY 
home battery to be steered by CAN-BUS. I'm now gathering all bits and 
pieces (do not have a actual battery yet). But like the title of this 
tread, the charger did not listen to commands (it did acknowledge the 
CAN-BUS messages though). Again just for reference (like Matej L. in a 
previous contribution): COMMANDS HAVE TO BE SENT WITH SWAPPED LOW AND 
HIGH BYTES, thus reading from the manual e.g. set system_config 
(0x00c2), you have to sent 0xc2, 0x00. I know, it is in the manual, but 
I guess many of us are first time CAN-BUS users.

Next, some fields from the charger (e.g. manufacturer date) where messed 
up (showing 160119, a number that showed up again in the serial number 
of the charger:  000076 + 160119) I do not know. Firmware shows: 0f 0b 
ff ff ff ff So, if I divide (like some previous code sample showed) the 
first byte, firmware is 1.5 (?) Anybody know the purpose of the second 
byte that has value 0x0b?

I could write 0x03, 0x04 to 0xc2, 0x00 and the value of 4 (the famous 
bit 10) was sustained after power up, indicating it has the disabled 
EEPROM write function. (again, I do not have a battery yet, so it all 
has to prove itself).

That's all I have to share. Great thread. Happy to help others
(using raspberry pi 3B+ (lan),  Waveshare 2-CH-CAN-Hat, NPB-1700-48 as 
charger and OpenDTU together with Hoymiles HMS-500 as inverters)

And, oh yeah, the search term for the connector on the MeanWell NPB: JST 
PHDR-14VS

: Bearbeitet durch User
von Udo E. (grisu74)


Lesenswert?

Hallo zusammen,

da ich noch eine alte Firmware habe und denke, dass der Lader in Zukunft 
den Geist aufgibt, überlege ich mir gerade einen anderen Lader zu 
kaufen.

Kennt jemand den victron skylla-i 24/100?

Der funktioniert ebenfalls mit CANBUS.

Gruß Udo

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.