Zum Inhalt springen

Modbus-Konnektor

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 lesen
  • ModbusWriter - Daten auf Modbus-Geräte schreiben
  • ✅ 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

Meddle unterstützt folgende Modbus-Transporte:

  • TCP - Modbus TCP über Ethernet
  • TCPWithTLS - Modbus TCP mit TLS-Verschlüsselung
  • UDP - Modbus über UDP
  • RTU - Modbus RTU über seriell
  • RTUOverTCP - Modbus RTU gekapselt in TCP
  • RTUOverUDP - Modbus RTU gekapselt in UDP
{
"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"
}
]
}
{
"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"
}
]
}
{
"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"
}
]
}

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)

Nur-Lese-Register, typischerweise für Sensordaten verwendet.

{
"key": "sensor_reading",
"address": 0,
"registerType": "InputRegister",
"dataType": "Int16"
}

Funktionscode: Read (04)

Einzelbit-Register für digitale Ausgänge.

{
"key": "motor_enable",
"address": 0,
"registerType": "Coil"
}

Funktionscodes: Read (01), Write Single (05), Write Multiple (15)

Nur-Lese-Einzelbit-Register für digitale Eingänge.

{
"key": "limit_switch",
"address": 0,
"registerType": "DiscreteInput"
}

Funktionscode: Read (02)

// 16-bit signed integer (-32768 bis 32767)
{"dataType": "Int16"} // 1 Register
// 16-bit unsigned integer (0 bis 65535)
{"dataType": "UInt16"} // 1 Register
// 32-bit float (4 Byte)
{"dataType": "Float32"} // 2 Register
// 64-bit float (8 Byte)
{"dataType": "Float64"} // 4 Register
// ASCII-Zeichen (1 Byte pro Register)
{"dataType": "AsciiChar"} // 1 Register

Modbus-Geräte können unterschiedliche Byte- und Word-Reihenfolgen verwenden. Konfigurieren Sie diese entsprechend Ihrem Gerät:

{
"defaultBitOrder": "BigEndian" // oder "LittleEndian"
}
  • BigEndian: Most Significant Byte zuerst (Standard, am häufigsten)
  • LittleEndian: Least Significant Byte zuerst

Für Multi-Register-Werte (32-bit, 64-bit):

{
"defaultWordOrder": "HighFirst" // oder "LowFirst"
}
  • HighFirst: High Word zuerst (Standard)
  • LowFirst: Low Word zuerst
{
"key": "special_value",
"address": 10,
"registerType": "HoldingRegister",
"dataType": "Float32",
"bitOrder": "LittleEndian",
"wordOrder": "LowFirst"
}

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, 115200
  • dataBits: 7 oder 8
  • parity: None, Even, Odd
  • stopBits: 1 oder 2
  • timeout: Lese-Timeout in Millisekunden

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
}
{
"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"
}
]
}
{
"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"
}
]
}
{
"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
}
]
}

Lösungen:

  • Endpunkt-Adresse und Port überprüfen
  • Netzwerkkonnektivität prüfen
  • Timeout-Wert erhöhen
  • Sicherstellen, dass Gerät eingeschaltet ist und antwortet

Lösungen:

  • Byte-Reihenfolge prüfen (BigEndian vs LittleEndian)
  • Word-Reihenfolge überprüfen (HighFirst vs LowFirst)
  • Datentyp mit Gerätespezifikation abgleichen
  • Registeradresse überprüfen

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

Häufige Modbus-Exception-Codes:

  • 01: Illegale Funktion
  • 02: Illegale Datenadresse
  • 03: Illegaler Datenwert
  • 04: Slave-Gerätefehler
  1. Mit Nur-Lesen beginnen: Mit Input Registern testen, bevor geschrieben wird
  2. Geeignetes Polling verwenden: Nicht schneller abfragen, als das Gerät antworten kann
  3. Aufeinanderfolgende Register gruppieren: Effizienter als verstreute Lesungen
  4. Byte-Reihenfolge dokumentieren: Notizen zu gerätespezifischen Konfigurationen führen
  5. Unit IDs testen: Sicherstellen, dass jedes Gerät auf seine Unit ID antwortet
  • OPC UA - Alternatives industrielles Protokoll
  • Siemens S7 - Direkte Siemens-SPS-Kommunikation
  • Filter - Modbus-Daten filtern
  • SQL Writer - Modbus-Daten in Datenbank speichern