Forum: Mikrocontroller und Digitale Elektronik CAN-Bus Analyse


von Marius (jusch)


Angehängte Dateien:

Lesenswert?

Hallo,

im Anhang ein Bild einer CAN-Bus Aufzeichnung, welche mit PCAN-View 
gemacht wurde.

Vielleicht kann mir jemand weiterhelfen, was in den jeweiligen CAN-ID´s 
steht?

Die Werte sind aus einem BMZ Hyperion Batteriespeicher gesnifft und ist 
aus der Daisychain der Kommunikation zwischen Batteriemodulen zur BMU.

Ich vermute, dass das Protokoll, irgendwas in Richtung CAN open CiA418 
oder so ist, bin mir hier aber nicht sicher.

Gruß Jusch
: Verschoben durch Moderator
von Alexander (alecxs)


Lesenswert?

Ohne CAN‑Matrix und Signal‑Definitionen sind die Rohdaten ziemlich 
nutzlos. Du kannst danach googlen oder selbst rekonstruieren, ersteres 
geht vermutlich schneller.
von Falk S. (falk_s831)


Lesenswert?

Jo, viel zu extrahieren ist da nicht. Wenn es Canopen sein sollte, 
sollten die IDs über ein EDS zu dekodieren sein - da werden die Dinger 
eingestellen und welche Funktion sie haben. Ansonsten bist Du auf einer 
spaßigen Reise des ReverseEngineerings unterwegs, viel Glück dabei.
von Rainer W. (rawi)


Lesenswert?

Marius schrieb:
> BMZ_1.jpg
> ...
> im Anhang ein Bild einer CAN-Bus Aufzeichnung, welche mit PCAN-View
> gemacht wurde.

Wichtige Regeln - erst lesen, dann posten!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.

Das ist doch nicht sooh schwierig zu verstehen.

Guck dir nach ID sortiert an, wie sich die Daten z.B. mit Ladung, 
Entladung, Temperatur, ... ändern und ob das zu CiA 418 passt. Ohne 
Referenzdaten oder Doku kann man nichts damit anfangen.
Viel Spaß.

https://www.can-cia.org/can-knowledge/cia-418-canopen-device-profile-for-battery-modules
von Alexander (alecxs)


Lesenswert?

Schon mal die Frames durch eine KI gejagt?
von Clemens S. (zoggl)


Lesenswert?

sortier mal nach den IDs und der Zykluszeit

wenn es eine Dasy Chain ist lassen sich meis ähnliche Blöcke finden

zb
181 Spannung Modul 1
182 Spannung Modul 2
183 Spannung Modul 3

381 Temp Modul 1
382 Temp Modul 2
383 Temp Modul 3

(bei dir sehe ich immer 6 Blöcke mit der selben Zykluszeit. da ist 
wahrscheinlich etwas ähnliches drin.)

log mal einen kompletten Lade / Entlade Zyklus mit und plotte alle byte 
Werte eines Sets aus je einem "Moduldatensatz".

Dann siehst du sehr schnell, was da los ist, außer die "verschlüsseln" 
das irgendwie

und setz die daten als csv hier rein
: Bearbeitet durch User
von Karls Q. (karlsquell)


Lesenswert?

Das sagt der Chat_5.4:

Ja — **teilweise**. Ich kann aus dem Screenshot einige **plausible 
Strukturen und Felder** ableiten, aber **nicht belastbar das komplette 
BMZ-Hyperion-Protokoll** rekonstruieren, solange kein 
DBC/Protokolldokument oder ein längerer Log mit Zustandsänderungen 
vorliegt. Ich erfinde dir da lieber nichts zusammen.

### Was man aus dem Screenshot ziemlich gut erkennen kann

Im Trace sieht man mehrere Gruppen von CAN-IDs:

- `0C2h, 0C3h, 0C1h`
- `102h, 103h, 101h`
- `142h, 143h, 141h`
- `182h, 183h, 181h`
- `1C2h, 1C3h, 1C1h`
- `382h, 383h, 381h`
- `4C3h`
- `6C1h, 6C2h, 6C3h`
- `085h, 202h, 242h, 282h`

Das sieht **sehr stark nach einem zyklischen Multi-Frame-Schema pro 
Batterie-String/Modul** aus:
- Suffix `1/2/3` könnte auf **drei Slaves  drei Packs  drei Module** 
hindeuten.
- Die Blöcke `0x100`, `0x140`, `0x180`, `0x1C0` scheinen je Pack 
unterschiedliche Signalgruppen zu übertragen.

---

## Auffällige Muster im Screenshot

Ich lese aus dem Bild u. a. folgende Frames:

### Gruppe für „Kanal 2“
- `0C2h`: `01 00 00 00 00 00 00 00`
- `102h`: `00 00 00 00 00 01 1A 59`
- `142h`: `A0 0F A1 0F 03 00 1A 72`
- `182h`: `12 00 14 00 11 00 1A DA`
- `1C2h`: `FF FF 08 00 59 58 1A 61`
- `382h`: `B7 50 ED 00 00 00 0D E3`
- `6C2h`: `C3 E1 10 40 00 00 00 00`

### Gruppe für „Kanal 3“
- `0C3h`: `01 00 00 00 00 00 00 00`
- `103h`: `00 00 00 00 00 01 14 FF`
- `143h`: `99 0F A4 0F 41 00 14 31`
- `183h`: `12 00 13 00 05 00 14 69`
- `1C3h`: `00 00 18 00 58 58 14 5A`
- `383h`: `B7 50 ED 00 00 00 0A B0`
- `6C3h`: `C3 E1 10 40 00 00 00 00`

### Gruppe für „Kanal 1“
- `0C1h`: `01 00 00 00 00 00 00 00`
- `101h`: `00 01 00 00 00 01 1F 76`
- `141h`: `98 0F 9C 0F 81 00 1F 5B`
- `181h`: `12 00 13 00 03 00 1F A3`
- `1C1h`: `00 00 10 00 56 56 1F 04`
- `381h`: `B7 50 ED 00 00 00 10 AF`
- `6C1h`: `C3 E1 10 40 00 00 00 00`

---

## Sehr wahrscheinliche Interpretation

### 1) `0C1h/0C2h/0C3h`
`01 00 00 00 00 00 00 00`

Das wirkt wie:
- **Heartbeat  Alive  Status gültig**
- Byte 0 = `01` = Gerät online  Daten gültig  Freigabe vorhanden

Mehr kann man daraus ohne Vergleichsdaten nicht seriös sagen.

---

### 2) `141h/142h/143h` → sieht stark nach **Zellspannungen-Min/Max + 
Zellnummer** aus

Beispiel `142h`:
`A0 0F A1 0F 03 00 1A 72`

Wenn man Little-Endian 16-bit liest:

- Byte0..1 = `0x0FA0` = **4000**
- Byte2..3 = `0x0FA1` = **4001**
- Byte4..5 = `0x0003` = **3**
- Byte6..7 = `0x721A` oder CRC/Counter?
  Vorsicht: im CAN sind das einfach zwei weitere Bytes `1A 72`; je nach 
Endianness `0x721A = 29210`.

Das ist **extrem typisch** für:
- `U_cell_min = 4000 mV`
- `U_cell_max = 4001 mV`
- `cell_index = 3`

Weitere Beispiele passen ebenfalls:

- `141h`: `98 0F 9C 0F 81 00 1F 5B`
  - `0x0F98 = 3992 mV`
  - `0x0F9C = 3996 mV`
  - `0x0081 = 129` → das wirkt **nicht** wie einfache Zellnummer, eher:
    - obere Bits = Flags
    - untere Bits = Zellindex
    - oder zwei 8-bit Felder

- `143h`: `99 0F A4 0F 41 00 14 31`
  - `0x0F99 = 3993 mV`
  - `0x0FA4 = 4004 mV`
  - `0x0041 = 65`

**Fazit:**
Die ersten 4 Bytes sind **sehr wahrscheinlich Spannungswerte in mV**. 
Byte 4/5 enthalten wahrscheinlich **Index/Flags zu min/max-Zelle**.

---

### 3) `181h/182h/183h` → vermutlich **Temperaturen** oder weitere 
Extremwerte

Beispiel `182h`:
`12 00 14 00 11 00 1A DA`

Als 16-bit little-endian:
- `0x0012 = 18`
- `0x0014 = 20`
- `0x0011 = 17`

Das sieht stark nach:
- **T_min = 18 °C**
- **T_max = 20 °C**
- **Sensor-ID = 17**

Andere Beispiele:
- `181h`: `12 00 13 00 03 00 ...` → 18 °C / 19 °C / Sensor 3
- `183h`: `12 00 13 00 05 00 ...` → 18 °C / 19 °C / Sensor 5

Das ist **sehr plausibel**.

---

### 4) `1C1h/1C2h/1C3h` → wahrscheinlich **Strom  SoC  SoH / 
Statusbits**, aber nicht eindeutig

Beispiel `1C2h`:
`FF FF 08 00 59 58 1A 61`

Mögliche Zerlegung:
- `0xFFFF` = ungültig  nicht verwendet  signed = `-1`
- `0x0008` = Status oder Zähler
- `0x59 = 89`
- `0x58 = 88`

Die beiden Bytes `59 58`, `58 58`, `56 56` sind auffällig. Das könnte 
sein:
- SoC / SoH in Prozent
- zwei gleiche oder fast gleiche Kennwerte
- Durchschnitts-/Grenzwerte

Aber: **nicht belastbar**.

---

### 5) `381h/382h/383h` → sehr wahrscheinlich **Packspannung** oder 
**Energie-/Leistungswert**

Beispiel:
- `381h`: `B7 50 ED 00 00 00 10 AF`
- `382h`: `B7 50 ED 00 00 00 0D E3`
- `383h`: `B7 50 ED 00 00 00 0A B0`

Die ersten 3 Bytes sind bei allen gleich:
- `B7 50 ED`

Als 24-bit little-endian:
- `0xED50B7 = 15,552,695` → roh wenig intuitiv
- oder als andere Skalierung  Seriennummer  Kapazität / Energiezähler

Da nur die letzten zwei Bytes variieren, könnte das Frame sein:
- 32-bit Wert + 16-bit Prüfsumme
- oder 48-bit Datenstruktur mit Counter

Ohne mehr Daten **nicht sicher dekodierbar**.

---

### 6) `6C1h/6C2h/6C3h` → möglicherweise **Float-Wert im IEEE754**

Alle drei:
`C3 E1 10 40 00 00 00 00`

Die ersten vier Bytes little-endian gelesen:
- `0x4010E1C3`

Das sieht sehr nach IEEE754-Float aus. Ich habe den Wert nicht blind 
geraten, aber er liegt ungefähr im Bereich **2.x**. Das könnte sein:
- Strom in A
- Spannung pro Zelle in V
- Innenwiderstand
- Kalibrierwert

Da für alle drei identisch, könnte es auch ein 
**Konfigurationsparameter** sein.

---

### 7) `202h`, `242h`, `282h` → sieht nach **langen Bitfeldern / 
Zell-Balancing / Fehlerbitmap** aus

- `202h`: `A1 0F A1 0F A1 0F A1 0F`
- `242h`: `A0 0F A1 0F A1 0F 9F 0F`
- `282h`: `A1 0F A1 0F A0 0F A1 0F`

Das sind je vier 16-bit Werte um **3999–4001 mV**.
Das könnte sehr gut sein:
- **vier Einzelzellspannungen**
- also z. B. Zellen 1–4 eines Blocks

Dann wären `242h`/`282h` evtl. weitere Zellgruppen.
Das ist eine der **stärksten Hypothesen** im ganzen Bild.

---

## Meine beste Arbeits-Hypothese für die Telegramme

| CAN-ID-Bereich | Vermutung |
|---|---|
| `0Cxh` | Heartbeat  Online  Freigabe |
| `10xh` | Status/Flags/Counter/Pack-spezifischer Zustandswert |
| `14xh` | Zellspannung min/max und Index/Flags |
| `18xh` | Temperatur min/max und Sensorindex |
| `1Cxh` | SoC/SoH/Strom/Statuswort |
| `20xh/24xh/28xh` | Einzelzellspannungen blockweise |
| `38xh` | Summenwert/Energiezähler/Packspannung mit Zusatzbytes |
| `6Cxh` | Float/Konfigurationswert |

---

## Was ich **nicht** belastbar behaupten würde

Ich würde **nicht** ohne weitere Daten sagen:
- welches Byte exakt **SoC**, **SoH**, **Strom**, **Leistung**, 
**Spannung**, **Fehlercode** ist
- ob die letzten 1–2 Bytes eine **CRC**, ein **Rolling Counter** oder 
Timestamp/Alive-Counter sind
- ob die IDs proprietär BMZ sind oder nur auf einer 
Drittgeräte-Schnittstelle gespiegelt werden

Dafür bräuchte ich mehr als einen Screenshot.

---

## Was du mir geben müsstest, damit ich es sauber dekodiere

Am besten eines davon:

1. **Rohlog als Text**
   - z. B. aus PCAN-View exportiert (`.trc`, `.txt`, `.asc`)
2. **Messung bei bekannten Zustandsänderungen**
   - Laden EIN/AUS
   - Entladen EIN/AUS
   - SoC bekannt
   - Packspannung bekannt
   - Temperaturen bekannt
3. **Längerer Mitschnitt**
   - mindestens 30–60 Sekunden
4. **Falls vorhanden:**
   - DBC
   - BMZ-Dokumentation
   - Wechselrichter-/BMS-Protokollbeschreibung

Dann kann ich dir typischerweise:
- Signal für Signal mappen,
- Endianness prüfen,
- Skalierung ableiten,
- eine **Tabelle aller CAN-IDs** erstellen,
- und bei Bedarf sogar eine **DBC-Datei** daraus bauen.

---

## Vorläufige Dekodierung der sichtbarsten Frames

### Wahrscheinlichste Kandidaten

| ID | Daten | Wahrscheinliche Bedeutung |
|---|---|---|
| `0C1/0C2/0C3` | `01 00 00 00 00 00 00 00` | Heartbeat / aktiv |
| `141/142/143` | z. B. `A0 0F A1 0F 03 00 ...` | `Ucell_min`, `Ucell_max`, 
Index/Flags |
| `181/182/183` | z. B. `12 00 14 00 11 00 ...` | `Tmin`, `Tmax`, Sensorindex |
| `202/242/282` | `A1 0F ...` | Einzelzellspannungen in mV |
| `6C1/6C2/6C3` | `C3 E1 10 40 ...` | Float-/Konfigurationswert |

---

## Konkretes Beispiel dekodiert

### `142h = A0 0F A1 0F 03 00 1A 72`

Wenn Little-Endian 16-bit:
- Wert 1: `0x0FA0 = 4000`
- Wert 2: `0x0FA1 = 4001`
- Wert 3: `0x0003 = 3`

**Plausibel:**
- minimale Zellspannung: **4000 mV**
- maximale Zellspannung: **4001 mV**
- betroffene Zelle / Gruppe: **3**

### `182h = 12 00 14 00 11 00 1A DA`

- `0x0012 = 18`
- `0x0014 = 20`
- `0x0011 = 17`

**Plausibel:**
- minimale Temperatur: **18 °C**
- maximale Temperatur: **20 °C**
- Sensor/Index: **17**

---

## Kurzfazit

**Ja, grob dekodieren kann man das schon.**
**Belastbar erkennbar** sind vor allem:
- **Zellspannungswerte** um 4.0 V
- **Temperaturwerte** um 18–20 °C
- **zyklische Telegrammgruppen für mehrere Batteriemodule**

**Nicht belastbar** ist aus nur diesem Screenshot:
- vollständige Signalzuordnung aller Bytes
- SoC/SoH/Strom/Leistung/Faultbits im Detail

### Wenn du willst
Lade mir den **PCAN-Export als `.trc`, `.txt` oder `.asc`** hoch, dann 
mache ich dir daraus:
1. eine **ID-für-ID-Dekodiertabelle**
2. die **wahrscheinlichen Skalierungen**
3. auf Wunsch sogar eine **erste DBC-Datei**.
: Bearbeitet durch User
von Marius (jusch)


Lesenswert?

Alexander schrieb:
> Schon mal die Frames durch eine KI gejagt?

Ja habe ich.

Es kommt das ähnliche Ergebnis raus wie bei Karls Q seinem Post.

Leider passt hier z.B. nicht die Modulspannung. Diese müsste bei ca. 
56,1V liegen. Diese Spannung hatten die Module als der Trace erstellt 
wurde.
von Marius (jusch)



Lesenswert?

Hallo,

hat ein bisschen gedauert. Musste mir erst noch ein Adapter etc. bauen 
um ein BMZ Helios Batteriemodul direkt anzusprechen ohne dass die BMU 
mit aktiv ist.

Im Anhang habe ich mal die Log-Datei angehangen.

Gruß Jusch
von Rainer W. (rawi)


Lesenswert?

Marius schrieb:
> Leider passt hier z.B. nicht die Modulspannung. Diese müsste bei ca.
> 56,1V liegen.

Die könnte sich aus der Summe der Zellspannungen ergeben.
Wie ist dein BMZ Hyperion Batteriespeicher aufgebaut?
Falls die Zellen als 14S verschaltet sind, könnte sich der von dir 
angegebene Wert ergeben - das Aufaddieren überlasse ich dir. Wo ist 
"hier"?
von Marius (jusch)


Lesenswert?

Kurzes Update:

Ich habe einen Adapter gebaut, womit ich die CAN-Kommunikation von einem 
Modul aufzeichnen / anschauen kann.

Das Protokoll müsste / ist ähnlich wie CiA 454 (EnergyBus) Battery 
Device Profile.

Die CAN-ID 201, 241, 281, 2C1 ist die Zellspannung (max. 16 Zellen), 
Lesart sind jeweils 2 Byte als Little-Endian-Format, in 
HEX-Zahlenformat. Die Spannung ist in Volt mit drei Nachkommastellen.

Die letzte Zahl der CAN-ID gibt das jeweilige Batteriemodul an, hierbei 
das Batteriemodul 1.

Die CAN-ID 301 sind die Temperaturfühler des Moduls (max. 8 Stück), 
verbaut pro Modul sind 6 Stück.
Temperatur wird in °C angeben, jedes Byte ist ein Temperaturfühler in 
HEX-Zahlenformat.

Für weitere CAN-IDs sind auch Informationen vorhanden.

In der CAN-ID 0C1 ist der werden Fehler / Warnungen dargestellt, hierbei 
ist mir aufgefallen, dass einzelne Batteriemodule sich in dieser ID 
unterscheiden, bzw. das unterschiedliche Werte drin stehen.

Ein Befehl an 082 Byte 0: 01 = Erzeugt eine Antwort des BMS, eigentlich 
sollte damit eine Fehlermeldung quittiert werden, nur leider macht das 
BMS dies nicht.

Vielleicht habt jemand noch eine Idee, wie die Fehler weiter quittiert 
werden können.
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.