"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

Kommunikation mit BMS

jb 13.01.2020 - 15:48 2618 1
Posts

jb

Here to stay
Registered: May 2000
Location: /home/noe/
Posts: 3504
Hallo,

bin dabei mir einen kleinen Speicher zu bauen, der mit Solarstrom geladen und dann nachts über über einen kleinen WR entladen wird.
Die Lithiumakkus sind über ein BMS angeschlossen, das per USB/RS232 und Software amPC oder über Bluetooth und eine App bedient werden kann.

Ich möchte nun die Mosfets manuell schalten können, bevor das BMS selbst aufgrund der einstellbaren Settings die Verbindung von Last oder Lader trennt. Vom Hersteller gibts hierzu die Beschreibung des Protokolls in einem XLS.

Auslesen ist kein Problem, das ist eines der kurz gezeigten Beispiele. Wenn ich die entsprechenden Werte ans BMS schicke, so antwortet das wunschgemäß mit jede Menge Daten (Akkuspannung, Strom, Mosfet Status, Temperaturen, Restkapazität und vieles mehr).
Ich scheitere aber an der Checksum Berechnung oder auch am Schreibbefehl selbst, obwohl ich die Checksum Berechnung vom Lesebefehl nachvollziehen kann.

In der Beschreibung steht zur Checksum Berechnung (16Bit Wert) folgendes:
Code:
verfication on data,Length and command code ,then act inverse code plus one,big-endian at highest address and little endian at low address

Ich habe hier z.B. Data: 0x02, Length: 0x01 Command Code: 0x15 (Register 21 dezimal ist für die Mosfet Kontrolle), 0x02 heißt hier: Lade Mosfet aus, Entlade Mosfet ein.
In Summe gibt das 0x0018. invertiert gibt das 0xFFE7, 1 addieren: 0xFFE8
Genau das quittiert mir das BMS aber mit 0x80, laut Protokollbeschreibung eine inkorrekte Anweisung. Hab schon alle möglichen Kombinationen durch High/Low vertauscht usw.

Das Beispiel vom Lesebefehl (der funktioniert) hat Command Code: 0x03, Length: 0x00 und kein Data Feld (Datenlänge ist ja 0). Das gibt berechnet dann 0xFFFD, dem kann ich auch folgen.

Würdet ihr die Berechnung evtl. anders interpretieren?

Das Beispiel vom Lesebefehl (der funktioniert) hat Command Code: 0x03, Length: 0x00 und kein Data Feld (Datenlänge ist ja 0). Das gibt berechnet dann 0xFFFD, dem kann ich auch folgen.

Angehängt hab ich die Beschreibung vom Protokoll, vielleicht hab ich auch den Schreibbefehl (ich hätte hier DD 5A 15 01 02 FF E8 77) falsch interpretiert?
protocol-bms-en_241658.zip (downloaded 61x)

disposableHero

Addicted
Avatar
Registered: Mar 2001
Location: A&EE
Posts: 420
vielleicht meinen die mit "inverse code" nicht das 1er Komplement sondern die Bit- oder Bytereihenfolge
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz