Wiesemann & Theis GmbH

Netzwerk-, Sensor- & Schnittstellentechnik für Industrie, Office & IT

Hintergrundwissen:

Datenformate und Protokolle

Vom einfachen Byte bis zum Industrieprotokoll



Was sind Daten?

Ob Digitalisierung, Industrie 4.0 oder IoT (Internet of Things), letztlich geht es darum, dass verschiedenste, oft industrielle Komponenten und auch deren Nutzer, Daten miteinander austauschen.

Aus Sicht der Nutzer können diese Daten unterschiedlichste Informationen wie z. B. Temperaturen, Schaltzustände, Gewichte, Zeitangaben, Positionierungsdetails und vieles mehr sein.

Aber egal um welche Inhalte es geht, für die elektronische Datenverarbeitung bzw. Computertechnik sind Daten immer eine unbestimmte Anzahl von Bytes.

Ein Byte entspricht einem Zahlenwert zwischen 0 und 255.

Datenaustausch bedeutet also Bytes von A nach B zu übertragen


Geregelter Datenaustausch durch Protokolle

Damit der Empfänger die Daten, die er vom Sender bekommt, versteht, ist es wichtig, dass festgelegt ist, in welcher Form die Daten übertragen werden.

Darüberhinaus muss in Systemen, bei denen mehrere Komponenten miteinander vernetzt sind, festgelegt sein, für wen eine Datensendung bestimmt ist. Neben den eigentlich zu übertragenden Nutzdaten muss der Datensendung deshalb noch eine Adressinformation beigefügt werden.

Wenn Nutzdaten und Adressierungsinformationen einem vorgegebenen Rahmenaufbau folgen, spricht man von einem Protokoll.

In der Vergangenheit wurde zur Datenübertagung zwischen industriellen Komponenten häufig auf Feldbussysteme gesetzt. Feldbusse sind serielle Verbindungen zwischen den beteiligten Komponenten. Dabei haben sich diverse Standards nebeneinander etabliert, die sich nicht nur in Protokoll und Übertragungsgeschwindigkeit unterscheiden. Auch die physikalische Übertragung bis hin zu den verwendeten mechanischen Anschlussmöglichkeiten variieren stark.

Neuere Industrieprotokolle unterscheiden sich zwar auf Protokollebene in der Kodierung der Daten, aber als physikalisches Transportmedium nutzen die meisten TCP/IP-Ethernet.

Damit gibt es einen gemeinsamen Standard, der viele Vorteile mit sich bringt:

  • vorhandene Infrastruktur kann genutzt werden
  • unterschiedliche Industrieprotokolle können im gleichen Netzwerk nebeneinander verwendet werden
  • einheitliche Übertragungstechnik und Steckverbinder
  • standortübergreifende Kommunikation möglich
  • beliebig erweiterbar

Datenformate

Bei Protokollen, die als gemeinsamen Standard TCP/IP-Ethernet nutzen, erfolgt die Adressierung bis auf wenige Ausnahmen bereits über die IP-Adresse.

Das eigentliche Industrieprotokoll definiert eher darüber, in welcher Form die transportierten Daten übertragen werden.

Es gibt zwei grundsätzliche Datenformate:

  • Nachrichtentext
  • Binäre Daten

Wann welche Variante zum Tragen kommt, hängt von vielen Faktoren ab.

Daten als Text

Insbesondere bei webbasierten Anwendungen werden Daten aller Art als Text versendet. Text bedeutet, dass die Informationen als für den Menschen lesbare Zeichenkette übertragen werden. Dabei belegt jedes Zeichen ein Byte.

Daten als ASCII-Zeichen


Die Kodierung erfolgte in der Vergangenheit nach dem ASCII-Standard. Die Zuordnung, welches Schriftzeichen welchem Zahlenwert entspricht, ist in der ASCII-Tabelle definiert (ASCII = American Standard Code for Information Interchange).

ASCII-Tabelle


Die Besonderheit dabei war in der Vergangenheit, dass nur 7 der 8 zur Verfügung stehenden Bits eines Bytes genutzt wurden, womit der verwendbare Zeichenvorat auf 128 lesbare Zeichen beschränkt ist.

Neuere Standards wie UTF8 überwinden diese Einschränkung und erlauben es für Sonderzeichen, sogar zwei Bytes für ein Zeichen zu verwenden.

Neben frei formulierten Textinhalten haben sich standardisierte Textformate bei den Web- und Industrieprotokollen etabliert:

  • XML
  • JSON

Beide Formate wollen wir hier kurz erklären.

XML - Extensible Markup Language
XML ist eine sogenannte Auszeichnungssprache. Die eigentlichen Nutzdaten werden in Tags eingebettet. Die Tags sind Benennungen der jeweiligen Werte bzw. Inhalte. Jedes Tag beginnt mit einer öffnenden spitzen Klammer und endet mit einer schließenden.

Jedes XML-Konstrukt beginnt mit einem Start-Tag, in dem mindestens die XML-Version angegeben ist. Zusätzliche Parameter, wie beispielsweise die verwendete Zeichenkodierung, sind ebenfalls möglich:

<?xmlversion="1.0" encoding="UTF-8"?>

Nach dem Start-Tag folgen die weiteren in Tags eingebetteten Inhalte. Alle Inhalte bis auf das Start-Tag haben ein öffnendes und ein schließendes Tag gleichen Namens. Allerdings beginnt die Benennung beim schließenden Tag mit einem Slash ("/").

Beispiel:

<inhalt>irgendetwas</inhalt>

XML lässt auch strukturiert, nach Hierarchie ineinander verschachtelte Tags zu. Hier als Beispiel die Sensorwerte eines W&T Web-Thermo-Hygrobarometers:

<?xml version="1.0" encoding="UTF-8"?>
<webio>
  <iostate>
    <sensor>
      <name>Temperatur</name>
      <number>0</number>
      <unit>°C</unit>
      <value>23.900000</value>
    </sensor>
    <sensor>
      <name>rel. Feuchte</name>
      <number>1</number>
      <unit>%</unit>
      <value>36</value>
    </sensor>
    <sensor>
      <name>Luftdruck</name>
      <number>2</number>
      <unit>hPa</unit>
      <value>992</value>
    </sensor>
  </iostate>
</webio>

Die Einrückungen sind bei XML keine Pflicht, aber üblich, da die Lesbarkeit dadurch deutlich erhöht wird.

Der Vorteil bei XML als Übertragungsformat liegt darin, dass sowohl Mensch als auch Maschine bzw. ein auswertendes Programm die Inhalte gut lesen können.

Nachteil ist das sehr hohe Brutto-Datenaufkommen für wenige Inhalte.

JSON - JavaScript Object Notation
Die Syntax, also der Aufbau von JSON, basiert auf einer Teilmenge der JavaScript-Syntax.

JSON nutzt Paare aus Namen und Wert/Inhalt zur Kodierung der Daten.

Beispiel: "inhalt" : "irgendetwas"

Auch JSON lässt einen strukturierten, nach Hierarchie ineinander verschachtelten Aufbau zu. Hier als Beispiel noch einmal die Sensorwerte eines W&T Web-Thermo-Hygrobarometers:

{
  "iostate":
  {
    "sensor":
    [
      {
        "name": "Temperatur",
        "number": 0,
        "unit": "°C",
        "value": 24.1
      },
      {
        "name": "rel. Feuchte",
        "number": 1,
        "unit": "%",
        "value": 35.9
      },
      {
        "name": "Luftdruck",
        "number": 2,
        "unit": "hPa",
        "value": 991.8
      }
    ]
  }
}

Sowohl Namen als auch Werte werden in Anführungszeichen oben eingebettet. Eine Ausnahme sind Zahlenwerte - hier kann auf die Anführungszeichen verzichtet werden.

Name/Werte-Paare sind durch Kommata getrennt.

Zusammengehörende Name-/Werte-Paare müssen mit geschweiften Klammern zu Gruppen zusammengefasst werden.

Zusammengehörende Gruppen können ein Array bilden und werden durch Kommata getrennt in eckigen Klammern zusammengefasst.

Eine detaillierte Beschreibung zum JSON-Format gibt es unter https://www.json.org.

JSON ist vom Datenaufkommen deutlich kompakter als XML und trotzdem von Mensch und Maschine gut lesbar.

Base64-Kodierung
Base64 ist ein Verfahren, das Binärdaten in eine Kette lesbarer ASCII-Zeichen kodiert bzw. dekodiert. Auf diese Weise lassen sich binäre Inhalte auch mit textbasierenden Übertragungsformaten transportieren.

Das Verfahren ist recht einfach. Es werden jeweils drei Bytes des Binär-Codes bitweise auf vier 6Bit-Zahlen übertragen.

Base64-Codierung

Jeder der vier Zahlen wird nach der folgenden Tabelle das dem Wert entsprechende Zeichen zugeordnet. So werden drei binäre Bytes durch vier Chars, also lesbare Zeichen, ersetzt.

Base64-Codierung

Dieser Vorgang wird wiederholt, bis die gesamten binären Bytes kodiert sind. Bleiben am Ende einzelne Bytes über, werden Füllbytes hinzugefügt, um die letzten drei Bytes zu kodieren. Füllbytes haben den Wert 0.

Um beim anschließenden Dekodieren, also der Rückgewinnung der ursprünglichen Binärbytes, die Füllbytes wieder aussortieren zu können, wird der kodierten Zeichenkette für jedes Füllbyte am Ende ein "="-Zeichen angehängt.

Die häufigsten Anwendungsfälle für Base64-Kodierung sind webbasierte Anwendungen und E-Mail.

Binärdaten

Daten sind immer eine bestimmte Anzahl an Bytes.

Welches Byte an welcher Stelle welchen Zweck erfüllt, ist entweder durch ein standardisiertes Protokoll oder die Anwendung festgelegt. Hinter einem oder mehreren Bytes verbirgt sich ein Wert, ein Werte-Array, eine Zeichenkette oder auch ein Funktionsaufruf.

Dabei können in einer Datensendung einzelne Werte übertragen werden. Oft wird aber auch mit Datenstrukturen gearbeitet, bei denen festgelegt ist, an welcher Stelle der übertragenen Byte-Kette welcher Wert abgelegt ist.

Hier als Beispiel Daten eines Modbus-Funktionsaufrufs. Der Function Code ist z. B. immer im 8. Byte untergebracht:

Modbus-TCP Paketaufbau

Ein weiteres gängiges Verfahren für binären Datenaufbau ist TLV, was für Type Length Value steht. Mehrere Inhalte beliebiger Größe können aufeinanderfolgend in einer Datensendung übertragen werden.

Für jeden Inhalt gilt die Abfolge:

  • Type - um was für eine Art von Inhalt handelt es sich?
    Typenfestlegung bestimmt durch die Anwendung
  • Length - wie viele Bytes umfasst der Inhalt?
  • Value - Bytes des Wertes bzw. Inhalts.

Gibt es hinter einer solchen Abfolge weitere Bytes, ist das die nächste Abfolge.

Hier ein einfaches Beispiel:

TLV Paketaufbau

Die übermittelten Bytes beinhalten zwei Werte: einen 16Bit-Wert (2 Bytes) und einen 32Bit-Wert (4 Bytes).

Der Vorteil der binären Datenübertragung ist der sehr kompakte Aufbau der Daten.


Grundlagen zu gängigen Industrieprotokollen

Produkte für industrielle Anwendungen mit Standardprotokollen

^