Modbus RTU Treiber (RTU-over-TCP)
Übersicht
Modbus RTU — Modbus-Variante, die über RS-485 / RS-232 seriell arbeitet. Native Neuimplementierung 2026-07 — die alte Delegation an Apache PLC4j modbus-rtu wurde entfernt. Verwendet wird jetzt die native RTU-over-TCP-Implementierung (ModbusRtuOverTcp) aus plantpulse-plc-protocol. Serielle RTU-Geräte werden über einen Seriell-TCP-Konverter bereitgestellt und als host:port registriert — der Treiber arbeitet ausschließlich mit TCP-Sockets.
| Punkt | Wert |
|---|---|
opc_type | MODBUS_RTU |
| Implementierungsklasse | plantpulse.driver.protocol.modbus.ModbusRTUDriver |
| Bibliothek | eigene native Implementierung (ModbusRtuOverTcp aus plantpulse-plc-protocol) |
| Vererbung | AbstractNativeModbusDriver (nicht PLC4j) |
| read | ✅ |
| write | ✅ (coil / holding-register) |
| Sicherheit | keine (Modbus-Standard selbst) |
Der native Treiber arbeitet ausschließlich mit TCP-Sockets. RS-485/232-Geräte werden über einen Seriell↔TCP-Konverter (z. B. USR-TCP232, Moxa NPort) bereitgestellt; dessen IP:Port wird als opc_agent_ip / opc_agent_port registriert. Serielle Parameter wie Baudrate, Parität oder Stoppbits werden am Konverter konfiguriert; der Treiber verwendet sie nicht.
Klassenstruktur
AbstractNativeModbusDriver (주소 파싱 · 디코드 · read/write 공통)
└── ModbusRTUDriver — createClient() = new ModbusRtuOverTcp(unitId, host, port)
└── ModbusTCPDriver — createClient() = new ModbusTcp(unitId, host, port)
Das RTU-Framing (Slave-Adresse + PDU + CRC-16 LE) übernimmt ModbusRtuOverTcp über den TCP-Stream.
OPC-Registrierungsoptionen
| Feld | Bedeutung | Standard |
|---|---|---|
opc_agent_ip | IP des Seriell-TCP-Konverters | 192.168.0.60 |
opc_agent_port | TCP-Port des Konverters | Konverter-Einstellung (z. B. 502 / 4001) |
options.unit-id (Alias unit-identifier) | Modbus-Slave-ID (1..247) | 1 |
options.request-timeout | Antwort-Timeout (ms) | 5000 |
Serielle Parameter wie
baud-rate/parity/stop-bitswerden am Konverter eingestellt — der Treiber nimmt sie nicht entgegen.
Tag-Format plc_address
Identisch zu Modbus TCP — <area>:<address>[:<datatype>][[<count>]] (Syntax von PLC4X modbus4x beibehalten, 1-basiert):
| Notation | Bedeutung |
|---|---|
coil:1 | FC 01 — Read Coils |
discrete-input:1 | FC 02 — Read Discrete Inputs |
holding-register:1 | FC 03 — Read Holding Registers (signed 16) |
holding-register:1:UINT | unsigned 16 |
holding-register:1:DINT | signed 32 (2 Register, MSWord-first) |
holding-register:1:REAL | 32-Bit-Float (2 Register) |
holding-register:100:STRING[10] | 10-Word-ASCII |
input-register:1 | FC 04 — Read Input Registers |
Die detaillierten Notationsregeln sowie das Mapping data_type · format entsprechen der Seite zum Modbus TCP Treiber.
Write (nativ)
coil:N→ Single-Coil-Write (Boolean).holding-register:N[:TYPE]→ Register-Write je nach Datentyp (REAL/DINT= 2 Register MSWord-first, sonst einzelnes 16-Bit-Register).discrete-input/input-registersind read-only.
Nicht unterstützt
- Direkter serieller Port (
/dev/ttyUSB0) — nicht unterstützt. Nur über Seriell-TCP-Konverter. - Multi-Master / Token-Passing — nur ein einzelner Master.
- Modbus ASCII (Doppelpunkt-Trennung, LRC-Prüfsumme) — nur RTU-Framing.
Referenzen
- Modbus over Serial Line (V1.02) — Modbus-IDA.
- Code:
plantpulse-edge-driver/src/plantpulse/driver/protocol/modbus/ModbusRTUDriver.java+ Paketmodbusausplantpulse-plc-protocol. - Betrieb: Statt USB-↔-RS-485-Adapter einen Seriell-TCP-Konverter verwenden und Abschlusswiderstand 120 Ω prüfen. Bei falscher unit-id / Baudrate treten ausschließlich Timeouts auf.