Industrial IoT

Sparkplug B Datentypen und Metrik-Properties: die Referenz

Eine praxisnahe Referenz zu allen Sparkplug B Datentypen, dem Protobuf-Feld, in dem jeder Typ übertragen wird, Metrik-Properties wie Quality, Metrik-Flags und DataSets, mit dekodierten Beispielen und typischen Umrechnungsfehlern.

Referenztabelle der Sparkplug B Datentypen mit Codes, Protobuf-Wertfeldern und Metrik-Properties
Probieren Sie es auf Ihrem eigenen MQTT-Broker ausHolen Sie sich im Free-Tarif einen privaten, verwalteten MQTT-Broker und starten Sie mit fertigen Codebeispielen.
Kostenlos testen Codebeispiele Keine Kreditkarte erforderlich

Sparkplug B Datentypen legen genau fest, wie jeder Metrikwert kodiert wird, von einer vorzeichenbehafteten 8-Bit-Ganzzahl bis zu einer vollständigen Tabelle mit Zeilen und Spalten. Diese Referenz listet jeden Datentyp-Code mit dem zugehörigen Protobuf-Feld auf, erklärt Metrik-Properties und Qualitätscodes und zeigt dekodierte Beispiele, damit Sie jeden Typ erkennen, wenn Sie echten Datenverkehr untersuchen.

Warum Sparkplug eigene Datentypen hat

JSON kennt Zahlen, Strings und Booleans. Industrielle Systeme in Maschinenbau und Prozessindustrie brauchen mehr Präzision. Ein SPS-Register, etwa in einer Siemens S7, kann eine vorzeichenlose 16-Bit-Ganzzahl sein, ein Zähler ein vorzeichenloser 64-Bit-Wert, und ein Zeitstempel darf nicht mit einer gewöhnlichen Zahl verwechselt werden. Sparkplug B gibt jeder Metrik einen expliziten datatype-Code, damit eine Host-Anwendung am anderen Ende der Welt den Wert genau so interpretiert, wie der Edge Node ihn gemeint hat.

Der Datentyp wird in Birth-Nachrichten für jede Metrik deklariert. Datennachrichten dürfen ihn weglassen, weshalb Konsumenten die Datentypen aus den Births speichern, wie in unserem Leitfaden zum Sparkplug B Payload beschrieben.

Skalare Sparkplug B Datentypen

Code Name Protobuf-Wertfeld Hinweise
0 Unknown keins Platzhalter, sollte in gültigen Metriken nicht vorkommen
1 Int8 int_value Vorzeichenbehaftet, Zweierkomplement in einem vorzeichenlosen Feld
2 Int16 int_value Vorzeichenbehaftet, Zweierkomplement
3 Int32 int_value Vorzeichenbehaftet, Zweierkomplement
4 Int64 long_value Vorzeichenbehaftet, Zweierkomplement in uint64
5 UInt8 int_value Vorzeichenlos
6 UInt16 int_value Vorzeichenlos
7 UInt32 int_value Vorzeichenlos
8 UInt64 long_value Vorzeichenlos
9 Float float_value 32-Bit IEEE 754
10 Double double_value 64-Bit IEEE 754
11 Boolean boolean_value true oder false
12 String string_value UTF-8-Text
13 DateTime long_value Millisekunden seit Unix-Epoch, UTC
14 Text string_value Längerer Text, gleiche Kodierung wie String
15 UUID string_value UUID in String-Form
16 DataSet dataset_value Tabelle mit typisierten Spalten und Zeilen
17 Bytes bytes_value Rohe Binärdaten
18 File bytes_value Dateiinhalt, beschrieben durch MetaData
19 Template template_value Benutzerdefinierter Typ oder Instanz

Die Codes 20 und 21 (PropertySet und PropertySetList) werden für Property-Werte verwendet, nicht für Metrikwerte.

Die Falle bei vorzeichenbehafteten Ganzzahlen

Der häufigste Dekodierfehler bei Sparkplug ist das direkte Lesen vorzeichenbehafteter Ganzzahlen. Da int_value ein vorzeichenloses 32-Bit-Feld ist, kommt ein Int32 mit dem Wert -5 als 4294967291 an, und ein Int64 mit dem Wert -1 als 18446744073709551615 in long_value. Der Konsument muss anhand des deklarierten Datentyps das Zweierkomplement anwenden. Edge Nodes müssen beim Kodieren umgekehrt vorgehen. Zeigt ein Dashboard plötzlich eine Temperatur von vier Milliarden Grad an, ist das fast immer der Grund.

DateTime ist keine Zahl

Eine DateTime-Metrik und eine Int64-Metrik nutzen dasselbe Feld, bedeuten aber Unterschiedliches. Behandeln Sie DateTime als Millisekunden seit Epoch in UTC und rechnen Sie den Wert für die Anzeige um. Senden Sie niemals Sekunden und niemals Ortszeit.

Array-Datentypen

Sparkplug definiert außerdem Arrays skalarer Typen. Sie werden in bytes_value als gepackte Little-Endian-Werte übertragen, eine Kodierung, die Sparkplug 3.0 präzise festlegt (was sonst noch präzisiert wurde, zeigt unser Vergleich zu Sparkplug 3.0).

Code Name Code Name
22 Int8Array 29 UInt64Array
23 Int16Array 30 FloatArray
24 Int32Array 31 DoubleArray
25 Int64Array 32 BooleanArray
26 UInt8Array 33 StringArray
27 UInt16Array 34 DateTimeArray
28 UInt32Array

Die Array-Unterstützung unterscheidet sich zwischen Produkten. Wenn Sie herstellerübergreifend auf Arrays angewiesen sind, testen Sie sie frühzeitig mit beiden Seiten am selben Broker.

Metrik-Flags

Jede Metrik kann boolesche Flags tragen, die beeinflussen, wie Konsumenten sie behandeln:

Flag Bedeutung Verhalten des Konsumenten
is_null Die Metrik existiert, hat aber keinen Wert Als null oder schlechte Qualität anzeigen, nicht durch null ersetzen
is_historical Wert stammt aus der Vergangenheit, etwa aus Store and Forward Speichern, aber den Live-Wert nicht überschreiben
is_transient Wert soll nicht historisiert werden Anzeigen, aber nicht speichern

Metriken haben außerdem einen optionalen timestamp, getrennt vom Zeitstempel des Payloads. Nutzen Sie ihn, um festzuhalten, wann der Wert an der Quelle erfasst wurde.

Metrik-Properties

Eine Metrik kann ein PropertySet tragen: parallele Listen aus Schlüsseln und typisierten Werten. Property-Werte nutzen dieselben Datentyp-Codes sowie PropertySet (20) und PropertySetList (21), die Verschachtelung ermöglichen.

Die Quality-Property

Die einzige Property, der die Spezifikation eine festgelegte Bedeutung gibt, ist Quality, ein Int32:

Wert Bedeutung
192 Gut
0 Schlecht
500 Veraltet

Ein Host, der eine Metrik mit Quality 0 erhält, sollte sie als schlecht anzeigen, selbst wenn ein Wert vorhanden ist. Viele Edge-Plattformen setzen Quality 500, wenn sie den Kontakt zum zugrunde liegenden Gerät verlieren, den Node aber verbunden halten.

Weitere gängige Properties

Einheiten, Wertebereiche, Beschreibungen und Anzeigeformate werden häufig als Properties übertragen, ihre Schlüsselnamen sind aber Konventionen der jeweiligen Plattform und nicht Teil der Spezifikation. Einigen Sie sich auf ein gemeinsames Property-Vokabular für alle Edge Nodes, sonst sieht Ihre Host-Anwendung dasselbe Konzept unter verschiedenen Schlüsseln.

DataSets

Ein DataSet ist eine kleine typisierte Tabelle innerhalb einer einzigen Metrik. Es hat eine Spaltenanzahl, Spaltennamen, einen Datentyp-Code pro Spalte und eine Liste von Zeilen. Jeder Zeilenwert nutzt eine eingeschränkte Menge an Feldern: int, long, float, double, boolean oder string.

Dekodiert könnte eine Tabelle mit Rezepturparametern so aussehen:

{
  "name": "Recipe/Steps",
  "datatype": 16,
  "datasetValue": {
    "numOfColumns": 3,
    "columns": ["Step", "Temperature", "Duration"],
    "types": [3, 9, 7],
    "rows": [
      { "elements": [{ "intValue": 1 }, { "floatValue": 180.0 }, { "intValue": 600 }] },
      { "elements": [{ "intValue": 2 }, { "floatValue": 220.0 }, { "intValue": 300 }] }
    ]
  }
}

DataSets eignen sich für Gruppen zusammengehöriger Werte, die beieinander bleiben müssen. Für strukturierte Anlagenmodelle passen Templates meist besser; siehe Sparkplug Templates und UDTs.

Dekodierte Beispiele

Hier ein Ausschnitt aus einem Birth mit mehreren Datentypen und einer Quality-Property, wie Sie ihn nach dem Dekodieren sehen würden:

[
  { "name": "Pump/Running", "alias": 1, "datatype": 11, "booleanValue": true },
  { "name": "Pump/Speed", "alias": 2, "datatype": 9, "floatValue": 1475.0,
    "properties": { "keys": ["Quality"], "values": [{ "type": 3, "intValue": 192 }] } },
  { "name": "Pump/StartCount", "alias": 3, "datatype": 8, "longValue": "18342" },
  { "name": "Pump/LastService", "alias": 4, "datatype": 13, "longValue": "1789000000000" },
  { "name": "Pump/Offset", "alias": 5, "datatype": 2, "intValue": 4294967286 },
  { "name": "Pump/Serial", "alias": 6, "datatype": 12, "stringValue": "P-0042" }
]

Beachten Sie den Int16-Offset: Der Rohwert 4294967286 ergibt nach Zweierkomplement -10. Beachten Sie außerdem, dass manche JSON-Darstellungen 64-Bit-Werte als Strings ausgeben, um Genauigkeitsverluste in JavaScript zu vermeiden.

Datentypen in der Praxis prüfen

Am schnellsten prüfen Sie Datentypen, indem Sie dekodierte Births lesen. ConnectMQ dekodiert Sparkplug B im Topic-Explorer des Portals, sodass Sie ein NBIRTH oder DBIRTH öffnen und Datentyp und Wert jeder Metrik prüfen können, ohne Code zu schreiben. Für automatisierte Prüfungen ordnet der Decoder aus unserem Tutorial zum Dekodieren von Sparkplug B in Python Codes den Namen zu und übernimmt die Vorzeichenumrechnung.

Wenn Sie auf dem öffentlichen MQTT-Broker testen, verwenden Sie eine zufällige Group ID und denken Sie daran, dass dort alles für jeden lesbar ist. Er eignet sich für Tests und Prototypen, nicht für echte Produktionsdaten.

Checkliste für Datentypen bei der Edge-Node-Konfiguration

  1. Ordnen Sie jedem Sparkplug-Typ den Typ des Quellregisters zu; erweitern Sie nicht alles auf Double.
  2. Verwenden Sie vorzeichenlose Typen für Zähler, die nie negativ werden.
  3. Verwenden Sie DateTime für Zeitstempel, immer in Millisekunden UTC.
  4. Setzen Sie Quality bei Metriken, deren Quelle unabhängig vom Node ausfallen kann.
  5. Verwenden Sie is_null statt null, wenn ein Wert nicht verfügbar ist.
  6. Kennzeichnen Sie Store-and-Forward-Daten als historisch.
  7. Einigen Sie sich auf einheitliche Property-Schlüsselnamen für alle Edge Nodes.
  8. Testen Sie Arrays, DataSets und Templates vor dem Rollout durchgängig.

Wo Datentypen ins Bild passen

Korrekte Datentypen sorgen dafür, dass Sparkplug-Daten Historians, SCADA, MES und einen Unified Namespace (UNS) ohne Korrekturen pro Tag speisen können. Im UNS wird die ISA-95-Equipment-Hierarchie (Enterprise → Site → Area → Line → Cell) zur Topic-Struktur auf dem MQTT-Broker, etwa acme/werk-stuttgart/montage/linie-1/zelle-3/temperatur. Ein UInt16 aus einem SPS-Register muss dort als derselbe Typ ankommen, sonst rechnet jede nachgelagerte Anwendung falsch. Wie Sparkplug und UNS zusammenspielen, erklärt der Artikel Sparkplug B und Unified Namespace; weitere Architekturhinweise finden Sie im Leitfaden zu Industrial IoT mit MQTT. Jeder konforme MQTT Broker transportiert diese Payloads; ein verwalteter MQTT-Broker, der sie zusätzlich dekodiert, beschleunigt die Überprüfung erheblich.

Starten Sie mit ConnectMQ

Erstellen Sie unter app.connectmq.com einen kostenlosen Serverless-Broker, ganz ohne Kreditkarte. Verbinden Sie Ihren Edge Node und prüfen Sie Datentyp, Wert und Qualität jeder Metrik im ConnectMQ Topic-Explorer.

Häufig gestellte Fragen

Wie viele Sparkplug B Datentypen gibt es?

Die Spezifikation definiert skalare Typen mit den Codes 1 bis 19, die Property-Set-Typen 20 und 21 sowie die Array-Typen 22 bis 34. Code 0 steht für Unknown.

Warum erscheint mein negativer Sparkplug-Wert als riesige Zahl?

Vorzeichenbehaftete Ganzzahlen werden in vorzeichenlosen Protobuf-Feldern gespeichert. Wenden Sie anhand des deklarierten Datentyps das Zweierkomplement an oder nutzen Sie einen Decoder, der das für Sie erledigt.

Was bedeutet Quality 192 bei Sparkplug?

Es bedeutet gute Qualität. Die Quality-Property verwendet 192 für gut, 0 für schlecht und 500 für veraltet.

Sind Sparkplug-Datentypen in Datennachrichten Pflicht?

In Birth-Nachrichten sind sie Pflicht, in NDATA und DDATA optional. Konsumenten sollten sich den Datentyp jeder Metrik aus dem Birth merken.

Verwandte Artikel

Industrial DataOps: Werksdaten kontextualisieren und steuern

Was Industrial DataOps in der Praxis bedeutet: Kontextualisierung, Normalisierung, Qualitätsprüfungen und Governance von OT-Daten und wie Sie diese Schicht auf einem MQTT-Namespace betreiben.

8 Min. Lesezeit

Alle Artikel →

Ihr privater MQTT-Broker ist nur wenige Klicks entfernt

Konto anlegen, Broker-Zugangsdaten erhalten und das erste Gerät verbinden — ohne Server, die installiert, gepatcht oder skaliert werden müssen.