Teilnehmermodus Protokoll Spezifikation v1.0 - BMS CAN LIN Kommunikation

Ü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. Diese technische Spezifikation definiert die Nachrichtenstruktur, Signaldefinitionen und Implementierungsanforderungen für Entwickler, die Teilnehmermodus-kompatible BMS-Geräte integrieren möchten.

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 4 Bytes 1000ms Geschätzte Restlaufzeit

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,5°C

Berechnungen:

  • Spannung: Rohwert * 1 mV
  • Strom: Rohwert * 1 mA (negativ = Entladung, positiv = Ladung)
  • Temperatur: Rohwert * 0,5°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,5%
2-3 State_Of_Health 16-bit unsigned, little-endian 0,5%
4-5 Dischargeable_Capacity 16-bit unsigned, little-endian 0,1Ah
6 Nominal_Capacity 8-bit unsigned 2Ah

Berechnungen:

  • SOC: Rohwert * 0,5% (Bereich: 0-100%)
  • SOH: Rohwert * 0,5% (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 Uptime_Since_Last_Reset 32-bit unsigned, little-endian Sekunden

Time_To_Go (0x779 / 0x19)

Zweck: Geschätzte verbleibende Laufzeit.

Byte-Layout:

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

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.0 01.11.2025 Erstveröffentlichung

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