Modbus-Konnektor
Übersicht
Abschnitt betitelt „Übersicht“Der Modbus-Konnektor ermöglicht die Kommunikation mit SPSen und industriellen Geräten über das Modbus-Protokoll und unterstützt sowohl serielle (RTU) als auch TCP/IP-Verbindungen.
Konnektor-Typen:
ModbusReader- Daten von Modbus-Geräten lesenModbusWriter- Daten auf Modbus-Geräte schreiben
Funktionen
Abschnitt betitelt „Funktionen“- ✅ Mehrere Transportprotokolle (TCP, RTU, UDP, TLS)
- ✅ Alle Registertypen (Holding, Input, Coil, Discrete Input)
- ✅ Mehrere Datentypen (Int16/32/64, UInt16/32/64, Float32/64, ASCII)
- ✅ Konfigurierbare Byte- und Word-Reihenfolge
- ✅ Unit ID-Unterstützung für Multi-Geräte-Netzwerke
Transportprotokolle
Abschnitt betitelt „Transportprotokolle“Meddle unterstützt folgende Modbus-Transporte:
TCP- Modbus TCP über EthernetTCPWithTLS- Modbus TCP mit TLS-VerschlüsselungUDP- Modbus über UDPRTU- Modbus RTU über seriellRTUOverTCP- Modbus RTU gekapselt in TCPRTUOverUDP- Modbus RTU gekapselt in UDP
Basiskonfiguration
Abschnitt betitelt „Basiskonfiguration“Modbus TCP Reader
Abschnitt betitelt „Modbus TCP Reader“{ "type": "ModbusReader", "config": { "endpoint": "192.168.1.100:502", "transport": "TCP", "pollingRate": 1000, "defaultUnitId": 1, "defaultBitOrder": "BigEndian", "defaultWordOrder": "HighFirst" }, "variables": [ { "key": "temperature", "address": 0, "registerType": "HoldingRegister", "dataType": "Float64" }, { "key": "pressure", "address": 4, "registerType": "HoldingRegister", "dataType": "Int32" } ]}Modbus RTU Reader
Abschnitt betitelt „Modbus RTU Reader“{ "type": "ModbusReader", "config": { "endpoint": "/dev/ttyUSB0", "transport": "RTU", "pollingRate": 1000, "defaultUnitId": 1, "baudRate": 9600, "dataBits": 8, "parity": "None", "stopBits": 1 }, "variables": [ { "key": "sensor_value", "address": 0, "registerType": "InputRegister", "dataType": "UInt16" } ]}Modbus Writer
Abschnitt betitelt „Modbus Writer“{ "type": "ModbusWriter", "config": { "endpoint": "192.168.1.100:502", "transport": "TCP", "defaultUnitId": 1 }, "variables": [ { "key": "setpoint", "address": 100, "registerType": "HoldingRegister", "dataType": "Float32" }, { "key": "enable", "address": 0, "registerType": "Coil" } ]}Registertypen
Abschnitt betitelt „Registertypen“Holding Registers (Lesen/Schreiben)
Abschnitt betitelt „Holding Registers (Lesen/Schreiben)“Allzweckregister, die gelesen und geschrieben werden können.
{ "key": "temperature", "address": 0, "registerType": "HoldingRegister", "dataType": "Float64"}Funktionscodes: Read (03), Write Single (06), Write Multiple (16)
Input Registers (Nur Lesen)
Abschnitt betitelt „Input Registers (Nur Lesen)“Nur-Lese-Register, typischerweise für Sensordaten verwendet.
{ "key": "sensor_reading", "address": 0, "registerType": "InputRegister", "dataType": "Int16"}Funktionscode: Read (04)
Coils (Lesen/Schreiben Boolean)
Abschnitt betitelt „Coils (Lesen/Schreiben Boolean)“Einzelbit-Register für digitale Ausgänge.
{ "key": "motor_enable", "address": 0, "registerType": "Coil"}Funktionscodes: Read (01), Write Single (05), Write Multiple (15)
Discrete Inputs (Nur Lesen Boolean)
Abschnitt betitelt „Discrete Inputs (Nur Lesen Boolean)“Nur-Lese-Einzelbit-Register für digitale Eingänge.
{ "key": "limit_switch", "address": 0, "registerType": "DiscreteInput"}Funktionscode: Read (02)
Datentypen
Abschnitt betitelt „Datentypen“Integer-Typen
Abschnitt betitelt „Integer-Typen“// 16-bit signed integer (-32768 bis 32767){"dataType": "Int16"} // 1 Register
// 16-bit unsigned integer (0 bis 65535){"dataType": "UInt16"} // 1 Register// 32-bit signed integer{"dataType": "Int32"} // 2 Register
// 32-bit unsigned integer{"dataType": "UInt32"} // 2 Register// 64-bit signed integer{"dataType": "Int64"} // 4 Register
// 64-bit unsigned integer{"dataType": "UInt64"} // 4 RegisterFloating-Point-Typen
Abschnitt betitelt „Floating-Point-Typen“// 32-bit float (4 Byte){"dataType": "Float32"} // 2 Register
// 64-bit float (8 Byte){"dataType": "Float64"} // 4 RegisterString-Typen
Abschnitt betitelt „String-Typen“// ASCII-Zeichen (1 Byte pro Register){"dataType": "AsciiChar"} // 1 RegisterByte- und Word-Reihenfolge
Abschnitt betitelt „Byte- und Word-Reihenfolge“Modbus-Geräte können unterschiedliche Byte- und Word-Reihenfolgen verwenden. Konfigurieren Sie diese entsprechend Ihrem Gerät:
Bit-Reihenfolge (Byte-Reihenfolge)
Abschnitt betitelt „Bit-Reihenfolge (Byte-Reihenfolge)“{ "defaultBitOrder": "BigEndian" // oder "LittleEndian"}- BigEndian: Most Significant Byte zuerst (Standard, am häufigsten)
- LittleEndian: Least Significant Byte zuerst
Word-Reihenfolge
Abschnitt betitelt „Word-Reihenfolge“Für Multi-Register-Werte (32-bit, 64-bit):
{ "defaultWordOrder": "HighFirst" // oder "LowFirst"}- HighFirst: High Word zuerst (Standard)
- LowFirst: Low Word zuerst
Pro-Variable-Override
Abschnitt betitelt „Pro-Variable-Override“{ "key": "special_value", "address": 10, "registerType": "HoldingRegister", "dataType": "Float32", "bitOrder": "LittleEndian", "wordOrder": "LowFirst"}RTU-Serielle Konfiguration
Abschnitt betitelt „RTU-Serielle Konfiguration“Für Modbus RTU über serielle Verbindungen:
{ "endpoint": "/dev/ttyUSB0", "transport": "RTU", "baudRate": 9600, "dataBits": 8, "parity": "None", "stopBits": 1, "timeout": 1000}Parameter:
baudRate: 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200dataBits: 7 oder 8parity: None, Even, OddstopBits: 1 oder 2timeout: Lese-Timeout in Millisekunden
Unit ID (Slave-Adresse)
Abschnitt betitelt „Unit ID (Slave-Adresse)“Modbus unterstützt mehrere Geräte im selben Netzwerk über Unit IDs:
{ "defaultUnitId": 1 // Standard für alle Variablen}Pro-Variable-Override:
{ "key": "device2_temp", "address": 0, "registerType": "HoldingRegister", "dataType": "Float32", "unitId": 2 // Override für diese Variable}Häufige Anwendungsfälle
Abschnitt betitelt „Häufige Anwendungsfälle“1. Energiezähler-Lesung
Abschnitt betitelt „1. Energiezähler-Lesung“{ "type": "ModbusReader", "config": { "endpoint": "192.168.1.50:502", "transport": "TCP", "pollingRate": 5000, "defaultUnitId": 1 }, "variables": [ { "key": "voltage", "address": 0, "registerType": "InputRegister", "dataType": "Float32" }, { "key": "current", "address": 2, "registerType": "InputRegister", "dataType": "Float32" }, { "key": "power", "address": 4, "registerType": "InputRegister", "dataType": "Float32" }, { "key": "energy", "address": 6, "registerType": "InputRegister", "dataType": "Float64" } ]}2. SPS-Steuerung
Abschnitt betitelt „2. SPS-Steuerung“{ "type": "ModbusWriter", "config": { "endpoint": "192.168.1.100:502", "transport": "TCP", "defaultUnitId": 1 }, "variables": [ { "key": "motor_speed", "address": 100, "registerType": "HoldingRegister", "dataType": "UInt16" }, { "key": "motor_start", "address": 0, "registerType": "Coil" }, { "key": "motor_stop", "address": 1, "registerType": "Coil" } ]}3. Multi-Geräte-Netzwerk
Abschnitt betitelt „3. Multi-Geräte-Netzwerk“{ "type": "ModbusReader", "config": { "endpoint": "/dev/ttyUSB0", "transport": "RTU", "pollingRate": 1000, "baudRate": 9600 }, "variables": [ { "key": "device1_temp", "address": 0, "registerType": "HoldingRegister", "dataType": "Float32", "unitId": 1 }, { "key": "device2_temp", "address": 0, "registerType": "HoldingRegister", "dataType": "Float32", "unitId": 2 }, { "key": "device3_temp", "address": 0, "registerType": "HoldingRegister", "dataType": "Float32", "unitId": 3 } ]}Fehlerbehebung
Abschnitt betitelt „Fehlerbehebung“Verbindungs-Timeout
Abschnitt betitelt „Verbindungs-Timeout“Lösungen:
- Endpunkt-Adresse und Port überprüfen
- Netzwerkkonnektivität prüfen
- Timeout-Wert erhöhen
- Sicherstellen, dass Gerät eingeschaltet ist und antwortet
Ungültige Daten
Abschnitt betitelt „Ungültige Daten“Lösungen:
- Byte-Reihenfolge prüfen (
BigEndianvsLittleEndian) - Word-Reihenfolge überprüfen (
HighFirstvsLowFirst) - Datentyp mit Gerätespezifikation abgleichen
- Registeradresse überprüfen
RTU-Kommunikationsfehler
Abschnitt betitelt „RTU-Kommunikationsfehler“Lösungen:
- Serielle Kabelverbindungen prüfen
- Baudrate mit Gerät abgleichen
- Paritäts- und Stoppbit-Einstellungen bestätigen
- Geeignete Abschlusswiderstände prüfen
- Polling-Frequenz reduzieren, um Bus-Kollisionen zu vermeiden
Exception-Codes
Abschnitt betitelt „Exception-Codes“Häufige Modbus-Exception-Codes:
- 01: Illegale Funktion
- 02: Illegale Datenadresse
- 03: Illegaler Datenwert
- 04: Slave-Gerätefehler
Best Practices
Abschnitt betitelt „Best Practices“- Mit Nur-Lesen beginnen: Mit Input Registern testen, bevor geschrieben wird
- Geeignetes Polling verwenden: Nicht schneller abfragen, als das Gerät antworten kann
- Aufeinanderfolgende Register gruppieren: Effizienter als verstreute Lesungen
- Byte-Reihenfolge dokumentieren: Notizen zu gerätespezifischen Konfigurationen führen
- Unit IDs testen: Sicherstellen, dass jedes Gerät auf seine Unit ID antwortet
Verwandte Konnektoren
Abschnitt betitelt „Verwandte Konnektoren“- OPC UA - Alternatives industrielles Protokoll
- Siemens S7 - Direkte Siemens-SPS-Kommunikation
- Filter - Modbus-Daten filtern
- SQL Writer - Modbus-Daten in Datenbank speichern