Umfassendes Modbus-Handbuch
Vorstellung
Modbus ist das weltweit am weitesten verbreitete industrielle Kommunikationsprotokoll. Es wurde 1979 entwickelt und kommt in Millionen von SPSen, Frequenzumrichtern, Reglern, Zählern und industriellen Sensoren zum Einsatz. Eziwan unterstützt nativ Modbus RTU (über RS-485) und Modbus TCP (über Ethernet).
Modbus RTU über RS-485
RS-485-Verkabelung: Ein umfassender Leitfaden
RS-485 ist eine differentielle Zweidraht-Schnittstelle (A und B). Die Spannungsdifferenz zwischen A und B codiert das Signal, wodurch es eine hervorragende Störfestigkeit gegenüber elektromagnetischen Störungen in industriellen Umgebungen aufweist.
⚠️ Reihenschaltung (A↔A, B↔B, gemeinsamer Erdungsanschluss). Abschlusswiderstände 120 Ω nur an beiden Enden des Busses – auf der Eziwan-Seite bereits integriert, am letzten Slave anzubringen. Niemals einen Widerstand in der Mitte der Leitung.
Anschlussbelegung der Eziwan RS-485-Klemmen:
| Eziwan-Klemme | RS-485-Signal | Empfohlene Kabelfarbe |
|---|---|---|
| A (oder D+) | Differenz-Plus | Weiß oder Rot |
| B (oder D-) | Differenz-Minus | Blau oder Schwarz |
| GND | Referenzmasse | Grün oder Grau |
RS-485-Kommunikationsparameter
Die Einstellungen müssen auf dem Gateway und allen Slaves identisch sein:
| Parameter | Gängige Werte | Eziwan-Standardwert |
|---|---|---|
| Baudrate | 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 | 9600 |
| Parität | N (keine), E (gerade), O (ungerade) | N |
| Datenbits | 7, 8 | 8 |
| Stoppbits | 1, 2 | 1 |
| Pause zwischen den Nachrichten | 3,5 Zeichenzeiten (Modbus-Standard) | Auto |
Gängigste Standardkonfiguration: 9600 8N1 (9600 Baud, 8 Datenbits, keine Parität, 1 Stoppbit)
Maximale Entfernung und Anzahl der Slaves
| Baudrate | Maximale Entfernung | Max. Slaves (elektrisch) |
|---|---|---|
| 9.600 bps | 1.200 m | 32 (Einheitslasten) |
| 19.200 bps | 800 m | 32 |
| 57.600 bps | 200 m | 32 |
| 115.200 bps | 50 m | 32 |
Um mehr als 32 Slaves oder eine Entfernung von mehr als 1.200 m zu erreichen, muss ein RS-485-Repeater verwendet werden.
Modbus TCP
Ethernet-Verbindung
Modbus TCP kapseln das Modbus-Protokoll in TCP/IP-Frames ein. Die Verbindung erfolgt direkt über Ethernet (RJ45).
| Parameter | Wert |
|---|---|
| TCP-Port | 502 (Standard), manchmal 503 oder ein anderer Wert, je nach Hersteller |
| Geräte-ID | Adresse des Slaves (1 bis 247) oder 255 für den direkten Zugriff |
| Empfohlenes Timeout | 500 ms bis 2000 ms, je nach Netzwerk |
| TCP-Keep-Alive | Empfohlen für Langzeitverbindungen |
Netzwerkkonfiguration
Das Eziwan-Gateway muss über das Ethernet-Netzwerk eine Verbindung zur Modbus-TCP-Steuerung herstellen können. Bitte überprüfen Sie Folgendes:
- Das Gateway und die SPS befinden sich im selben Subnetz (oder es befindet sich ein Router zwischen ihnen)
- Es gibt keine Firewall, die den TCP-Port 502 zwischen Gateway und SPS blockiert
- Die Modbus-TCP-SPS ist so konfiguriert, dass sie Verbindungen akzeptiert (PUT/GET bei Siemens aktiviert)
Die vier Arten von Modbus-Registern
Die Modbus-Spezifikation definiert vier verschiedene Datenbereiche:
| Typ | Modbus-Code | Adressen | Master-Zugriff | Größe | Beschreibung |
|---|---|---|---|---|---|
| Coils | 0x (1x) | 00001–09999 | Lesen/Schreiben | 1 Bit | Digitale Ausgänge (Relais, Spulen) |
| Diskrete Eingänge | 1x (2x) | 10001–19999 | Nur Lesen | 1 Bit | Digitale Eingänge (Binärsensoren) |
| Eingangsregister | 3x | 30001–39999 | Nur Lesen | 16 Bit | Messwerte (analoge Sensoren) |
| Halteregister | 4x | 40001–49999 | Lesen/Schreiben | 16 Bit | Parameter und Sollwerte |
Wichtiger Hinweis: Modbus-Adressen beginnen in der „funktionalen“ Notation bei 1 (40001 bis 49999), doch die Modbus-Funktionen verwenden 0-basierte Adressen (die FC03-Anfrage für das Register 40001 verwendet die Adresse 0x0000). Eziwan unterstützt beide Notationen.
Standard-Modbus-Funktionen
| Funktionscode | Name | Zielregister |
|---|---|---|
| FC01 | Read Coils | Coils (0x) |
| FC02 | Diskrete Eingänge lesen | Diskrete Eingänge (1x) |
| FC03 | Halteregister lesen | Halteregister (4x) |
| FC04 | Eingangsregister lesen | Eingangsregister (3x) |
| FC05 | Einzelne Spule schreiben | Spulen (0x) |
| FC06 | Einzelnes Register schreiben | Halteregister (4x) |
| FC15 | Mehrere Spulen schreiben | Spulen (0x) |
| FC16 | Mehrere Register schreiben | Halteregister (4x) |
Konfiguration des Mappings in Eziwan
JSON-Konfigurationsschnittstelle
Das Modbus-Mapping legt fest, wie die Register der SPS erfasst und veröffentlicht werden:
{
"device": {
"name": "Compresseur_Atlas_GA75",
"description": "Compresseur d'air atelier principal",
"protocol": "modbus_rtu",
"connection": {
"port": "/dev/ttyS0",
"baudrate": 9600,
"parity": "N",
"databits": 8,
"stopbits": 1,
"slave_id": 1
}
},
"polling": {
"interval_ms": 5000,
"timeout_ms": 500,
"retry_count": 3,
"retry_delay_ms": 200
},
"registers": [
{
"name": "Pression_Service",
"address": "3x0001",
"count": 1,
"type": "uint16",
"scale_factor": 0.1,
"unit": "bar",
"description": "Pression de service sortie compresseur",
"alarm_low": 6.0,
"alarm_high": 12.0,
"publish_on_change": true
},
{
"name": "Temperature_Huile",
"address": "3x0002",
"count": 1,
"type": "uint16",
"scale_factor": 0.1,
"unit": "°C",
"alarm_high": 95.0
},
{
"name": "Heures_Fonctionnement",
"address": "4x0010",
"count": 2,
"type": "uint32_ab",
"unit": "h",
"description": "Compteur d'heures moteur"
},
{
"name": "Debit_Air",
"address": "3x0005",
"count": 2,
"type": "float32_abcd",
"unit": "m³/h"
},
{
"name": "Alarme_Active",
"address": "1x0001",
"count": 1,
"type": "bool",
"description": "Au moins une alarme active"
},
{
"name": "Code_Alarme",
"address": "4x0020",
"count": 1,
"type": "uint16",
"description": "Code alarme (voir tableau constructeur)"
}
]
}
Vollständiges Beispiel: 10 Temperaturregister, 5 Statusregister
Hier ist ein typisches Mapping für eine Produktionslinie mit 10 Temperaturpunkten und 5 Maschinenzuständen:
{
"registers": [
{ "name": "Temp_Zone1", "address": "4x0001", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone2", "address": "4x0003", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone3", "address": "4x0005", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone4", "address": "4x0007", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone5", "address": "4x0009", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone6", "address": "4x0011", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone7", "address": "4x0013", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone8", "address": "4x0015", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone9", "address": "4x0017", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone10", "address": "4x0019", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Etat_EnMarche", "address": "1x0001", "count": 1, "type": "bool" },
{ "name": "Etat_EnChauffe", "address": "1x0002", "count": 1, "type": "bool" },
{ "name": "Etat_Production", "address": "1x0003", "count": 1, "type": "bool" },
{ "name": "Etat_Defaut", "address": "1x0004", "count": 1, "type": "bool" },
{ "name": "Etat_ArretUrgence", "address": "1x0005", "count": 1, "type": "bool" }
]
}
Von Eziwan unterstützte Datentypen
| JSON-Typ | Beschreibung | Größe (Register) | Beispielwert |
|---|---|---|---|
uint16 | 16-Bit-Ganzzahl ohne Vorzeichen | 1 | 0 bis 65535 |
int16 | 16-Bit-Ganzzahl mit Vorzeichen | 1 | -32768 bis 32767 |
uint32_ab | 32-Bit-Ganzzahl, Big-Endian | 2 | 0 bis 4 294 967 295 |
uint32_ba | 32-Bit-Ganzzahl, Little-Endian | 2 | — |
float32_abcd | IEEE-754-Gleitkomma, ABCD | 2 | 23,456 |
float32_cdab | Gleitkomma nach IEEE 754, CDAB (Schneider) | 2 | — |
float32_badc | Gleitkomma nach IEEE 754, BADC | 2 | — |
float64_abcdefgh | Doppelte Genauigkeit | 4 | — |
bool | Boolesch (Coil oder Discrete Input) | 1 | true/false |
Debugging von Modbus
Modbus-Poll-Tool (Windows)
Modbus Poll ist das Standardwerkzeug zum Testen und Debuggen von Modbus-Verbindungen:
- Herunterladen unter modbustools.com
- Kostenlose Testversion (30 Tage)
- Konfiguration: „Connection“ → „Connect“ → „Modbus TCP“ (IP + Port 502) oder „Serial“ (COM + Baudrate)
- Zu lesende Register definieren: Setup → Read/Write Definition
Modbus-Poll – Konfiguration für das Auslesen
─────────────────────────────────────
Slave ID: 1
Function: 03 Read Holding Registers
Address: 0 (= registre 40001)
Quantity: 10
Scan Rate: 1000 ms
Eziwan-Protokolle zur Modbus-Fehlerbehebung
Im Eziwan-Portal unter „Gateway“ → „Logs“ → „Modbus“:
2026-06-04 14:32:00.123 [[INFO] Modbus RTU: Anfrage FC03, Slave=1, Adresse=0, Anzahl=10
2026-06-04 14:32:00.145 [[INFO] Modbus RTU: Antwort in 22 ms empfangen, 10 Register
2026-06-04 14:32:00.145 [DATA] Reg[0001]=0x4529 (23.4°C FLOAT32), Reg[0003]=0x42C6 (99.2 rpm)
2026-06-04 14:32:01.123 [[WARN] Modbus RTU: Timeout nach 500 ms, Slave=2 (Versuch 1/3)
2026-06-04 14:32:01.623 [[WARN] Modbus RTU: Timeout nach 500 ms, Slave=2 (Versuch 2/3)
2026-06-04 14:32:02.123 [[ERROR] Modbus RTU: Slave 2 nach 3 Versuchen nicht erreichbar
Aktivieren Sie die Protokollstufe „DEBUG“, um die rohen Hexadezimal-Frames zu erhalten:
2026-06-04 14:32:00.100 [DEBUG] TX: 01 03 00 00 00 0A C5 CD
│ │ ├──────┤ ├──────┤ └── CRC16
│ │ addr=0 count=10
│ FC03
slave=1
2026-06-04 14:32:00.122 [DEBUG] RX: 01 03 14 45 29 ... (20 octets + 2 CRC)
Fehlerbehebung
Problem 1: Modbus-RTU-Timeout
Symptome: Meldungen timeout, keine Antwort vom Slave.
Ursachen und Lösungen:
| Ursache | Diagnose | Lösung |
|---|---|---|
| Falsche Slave-ID | Slave-IDs 1 bis 10 manuell testen | Gerätedokumentation prüfen |
| Falsche Baudrate | — | 9600, 19200, 57600 nacheinander testen |
| Vertauschte A/B-Verkabelung | Spannung A-B messen: +1,5 V bis 5 V = korrekt | A- und B-Leiter vertauschen |
| Fehlender Abschlusswiderstand | R zwischen A und B im stromlosen Zustand messen: ~60 Ω bei 2 Widerständen | 120-Ω-Widerstand am Ende des Busses hinzufügen |
| Kabel zu lang | Gesamtlänge berechnen | Baudrate reduzieren oder Repeater hinzufügen |
| Keine RS-485-Stromversorgung | Spannung der Slave-Stromversorgung messen | 24 VDC am Slave überprüfen |
Problem 2: CRC-Fehler
Symptome: CRC error in den Eziwan-Protokollen, fehlerhafte Daten.
Ursachen:
- Elektromagnetische Störungen auf dem RS-485-Kabel (das Kabel fern von Stromkabeln verlegen)
- Ungeschirmtes Kabel (ein geschirmtes Kabel verwenden, wobei die Abschirmung nur auf der Gateway-Seite geerdet sein muss)
- Schlechte Kabelqualität (ein für RS-485 spezifiziertes Kabel mit einer Impedanz von 120 Ω verwenden)
- Zu hohe Übertragungsgeschwindigkeit für die Kabellänge (die Baudrate reduzieren)
Problem 3: Konflikt bei der Slave-ID
Symptome: Ein Slave antwortet anstelle eines anderen, Daten werden verwechselt.
Ursache: Zwei Slaves haben dieselbe Slave-ID auf demselben RS-485-Bus.
Lösung:
- Alle Slaves vom Bus trennen, bis auf einen
- Den Bus mit Modbus Poll abtasten, um die ID dieses Slaves zu ermitteln
- Die ID bei einem Konflikt ändern (über die Konfigurationsschnittstelle des Geräts)
- Die Slaves nacheinander wieder anschließen
Problem 4: Unlesbares Register (Ausnahmecode 02)
Symptom: Illegal Data Address (Exception Code 02).
Ursache: Die angeforderte Adresse ist in der SPS nicht vorhanden oder über Modbus nicht erreichbar.
Lösungen:
- In der Dokumentation des Herstellers nachsehen, welche Adressen unterstützt werden
- Manche Geräte stellen nur einen begrenzten Bereich von Registern zur Verfügung
- Bei Siemens überprüfen, ob sich der Speicherbereich tatsächlich in dem Datenblock befindet, der über PUT/GET zugänglich ist
Checkliste für die Schnelldiagnose
□ 24-VDC-Versorgungsspannung an den Eziwan-Versorgungsklemmen vorhanden
□ Die RS-485-LED von Eziwan blinkt während der Übertragung (TX)
□ A/B-Verkabelung: A = positiv, B = negativ (nicht invertiert)
□ Nur 120-Ω-Widerstände an beiden Enden des Busses
□ Korrekte Slave-ID (auf dem Display des Geräts oder in der Dokumentation überprüfen)
□ Gleiche Baudrate an Gateway und Gerät
□ Gleiche Parität auf Gateway und Gerät (N, E oder O)
□ Richtige IP-Adresse und Port 502 für Modbus TCP
□ PUT/GET auf S7-1500/1200 bei Bedarf aktiviert
□ Keine Firewall, die Port 502 im OT-Lokalen Netzwerk blockiert
Häufig gestellte Fragen
Modbus RTU oder Modbus TCP: Welches Protokoll sollte man verwenden?
RTU, wenn Ihre Geräte über einen seriellen RS-485-Bus angeschlossen sind (Sensoren, Zähler, ältere Steuerungen); TCP, wenn die Geräte bereits über Ethernet verbunden sind. Das Eziwan-Gateway unterstützt beide Protokolle gleichzeitig und fungiert als Brücke zwischen RTU und TCP.
Welche Modbus-Funktionen werden für die Überwachung verwendet?
Hauptsächlich FC03 (Auslesen von Holding-Registern) und FC04 (Eingaberegister) zum Auslesen; FC06/FC16 zum Schreiben von Sollwerten. Die Ausnahmecodes (02 – ungültige Adresse, 0B – Ziel nicht erreichbar) dienen als Anhaltspunkt für die Fehlerbehebung.
Wie liest man einen 32-Bit-Wert oder einen Gleitkommawert aus?
In zwei aufeinanderfolgenden Registern, wobei die Wortreihenfolge (Big/Little Endian, Word Swap) in der Zuordnung des Gateways anzugeben ist. Ein und dasselbe Gerät kann verschiedene Konventionen mischen: Überprüfen Sie die Dokumentation des Herstellers Register für Register.
Kann Modbus über das Internet übertragen werden?
Niemals unverschlüsselt: Das Protokoll verfügt weder über eine Authentifizierung noch über eine Verschlüsselung. Das Gateway beschränkt den Modbus-Verkehr auf das lokale Netzwerk und überträgt die Daten über einen verschlüsselten VPN-Tunnel in die Cloud.
Weiterführende Ressourcen
- Modbus zur Cloud – die Erfassungslösung
- Modbus RTU in die Cloud – der Fall der seriellen Busse
- Modbus TCP in die Cloud – der Fall der Ethernet-Netzwerke
- Modbus RTU vs. TCP – der detaillierte Vergleich
- RS485 / Modbus RTU – Verkabelung und Abfrage im Detail