Modbus TCP
Modbus-Register und Spulen über TCP/IP, mit typisierter Adressierung, Steuerung der Byte-Reihenfolge und einem begrenzten Suchlauf im Netz.
Der Treiber Modbus TCP liest und schreibt Modbus-Register und Spulen über TCP/IP: Steuerungen, Zähler, Gateways und jeden Server, der Modbus/TCP spricht. Die Adressierung ist vollständig typisiert: Sie wählen eine Registerklasse und eine ab 0 gezählte Registernummer, und die Anwendung setzt die Anfrage auf dem Bus zusammen; es gibt keine Freitextadresse, bei der man sich vertun kann.
Gerät
| Feld | Bedeutung | Standard |
|---|---|---|
| Host | DNS-Name, IPv4- oder IPv6-Adresse des Modbus-Servers oder Gateways. | localhost, wenn leer gelassen |
| Port | TCP-Port. | 502 (eine eingestellte 0 fällt auf 502 zurück) |
| Unit-ID | Die Modbus-Kennung der Einheit (Slave), die jede Anfrage trägt, und die ein Gateway verwendet, um an das Gerät dahinter weiterzuleiten. 0 bis 255. | 1 |
| Minimales Transaktionsintervall (ms) | Taktung zur Verträglichkeit: die kürzeste Ruhe nach einer abgeschlossenen Transaktion, bevor die nächste beginnt, 0 bis 1000. Null fügt keine künstliche Verzögerung hinzu. | 0 |
| Abfrageintervall (ms) | Standardtakt des zyklischen Lesens für Tags, die ihn nicht selbst festlegen. | 1000 |
Der Basis-URI in der Kopfzeile des Bereichs ist modbus+tcp://host:port/unitID, dazu
?minimumTransactionIntervalMs=n, wenn das Intervall gesetzt ist.
Geräte, die sich Host und Port teilen, teilen sich auch ein Tor für Transaktionen: Anfragen an denselben Endpunkt überlappen sich nie, und das größte eingestellte minimale Transaktionsintervall unter den aktivierten Geräten an diesem Endpunkt taktet sie alle. Der Bereich sagt es, wenn ein anderes Gerät das wirksame Intervall über das hier eingestellte hebt. Das Intervall regelt nur den Verkehr, den diese Anwendung aussendet: Es ist eine Hilfe für einen langsamen Server oder ein langsames Gateway, keine Reparatur für Fehler im Netz.
Das Verbinden wartet höchstens 5 Sekunden; auf eine Antwort wird höchstens 10 Sekunden gewartet; auf Protokollebene wird nichts wiederholt. Die Wiederholschleife im Hintergrund besitzt das erneute Verbinden, ein Gerät, das aus ist, kostet also nichts außer einem Messwert schlechter Qualität.
Adressierung der Tags
| Feld | Bedeutung | Standard |
|---|---|---|
| Registerklasse | Welche Modbus-Größe der Tag adressiert: HoldingRegister, InputRegister, Coil oder DiscreteInput. |
Aus Typ und Zugriff abgeleitet: Tags vom Typ Boolean bekommen DiscreteInput (nur lesen) oder Coil (schreibbar); jeder andere Typ bekommt InputRegister (nur lesen) oder HoldingRegister (schreibbar). |
| Registernummer (ab 0) | Die rohe Adresse des Protokolls. Das ist die ab 0 gezählte Adresse auf dem Bus, nicht die klassische Schreibweise 4xxxx: Das Holding-Register "40001" ist die Registernummer 0. Das Register reist als 16-Bit-Zahl über den Bus, das Feld nimmt also 0 bis 65535 an und lehnt dort, wo es eingetippt wird, alles Breitere ab. | 0 |
| Anzahl (Register, leer = automatisch) | Wie viele 16-Bit-Register der Wert belegt. Das Feld wird nur bei Tags vom Typ String gezeichnet: Jeder andere Typ hat eine feste Breite, es gibt also nichts zu übersteuern. | Nach Typ: Boolean 1, Int32 und Float 2, String 4 |
| Höchstwertiges Byte zuerst | Welches Byte jedes 16-Bit-Registers zuerst über den Bus geht. Nur bei numerischen Tags. | ein (was die Modbus-Spezifikation verlangt) |
| Höchstwertiges Wort zuerst | Welches Register eines Werts aus zwei Registern die obere Hälfte trägt. Nur bei numerischen Tags. | ein |
Die Karte Quelle zeigt die zusammengesetzte Busadresse (zum Beispiel 100?quantity=2) als
Vorschau, die nur gelesen wird, das, was der Bereich zeigt, ist also genau das, was die
Anfrage trägt.
Werttypen und Anzahlen
Vier Werttypen werden angeboten, und die Breite jedes einzelnen auf dem Protokoll ist fest:
| Datentyp | Register | Form auf dem Bus |
|---|---|---|
| Boolean | 1 | Auf einer Registerklasse: Jedes Register ungleich null liest wahr, und ein Schreibvorgang sendet 1 oder 0. Auf Coil/DiscreteInput: das Bit selbst. |
| Int32 | 2 | Vorzeichenbehaftete 32-Bit-Ganzzahl über ein Registerpaar. |
| Float | 2 | IEEE 754 mit einfacher Genauigkeit über ein Registerpaar. |
| String | 1 oder mehr (Standard 4) | UTF-8-Bytes, zwei je Register gepackt. Ein Lesevorgang endet am ersten NUL-Byte; ein Schreibvorgang muss in die erklärte Anzahl passen (2 Bytes je Register) und wird mit Nullen aufgefüllt. |
Ein Tag vom Typ String wird in der Reihenfolge gelesen und geschrieben, in der das Gerät die Bytes hält, und ein Schreibvorgang sendet immer UTF-8. Bytes, die kein gültiges UTF-8 sind, und so sieht ein Bereich aus, den das Gerät nie beschrieben hat, oder Text in einer anderen Kodierung, werden als Unicode-Ersatzzeichen gelesen, statt fehlzuschlagen: Der Tag zeigt sichtbar etwas Falsches, und jeder andere Tag an diesem Gerät liest weiter.
Anzahl wird nur bei Tags vom Typ String gefragt. Die Breiten von Boolean, Int32 und Float sind fest, das Feld wird an diesen Punkten also nicht gezeichnet, weder im Bereich des Tags noch in der Tabelle der Tags; die Übersteuerung gibt es, um Tags vom Typ String zu bemessen.
Byte- und Wortreihenfolge
Die beiden Felder zur Reihenfolge werden bei numerischen Tags gezeichnet. Sie sind zwei
unabhängige Fragen: welches Byte innerhalb eines Registers führt und welches Register über
ein Paar hinweg führt. Modbus legt für Text keines von beiden fest, ein Tag vom Typ String
bekommt sie deshalb nicht angeboten: Seine Bytes reisen in der Reihenfolge, in der das
Gerät sie hält. Für den Wert 0x01020304, mit A als höchstwertigem Byte, ergeben sich
vier Anordnungen:
| Höchstwertiges Byte zuerst | Höchstwertiges Wort zuerst | Bytes auf dem Bus |
|---|---|---|
| ein | ein | AB CD (der Standard der Spezifikation) |
| ein | aus | CD AB (der klassische Wort-Tausch) |
| aus | ein | BA DC |
| aus | aus | DC BA |
Lesen und Schreiben wenden dieselben zwei Antworten in derselben Reihenfolge an, ein Schreibvorgang legt also genau die Bytes ab, die ein Lesevorgang zurückgebracht hätte.
Funktionscodes
| Registerklasse | Lesen | Schreiben |
|---|---|---|
| HoldingRegister | 3 (Read Holding Registers) | 6 (einzelnes Register) oder 16 (mehrere Register) |
| InputRegister | 4 (Read Input Registers) | nur lesen; ein Schreibvorgang wird abgelehnt |
| Coil | 1 (Read Coils) | 5 (Force Single Coil, eine einzelne Spule) |
| DiscreteInput | 2 (Read Discrete Inputs) | nur lesen; ein Schreibvorgang wird abgelehnt |
Ein Schreibvorgang gilt erst dann als erfolgreich, wenn die Antwort des Servers auf Protokollebene die Annahme bestätigt; erst dann rückt auch der zwischengespeicherte Wert nach.
Gerätesuche
Der Suchlauf ist ausdrücklich und begrenzt: Die Anwendung leitet Ihr lokales Teilnetz nie ab und fährt es nie von sich aus ab. Das Formular für den Umfang nimmt an:
| Feld | Bedeutung | Standard |
|---|---|---|
| IPv4-Host oder CIDR | Eine Adresse (192.168.1.10) oder ein Teilnetz nicht breiter als /24 (192.168.1.0/24). Netz- und Broadcast-Adressen werden übersprungen. |
erforderlich |
| Port | Der Port, der abgetastet wird. | 502 |
| Unit-IDs | Werte, durch Komma getrennte Listen oder aufsteigende Bereiche: 1, 1,5,9, 1, 3, 8-16 (0 bis 255). |
1 |
| Minimales Transaktionsintervall (ms) | Taktung zwischen abgeschlossenen Abtastungen auf demselben Host, 0 bis 1000. | 0 |
Ein einzelner Suchlauf darf höchstens 256 Abtastungen senden (Hosts × Unit-IDs); ein größerer Plan wird abgelehnt, bevor ein Socket geöffnet wird. Die einzige gesendete Anfrage ist Read Basic Device Identification (Funktion 43/14): Die Gerätesuche liest nie Register und rät nie eine Registerbelegung. Eine vollständig gültige Modbus-Ausnahme als Antwort beweist, dass eine Einheit da ist, ohne ihre Identität zu behaupten; Erreichbarkeit über TCP, Zeitüberschreitungen und fehlerhafte Rahmen tun das nicht. Bis zu vier Hosts werden nebeneinander abgetastet, innerhalb eines Hosts nacheinander, mit 750 ms Zeitlimit für Verbinden und Abtasten.
Die Ergebnisse tragen den vollständigen Endpunkt und einen vorgeschlagenen Namen aus Hersteller und Produktcode, wenn das Gerät sie meldet. Kandidaten haben null Tags: Register werden nach Hinzufügen eingerichtet. Eine bereits konfigurierte Einheit wird als solche gekennzeichnet und bietet Öffnen an, statt ein Duplikat anzulegen.
Grenzen, die man kennen sollte
- Breite Ganzzahltypen (Int64, vorzeichenlose Breiten) und Double werden nicht angeboten: Der Codec auf dem Bus überträgt genau die vier Typen oben verlustfrei hin und zurück.
- Je Endpunkt ist immer nur eine Anfrage unterwegs; viele Geräte hinter einem Gateway teilen sich diese Reihung von Haus aus.
- Schreibvorgänge adressieren jeweils eine Spule oder eine Folge von Registern; ein Schreibvorgang über mehrere Spulen gibt es nicht.