Teilnehmermodus Protokoll Spezifikation v1.1 - BMS CAN LIN Kommunikation

⚠️ Wichtige Versionsanforderungen

Damit dieser Modus über die App erfolgreich aktiviert werden kann, muss mindestens die App Version v1.60 und mindestens die BMS Version 0.5.6 installiert sein. Falls eine ältere Version installiert ist, schauen Sie bitte auf ältere Versionen dieser Dokumentation.

→ Zur Version 1.0 der Dokumentation

Überblick - BMS Kommunikationsprotokoll für Entwickler

Das Teilnehmermodus Protokoll ist ein standardisiertes BMS Kommunikationsprotokoll für die Kommunikation mit SaftkistePRO Batteriemanagementsystemen mit Unterstützung für CAN-Bus und LIN-Bus Schnittstellen. Die SaftkistePRO kann als passiver Teilnehmer in bestehende Bus-Netzwerke integriert werden und ihre Batteriedaten über das Protokoll an andere Systeme im Fahrzeug senden. Diese Funktion ermöglicht es, Ladezustand, Spannung, Strom und weitere wichtige Batterieparameter direkt an Bordcomputer, Anzeigegeräte oder andere Komponenten zu übertragen, ohne dass zusätzliche Verkabelung erforderlich ist. Diese technische Spezifikation definiert die Nachrichtenstruktur, Signaldefinitionen und Implementierungsanforderungen für Entwickler, die Teilnehmermodus-kompatible BMS-Geräte integrieren möchten.

Downloads

Protokoll-Dateien für Entwickler:

Anschluss und Aktivierung

CAN

Die Pins für CAN-High und CAN-Low sind an den Pins 6 bzw. 16 der SaftkistePRO anzuschließen:

SaftkistePRO CAN-Bus Anschluss Pin 6 und 16 Teilnehmermodus

Aktivierung über App > “Netzwerk” > “CAN Teilnehmermodus” > “Hinzufügen”.

LIN

Der LIN-Bus ist an Pin 8 der SaftkistePRO anzuschließen:

SaftkistePRO LIN-Bus Anschluss Pin 8 Teilnehmermodus

Aktivierung über App > “Netzwerk” > “LIN Teilnehmermodus” > “Hinzufügen”.

BMS Protokoll Features - CAN und LIN Bus

  • Dual-Bus-Unterstützung: CAN 2.0B und LIN 2.1
  • Umfassende BMS-Daten: Batteriestatus, Zellspannungen, Schutzfunktionen und Diagnose
  • Standardisiertes Nachrichtenformat: Konsistent über alle Teilnehmermodus-Geräte
  • Echtzeit-Überwachung: Kritische Daten mit 100ms Aktualisierungsraten
  • Fehlererkennung: Integrierte Fehlerberichterstattung und Schutzmechanismen

CAN LIN Nachrichten-Übersicht - BMS Datenstruktur

Nachricht CAN ID LIN ID Länge Update-Rate Beschreibung
States 0x770 0x10 8 Bytes 100ms Alle Boolean-Status-Flags
Parameters 0x771 0x11 4 Bytes 1000ms Software-/Hardware-Versionen
Serial_Number_1 0x772 0x12 8 Bytes 5000ms Geräte-Seriennummer (Teil 1)
Serial_Number_2 0x773 0x13 8 Bytes 5000ms Geräte-Seriennummer (Teil 2)
General_Readings 0x774 0x14 8 Bytes 100ms Spannung, Strom, Temperatur
Cell_Voltages 0x775 0x15 8 Bytes 100ms Einzelne Zellspannungen
Capacity 0x776 0x16 7 Bytes 1000ms SOC, SOH, Kapazitätsdaten
Cumulativ_Ah 0x777 0x17 8 Bytes 1000ms Kumulierte Lade-/Entladung
Uptime 0x778 0x18 8 Bytes 10000ms System-Laufzeitzähler
Time_To_Go 0x779 0x19 8 Bytes 1000ms Geschätzte Restlaufzeit und Zeit bis Vollladung

Nachrichten-Definitionen

States (0x770 / 0x10)

Zweck: Konsolidierte Boolean-Status-Flags für alle BMS-Zustände, Schutzfunktionen und Fehler.

Bit-Layout:

Byte Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
0 Any_Fault_Active Any_Protection_Active Force_Off_Pin_State User_Main_Switch_State Is_Heating Is_Balancing Is_Discharging Is_Charging
1 High_Current_Charge_Prot High_Cell_Voltage_Prot Low_Cell_Voltage_Prot Pre_Warning_Charge_Shutdown Pre_Warning_Discharge_Shutdown Low_SoC Allowed_To_Discharge Allowed_To_Charge
2 Switch_Fault Low_Temperature_Discharge_Prot Low_Temperature_Charge_Prot High_Temperature_Discharge_Prot High_Temperature_Charge_Prot High_Current_Discharge_Prot High_Current_Charge_Prot Reserviert
3 Critical_Alert Switch_Forced_Off Shunt_Delta_Fault Voltage_Delta_Fault Temperature_Fault Voltage_Fault Switch_Fault Reserviert
4-7 Reserviert (0x00)

Signal-Definitionen:

  • Is_Charging: Batterie wird aktiv geladen
  • Is_Discharging: Batterie wird aktiv entladen
  • Is_Balancing: Zellbalancing ist aktiv
  • Is_Heating: Batterieheizung ist aktiv
  • Any_Protection_Active: Beliebiger Schutzmechanismus ist ausgelöst
  • Any_Fault_Active: Beliebige Fehlerbedingung liegt vor
  • Critical_Alert: Kritischer Systemfehler erfordert sofortige Aufmerksamkeit

Parameters (0x771 / 0x11)

Zweck: Software- und Hardware-Versionsinformationen.

Byte-Layout:

Byte Feld Typ Bereich
0 Software_Version_Major 8-bit unsigned 0-255
1 Software_Version_Minor 8-bit unsigned 0-255
2 Software_Version_Patch 8-bit unsigned 0-255
3 Hardware_Version 8-bit unsigned 0-255

Serial_Number_1 & Serial_Number_2 (0x772-0x773 / 0x12-0x13)

Zweck: 16-stellige ASCII-Seriennummer-Identifikation.

Format: ASCII-Zeichen, null-terminiert wenn kürzer als 16 Zeichen.

General_Readings (0x774 / 0x14)

Zweck: Primäre Batteriemessungen.

Byte-Layout:

Bytes Feld Typ Einheit
0-3 Voltage 32-bit unsigned, little-endian mV
4-5 Current 16-bit signed, little-endian mA
6-7 Temperature 16-bit unsigned, little-endian 0,01°C

Berechnungen:

  • Spannung: Rohwert * 1 mV
  • Strom: Rohwert * 1 mA (negativ = Entladung, positiv = Ladung)
  • Temperatur: Rohwert * 0,01°C

Cell_Voltages (0x775 / 0x15)

Zweck: Überwachung einzelner Zellspannungen.

Byte-Layout:

Bytes Feld Typ Einheit
0-1 Cell1_Voltage 16-bit unsigned, little-endian mV
2-3 Cell2_Voltage 16-bit unsigned, little-endian mV
4-5 Cell3_Voltage 16-bit unsigned, little-endian mV
6-7 Cell4_Voltage 16-bit unsigned, little-endian mV

Capacity (0x776 / 0x16)

Zweck: Batteriekapazität und Zustandsinformationen.

Byte-Layout:

Bytes Feld Typ Einheit
0-1 State_Of_Charge 16-bit unsigned, little-endian 0,01%
2-3 State_Of_Health 16-bit unsigned, little-endian 0,01%
4-5 Dischargeable_Capacity 16-bit unsigned, little-endian 0,1Ah
6 Nominal_Capacity 8-bit unsigned 2Ah

Berechnungen:

  • SOC: Rohwert * 0,01% (Bereich: 0-100%)
  • SOH: Rohwert * 0,01% (Bereich: 0-100%)
  • Entladbare Kapazität: Rohwert * 0,1 Ah
  • Nennkapazität: Rohwert * 2 Ah

Cumulativ_Ah (0x777 / 0x17)

Zweck: Lebensdauer-Energiezähler.

Byte-Layout:

Bytes Feld Typ Einheit
0-3 Cumulativ_Discharged_Ah 32-bit unsigned, little-endian Ah
4-7 Cumulativ_Charged_Ah 32-bit unsigned, little-endian Ah

Uptime (0x778 / 0x18)

Zweck: System-Laufzeitverfolgung.

Byte-Layout:

Bytes Feld Typ Einheit
0-3 Uptime 32-bit unsigned, little-endian Sekunden
4-7 Reserviert 32-bit unsigned, little-endian -

Time_To_Go (0x779 / 0x19)

Zweck: Geschätzte Restlaufzeit und Zeit bis Vollladung.

Byte-Layout:

Bytes Feld Typ Einheit
0-3 Time_To_Go 32-bit unsigned, little-endian Sekunden
4-7 Time_To_Full 32-bit unsigned, little-endian Sekunden

Spezialwerte:

  • Time_To_Go = 4294967295: Nicht anwendbar (z.B. bei Ladung)
  • Time_To_Full = 4294967295: Nicht anwendbar (z.B. bei Entladung)

BMS Implementierungsanforderungen - CAN LIN Konfiguration

CAN-Bus-Konfiguration

  • Protokoll: CAN 2.0B Standard Frame
  • Baudrate: 500 kbps (empfohlen)
  • Byte-Reihenfolge: Little Endian
  • Knotenname: "Saftkiste"

LIN-Bus-Konfiguration

  • Protokoll: LIN 2.1
  • Baudrate: 19200 bps
  • NAD: 0x01
  • Produkt-ID: 0x1234, 0x5678

Timing-Anforderungen

  • Kritische Nachrichten (States, General_Readings, Cell_Voltages): ≤ 100ms
  • Status-Nachrichten (Capacity, Parameters): ≤ 1000ms
  • Identifikations-Nachrichten (Serial Numbers, Uptime): ≤ 10000ms

Fehlerbehandlung

  • Überwachung der Any_Fault_Active und Critical_Alert Flags
  • Implementierung von Timeout-Erkennung für fehlende Nachrichten
  • Validierung der Datenbereiche gemäß Signaldefinitionen

BMS Code-Beispiele - CAN LIN Implementierung

CAN-Nachrichten-Parsing (C)

typedef struct {
    uint8_t is_charging : 1;
    uint8_t is_discharging : 1;
    uint8_t is_balancing : 1;
    uint8_t is_heating : 1;
    uint8_t user_main_switch : 1;
    uint8_t force_off_pin : 1;
    uint8_t any_protection : 1;
    uint8_t any_fault : 1;
} states_byte0_t;

void parse_states_message(uint8_t* data) {
    states_byte0_t* states = (states_byte0_t*)&data[0];

    if (states->any_fault) {
        // Fehlerbedingung behandeln
    }
    if (states->any_protection) {
        // Schutzfunktion behandeln
    }
}

void parse_general_readings(uint8_t* data) {
    uint32_t spannung_mv = *(uint32_t*)&data[0];
    int16_t strom_ma = *(int16_t*)&data[4];
    uint16_t temp_raw = *(uint16_t*)&data[6];

    float temperatur_c = temp_raw * 0.5f;

    printf("Spannung: %u mV, Strom: %d mA, Temp: %.1f°C\n",
           spannung_mv, strom_ma, temperatur_c);
}

LIN-Schedule-Implementierung

// LIN Schedule-Tabelle
lin_frame_t schedule[] = {
    {0x10, 10},   // States - 10ms
    {0x14, 10},   // General_Readings - 10ms
    {0x15, 10},   // Cell_Voltages - 10ms
    {0x16, 100},  // Capacity - 100ms
    {0x11, 1000}, // Parameters - 1000ms
};

Konformitätstests

Nachrichten-Validierung

  1. Überprüfung, dass alle Nachrichten-IDs übertragen werden
  2. Prüfung der Timing-Anforderungen
  3. Validierung der Datenbereiche und Skalierung
  4. Test der Fehler-Flag-Funktionalität

Integrations-Checkliste

Versions-Historie

Version Datum Änderungen
1.1 28.11.2025
  • Entfernung des Signals "Uptime_Since_Last_Reset". Stattdessen bleibt diese Adresse frei.
  • Hinzufügung von Time_To_Full bei CAN-ID 0x779 bzw. LIN-ID 0x19
  • Fehlerbehebung bei Time_To_Go Berechnung
1.0 01.11.2025 Erstveröffentlichung

Kontakt: Für technischen Support und Protokoll-Updates wenden Sie sich an das Entwicklungsteam.