Modbus Unit-ID: Wann sie zählt und warum 0, 1 und 255 vorkommen

· Von Vladimir Chemeris, Entwickler von Modbus TCP FieldKit

Kurzantwort: Hinter einem Gateway von TCP auf RS-485 ist die Unit-ID die serielle Adresse des Geräts, 1 bis 247. Bei einem Gerät direkt im Netzwerk hat sie keine Routing-Aufgabe: Der Guide empfiehlt 0xFF und akzeptiert 0, doch viele Geräte erwarten 1. Verbindet sich ein Gerät und sagt dann nichts, ist die Unit-ID das Erste, was Sie prüfen.

Was der Guide sagt

Der Implementation Guide zu Modbus TCP nennt das Feld bei direkten Geräten „useless“ (nutzlos) und legt die Regel in einer Zeile fest: „On TCP/IP, the MODBUS server is addressed using its IP address; therefore, the MODBUS Unit Identifier is useless. The value 0xFF has to be used.“ Sinngemäß: Bei TCP/IP adressiert die IP-Adresse den Server, die Unit Identifier ist daher nutzlos, und der Wert 0xFF ist vorgeschrieben. Eine Anmerkung ergänzt, dass der Guide auch 0 akzeptiert.

Der Guide erklärt auch, warum man bei einem direkten Gerät keine echte Adresse wie 1 verwenden soll: Wandert diese IP später auf ein Gateway, leitet das Gateway die Anfrage an das Gerät weiter, das diese Adresse hat. Mit 0xFF verwirft das Gateway sie.

Bei einem Gateway trägt das Feld die serielle Adresse, und „the bridge uses the MODBUS Unit identifier to forward the request to the right slave device“ (die Bridge nutzt die Unit Identifier, um die Anfrage an das richtige Slave-Gerät weiterzuleiten). Serielle Adressen reichen von 1 bis 247, und 0 bedeutet Broadcast.

Was Geräte tun

In der Praxis begegnen Ihnen diese Fälle:

  • Geräte, die auf jede Unit-ID antworten.
  • Geräte, die nur auf ihre konfigurierte ID antworten, oft 1, und sonst stumm bleiben.
  • Gateways, die bei einer leeren Adresse 0B antworten.
  • Gateways, die den Client in den Timeout laufen lassen.
  • Server, die mit einer Exception antworten.

Ein Server mit pymodbus 3.16.1, bei dem nur Unit 1 definiert war, antwortete auf Unit 2, Unit 0 und Unit 255 mit Exception 04:

TX 00 10 00 00 00 06 02 03 00 00 00 01
RX 00 10 00 00 00 03 02 83 04

Wer die Spezifikation im Kopf hat, könnte erwarten, dass 0xFF hier funktioniert. Das tat es nicht, nehmen Sie also nichts an. Testen Sie gegen das Gerät, das vor Ihnen steht.

Die richtige ID finden

  1. Probieren Sie 1, dann 255, dann 0.
  2. Wenn Sie hinter einem Gateway arbeiten, prüfen Sie die serielle Adresse des Geräts am Display oder an den DIP-Schaltern.
  3. Scannen Sie. Senden Sie an jeden Kandidaten einen Lesezugriff auf ein einzelnes Register an Adresse 0. Bei 300 ms pro stummer Unit dauern alle 247 etwa 75 Sekunden.
  4. Werten Sie eine Exception als Erfolg. Illegal Data Address beweist, dass eine Unit geantwortet hat, und Sie müssen nur ein anderes Register wählen.
  5. Zählen Sie 0A oder 0B nicht mit. Sie stammen vom Gateway und sagen nichts über das Gerät dahinter.

Unit IDs scannen in FieldKit arbeitet so: Quick probiert 1 bis 10 sowie 0 und 255, und All probiert 1 bis 247. Es sendet nur Lesezugriffe mit FC 03, nacheinander, mit einem Timeout von etwa 300 ms.

Bevor Sie ein Gateway scannen

Schließen Sie zuerst andere Poller, denn viele Gateways erlauben nur einen Client gleichzeitig. Auf einer gemeinsam genutzten RS-485-Leitung erzeugt ein langer Scan außerdem Verkehr für andere Master. Führen Sie ihn daher bei der Inbetriebnahme aus und nicht auf einem ausgelasteten Produktionsbus.

Unit-ID bei RTU over TCP

Bei transparentem RTU over TCP wird die Unit-ID zum ersten Byte des RTU-Frames, und das Gerät an der Leitung prüft sie. Ein falscher Wert bleibt ohne Antwort, und kein Gateway meldet ihn. Broadcast 0 erhält konstruktionsbedingt keine Antwort. RTU over TCP und Modbus TCP im Vergleich.

Quellen

FAQ

Welche Unit-ID soll ich für Modbus TCP verwenden?

Für ein Gerät direkt an TCP empfiehlt der Implementation Guide 0xFF und akzeptiert auch 0. In der Praxis sind viele Geräte so eingerichtet, dass sie auf 1 antworten, prüfen Sie also das Handbuch. Hinter einem Gateway verwenden Sie die serielle Adresse des Zielgeräts, von 1 bis 247.

Ist die Unit-ID dasselbe wie die Slave-Adresse?

Hinter einem Gateway ja: Das Gateway leitet sie als RTU-Adresse weiter. Bei einem Gerät, das direkt an TCP hängt, identifiziert die IP-Adresse den Server, das Feld hat also keine Routing-Aufgabe.

Wie finde ich eine unbekannte Unit-ID?

Scannen. Senden Sie an jeden Kandidaten einen harmlosen Lesezugriff und sehen Sie, wer antwortet oder wer mit einer Exception antwortet. Eine Exception wie Illegal Data Address beweist trotzdem, dass die Unit existiert.