Betreten Sie eine beliebige vor 2010 gebaute Fabrik, und Sie treffen auf dasselbe Gespenst: einen Schaltschrank voller SPS, die die Linie noch immer perfekt steuern, Modbus sprechen und nie dafür ausgelegt waren, das öffentliche Internet zu berühren. Sie zu ersetzen ist selten eine Option. Die Investitionskosten sind enorm, die Ausfallzeit ist inakzeptabel, und ehrlich gesagt haben diese Steuerungen drei Generationen von IT-Strategie überlebt. Der pragmatische Weg nach vorn ist das Retrofit: Lassen Sie die SPS in Ruhe, setzen Sie ein Edge-Gateway ein und streamen Sie die Daten, die sie seit dreißig Jahren still produzieren, in den Azure IoT Hub, wo sie endlich etwas Nützliches tun können.
Dieser Beitrag ist der Feldführer, den wir uns bei unserem ersten Brownfield-Projekt gewünscht hätten. Wir behandeln Modbus RTU und TCP auf Bit-Ebene, die RS-485-Verkabelungsfehler, die Ihre Wochenenden auffressen, die Funktionscodes, die Sie tatsächlich verwenden werden, Adressierungsfallen, die mehr Integratoren ruiniert haben als irgendetwas anderes, und ein funktionierendes ESP32-Gateway-Muster, das Modbus zu MQTT zu Azure überbrückt. Wenn Sie Retrofit-Optionen für Industrie-IoT bewerten, beginnen Sie hier.
Warum Modbus noch immer überall ist
Modbus wurde 1979 von Modicon veröffentlicht. Es ist ein Request/Response-Protokoll, Master/Slave (die moderne Terminologie lautet Client/Server), und es trägt keine Sicherheit, keine Authentifizierung und fast keine Metadaten. Das sollte ein Problem sein. In der Praxis ist es der Grund, warum Modbus gewonnen hat. Die Spezifikation passt auf ein paar Dutzend Seiten, jeder SPS-Hersteller implementiert sie, und das Leitungsformat ist so simpel, dass Sie es mit einem Oszilloskop und einem Papierblock dekodieren können.
Sie begegnen Modbus in zwei Hauptvarianten. Modbus RTU läuft über RS-485 (gelegentlich RS-232) mit 9600 bis 115200 Baud, mit einem kompakten Binärrahmen und einer CRC-16. Modbus TCP verpackt dieselbe Protokolldateneinheit in ein TCP-Paket auf Port 502, verzichtet auf die CRC (TCP übernimmt die Integrität) und fügt einen 7-Byte-MBAP-Header hinzu. Es gibt auch Modbus ASCII, dem Sie hoffentlich nie begegnen.
Die Funktionscodes, die Sie wirklich brauchen
Modbus definiert rund zwanzig Funktionscodes, aber vier davon decken etwa 95 Prozent der realen Integrationen ab:
- 0x03 Read Holding Registers — das Arbeitspferd. 16-Bit-Lese-/Schreibregister. Verwenden Sie dies für Sollwerte, Konfiguration und die meisten Analogwerte.
- 0x04 Read Input Registers — 16-Bit-Nur-Lese-Register. Häufig für Sensorwerte verwendet (Temperatur, Druck, Durchfluss).
- 0x06 Write Single Register — ein einzelnes 16-Bit-Register schreiben. Atomar, einfach, ideal für Sollwertänderungen.
- 0x10 Write Multiple Registers — einen zusammenhängenden Block schreiben. Nützlich für Mehrwortwerte (32-Bit-Floats, Zeitstempel), damit der Schreibvorgang aus Sicht der SPS atomar ist.
Gelegentlich sehen Sie auch 0x01 Read Coils und 0x05 Write Single Coil für boolesche E/A sowie 0x02 Read Discrete Inputs für nur lesbare Digitaleingänge. Meiden Sie die Diagnose-Funktionscodes (0x08, 0x11), sofern Sie keinen konkreten Grund haben; die Herstellerunterstützung ist uneinheitlich und sie zahlen sich nicht aus.
RS-485-Verkabelung: Wo Projekte sterben
Wenn Ihr Modbus-RTU-Bus unzuverlässig ist, liegt die Ursache fast nie am Protokoll. Es ist die physikalische Schicht. RS-485 ist ein differenzielles Adernpaar (A und B, manchmal mit D+ und D- gekennzeichnet), optional mit einer gemeinsamen Masse-Referenz, das bei 9600 Baud 1200 Meter überbrücken kann, wenn Sie drei Regeln beachten.
1. Die Topologie muss eine Reihenschaltung sein
Keine Sterne. Keine Stichleitungen länger als ein paar Zentimeter. Das Kabel tritt an einem Klemmenpaar in ein Gerät ein und am nächsten wieder aus. Jede Sterntopologie in Produktion ist ein zukünftiger Ausfall, der auf einen feuchten Morgen wartet.
2. Terminierung an beiden Enden
120-Ohm-Widerstände zwischen A und B an den beiden physikalischen Enden des Busses. Nicht in der Mitte. Nicht an jedem Gerät. Manche Transceiver und SPS haben einen DIP-Schalter oder Jumper zur Aktivierung der internen Terminierung — prüfen Sie, nehmen Sie es nicht an. Ohne Terminierung erhalten Sie Reflexionen, die wie zufällige CRC-Fehler aussehen.
3. Die Ruhelage vorspannen (Bias)
Wenn kein Transceiver den Bus treibt, floaten A und B. Rauschen wird als Startbits interpretiert. Ziehen Sie A über etwa 680 Ohm auf 5 V hoch und B über denselben Wert auf Masse herunter, einmal am Bus angewendet (typischerweise am Master). Moderne Transceiver wie der MAX13487 übernehmen die Failsafe-Vorspannung intern, aber die meisten Legacy-Installationen tun das nicht.
Verwenden Sie geschirmte, verdrillte Zweidrahtleitung, erden Sie den Schirm nur an einem Ende und halten Sie das Kabel von FU-Ausgängen und Schützen fern. Wir haben erlebt, wie eine 200-Meter-Leitung von 80 Prozent CRC-Fehlern auf null ging, indem sie 30 cm von einem Motorkabel weg verlegt wurde.
Adressierung: Der Fluch der Modbus-Integratoren
Hier wird jeder Integrator mindestens einmal gebissen. Die Modbus-Spezifikation verwendet auf der Leitung nullbasierte Adressierung. Viele SPS-Hersteller dokumentieren ihre Registerkarten mit einsbasierter Nummerierung, manchmal mit einem führenden Präfix, das den Registertyp angibt.
- Die dokumentierte Adresse
40001bedeutet Holding-Register, Adresse 0 auf der Leitung. - Die dokumentierte Adresse
40101bedeutet Holding-Register, Adresse 100 auf der Leitung. - Die dokumentierte Adresse
30005bedeutet Input-Register, Adresse 4 auf der Leitung.
Wenn Ihre Lesevorgänge Unsinn oder Off-by-One-Werte zurückgeben, sollte Ihre erste Hypothese einsbasiert versus nullbasiert lauten. Ihre zweite Hypothese sollte die Byte-Reihenfolge sein. Modbus überträgt jedes 16-Bit-Register big-endian, aber 32-Bit-Werte (Floats, Longs) erstrecken sich über zwei Register, und die Hersteller sind sich über die Wortreihenfolge uneinig. Sie können ABCD, CDAB, BADC oder DCBA sehen. Schneider neigt zu einer Reihenfolge, Siemens zu einer anderen, und der billige chinesische Wechselrichter, den Sie bei AliExpress gekauft haben, verwendet, was auch immer dem Ingenieur an jenem Morgen einfiel. Bestätigen Sie mit einem bekannten Wert — lassen Sie die SPS 1,0 als Float anzeigen und lesen Sie beide Wortreihenfolgen, um zu sehen, welche das IEEE-754-Bitmuster 0x3F800000 ergibt.
Vorzeichenbehaftet versus vorzeichenlos ist die dritte häufige Falle. Ein Temperaturwert von -5 sieht wie 65531 aus, wenn Sie das Register als vorzeichenlos dekodieren. Prüfen Sie stets die Herstellerdokumentation für den Datentyp pro Register und konfigurieren Sie Ihre Gateway-Karte entsprechend.
Gateway-Hardware: ESP32 vs. kommerziell
Für Retrofits mit geringer Kanalzahl und einem einzelnen Schaltschrank ist ein ESP32 mit einem isolierten RS-485-Transceiver bei Kosten und Flexibilität schwer zu schlagen. Eine typische Stückliste sieht so aus:
- ESP32-WROOM-32- oder ESP32-S3-Modul
- MAX3485 oder ADM2483 (galvanisch getrennter) RS-485-Transceiver
- 120-Ohm-Terminierungswiderstand mit DIP-Schalter
- Hutschienengehäuse mit 24-VDC-Eingang und isoliertem 3,3-V-Regler
- Optionaler Ethernet-PHY (LAN8720), falls WLAN in der Anlage inakzeptabel ist
Die Gesamtkosten für Teile liegen bei etwa 25 bis 40 EUR, die Firmware unterliegt vollständig Ihrer Kontrolle, und Sie können OTA-Updates über Azure-IoT-Hub-Device-Twins ausrollen. Wir bauen dieses Art von vernetztem Gerät regelmäßig als Fundament für größere Flotten.
Kommerzielle Gateways von Moxa, Advantech oder HMS Networks sind sinnvoll, wenn Sie Zertifizierungen (UL, ATEX), redundante Stromversorgung, gehärtete Temperaturbereiche benötigen oder wenn die Beschaffungsabteilung des Kunden schlichtweg keine Eigenentwicklung genehmigt. Sie kosten 400 bis 1500 EUR pro Knoten, und die Firmware ist eine Blackbox. Der Handel ist betrieblicher Komfort gegen Herstellerabhängigkeit.
Das Edge-Gateway-Muster: Modbus zu MQTT zu Azure
Die Architektur, die wir einsetzen, sieht so aus:
- Das Edge-Gateway pollt Modbus-Geräte nach einem Zeitplan (1 bis 60 Sekunden je nach Signal).
- Dekodierte Werte werden auf technische Einheiten normalisiert und mit einer stabilen Kennung versehen.
- Das Gateway veröffentlicht JSON über MQTT an den Azure IoT Hub mithilfe des Device-SDK.
- Der IoT Hub leitet Nachrichten an Event Hubs weiter, dann an Stream Analytics oder direkt in einen Zeitreihenspeicher.
- Ein Analyse-Dashboard visualisiert Trends und löst Alarme aus.
Dieses Muster ist das Rückgrat nahezu jeder Azure-IoT-Datenpipeline, die wir bauen. Mehr zur Hub-Bereitstellung lesen Sie in unserem Beitrag zu Azure IoT Hub für Gerätehersteller.
Funktionierender ESP32-Modbus-Client-Code
Nachfolgend ein abgespeckter, aber realistischer Sketch im Arduino-Framework mit der eModbus-Bibliothek. Er pollt vier Holding-Register von einem Slave mit Adresse 1, dekodiert sie und veröffentlicht JSON über MQTT.
#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <ModbusClientRTU.h>
#define RS485_RX 16
#define RS485_TX 17
#define RS485_DE 4
HardwareSerial RS485(2);
ModbusClientRTU MB(RS485_DE);
WiFiClient net;
PubSubClient mqtt(net);
uint32_t lastPoll = 0;
const uint8_t SLAVE_ID = 1;
const uint16_t START_REG = 0; // 40001 in vendor docs
const uint16_t COUNT = 4;
void onData(ModbusMessage response, uint32_t token) {
uint16_t regs[4];
for (uint8_t i = 0; i < COUNT; i++) {
response.get(3 + i * 2, regs[i]);
}
// Word swap for ABCD float (vendor specific)
union { uint32_t u; float f; } conv;
conv.u = ((uint32_t)regs[0] << 16) | regs[1];
float temperature = conv.f;
int16_t pressure = (int16_t)regs[2]; // signed
uint16_t status = regs[3];
char payload[160];
snprintf(payload, sizeof(payload),
"{"t":%.2f,"p":%d,"s":%u,"ts":%lu}",
temperature, pressure, status, millis());
mqtt.publish("devices/gw01/telemetry", payload);
}
void onError(Error err, uint32_t token) {
Serial.printf("Modbus error 0x%02X token %un", (int)err, token);
}
void setup() {
Serial.begin(115200);
RS485.begin(19200, SERIAL_8E1, RS485_RX, RS485_TX);
MB.onDataHandler(&onData);
MB.onErrorHandler(&onError);
MB.setTimeout(1000);
MB.begin(RS485);
WiFi.begin("plant-iot", "secret");
while (WiFi.status() != WL_CONNECTED) delay(200);
mqtt.setServer("hub.azure-devices.net", 8883);
mqtt.connect("gw01", "hub.azure-devices.net/gw01/?api-version=2021-04-12", "<SAS>");
}
void loop() {
mqtt.loop();
if (millis() - lastPoll > 5000) {
lastPoll = millis();
Error e = MB.addRequest(0x1234, SLAVE_ID, READ_HOLD_REGISTER, START_REG, COUNT);
if (e != SUCCESS) Serial.printf("Queue err 0x%02Xn", (int)e);
}
}
Dies ist bewusst minimal gehalten. Produktionsfirmware ergänzt TLS über die Azure-Root-CA, SAS-Token-Rotation, Device-Twin-Handling, exponentielles Backoff bei WLAN-Verlust und einen Watchdog. Aber die Polling-Schleife und die Dekodierlogik behalten im Wesentlichen diese Form.
Polling-Strategie und Ratenbegrenzungen
Modbus RTU ist halbduplex. Nur ein Gerät sendet gleichzeitig. Bei 19200 Baud dauert ein typisches Lesen von 10 Registern plus Umschaltung rund 30 ms. Mit 20 Slaves an einem Bus ist es realistisch, jedes Signal jede Sekunde zu pollen; alle 100 ms zu pollen ist es nicht. Gruppieren Sie Register pro Slave in zusammenhängende Blöcke, damit eine Anfrage viele Werte zurückgibt. Staffeln Sie die Slaves, damit Sie nicht einen Polling-Zyklus beenden und sofort den nächsten starten — lassen Sie Luft für Wiederholungen.
Für Systeme mit hoher Kanalzahl setzen Sie mehrere RS-485-Segmente hinter einem Gateway mit einer separaten UART pro Segment ein, oder verwenden Sie ein Modbus-TCP-Gateway, mit dem Sie über ein geswitchtes Netzwerk über Slaves hinweg parallelisieren können.
Fehlerbehandlung und Resilienz
Behandeln Sie jeden Modbus-Lesevorgang als etwas, das fehlschlagen wird. Bauen Sie Ihr Gateway um drei Regeln herum:
- Zwischenspeichern der letzten bekannten guten Werte mit einem Zeitstempel. Wenn ein Poll fehlschlägt, veröffentlichen Sie den zwischengespeicherten Wert mit einem Qualitätskennzeichen (gut, veraltet, schlecht), statt die Nachricht zu verwerfen.
- Puffern Sie Telemetrie lokal, wenn die Cloud-Verbindung abbricht. Eine 4-MB-Partition auf dem ESP32 fasst Stunden komprimierter Historie. Wiederholung bei erneuter Verbindung.
- Alarmieren Sie bei Fehlern auf Protokollebene, nicht nur bei fehlenden Werten. Ein Slave, der den Ausnahmecode 0x02 (unzulässige Datenadresse) zurückgibt, bedeutet, dass Ihre Karte falsch ist, nicht dass der Sensor tot ist.
Sicherheit: Modbus hat keine
Jeder Modbus-Master kann jedes Register jedes Slaves am Bus beschreiben. Es gibt keine Authentifizierung, keine Verschlüsselung, kein Konzept einer privilegierten Operation. Modbus TCP setzt dieselbe Situation über das gesamte IP-Netzwerk hinweg fort. Die einzige sichere Annahme ist, dass das Modbus-Segment standardmäßig feindlich ist und isoliert werden muss.
- Platzieren Sie das Gateway und die SPS in einem dedizierten VLAN ohne Internet-Route außer über das Gateway selbst.
- Das Gateway terminiert TLS zu Azure. Eingehender Verkehr aus der Cloud darf nur über signierte Device-Twin-Updates oder Direct Methods laufen, niemals als rohes TCP.
- Setzen Sie den Modbus-TCP-Port 502 niemals dem öffentlichen Internet aus. Ja, Shodan findet Tausende davon.
- Wenn Sie Schreibfähigkeit aus der Cloud benötigen, riegeln Sie sie hinter einer serverseitigen Regel-Engine ab, die den angeforderten Sollwert gegen sichere Bereiche validiert, bevor er überhaupt das Gateway erreicht.
Für tiefergehenden Kontext zur Protokollsicherheit über den gesamten Stack hinweg lesen Sie unseren Überblick über industrielle Protokolle und wo sie hingehören.
Praxisbeispiel: 30 Jahre alte SPS in einer Brownfield-Anlage
Betrachten Sie ein typisches Retrofit, das wir mehrfach durchgeführt haben: eine Metallverarbeitungslinie aus den frühen 1990er-Jahren. Sechs Allen-Bradley SLC 500 SPS steuern die Linie, jede mit einer bei einem früheren Upgrade nachgerüsteten Modbus-RTU-Adapterkarte. Der Kunde will OEE-Transparenz, Ursachenanalyse von Ausfallzeiten und ein Wartungs-Dashboard. Ein Austausch der SPS würde über 400.000 EUR kosten und sechs Wochen Ausfallzeit erfordern. Keines von beidem ist akzeptabel.
Das Retrofit sah so aus:
- Zwei ESP32-S3-Gateways in Hutschienengehäusen, eines pro Elektroraum, jedes verwaltet drei SPS an einem in Reihe geschalteten RS-485-Bus.
- Register-Karten der Hersteller wurden gegen die vorhandene HMI reverse-engineert; 87 Signale über die Linie hinweg getaggt (Motorströme, Hydraulikdrücke, Zykluszähler, Störungsbits).
- Polling mit 2 s für hochprioritäre Signale, 30 s für langsam veränderliche.
- MQTT an den Azure IoT Hub, weitergeleitet an Time Series Insights und Power BI.
- Individuelles React-Dashboard für das Wartungsteam, über Webhook in das vorhandene CMMS integriert.
Gesamtprojekt: neun Wochen, Hardwarekosten unter 5.000 EUR, keine SPS-Firmware-Änderungen, keine Produktionsausfallzeit während der Inbetriebnahme. Innerhalb von drei Monaten hatte sich das Dashboard amortisiert, indem es 14 Stunden ungeklärter Ausfallzeit pro Monat einem einzigen intermittierenden Hydraulikventil zuordnete, das in den vorangegangenen zwei Jahren für drei verschiedene Dinge verantwortlich gemacht worden war.
Wann man über Modbus hinausgehen sollte
Modbus ist ein guter Transport für periodische numerische Daten. Es kämpft mit ereignisgesteuerten Signalen, großen Payloads und jeder Art strukturierter Metadaten. Wenn Ihr Retrofit Anforderungen wie Vibrationsspektren, Bilddaten oder irgendetwas im Subsekundenbereich umfasst, planen Sie OPC UA oder ein paralleles Sensornetzwerk ein, das am Gateway überbrückt wird. Wir betreiben Modbus oft parallel zu individuellen IoT-Sensorknoten am selben Edge-Gateway, wobei das Gateway beide zu einem einzigen cloudseitigen Schema harmonisiert.
Bringen Sie Ihre Brownfield-Anlage online
Ein Modbus-Retrofit ist der risikoärmste, schnellste Weg mit der kürzesten Amortisation von einer Legacy-Anlage zu einer modernen Datenplattform. Gut gemacht, amortisiert es sich innerhalb eines Jahres und erschließt ein Jahrzehnt an Analytik auf Anlagen, die Sie bereits besitzen. Schlecht gemacht, produziert es eine Wand aus CRC-Fehlern und ein Dashboard, dem niemand traut. Der Unterschied ist die Tiefe der Ingenieursarbeit — in der Verkabelung, der Registerkarte, der Polling-Disziplin und dem cloudseitigen Schema.
FSS entwirft und implementiert Industrie-IoT-Retrofits durchgängig, von der RS-485-Kabelauswahl über Azure-Dashboards bis zu Integrationen von Drittsystemen. Wenn Sie einen Schaltschrank voller SPS und einen Rückstau unbeantworteter Fragen darüber haben, was sie tun, sprechen Sie mit unserem Team für vernetzte Geräte und lassen Sie uns ein Pilotprojekt für eine Linie scopen.