Chemenu kompiliert Rohnotizen zu einem verlinkten, quellengebundenen Wiki: raw/ -> types/ + tools/ -> kb/ -> reports/. Was mechanisch ist, macht tools/wikitool; was Urteil braucht, macht ein Agent unter Contracts, deren Grenzen in Code durchgesetzt sind statt im Prompt. Dieser Commit ist der Startpunkt der oeffentlichen Historie. Die vorherige Entwicklung fand in einer privaten Instanz statt und ist nicht Teil dieses Repositorys; ihre Erzaehlung steht vollstaendig in CHANGES.md, das mit 44 Eintraegen von 0.1.0 bis 2.1.0 erhalten geblieben ist. Der mitgelieferte Korpus ist ein Testbett und eine Demo: 170 Seiten ueber den Stack selbst - Gates, Lint, Versionierung, Suche, das Wiki-Muster. Er dokumentiert das Werkzeug mit den eigenen Mitteln des Werkzeugs. Lizenz: AGPL-3.0 fuer den Stack (tools/, types/), CC-BY-4.0 fuer die Inhalte. Die Grenze zwischen beiden ist der Dateiplan, den dist export berechnet - siehe NOTICE.
9.0 KiB
type, concept_type, tags, created, modified, related, sources, confidence, confidence_base, provenance, summary
| type | concept_type | tags | created | modified | related | sources | confidence | confidence_base | provenance | summary | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| types/concept.md | protocol |
|
2026-07-25 | 2026-08-29 |
|
0.90 | 0.90 | general | Industrielles Kommunikationsprotokoll von 1979 zur Anbindung speicherprogrammierbarer Steuerungen und Geräte über serielle oder TCP-Netze. |
Modbus
Typ: Protokoll (Kommunikationsprotokoll)
Definition
Modbus ist ein serielles Kommunikationsprotokoll, das 1979 von Modicon (jetzt Schneider Electric) veröffentlicht wurde und für die Verwendung mit seinen programmierbaren Steuerungsgeräten (PLCs) bestimmt ist. Es ist seitdem zu einem De-facto-Standard-Kommunikationsprotokoll in industriellen Umgebungen geworden und ist jetzt die am häufigsten verfügbare Mittel zum Verbinden industrieller elektronischer Geräte.
Kernpunkte
- Offener Standard - Öffentlich verfügbar, keine Lizenzgebühren
- Serielles Protokoll - Ursprünglich für serielle (RS-232/RS-485) Kommunikation konzipiert
- Client-Server-Modell - Ein Master, mehrere Slaves (Geräte)
- Einfaches Frame-Format - Leicht auf eingebetteten Geräten zu implementieren
- Weit verbreitet - Wird in vielen Branchen und Gerätetypen verwendet
Varianten
Modbus RTU
- Transport: Seriell (RS-232, RS-485)
- Kodierung: Binär (RTU = Remote Terminal Unit)
- Prüfsumme: CRC
- Anwendungsfall: Industrielle Umgebungen, lange Entfernungen
- Geschwindigkeit: Bis zu 115200 Baud
- Entfernung: Bis zu 1200 Meter (RS-485)
Modbus ASCII
- Transport: Seriell (RS-232, RS-485)
- Kodierung: ASCII-Zeichen
- Prüfsumme: LRC (Longitudinal Redundancy Check)
- Anwendungsfall: Menschenlesbar, langsamer aber robuster in lauten Umgebungen
- Geschwindigkeit: Langsamer als RTU aufgrund der ASCII-Kodierung
Modbus TCP
- Transport: Ethernet TCP/IP
- Kodierung: Wie Modbus RTU (binär)
- Port: 502 (Standard)
- Anwendungsfall: Moderne Netzwerke, Integration mit IT-Systemen
- Adressierung: Verwendet IP-Adressen statt Slave-IDs
- Vorteil: Keine serielle-zu-Ethernet-Konverter erforderlich
Modbus over TCP/IP (Modbus/TCP)
Wie Modbus TCP - die häufigste TCP-Variante.
Adressierung
Geräte-Adressierung
- Slave ID: 1-247 (0 ist Broadcast, 248-255 sind reserviert)
- TCP: IP-Adresse ersetzt Slave ID, aber Slave ID ist noch im Protokoll-Frame
Daten-Adressierung
Modbus organisiert Daten in vier primäre Tabellen:
| Tabelle | Code | Beschreibung |
|---|---|---|
| Discrete Inputs | 0x | Schreibgeschützt, 1-Bit (digitale Eingänge) |
| Coils | 01 | Lesen-Schreiben, 1-Bit (digitale Ausgänge) |
| Input Registers | 04 | Schreibgeschützt, 16-Bit (analoge Eingänge) |
| Holding Registers | 03 | Lesen-Schreiben, 16-Bit (analoge Ausgänge, Konfiguration) |
Hinweis: Adressen werden oft mit einem Präfix referenziert:
0:oderI:für Input (Discrete Inputs, Input Registers)1:oderQ:für Output (Coils, Holding Registers)4:für Holding Registers (häufige Konvention)
Datentypen
Modbus überträgt 16-Bit-Werte. Größere Werte werden als mehrere Register übertragen:
| Datentyp | Register | Byte-Reihenfolge |
|---|---|---|
| INT16 | 1 | Big-Endian |
| UINT16 | 1 | Big-Endian |
| INT32 | 2 | Konfigurierbar |
| UINT32 | 2 | Konfigurierbar |
| FLOAT32 | 2 | IEEE 754, konfigurierbar |
| FLOAT64 | 4 | IEEE 754, konfigurierbar |
Byte-Reihenfolge (Endianness):
- Big-Endian: Höchstwertiges Byte zuerst
- Little-Endian: Niedrigstwertiges Byte zuerst
- Wort-Reihenfolge: Hochwort zuerst oder Niedrigwort zuerst
Häufige Kombinationen: 1211 (Big-Endian-Wort, Big-Endian-Byte), 2143, 4321 usw.
Funktionscodes
Häufige Modbus-Funktionscodes:
| Code | Name | Beschreibung |
|---|---|---|
| 01 | Read Coils | Mehrere Coil-Status lesen |
| 02 | Read Discrete Inputs | Mehrere diskrete Eingänge lesen |
| 03 | Read Holding Registers | Mehrere Holding Registers lesen |
| 04 | Read Input Registers | Mehrere Input Registers lesen |
| 05 | Write Single Coil | Ein einzelnes Coil schreiben |
| 06 | Write Single Register | Ein einzelnes Holding Register schreiben |
| 07 | Read Exception Status | Gerätekennstatus lesen |
| 08 | Diagnostics | Diagnose-Funktionen |
| 15 | Write Multiple Coils | Mehrere Coil-Status schreiben |
| 16 | Write Multiple Registers | Mehrere Holding Registers schreiben |
| 17 | Report Slave ID | Slave ID und zusätzliche Informationen melden |
Verwendung in Ihren Projekten
Basierend auf der Repository-Struktur wird Modbus wahrscheinlich verwendet von:
- E3DC-Systeme stellen Modbus-TCP-Schnittstellen bereit
- ha-core kann Modbus verwenden, um mit E3DC-Wechselrichtern zu kommunizieren
- Home Assistant-Integrationen verwenden häufig Modbus zur Gerätekommunikation
Beispiel: Lesen von E3DC-Daten über Modbus TCP
# Python example using pymodbus
from pymodbus.client import ModbusTcpClient
client = ModbusTcpClient('192.168.1.100', port=502)
client.connect()
# Read battery SOC (Holding Register 40000, assuming INT16)
response = client.read_holding_registers(0, 1, slave=1)
soc = response.registers[0]
print(f"Battery SOC: {soc}%")
client.close()
// Go example using a Modbus library
package main
import (
"fmt"
"github.com/goburrow/modbus"
)
func main() {
handler := modbus.NewTCPClientHandler("192.168.1.100:502")
handler.SlaveId = 1
handler.Timeout = 5000 * time.Millisecond
client := modbus.NewClient(handler)
if err := client.Connect(); err != nil {
panic(err)
}
defer client.Close()
// Read holding register 0
results, err := client.ReadHoldingRegisters(0, 1)
if err != nil {
panic(err)
}
fmt.Printf("Value: %d\n", results[0])
}
Häufige Probleme
- Endianness-Fehler - Daten erscheinen mit falschen Werten
- Register-Adressierung um Eins daneben - Verschiedene Hersteller verwenden unterschiedliche Adressierung
- Baud-Raten-Fehler - Für serielle Verbindungen
- Parität/Stop-Bits - Serielle Konfigurationsprobleme
- Slave-ID-Konflikte - Mehrere Geräte mit gleicher ID auf demselben Bus
- Timeout-Probleme - Gerät reagiert nicht innerhalb des Timeout-Zeitraums
- Byte-Reihenfolge-Verwirrung - Unterschiedliche Interpretationen von Register-Paaren
Best Practices
- Die Modbus-Map immer dokumentieren - Welche Register enthalten welche Daten
- Zuerst mit Modbus-Tools testen - Modbus Poll, QModMaster oder ähnliches verwenden
- Timeouts elegant verarbeiten - Geräte können vorübergehend nicht verfügbar sein
- Werte zwischenspeichern - Nicht zu häufig abfragen
- Daten validieren - Auf angemessene Bereiche prüfen
- Ordnungsgemäße Fehlerbehandlung verwenden - Nicht davon ausgehen, dass Lesevorgänge erfolgreich sind
- Endianness dokumentieren - Byte- und Wort-Reihenfolge angeben
Tools
- Modbus Poll - Windows GUI-Tool zum Testen
- QModMaster - Cross-Plattform-Modbus-Master
- modbus-palette - Node-RED-Knoten für Modbus
- pymodbus - Python-Bibliothek
- goburrow/modbus - Go-Bibliothek
- libmodbus - C-Bibliothek
- Wireshark - Mit Modbus-Dissektor für Analyse
Wann Modbus zu verwenden
- Verbindung zu industriellen Geräten (PLCs, Wechselrichter, Sensoren)
- Wenn Ethernet oder Seriell verfügbar ist
- Für einfache, zuverlässige Kommunikation
- Wenn das Gerät Modbus nativ unterstützt
Wann Modbus NICHT zu verwenden
- Wenn höherwertige Protokolle verfügbar sind (MQTT, HTTP REST)
- Für komplexe Datenstrukturen
- Wenn Sicherheit ein Problem ist (Modbus hat keine eingebaute Sicherheit)
- Für Hochgeschwindigkeits-Datenübertragung mit hohem Volumen
Sicherheitsaspekte
Modbus hat keine eingebaute Sicherheit:
- Keine Authentifizierung
- Keine Verschlüsselung
- Keine Integritätsprüfung
Abhilfemaßnahmen:
- Auf isolierten Netzwerken verwenden (nicht dem Internet ausgesetzt)
- VPNs oder Firewalls zum Einschränken des Zugriffs verwenden
- Modbus Security (TLS) in Betracht ziehen, falls verfügbar
- Netzwerksegmentierung verwenden
Leistung
- Latenz: Normalerweise 10-100ms pro Anfrage
- Durchsatz: 10-100 Anfragen/Sekunde (hängt vom Netzwerk und den Geräten ab)
- Nachrichtengröße: Durch Protokoll begrenzt (normalerweise < 260 Bytes)
Verwandte Concepts
- MQTT - Alternatives Protokoll für IoT/Industrie
- OPC UA - Modernes Industrieprotokoll mit Sicherheit
- Industrial-Automation-Konzept
- E3DC - Verwendet Modbus zur Kommunikation
Historie
- [1979] - Ursprünglich von Modicon veröffentlicht
- [2004] - Modbus IDA (Modbus Industrial Automation) gegründet
- [2006] - Modbus/TCP-Spezifikation veröffentlicht
- [2007] - Modbus-Organisation gegründet
- [2026-07-25] - Concept-Seite erstellt
Siehe auch
- Modbus Organization
- Modbus Specifications
- E3DC - Verwendet Modbus TCP
- ha-core - Kann Modbus verwenden