Howto: JBD BMS unte...
 
Benachrichtigungen
Alles löschen

Howto: JBD BMS unter Windows einfach auslesen

2 Beiträge
2 Benutzer
0 Likes
590 Ansichten
(@mallkuss)
Newbie
Beigetreten: Vor 8 Monaten
Beiträge: 1
Themenstarter  

Hallo Forum,

ich habe in den letzen Wochen und Monaten einiges zum Auslesen meiner JBD BMS ausprobiert und wollte euch mein Ergebnis vorstellen.
Das ist sicher nicht perfekt programmiert, aber vielleicht nützt es ja dem ein oder anderen als Input für eigene Versuche.

kurz zur Historie: ich habe mehrere Akkus aus 18650 und 280Ah LifePo4 Zellen..

Anfangs habe ich Spannungen und Ströme über DigitalMultimeter (DMM) mit serieller Schnittstelle ausgelesen, aber die gingen alle ne ein, zwei Jahren kaputt.

Also habe ich eine Möglichkeit gesucht die benötigten Infos aus dem BMS zu bekommen, per Kommandozeile. Habe dann einige Zeit mit python scripten rumgemacht, das war mit den ganzen Libraries doch recht aufwendig, lief aber ne Weile ganz gut. 

Vor ein paar Wochen habe ich dann per Python keine Verbindung mehr mit dem BMS herstellen können, da habe ich beschlossen: how hard can it be Smile Effektiv muss ich ja nur ein, zwei bekannte Datenfolgen ans BMS schicken und das Ergebnis abholen und auswerten.

Letztendlich kann ich nun mit Windows Bordmitteln (power shell) meine JBS BMS auslesen und die Daten weiterverarbeiten (ich nutze das um das Laden zu steuern, und auch um aktuellen Status auszulesen und um Plots zu generieren für monitoring (alles DIY, also rudimentär).

Ausgabe des Scripts als Beispiel:

Paket 3: Spannung 26.28V Strom -10.9A SOC 90%
Paket 4: 3,286 3,288 3,26 3,286 3,285 3,263 3,287 3,296 deltaV: 36mV

Spoiler
Quellcode

function asciiToHex($a)
{
$b = $a.ToCharArray();
Foreach ($element in $b) {$c = $c + [System.String]::Format("{0:X2}", [System.Convert]::ToUInt32($element)) + ";"}
# [System.Convert]::ToUInt32($element)) + ";"}
$c
}

$port= new-Object System.IO.Ports.SerialPort COM7,9600,None,8,1
$port.Encoding = [System.Text.Encoding]::GetEncoding(28591)
$port.open()

# Kommando für Paket 3 schicken

$port.Readtimeout = 10000
$port.Write([byte[]] (221, 165, 3, 0, 255, 253, 119), 0, 7)

Start-Sleep -Milliseconds 2000

$text = $port.ReadExisting()
$hex = asciiToHex($text)
$hex_array = $hex.split(";")

# Spannung

$hex_volt = $hex_array[4]+$hex_array[5]
$volt = ([uint32]"0x$hex_volt" -as [double]) / 100

# Strom:

$hex_curr = $hex_array[6]+$hex_array[7]
$current_real_bms = ([int16]"0x$hex_curr" -as [double]) / 100

#SOC

$hex_soc = $hex_array[23]
$soc_bms = [uint32]"0x$hex_soc"

Write-host "Paket 3: Spannung" $volt"V Strom" $current_real_bms"A SOC" $soc_bms"%"

# Kommando für Paket 4 schicken

$port.Write([byte[]] (221, 165, 4, 0, 255, 252, 119), 0, 7)

Start-Sleep -Milliseconds 2000

$text = $port.ReadExisting()
$hex = asciiToHex($text)

$hex_array = $hex.split(";")

# Zelle 1
$hex_volt = $hex_array[4]+$hex_array[5]
$volt_1 = ([uint32]"0x$hex_volt" -as [double]) / 1000

# Zelle 2
$hex_volt = $hex_array[6]+$hex_array[7]
$volt_2 = ([uint32]"0x$hex_volt" -as [double]) / 1000

# Zelle 3
$hex_volt = $hex_array[8]+$hex_array[9]
$volt_3 = ([uint32]"0x$hex_volt" -as [double]) / 1000

# Zelle 4
$hex_volt = $hex_array[10]+$hex_array[11]
$volt_4 = ([uint32]"0x$hex_volt" -as [double]) / 1000

# Zelle 5
$hex_volt = $hex_array[12]+$hex_array[13]
$volt_5 = ([uint32]"0x$hex_volt" -as [double]) / 1000

# Zelle 6
$hex_volt = $hex_array[14]+$hex_array[15]
$volt_6 = ([uint32]"0x$hex_volt" -as [double]) / 1000

# Zelle 7
$hex_volt = $hex_array[16]+$hex_array[17]
$volt_7 = ([uint32]"0x$hex_volt" -as [double]) / 1000

# Zelle 8
$hex_volt = $hex_array[18]+$hex_array[19]
$volt_8 = ([uint32]"0x$hex_volt" -as [double]) / 1000

# delta V berechnen

$list_cell_volt = $volt_1, $volt_2, $volt_3, $volt_4, $volt_5, $volt_6, $volt_7, $volt_8
$result = $list_cell_volt | Measure-Object -Minimum -Maximum
$cell_min = $result.Minimum
$cell_max = $result.Maximum
$cell_delta = $cell_max - $cell_min
$cell_delta = [math]::round($cell_delta,3) * 1000

write-host "Paket 4: " $volt_1 $volt_2 $volt_3 $volt_4 $volt_5 $volt_6 $volt_7 $volt_8 "deltaV:" $cell_delta"mV"

$port.Close()

Das Ganze läuft hier jetzt schon eine ganze Weile recht zuverlässig, ich hoffe damit verstoße ich jetzt nicht gleich mit dem ersten Post gegen irgendwelche Regeln.

Hab bisher den YT Kanal des DR verfolgt, aber das Forum nicht genutzt bisher. Hab aber schon einige interesante Threads entdeckt hier!

Viele Grüße

Markus

 

 

 


   
Zitat
Schlagwörter für Thema
Carolus
(@carolus)
Famous Member Admin
Beigetreten: Vor 2 Jahren
Beiträge: 6970
 

Willkommen!

Interessant!

In Anleitungen verschoben.

Ich bin kein Amateur, aber ich lerne trotzdem noch.
Bürokratie schafft man nicht durch neue Regeln oder Gesetze ab.


   
AntwortZitat
Howto: JBD BMS unte...
 
Teilen: