Zum Hauptinhalt springen

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.

PunktWert
opc_typeMODBUS_RTU
Implementierungsklasseplantpulse.driver.protocol.modbus.ModbusRTUDriver
Bibliothekeigene native Implementierung (ModbusRtuOverTcp aus plantpulse-plc-protocol)
VererbungAbstractNativeModbusDriver (nicht PLC4j)
read
write✅ (coil / holding-register)
Sicherheitkeine (Modbus-Standard selbst)
Kein direkter Serieller Zugriff — Seriell-TCP-Konverter vorausgesetzt

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

FeldBedeutungStandard
opc_agent_ipIP des Seriell-TCP-Konverters192.168.0.60
opc_agent_portTCP-Port des KonvertersKonverter-Einstellung (z. B. 502 / 4001)
options.unit-id (Alias unit-identifier)Modbus-Slave-ID (1..247)1
options.request-timeoutAntwort-Timeout (ms)5000

Serielle Parameter wie baud-rate / parity / stop-bits werden 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):

NotationBedeutung
coil:1FC 01 — Read Coils
discrete-input:1FC 02 — Read Discrete Inputs
holding-register:1FC 03 — Read Holding Registers (signed 16)
holding-register:1:UINTunsigned 16
holding-register:1:DINTsigned 32 (2 Register, MSWord-first)
holding-register:1:REAL32-Bit-Float (2 Register)
holding-register:100:STRING[10]10-Word-ASCII
input-register:1FC 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-register sind 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 + Paket modbus aus plantpulse-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.