Teilnehmermodus
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:
Aktivierung über App > “Netzwerk” > “CAN Teilnehmermodus” > “Hinzufügen”.
LIN
Der LIN-Bus ist an Pin 8 der SaftkistePRO anzuschließen:
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_ActiveundCritical_AlertFlags - 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
- Überprüfung, dass alle Nachrichten-IDs übertragen werden
- Prüfung der Timing-Anforderungen
- Validierung der Datenbereiche und Skalierung
- Test der Fehler-Flag-Funktionalität
Integrations-Checkliste
Versions-Historie
| Version | Datum | Änderungen |
|---|---|---|
| 1.1 | 28.11.2025 |
|
| 1.0 | 01.11.2025 | Erstveröffentlichung |
Kontakt: Für technischen Support und Protokoll-Updates wenden Sie sich an das Entwicklungsteam.