Plattform · Multi Stacks
Fahrzeug- und Industrial-IoT-Kommunikation, deklariert als Datendateien.
CAN, J1939, UDS, Modbus, ISOBUS — gleiche Engine, eine DSL, eine Laufzeit. Stacks laufen gleichzeitig auf denselben physischen Schnittstellen mit unabhängigen Lifecycles. Protokoll-Änderungen sind JSON-Edits, keine Firmware-Releases.
Teil der No-Code-Engine-Schicht — Stack-Verhalten aus JSON konfigurieren, kein Rekompilieren erforderlich. Developer-first: vollständige JSON-DSL über das MOS4-SDK.
Das deklarative Modell
Vier Bausteine — eine Engine.
Jedes Multi-Stacks-Deployment, Fahrzeugbus oder Industrial IoT, wird als vier bewegliche Teile deklariert. Periodische Strategie wird out of the box geliefert; erweiterte Sequenzen entstehen durch Kombination mit MSP und MEP.
1 · Protokoll
Transport und Framing — CAN, CAN-FD, J1939, ISO-TP, DoIP, UDS, K-Line, ISOBUS, Modbus RTU/TCP, CANopen. Auswahl ist ein JSON-Feld; kein Rekompilieren für einen neuen Transport.
2 · Anfrage + Antwort
Welchen Command, welche PID, PGN oder Register senden und wie die Antwort zu dekodieren ist. Dekodier-Ausdrücke sind inline — Bytes rein, benanntes Signal raus.
3 · Broadcast
Read-only und unaufgeforderte Nachrichtenverarbeitung — passives Sniffing, ereignisartiges Dekodieren ohne eine Anfrage. Dasselbe JSON deklariert die Dekodierung für unaufgeforderte Frames.
4 · Strategie
Welche Sequenzen wann ausgeführt werden. Standardmäßig periodisch. Signalgesteuert über MSP, ereignisgesteuert über MEP — der Rest von MOS4 liefert die erweiterte Strategie ohne das deklarative Modell zu verlassen.
Protokoll-Abdeckung
16 Protokoll-Familien in einer einheitlichen API.
| Protokoll | Transport | Typisches Segment |
|---|---|---|
| CAN Classical | CAN | PKW, leichte Nutzfahrzeuge, Off-Highway |
| CAN-FD | CAN | Moderne PKW, Elektrofahrzeuge |
| ISO-TP | CAN segmentiert | UDS-Diagnoseschicht |
| DoIP | Ethernet | Moderne ECU-Diagnose |
| UDS | ISO-TP / DoIP | Unified Diagnostic Services |
| OBD-II | ISO-TP / K-Line | Leichtfahrzeug-Emissionen (ISO 15031) |
| OBFCM | OBD-II / UDS | EU-Kraftstoff-/Energiemeldung (2021/392) |
| J1939 | CAN | Schwere Nutzfahrzeuge, Busse |
| J1587/J1708 | RS-485 | Legacy schwere Nutzfahrzeuge |
| J1850 VPW/PWM | Einzel-Draht | Legacy PKW (GM, Chrysler) |
| K-Line | ISO 9141-2 | Ältere Personenfahrzeuge |
| CANopen | CAN | Industrie, Off-Highway-Maschinen |
| ISOBUS | CAN (ISO 11783) | Landwirtschaftliche Geräte (nur Lesen) |
| Modbus RTU/TCP | RS-485 / Ethernet | Industrie-Sensoren, Generatoren, SPSen |
| GMLAN | CAN | Legacy-GM-PKW |
| TP 2.0 | CAN | VAG-Gruppe PKW |
Modbus ASCII ist experimentell — nicht für Produktionseinsatz angegeben. ISOBUS ist schreibgeschützte Erfassung; VT-Display-Authoring wird nicht unterstützt.
Bringen Sie Ihren Bus und Protokoll-Mix — wir passen Multi Stacks an.
Praxisbeispiel · Fahrzeug (J1939)
LKW-Dashcam-Szenario — Motorlast via J1939.
Eine schwere Nutzfahrzeug-Flotten-Dashcam benötigt Motorlast und Straßengeschwindigkeit bei 10 Hz, zusammen mit Diagnose-Trouble-Code-Abfragen auf Anforderung. Das Ganze ist ein einzelner JSON-Stack.
Minimaler J1939-Stack-JSON
{
"ecu_id": "EngineECU",
"address": "0x00",
"commands": [
{
"name": "engine_load_pct",
"pgn": "0xF003",
"spn": 92,
"period_ms": 100,
"decode": "A * 100 / 255"
},
{
"name": "road_speed_kph",
"pgn": "0xFEF1",
"spn": 84,
"period_ms": 100,
"decode": "(A * 256 + B) / 256"
}
],
"dtc": { "service": "uds", "read": "0x19", "clear": "0x14" }
} Eine PGN hinzufügen, einen Zeitraum ändern oder einen neuen DTC-Service verdrahten ist ein JSON-Edit und ein Commit. Kein Rekompilieren, kein Firmware-Flash.
Praxisbeispiel · Industrial IoT (Modbus)
Abfragen einer SPS über Modbus RTU.
Gleiche vier Bausteine, anderes Protokoll. Ein Fabrik-Generatorregler stellt Eingangsregister bereit; ein Modbus-Stack pollt sie mit 1 Hz, dekodiert sie als benannte Signale und sendet ein Ereignis, wenn ein Schwellwert überschritten wird.
Minimaler Modbus-Stack-JSON
{
"device_id": "Genset-01",
"transport": "modbus_rtu",
"slave_id": 7,
"commands": [
{
"name": "coolant_temp_c",
"function": "read_input_registers",
"address": 30001,
"count": 1,
"period_ms": 1000,
"decode": "A / 10"
},
{
"name": "fuel_level_pct",
"function": "read_input_registers",
"address": 30002,
"count": 1,
"period_ms": 1000,
"decode": "A"
}
],
"broadcast": { "on_threshold": "fuel_level_pct < 10", "emit": "low_fuel" }
} Modbus RTU und Modbus TCP/MBAP teilen dieselbe DSL. Von einem auf den anderen wechseln ist ein einzelnes JSON-Feld.
Strategie-Komposition
Multi Stacks gesteuert durch MSP oder MEP.
Der Strategie-Baustein ist absichtlich einfach — periodisch, mit optionalen Broadcast-Triggern. Erweiterte Sequenzen entstehen, wenn MSP (signalgesteuert) oder MEP (ereignisgesteuert) die Strategie ist.
MSP steuert Multi Stacks (signalgesteuert)
Ein MSP-Graph überwacht ein dekodiertes Signal — z. B. Straßengeschwindigkeit überschreitet 80 km/h — und löst eine Multi-Stacks-Anfrage aus (z. B. UDS-Lesen des Kraftstoffverbrauchs-Snapshots). Die Antwort fließt über denselben Stack zurück.
Ein MSP-Graph überwacht einen Signal-Schwellwert und löst eine Multi-Stacks-UDS-Anfrage aus; die Multi-Stacks-Antwort fließt zurück in MSP.
flowchart LR Sig[MSP-Graph<br/>Signal-Schwellwert] -->|auslösen| MS[Multi Stacks<br/>UDS-Anfrage senden] MS -->|Antwort| Sig
MEP steuert Multi Stacks (ereignisgesteuert)
Eine MEP-Regel feuert bei einem benannten Ereignis (Motor EIN, Geofence-Überquerung, OTA-Download abgeschlossen) und führt eine Multi-Stacks-Aktions-Sequenz aus — z. B. DTCs nach einem Serviceebesuch löschen oder einen einmaligen ECU-Snapshot lesen.
Ein EventBus-Ereignis löst eine MEP-Regel aus, deren Aktion eine Multi-Stacks-Sequenz ausführt.
flowchart LR Evt[EventBus<br/>benanntes Ereignis] -->|auslösen| MEP[MEP-Regel] MEP -->|Aktion| MS[Multi Stacks<br/>Sequenz ausführen]
Multi-Stack-Modus
N Stacks · ein Satz physischer Schnittstellen.
Jeder Stack läuft mit einem unabhängigen Lifecycle und Export-Pfad auf denselben physischen Schnittstellen. Mehrere Stacks, die einen Bus teilen, benötigen keinen Scheduler — die einheitliche Protokoll-API arbitriert den Zugriff und erzwingt Isolation.
Drei unabhängige Stacks teilen eine einheitliche Protokoll-API. Stack A ist ein OBD-II-JSON-Stack, der Fahrgast-PIDs liest. Stack B ist ein J1939-JSON-Stack, der LKW-PGNs liest. Stack C ist ein Modbus-JSON-Stack, der RS-485-Sensoren liest. Alle drei speisen die einheitliche Protokoll-API, die den Zugriff arbitriert und unabhängige Lifecycles erzwingt. Der Manager leitet zu drei physischen Schnittstellen — CAN0, CAN1 und RS-485 — ohne Bus-Eigentümerschaftskonflikte. Jeder Stack exportiert unabhängig: Stack A zu MQTT-Topic A, Stack B zu MQTT-Topic B, Stack C zur Policy-Engine.
flowchart TD S1[Stack A — OBD-II JSON<br/>Fahrgast-PIDs] S2[Stack B — J1939 JSON<br/>LKW-PGNs] S3[Stack C — Modbus JSON<br/>RS-485-Sensoren] V[Einheitliche Protokoll-API<br/>Arbitrierung · Lifecycles] S1 --> V S2 --> V S3 --> V V --> Iface1[CAN0] V --> Iface2[CAN1] V --> Iface3[RS-485] S1 -->|Export| MQ1[MQTT-Topic A] S2 -->|Export| MQ2[MQTT-Topic B] S3 -->|Export| MEP[Policy-Engine]
| Methode | Takt | Beschreibung |
|---|---|---|
| SubscribeData | konfigurierbar | Dekodierte, benannte Signal-Werte für MSP- und MEP-Verbrauch |
| SubscribeBusLoad | ~1 Hz | CAN-Auslastungs-Metriken pro physischer Schnittstelle |
| SubscribeCanFrames | Frame-Rate | Raw-Frame-Tap — zusammengeführter Stream von allen aktiven Stacks |
Der Raw-Frame-Tap streamt in Echtzeit für den Verbrauch durch MSP, die MQTT-Bridge und den MOS4-Datenbankdienst.
Fähigkeiten
Was out of the box geliefert wird.
22 CI-validierte Standard-Stacks, produktionsgradige DTC-Behandlung, J2534-2-Passthrough und eingebaute Circuit-Breaker-Resilienz — alles verfügbar ohne einen Scheduler zu schreiben oder Bus-Arbitrierung manuell zu verwalten.
22 CI-validierte Standard-Stacks
OBD-II, UDS, J1939, ISOBUS, OBFCM, Modbus, CANopen und andere sind enthalten und bei jedem CI-Push über Python/pytest-Standalone-Tests validiert. Eigenen Stack als JSON-Datei daneben hinzufügen.
DTC-Lesen + -Löschen
Diagnostic Trouble Codes werden über den unterstützten Stack via OBD-II-Service 03/04 oder UDS-Diagnoseinformations-Services gelesen und gelöscht. Im Stack-JSON deklariert — kein benutzerdefinierter Code erforderlich.
J2534-2-Passthrough
Eine PassThru-JSON/Protobuf-API mit J2534-2-Extended-API-Unterstützung lässt bestehende Scan-Tools und ECU-Flasher das Fahrzeug über dasselbe Gateway erreichen — kein dedizierter J2534-Dongle benötigt.
Circuit-Breaker-Resilienz
Nach wiederholten Kommunikationsfehlern mit einer bestimmten ECU fährt dieser Stack automatisch zurück und meldet seinen Gesundheitsstatus an den Cloud-Controller. Andere Stacks auf demselben Gateway laufen normal weiter — kein Retry-Sturm, kein Kaskadenausfall.
Identifikation + OE-Stack-Push
Der richtige Stack für jedes Fahrzeug, automatisch.
Bevor ein Polling beginnt, identifiziert die Laufzeit das Fahrzeug und wählt den passenden OE-Stack zum Laden aus. Der gepushte OE-Stack standardisiert die Daten — Benennung, Format, Einheiten und Frequenz — über OE-DTCs, Dashboard-Telemetrie und andere OE-Datenoberflächen.
VIN-Identifikation
Die VIN wird beim Verbinden vom Fahrzeug gelesen. Die Laufzeit ordnet sie der entsprechenden OE-Stack-Definition zu und lädt diese, bevor der erste Polling-Zyklus beginnt. Keine manuelle Konfiguration auf Fahrzeug-Ebene.
Identifikations-Logik
Wenn die VIN allein nicht ausreicht, behandelt benutzerdefinierte Identifikations-Logik — in der Stack-Konfiguration deklariert — Grenzfälle: Fahrzeug-Varianten, Nachrüstungen oder gemischte Flotten-Konfigurationen. Das Ergebnis ist immer eine Stack-Auswahl.
Pro-Fahrzeug-Konfiguration
Identifikation kann auch durch eine pro-Fahrzeug-Konfiguration gesteuert werden, die aus der Cloud gepusht wird. Dies unterstützt Flotten, bei denen VIN-basierte Auflösung entweder nicht verfügbar oder durch Operator-Zuweisung überschrieben ist.
Dieser Identifikationsprozess ist autonom — das Gerät löst den richtigen Stack lokal aus dem Identifikationsergebnis auf, ohne Cloud-Round-Trip für den normalen Betrieb. Die Cloud pusht die OE-Stack-Definition einmal; das Gerät wendet sie bei jeder Verbindung an.
Kunden können den Stack-Katalog mit eigenen Stacks erweitern — gekauft, IP-eigentum oder reverse-engineered — mit eigener Identifikations-Logik. Benutzerdefinierte Stacks sind auf ihre Flotte beschränkt; sie koexistieren neben den Standard-OE-Stacks ohne Konflikt.
Für Cloud-gesteuerte Remote-Diagnose — wo ein Mensch oder eine KI der Master ist statt des Geräts — wenden Sie sich an unser Engineering-Team bezüglich der Remote-Diagnose-Oberfläche.
Einordnung
Eine Säule der Operations-Schicht.
Remote-Diagnose ist eine von fünf Säulen in der Operations-Schicht — zusammen mit Observability, Safety, OTA und Lifecycle. Den vollständigen Satz lesen unter /de/platform/operations.
ECU-Simulation
Hardware-freies Testen auf vcan.
mos-mes simuliert eine oder mehrere ECUs auf virtuellem CAN oder DoIP und antwortet
auf UDS, OBD-II und ISO-TP mit konfigurierbaren Signal-Strategien: konstant, Rampe, Sinus, zufällig
oder Lookup-Tabelle. CI-Pipelines führen vollständige UDS/OBD-II-Regressions-Suiten ohne physische
Bench aus.
Das eigenständige CLI führt load-stack, validate-stack und ein interaktives
REPL ohne MOS4-Laufzeit-Abhängigkeit aus. Ideal zur Integration der Stack-Validierung in Ihre eigene
CI-Pipeline.
Sprachunterstützung
Sechs Sprachen für Stack-Erweiterungen.
Kunden können Stack-Verhalten erweitern — benutzerdefinierte Identifikationslogik, Signaltransformationen und Action-Handler — mit einer von sechs Sprachen. Lua 5.4 ist die Scripting-Option mit der niedrigsten Einstiegshürde: keine Rust-Toolchain erforderlich.
Rust
Natives micro service-Authoring. Volle Typsicherheit, Zero-Copy-EventBus-Integration.
Python
Scripting und Data-Science-Workloads. Pytest-basierte Stack-Validierungs-CI ohne Hardware.
C / C++
Bestehende Embedded-Codebasen und Vendor-SDKs. Container-Isolierung erzwingt dasselbe Ressourcenbudget.
Go
Netzwerk-orientierte Micro Services und Gateway-Adapter. Standard-OCI-Container-Lieferung.
JavaScript / TypeScript
UI-micro services, webbasierte Dashboards und MEP-Action-Scripting.
Lua 5.4
Scripting-Option mit der niedrigsten Einstiegshürde. Stack-Verhalten ohne Rust-Toolchain erweitern. Hot-reloadbare Action-Handler über den Config-Service.
FAQ
Häufig gestellte Fragen
-
Ist Multi Stacks dasselbe wie OBDStacks?
Ja. OBDStacks ist der Legacy-Name; Multi Stacks ist der kanonische Name seit 2026-05-05. Gleiche Engine, gleiche JSON-DSL, gleicher default-stacks/-Katalog.
-
Wie viele Protokolle unterstützt die Laufzeit gleichzeitig?
Bis zu 16 Protokoll-Familien teilen eine einheitliche Protokoll-API. Mehrere Stacks laufen gleichzeitig mit unabhängigen Lifecycles und Export-Pfaden auf denselben physischen Schnittstellen.
-
Was ist ein deklarativer Stack?
Ein Stack ist eine JSON-Datendatei, die ECUs, Commands, Actions, Exports, Conditions und Expressions spezifiziert. Eine PID aktualisieren, einen Sampling-Zeitraum ändern oder eine Antwort-Richtlinie anpassen ist ein JSON-Edit und ein Commit — keine Firmware-Release.
-
Funktioniert Modbus ASCII in der Produktion?
Modbus ASCII ist ein experimentelles Feature — verlassen Sie sich nicht darauf für Produktions-Deployments. Modbus RTU (RS-485) und Modbus TCP/MBAP sind beide produktionsreif.
-
Kann ich einen Stack ohne echte ECU-Hardware testen?
Ja. mos-mes simuliert eine oder mehrere ECUs auf einer virtuellen CAN-Schnittstelle und antwortet auf UDS, OBD-II und ISO-TP mit konfigurierbaren Signal-Strategien. CI-Pipelines führen vollständige Regressions-Suiten auf vcan ohne physische Bench aus.
-
Was deckt DTC-Unterstützung ab?
DTC-Lesen und -Löschen über den unterstützten Stack — via OBD-II-Service 03/04 oder UDS-Diagnoseinformations-Services.
-
Wie kombiniert Multi Stacks mit MSP und MEP?
Eine Multi-Stacks-"Strategy" ist standardmäßig periodisch. Für signalgesteuerte Sequenzen publiziert ein MSP-Graph einen Trigger und Multi Stacks sendet die entsprechende Anfrage. Für ereignisgesteuerte Sequenzen feuert eine MEP-Regel bei einem benannten Ereignis und führt eine Multi-Stacks-Aktion aus. Beide Kompositionen bleiben deklarativ.
Bringen Sie Ihre Protokoll-Matrix.
Listen Sie die Asset-Familien auf, die Sie ausliefern; wir passen sie den richtigen Stacks an und zeigen das gleichzeitige Lifecycle-Setup auf einem Entwicklungsgerät.