# Modbus RTU

> Modbus über einen seriellen Bus, mit der physischen Leitung als eigenem Objekt, das sich seine über Unit-IDs adressierten Geräte teilen.

Der Treiber Modbus RTU spricht mit Modbus-Geräten an einem seriellen Bus, RS-485 oder
RS-232, erreicht über einen physischen COM-Anschluss, einen USB-Adapter oder einen
virtuellen oder umgeleiteten Anschluss. Weil der Bus physisch geteilt wird, ist die
Topologie **Treiber → Leitung → Gerät → Tag**: Die **Leitung** besitzt alles Elektrische
(Anschluss, Baudrate, Format, Zeiten), und jedes **Gerät** an ihr besitzt nur seine Adresse
als Einheit, sein zyklisches Lesen und seine Tags.

## Serielle Leitung {#serial-line}

| Feld | Bedeutung | Standard |
| --- | --- | --- |
| **Bezeichnung** | Sprechender Name des Busses. Jederzeit änderbar. | erforderlich |
| **Serieller Port** | Der Anschluss des Betriebssystems, zum Beispiel `COM3`. Das Feld ist Freitext, physische, virtuelle und umgeleitete Anschlüsse funktionieren also alle, und der Pfeil daneben bietet die Anschlüsse an, die Windows gerade erkennt (mit **Aktualisieren** für einen im Betrieb gesteckten Adapter); die erkannte Liste ist eine Bequemlichkeit, nie eine Positivliste. | `COM1` |
| **Baudrate** | Bitrate, die sich jedes Gerät am Bus teilt. | 9600 |
| **Übertragungsmodus** | Wie jedes Gerät am Bus seine Nachrichten rahmt: **RTU**, binäre Rahmen mit CRC-Prüfung, oder **ASCII**, Rahmen als Text vom Doppelpunkt bis zum Zeilenumbruch mit LRC-Prüfung, wie ältere Geräte sie sprechen. Ein Bus spricht einen Modus, deshalb gehört er zur Leitung. | RTU |
| **Serielles Format** | Geschlossene Auswahl aus `8N1`, `8N2`, `8E1`, `8E2`, `8O1`, `8O2`, auf einer ASCII-Leitung zusätzlich `7N2`, `7E1`, `7E2`, `7O1`: Die Ziffer sind die Datenbits, der Buchstabe die Parität (`N` keine, `E` gerade, `O` ungerade), die letzte Ziffer die Stoppbits. Ein RTU-Rahmen braucht 8 Datenbits, daher bietet eine RTU-Leitung nur die 8-Bit-Formate an; ein 7-Bit-Format, das von einer ASCII-Leitung übrig ist, erscheint leer und wird abgelehnt, bis ein anderes gewählt ist. Andere Breiten, Mark- und Space-Parität sowie 1,5 Stoppbits werden nicht unterstützt. | `8E1` |
| **Zeitlimit für die Antwort (ms)** | Längste Wartezeit auf die Antwort einer Einheit, 100 bis 60.000. Längere Zeitlimits kommen langsamen Anlagen entgegen, machen aber fehlende Einheiten und die Gerätesuche langsamer erkennbar. | 1000 |
| **Mindestabstand zwischen Transaktionen (ms)** | Taktung zur Verträglichkeit für die ganze Leitung, 0 bis 1000. Null lässt nur die automatische Ruhe des Protokolls; ein positiver Wert kann sie erhöhen, nie verringern. | 0 |

Auf einer ASCII-Leitung gilt die im Folgenden beschriebene Ruhe nicht: Ein ASCII-Rahmen endet mit seinem Zeilenumbruch, daher zeigt die automatische Ruhe 0 ms, und der **Mindestabstand zwischen Transaktionen (ms)** ist die einzige Pause zwischen den Rahmen, wie die Karte darunter sagt: "ASCII-Rahmen enden mit einem Zeilenumbruch, daher fügt die Leitung keine eigene Ruhe ein: Dieser Abstand ist die einzige Pause zwischen den Rahmen." Der Übertragungsmodus ist eine physische Einstellung und ist wie Port, Baudrate, Format und Antwortzeitlimit gesperrt, solange die Leitung aktiviert ist; die Laufzeitadresse eines Geräts auf einer ASCII-Leitung endet mit `/ascii`.

Das Protokoll selbst verlangt Ruhe zwischen den Rahmen, und die Leitung erzwingt sie immer:
Bis einschließlich 19.200 Baud beträgt die automatische Ruhe 3,5 Zeichenzeiten, berechnet
aus dem eingestellten Format; über 19.200 Baud sind es die festen 1,75 ms, die die
Spezifikation empfiehlt. Die wirksame Ruhe ist die **größere** von dieser automatischen
Untergrenze und dem eingestellten Intervall, nie ihre Summe, und der Bereich zeigt beide
Werte. Das Intervall zu erhöhen verlangsamt bewusst jede Einheit an der Leitung; es ist
eine Hilfe zur Verträglichkeit, keine Reparatur für Verdrahtung, Abschluss, Erdung oder
Störungen.

Eine neue Leitung beginnt **deaktiviert**, damit ihre physischen Einstellungen zuerst
eingerichtet werden können. Jeder physische Anschluss gehört zu höchstens einer Leitung,
verglichen ohne Rücksicht auf Groß- und Kleinschreibung und auch dann, wenn Leitungen
deaktiviert sind. Der Name und das Transaktionsintervall bleiben änderbar, während die
Leitung läuft (eine Änderung der Zeiten wirkt, ohne den Anschluss zu schließen und wieder
zu öffnen); Anschluss, Baudrate, Format und Antwort-Zeitlimit sind gesperrt, solange die
Leitung aktiviert ist: Deaktivieren und speichern Sie sie zuerst. Eine Leitung zu
deaktivieren hält die Kommunikation aller ihrer Geräte an, ohne deren einzelne Wahl unter
Aktiviert zu ändern.

Die Leitung meldet den physischen Übertragungsweg getrennt von ihren Geräten: **Aus**,
**Leerlauf** (kein aktiviertes Gerät), **Verbindung wird aufgebaut**, **Verbunden** oder
**Portfehler** mit einer Diagnose. Eine leere Leitung zu löschen entfernt nur die Leitung; eine zu löschen,
die Geräte enthält, verlangt eine ausdrückliche Bestätigung und löscht auch diese Geräte
und ihre Tags.

## Gerät {#device}

| Feld | Bedeutung | Standard |
| --- | --- | --- |
| **Serielle Leitung** | Fest: Ein Gerät wird unter seiner Leitung angelegt und erbt das physische Tupel, das im Bereich nur gelesen wird. Legen Sie das Gerät unter der gewünschten Leitung an. | die Leitung, unter der es angelegt wird |
| **Unit-ID** | Die Modbus-Adresse des Geräts am Bus, 1 bis 247, eindeutig innerhalb der Leitung (deaktivierte Geräte eingeschlossen). | 1 |
| **Abfrageintervall (ms)** | Standardtakt des zyklischen Lesens für Tags, die ihn nicht selbst festlegen. | 1000 |

Die interne Adresse zur Laufzeit ist
`modbus+rtu://<line-id>/<port>/<baud>/<format>/<timeout>/<unitId>/<interval>`: Sie trägt
die feste Identität der Leitung und ihre vollständigen physischen Einstellungen, nie ihren
sprechenden Namen.

## Verhalten der geteilten Leitung {#shared-line-behavior}

Der Treiber öffnet **eine serielle Sitzung je Leitung** und reiht jede Anfrage jedes Geräts
über einen einzigen Verteiler, Lesen und Schreiben überlappen sich am Bus also nie. Ein
anstehender Schreibvorgang nimmt den nächsten freien Platz mit begrenztem Vorrang:
Schreibvorgänge werden zügig bedient, aber dauerndes Schreiben kann das zyklische Lesen
nicht aushungern. Die Zeitüberschreitungen jeder Einheit sind voneinander getrennt, mit
zunehmender Wartezeit, ein stummes Gerät verlangsamt also nur sich selbst. Eine
Modbus-Ausnahme mit gültiger CRC ist ein Fehler dieser einen Anfrage an diesem Tag, und die
Leitung bleibt gesund. Nur ein physischer Ein-/Ausgabefehler (der Anschluss verschwindet,
der Adapter wird gezogen) macht die geteilte Sitzung ungültig und startet ein abgestimmtes
erneutes Öffnen für die ganze Leitung. Das zuletzt freigegebene Gerät schließt den
Anschluss.

## Adressierung der Tags {#tag-addressing}

Die Adressierung der Tags ist dieselbe wie bei [Modbus TCP](driver-modbus-tcp): eine
**Registerklasse** (Spule (0xxxx), Diskreter Eingang (1xxxx), Eingangsregister (3xxxx),
Holding-Register (4xxxx), standardmäßig aus Typ und Zugriff des Tags abgeleitet), eine ab 0 gezählte
**Registernummer**, eine automatische **Anzahl (Register, leer = automatisch)** (Boolean,
Int16 und UInt16 1 Register, Int32 und Float 2, String 4; das Feld wird nur bei Tags vom
Typ String gezeichnet, weil jede andere Breite fest ist) und die beiden Felder zur
Reihenfolge: **Höchstwertiges Byte zuerst (MSB first, Big-Endian)** für die Byte-Reihenfolge
und **Höchstwertiges Wort zuerst (High-Word zuerst)** für die Wort-Reihenfolge (nur bei den
Zwei-Register-Typen Int32 und Float gezeichnet), beide standardmäßig eingeschaltet. Die Karte
Quelle endet mit **Adresse im Handbuch**, der Adresse des Tags, wie das Handbuch des Geräts sie
druckt (Eingangsregister 0 ist 30001). Die
unterstützten Werttypen sind dieselben sechs (Boolean, Int16, UInt16, Int32, Float und
String): Int16 und UInt16 lesen ein einziges 16-Bit-Register, mit oder ohne Vorzeichen, und
für sie gilt nur die Byte-Reihenfolge (das Feld zur Wort-Reihenfolge wird nicht gezeichnet). Die Funktionscodes für Lesen und Schreiben sowie die
Anordnungen auf dem Bus stehen auf der Seite [Modbus TCP](driver-modbus-tcp) und gelten
hier unverändert.

## Gerätesuche {#discovery}

Die Gerätesuche tastet einen Bereich von Unit-IDs über eine vorhandene Leitung ab und wohnt
im Bereich dieser Leitung:

| Feld | Bedeutung | Standard |
| --- | --- | --- |
| **Unit-ID von** | Erste abzutastende Unit-ID, 1 bis 247. | 1 |
| **Unit-ID bis** | Letzte Unit-ID, aufsteigend ab der ersten. | 32 |

Auf einer ASCII-Leitung ist die Abtastung dieselbe Anfrage in einem ASCII-Rahmen, und die LRC tritt an die Stelle der CRC: Eine Ausnahme mit stimmender LRC beweist, dass eine Einheit da ist, ein Rahmen mit falscher LRC beweist nichts.

Der Suchlauf lädt die gespeicherten physischen Einstellungen der Leitung neu, öffnet den
Anschluss einmal und tastet den Bereich **nacheinander** mit Read Basic Device
Identification (Funktion 43/14) ab, wobei jede Abtastung mit der wirksamen Ruhe zwischen
den Rahmen getaktet wird. Er probiert nie Kombinationen von Einstellungen und liest nie
Register. Eine Modbus-Ausnahme mit gültiger CRC beweist, dass eine Einheit da ist, ohne
ihre Identität zu behaupten; eine Zeitüberschreitung oder ein ungültiger Rahmen tun das
nicht.

Eine Leitung, die in Betrieb ist, wird nie unterbrochen und nie automatisch umgeschaltet:
Deaktivieren Sie sie vor dem Suchlauf und aktivieren Sie sie danach selbst wieder. Ein
Abbruch schließt die serielle Sitzung und lässt bereits gezeigte Ergebnisse als
vorübergehende Kandidaten stehen, bis Sie sie ausdrücklich hinzufügen. Eine bereits
konfigurierte Unit-ID wird als solche gekennzeichnet und öffnet das vorhandene Gerät, statt
ein Duplikat anzulegen; die Ergebnisse tragen keine Tags, Register werden nach
**Hinzufügen** eingerichtet.

Gerätesuche und Konfiguration der Leitung teilen sich je physischem Anschluss eine
Reservierung, die sofort scheitert, ein Suchlauf und eine Änderung der Einstellungen können
sich also nicht um den Anschluss streiten: Dem Verlierer wird gesagt, welcher Vorgang ihn
hält.

## Grenzen, die man kennen sollte {#limits-worth-knowing}

- Die sechs Werttypen sind der ganze Wortschatz des Codecs auf dem Bus; andere
  Ganzzahlbreiten und Double werden nicht angeboten.
- Der Durchsatz ist eine Eigenschaft des Busses: Jedes Gerät an der Leitung teilt sich
  einen Strom von Anfragen, getaktet von der wirksamen Ruhe zwischen den Rahmen, viele
  Geräte oder ein erhöhtes Intervall verlängern also jeden Zyklus des Lesens.
