> For the complete documentation index, see [llms.txt](https://docs.enlyze.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.enlyze.com/connect/ot-connectivity/protokolle/modbus-tcp.md).

# Modbus TCP

Konfiguration des Modbus-TCP-Protokolls für ENLYZE.

Die folgende Anleitung führt dich durch die Anbindung von Datenquellen, die über Modbus TCP kommunizieren. Modbus ist ein offenes, herstellerunabhängiges Protokoll und wird von vielen Geräten im Maschinennetz unterstützt, etwa von Energiezählern, Temperaturreglern, Frequenzumrichtern, Sensoren und Steuerungen. ENLYZE bindet diese Geräte per Ethernet über Modbus TCP (Standard-Port `502`) an. In der ENLYZE Plattform heißt der Konnektor **Modbus TCP**.

{% hint style="info" %}
**Variablen manuell statt per Variable Discovery**

Modbus adressiert Daten über nummerierte Register und nicht über symbolische Tags. Eine [Variable Discovery](/connect/ot-connectivity.md#variable-discovery) ist deshalb nicht möglich. Stattdessen legst du die Variablen direkt in der ENLYZE Plattform an, entweder manuell oder mit Unterstützung eines KI-Assistenten über den [ENLYZE MCP](/integrations/mcp.md). Grundlage ist in beiden Fällen die Registertabelle (Modbus-Mapping) des Geräts. Wie das geht, erfährst du unter [Variablen hinzufügen](#variablen-hinzufugen).
{% endhint %}

## Unterstützte Geräte

Anbindbar ist jedes Gerät, das als Modbus-TCP-Server (Slave) arbeitet, darunter:

* Energiezähler und Netzanalysatoren, z. B. von Janitza
* Temperaturregler, Frequenzumrichter und Sensoren mit Ethernet-Schnittstelle
* Steuerungen mit Modbus-TCP-Server-Funktion, z. B. [Siemens](/connect/ot-connectivity/steuerungshersteller/siemens.md) LOGO! 8

Geräte, die nur Modbus RTU (seriell, RS-485) sprechen, bindest du über ein Modbus-Gateway (TCP auf RTU) an. In der ENLYZE Plattform legst du dann das Gateway als Modbus-TCP-Datenquelle an und adressierst die einzelnen Geräte über ihre [Unit-ID](#unit-id). Möchtest du ein RTU-Gerät direkt über die serielle Schnittstelle des Edge Devices anbinden, melde dich unter <support@enlyze.com>.

## Bevor du startest

Halte Folgendes bereit:

* die IP-Adresse des Geräts bzw. des Modbus-Gateways
* die Registertabelle des Geräts, meist im Handbuch oder beim Maschinenhersteller zu finden. Sie nennt für jeden Messwert den Registertyp, die Adresse, den Datentyp und, bei Werten über mehrere Register, die Wortreihenfolge (siehe [Adressen und Datentypen](#adressen-und-datentypen))
* die Unit-ID des Geräts, falls die Registertabelle sie nicht nennt

{% stepper %}
{% step %}

#### Datenquelle vernetzen

Falls noch nicht erfolgt, muss zunächst eine Netzwerkverbindung zwischen der Datenquelle und dem jeweiligen Edge Device hergestellt werden. Die möglichen Vernetzungsszenarien findest du [hier](/connect/integrationsszenarios.md). Der Konnektor baut eine TCP-Verbindung auf Port `502` zum Gerät auf. Achte bei Firewalls darauf, dass dieser Port zwischen Edge Device und Gerät freigegeben ist.

Mit den [Netzwerk-Tools](/connect/edge-device/enlyze-edge/netzwerk-tools.md) prüfst du per Ping, ob das Gerät vom Edge Device aus erreichbar ist.
{% endstep %}

{% step %}

#### Datenquelle anlegen

Rufe die [ENLYZE Manufacturing Data Platform](https://app.enlyze.com/platform) auf, wähle die Maschine aus, für welche diese Datenquelle hinzugefügt werden soll, und klicke auf die Schaltfläche **+ Datenquelle**.

Vergib einen aussagekräftigen Namen und hinterlege unter **Geräteinformationen** den Hersteller und das Modell des Geräts, z. B. **Janitza** und `UMG 604`.
{% endstep %}

{% step %}

#### Verbindungsdetails hinterlegen

Wähle unter **Verbindungsdetails** das **Edge Device** aus. Seinen Namen findest du auf dem Aufkleber am Gerät (Schema `adjektiv-wissenschaftler`). Wähle als **Konnektor** den Eintrag **Modbus TCP** und trage die Konnektordetails ein:

* **IP-Adresse**: die IPv4-Adresse des Geräts bzw. des Modbus-Gateways
* **Port**: Standard ist `502`. Ändere den Wert nur, wenn das Gerät auf einem anderen Port antwortet.
* **Kurzlebige Verbindungen (Ephemeral connections)**: Ist die Option aktiviert (Standard), baut das Edge Device für jedes Auslesen eine neue Verbindung zum Gerät auf. Ist sie deaktiviert, hält es eine Verbindung dauerhaft offen. Belasse die Standardeinstellung, sofern wir dir nichts anderes empfehlen.

Die Unit-ID gibst du nicht hier an, sondern für jede Variable einzeln.

Klicke auf **Speichern** und bestätige mit **Speichern und verbinden**. Das Edge Device baut die Verbindung zum Gerät auf.

{% hint style="info" %}
Fehlen dir noch Angaben, kannst du die Datenquelle zunächst **als Entwurf speichern**. Die Verbindungsdetails ergänzt du später über **Verbindungsdetails hinzufügen** auf der Seite der Datenquelle.
{% endhint %}
{% endstep %}

{% step %}

#### Variablen hinzufügen

Öffne auf der Seite der Datenquelle den Tab **Variablen**. Solange die Datenquelle noch keine Variablen hat, bietet er zwei Wege an: **Manuell hinzufügen** und **Über MCP-Server hinzufügen**.

{% tabs %}
{% tab title="A: Manuell" %}
**Du benötigst** die Registertabelle des Geräts.

1. Klicke auf **Manuell hinzufügen**. Der Dialog **Variablen hinzufügen** öffnet sich.
2. Fülle für jede Variable eine Zeile aus. Was du in die einzelnen Spalten einträgst, beschreibt [Adressen und Datentypen](#adressen-und-datentypen):
   * **Registertyp**: **Coil**, **Discrete input**, **Input register** oder **Holding register**
   * **Slave ID**: die Unit-ID des Geräts (`0` bis `255`)
   * **Adresse**: die Registeradresse, gezählt ab `0` (`0` bis `65535`)
   * **Datentyp**: z. B. `UINT16` oder `FLOAT32BE`. Für `STRING[n]` gibst du zusätzlich die **Zeichenkettenlänge** in Byte an.
   * **Anzeigename**, **Einheit** und **Skalierungsfaktor**: wie der Wert in der ENLYZE Plattform angezeigt wird. Einheit und Skalierungsfaktor gibt es nur für Zahlenwerte.
   * **Zustand**: **Auswerten** (empfohlen) zeichnet die Variable im Status Exploration auf, sodass du die Werte prüfen kannst, bevor du sie aktivierst. **Aktiv** zeichnet sie sofort auf und stellt sie allen Diensten zur Verfügung. Eine aktive Variable benötigt einen Anzeigenamen.
3. Füge mit **Zeile hinzufügen** weitere Variablen hinzu. Pro Durchgang sind bis zu 100 Zeilen möglich.
4. Klicke auf **Variablen hinzufügen**.

Existiert eine Variable bereits, wird sie nicht doppelt angelegt. Der Dialog weist dich in der jeweiligen Zeile darauf hin.
{% endtab %}

{% tab title="B: ENLYZE MCP" %}
**Du benötigst** einen KI-Assistenten, der mit dem ENLYZE MCP verbunden ist (siehe [ENLYZE MCP einrichten](/integrations/mcp/enlyze-mcp-einrichten.md)), und Informationen zum Gerät: das Datenblatt oder die Registertabelle als PDF, CSV oder Link, ersatzweise ein Foto des Typenschilds.

1. Klicke auf **Über MCP-Server hinzufügen**.
2. Klicke auf **Prompt kopieren**. Der Prompt enthält bereits Standort, Maschine und Datenquelle.
3. Füge den Prompt in deinen KI-Assistenten ein und teile die Geräteinformationen.
4. Der Assistent liest die Registertabelle aus, rechnet Adressen um und fragt nach, wenn etwas nicht eindeutig dokumentiert ist, etwa Wortreihenfolge, Skalierung oder Unit-ID.
5. Prüfe die vorgeschlagene Variablentabelle und gib sie frei. Erst danach legt der Assistent die Variablen in der ENLYZE Plattform an.
   {% endtab %}
   {% endtabs %}
   {% endstep %}

{% step %}

#### Werte prüfen und Variablen aktivieren

Variablen im Zustand **Auswerten** werden bereits aufgezeichnet, stehen aber noch nicht allen Diensten zur Verfügung. Vergleiche die ersten Werte mit einem bekannten Wert, etwa der Anzeige am Gerät. Weichen sie deutlich ab, hilft dir [Werte plausibilisieren](#werte-plausibilisieren). Passen die Werte, [kontextualisiere und aktiviere](/variable-mapping/kontextualisierung.md) die Variablen. Über **Zu allen verfügbaren Variablen** im Tab **Variablen** gelangst du direkt dorthin.

{% hint style="warning" %}
Die Anzahl der Variablen, die pro Datenquelle aufgezeichnet werden können, ist begrenzt. Erscheint der Hinweis **Variablenlimit erreicht**, melde dich unter <support@enlyze.com>.
{% endhint %}
{% endstep %}
{% endstepper %}

## Adressen und Datentypen

Registertabellen sind von Hersteller zu Hersteller unterschiedlich aufgebaut. Die folgenden Abschnitte zeigen, wie du die Angaben aus dem Handbuch in die Felder der ENLYZE Plattform überträgst.

### Registertypen

| Registertyp in der ENLYZE Plattform | Klassische Schreibweise | Inhalt                               | Datentypen        |
| ----------------------------------- | ----------------------- | ------------------------------------ | ----------------- |
| **Coil**                            | `0xxxx`                 | einzelnes Bit, les- und schreibbar   | `BOOL`            |
| **Discrete input**                  | `1xxxx`                 | einzelnes Bit, nur lesbar            | `BOOL`            |
| **Input register**                  | `3xxxx`                 | 16-Bit-Register, nur lesbar          | alle außer `BOOL` |
| **Holding register**                | `4xxxx`                 | 16-Bit-Register, les- und schreibbar | alle außer `BOOL` |

Ein einzelnes Bit innerhalb eines Input oder Holding Registers lässt sich nicht direkt als `BOOL` auslesen. Lege das Register in diesem Fall als `UINT16` an und melde dich bei uns, wenn du das Bit getrennt auswerten möchtest.

### Adresse

Die ENLYZE Plattform erwartet die Adresse, die tatsächlich über das Netzwerk gesendet wird. Sie wird ab `0` gezählt und enthält keine Kennziffer für den Registertyp. Viele Handbücher verwenden stattdessen die klassische, ab `1` gezählte Schreibweise, in der die erste Ziffer den Registertyp angibt. So rechnest du um:

| Angabe im Handbuch | Registertyp      | Adresse |
| ------------------ | ---------------- | ------- |
| `40001`            | Holding register | `0`     |
| `40101`            | Holding register | `100`   |
| `30001`            | Input register   | `0`     |
| `10005`            | Discrete input   | `4`     |
| `00010`            | Coil             | `9`     |

Nennt das Handbuch die Adresse bereits ohne Kennziffer (z. B. „Register 100“ oder `0x0064`), ist sie meist schon ab `0` gezählt und du übernimmst sie direkt. Hexadezimale Angaben rechnest du in Dezimalzahlen um, `0x0064` entspricht `100`.

### Datentypen

Ein Modbus-Register umfasst 16 Bit. Größere Werte belegen mehrere aufeinanderfolgende Register, die Adresse ist dabei immer die des ersten Registers.

| Datentyp                                     | Register                            | Datentyp in der ENLYZE Plattform |
| -------------------------------------------- | ----------------------------------- | -------------------------------- |
| `BOOL`                                       | 1 Bit (nur Coil und Discrete input) | Boolean                          |
| `INT16`, `UINT16`                            | 1                                   | Integer                          |
| `INT32BE`, `INT32LE`, `UINT32BE`, `UINT32LE` | 2                                   | Integer                          |
| `INT64BE`, `INT64LE`, `UINT64BE`, `UINT64LE` | 4                                   | Integer                          |
| `FLOAT32BE`, `FLOAT32LE`                     | 2                                   | Float                            |
| `FLOAT64BE`, `FLOAT64LE`                     | 4                                   | Float                            |
| `STRING[n]`                                  | n/2                                 | String                           |

`INT` steht für vorzeichenbehaftete Ganzzahlen, `UINT` für vorzeichenlose. Bei `STRING[n]` ist `n` die Länge in Byte und muss eine gerade Zahl sein.

### Wortreihenfolge

Bei Werten über mehrere Register legt die Endung `BE` bzw. `LE` fest, in welcher Reihenfolge die Register zusammengesetzt werden:

* **`BE`**: Das erste Register enthält den höherwertigen Teil des Werts. Handbücher bezeichnen das als „Big Endian“, „High Word First“ oder `ABCD`. Diese Reihenfolge ist am weitesten verbreitet.
* **`LE`**: Das erste Register enthält den niederwertigen Teil des Werts. Handbücher bezeichnen das als „Word Swap“, „Low Word First“ oder `CDAB`.

Die Bytes innerhalb eines Registers werden immer in der Modbus-Standardreihenfolge gelesen. Geräte mit vertauschten Bytes (`BADC`, `DCBA`) werden nicht unterstützt.

### Unit-ID

Die Unit-ID (in der ENLYZE Plattform **Slave ID**) gibt an, welches Gerät hinter einer IP-Adresse angesprochen wird.

* **Gerät direkt im Netzwerk**: Viele Geräte ignorieren die Unit-ID oder erwarten einen festen Wert, meist `1` oder `255`. Das Handbuch nennt den richtigen Wert.
* **Gerät hinter einem Modbus-Gateway**: Die Unit-ID ist die am RTU-Gerät eingestellte Busadresse. So bindest du mehrere Geräte über ein Gateway und eine Datenquelle an.

### Skalierungsfaktor

Viele Geräte übertragen Messwerte als Ganzzahl mit festem Faktor, z. B. `2305` für 230,5 V. Den Faktor findest du in der Registertabelle. Trage ihn als **Skalierungsfaktor** ein, im Beispiel `0.1`. Der Skalierungsfaktor darf nicht `0` sein.

### Werte plausibilisieren

Prüfe nach dem Anlegen die ersten Werte gegen einen bekannten Wert. Typische Abweichungen und ihre Ursachen:

* **Unplausibel große oder winzige Werte** (z. B. `1.2E-38` statt `230.5`): Die Wortreihenfolge passt nicht. Wechsle zwischen `BE` und `LE`.
* **Werte gehören zu einem benachbarten Messwert**: Die Adresse ist um eins verschoben. Prüfe die Umrechnung aus der klassischen Schreibweise.
* **Werte um den Faktor 10, 100 oder 1000 daneben**: Der Skalierungsfaktor fehlt oder ist falsch.
* **Keine Werte**: Registertyp, Adresse oder Unit-ID passen nicht zum Gerät. Lege nur Adressen an, die das Gerät tatsächlich bereitstellt. Jede Variable wird einzeln abgefragt, und nicht lesbare Register verlangsamen das Auslesen der übrigen Variablen.

Bei Fragen melde dich jederzeit gerne unter <support@enlyze.com>.
