
MESHLE Bluetooth Mesh Geräte über Modbus TCP von einer WAGO SPS steuern (CODESYS-Anleitung)
MESHLE Geräte sind drahtlos über MESHLE Bluetooth Mesh verbunden — ein proprietäres, offline-fähiges Mesh, das Ihre Beleuchtung, Sensoren und Aktoren ohne Cloud betreibt. Das MESHLE Gateway bindet dieses drahtlose Netzwerk an die übrige Gebäudeinfrastruktur an und stellt das Mesh über offene Schnittstellen bereit — REST, MQTT, Modbus TCP/IP und BACnet™ — sodass jedes bestehende kabelgebundene Steuerungssystem es lesen und steuern kann.
Diese Anleitung führt die Modbus-Brücke vollständig durch. Sie konfigurieren eine WAGO CC100 SPS als Modbus-TCP-Client, der drahtlos verbundene MESHLE Geräte über die Holding-Register des Gateways liest und beschreibt, und stellen diese Werte anschließend als IEC-Variablen in einem CODESYS 3.5 Projekt bereit. Modbus TCP wird vollständig im Gerätebaum von CODESYS konfiguriert — keine zusätzlichen Werkzeuge nötig.
Sie richtet sich an Gebäudeautomations- und GLT-Integratoren sowie an OEM-Ingenieure, die drahtlose MESHLE Beleuchtung unter SPS-Steuerung benötigen. Das durchgearbeitete Beispiel verwendet einen Mehrkanal-Dimmer (Out32) mit Unit-Adresse 1, der 4 Ausgangskanäle und einen Power-Status über Modbus-TCP-Holding-Register bereitstellt — dasselbe Muster bindet jedoch jeden MESHLE Gerätetyp im Mesh in Ihr kabelgebundenes Steuerungssystem ein.
Überblick
Diese Anleitung dokumentiert den vollständigen Prozess, ein drahtlos verbundenes MESHLE Bluetooth Mesh Netzwerk an ein kabelgebundenes Steuerungssystem anzubinden: Sie richten eine WAGO CC100 als Modbus-TCP-Client ein, der von MESHLE Gateway-Geräten liest und auf sie schreibt, und stellen diese Werte als IEC-Variablen in einem CODESYS 3.5 Projekt bereit.
Das durchgehend verwendete Beispielgerät ist die WAGO CC100 (751-9301). Jede andere WAGO Steuerung, die CODESYS 3.5 unterstützt, folgt demselben Prozess — lediglich der Schritt zur Geräteauswahl beim Anlegen des CODESYS Projekts unterscheidet sich.
Die CC100 agiert als Modbus-TCP-Client, das MESHLE Gateway als Server. Der Modbus-TCP-Gerätetreiber von CODESYS übernimmt das gesamte Polling automatisch, sobald die Kanäle konfiguriert sind. Ihr SPS-Programm liest und schreibt dann einfach die zugeordneten Array-Variablen.
Voraussetzungen
Stellen Sie die folgende Hardware und Software bereit, bevor Sie beginnen.
Hardware
- WAGO CC100 (751-9301) mit Firmware 6.4.6.x oder neuer (das hier verwendete Beispielgerät — jede kompatible WAGO Steuerung, die CODESYS 3.5 unterstützt, funktioniert)
- MESHLE Gateway mit aktiviertem Modbus TCP Server auf Port 502
- PC im selben Netzwerk wie die CC100 und das MESHLE Gateway
Software
- CODESYS 3.5 SP22 Patch 1 oder neuer
- WAGO Devices and Libraries Paket 2.0.9.2 oder neuer (installiert über den CODESYS Installer)
Anforderungen an das MESHLE Gateway
- Modbus TCP Server läuft auf Port 502
- Unit-Adresse des Zielgeräts ist 1
- Registerbelegung Version 1 (fixe Gerätebank ab Register 256, Geräte-Stride 50)
Referenz der Registerbelegung (Out32-Gerät, Unit-Adresse 1)
Das MESHLE Gateway verwendet eine fixe Registerbelegung. Die Bank eines Geräts beginnt bei 256 + (Unit-Adresse − 1) × 50. Für Unit-Adresse 1 ist die Gerätebasis somit Register 256.
Statusregister (lesen, FC03, ab Offset 256)
| Register-Offset | Adresse | Name | Beschreibung |
|---|---|---|---|
| 10 | 266 | STATUS_FLAGS | bit0 = Power aktuell, bit2 = Gerät online |
| 23 | 279 | OUT32_CH1 | Kanal 1 aktuell, 0..1000 (×10 Prozent) |
| 24 | 280 | OUT32_CH2 | Kanal 2 aktuell, 0..1000 (×10 Prozent) |
| 25 | 281 | OUT32_CH3 | Kanal 3 aktuell, 0..1000 (×10 Prozent) |
| 26 | 282 | OUT32_CH4 | Kanal 4 aktuell, 0..1000 (×10 Prozent) |
Kommandoregister (schreiben, FC16, ab Offset 286)
Kommandobasis: 256 + 30 = 286
| Register-Offset | Adresse | Name | Beschreibung |
|---|---|---|---|
| 0 | 286 | CMD_FLAGS | bit0 = Power ein/aus |
| 7 | 293 | CMD_OUT32_CH1 | Kanal 1 Sollwert, 0..1000 (×10 Prozent) |
| 8 | 294 | CMD_OUT32_CH2 | Kanal 2 Sollwert, 0..1000 (×10 Prozent) |
| 9 | 295 | CMD_OUT32_CH3 | Kanal 3 Sollwert, 0..1000 (×10 Prozent) |
| 10 | 296 | CMD_OUT32_CH4 | Kanal 4 Sollwert, 0..1000 (×10 Prozent) |
Wichtig: Alle Registerwerte verwenden eine ×10-Skalierung. Eine Helligkeit von 75 % wird als Registerwert 750 gespeichert. Teilen Sie Lesewerte stets durch 10 und multiplizieren Sie Schreibwerte in Ihrem SPS-Programm mit 10.
Teil 1: CODESYS Projekt einrichten
1.1 Neues Projekt anlegen
- Öffnen Sie CODESYS und gehen Sie zu File > New Project
- Wählen Sie Standard Project und klicken Sie OK
- Suchen Sie bei der Geräteauswahl nach 751-9301 und wählen Sie WAGO Compact Controller 100
- Stellen Sie die Programmiersprache auf Structured Text (ST)
- Klicken Sie OK und speichern Sie das Projekt mit Ctrl+S

Das Projekt öffnet sich mit dem Standard-Gerätebaum. Beachten Sie, dass das Gerät in diesem Schritt noch Device heißt.

1.2 Gerät umbenennen
Das Gerät muss im Gerätebaum CC100 heißen — für Konsistenz und um Probleme mit bestimmten WAGO Bibliotheken zu vermeiden.
- Klicken Sie mit der rechten Maustaste auf den obersten Geräteknoten (Device (751-9301 WAGO Compact Controller 100))
- Wählen Sie Properties
- Ändern Sie den Namen in CC100
- Klicken Sie OK

1.3 Ethernet-Adapter hinzufügen
Der Modbus TCP Client muss unter einem Ethernet-Adapter-Knoten liegen. Dieser repräsentiert die Netzwerkschnittstelle der CC100.
- Klicken Sie im Gerätebaum mit der rechten Maustaste auf CC100
- Wählen Sie Add Device...
- Erweitern Sie Ethernet Adapter
- Wählen Sie Ethernet
- Klicken Sie auf Add Device und schließen Sie den Dialog

1.4 Modbus TCP Client hinzufügen
- Klicken Sie im Gerätebaum mit der rechten Maustaste auf Ethernet (Ethernet)
- Wählen Sie Add Device...
- Erweitern Sie Fieldbuses > Modbus
- Erweitern Sie Modbus TCP Client
- Wählen Sie Modbus TCP Client (CODESYS, Version 4.5.0.0)
- Klicken Sie auf Add Device und schließen Sie den Dialog


Hinweis: CODESYS nennt diese Geräte Modbus TCP Client und Modbus TCP Server — nicht Master/Slave, wie es ältere Dokumentationen tun. Der Client ist die CC100 (der Modbus-Master). Der Server steht für das abgefragte entfernte Gerät (das MESHLE Gateway).
1.5 Modbus TCP Server hinzufügen
- Klicken Sie im Gerätebaum mit der rechten Maustaste auf Modbus_TCP_Client
- Wählen Sie Add Device...
- Erweitern Sie Fieldbuses > Modbus > Modbus TCP Server
- Wählen Sie Modbus TCP Server (CODESYS, Version 4.5.0.0)
- Klicken Sie auf Add Device und schließen Sie den Dialog

Der Gerätebaum zeigt nun die vollständige Struktur:
CC100
└── Ethernet (Ethernet)
└── Modbus_TCP_Client (Modbus TCP Client)
└── Modbus_TCP_Server (Modbus TCP Server)
Teil 2: Modbus TCP Server konfigurieren
2.1 Gateway-IP und Port einstellen
- Doppelklicken Sie im Gerätebaum auf Modbus_TCP_Server
- Der Tab General öffnet sich
- Setzen Sie Server IP address auf die IP-Adresse Ihres MESHLE Gateways
- Setzen Sie Response timeout (ms) auf 5000
- Setzen Sie Port auf 502

2.2 Lesekanal konfigurieren
- Klicken Sie auf den Tab Modbus Server Channel
- Klicken Sie auf Add Channel
- Konfigurieren Sie den Kanal wie folgt:
- Name: ReadStatus
- Access type: Read Holding Registers (Function Code 3)
- Trigger: Cyclic
- Cycle time (ms): 100
- READ Register Offset: 256
- Length: 27
- Error handling: Keep last value
- Klicken Sie OK

2.3 Schreibkanal konfigurieren
- Klicken Sie im Tab Modbus Server Channel erneut auf Add Channel
- Konfigurieren Sie den Kanal wie folgt:
- Name: WriteCommands
- Access type: Write Multiple Registers (Function Code 16)
- Trigger: Cyclic
- Cycle time (ms): 500
- WRITE Register Offset: 286
- Length: 11
- Klicken Sie OK
Beide Kanäle sollten nun in der Kanalliste erscheinen:

2.4 Globale Variablen im I/O-Mapping zuweisen
- Klicken Sie auf den Tab ModbusTCPServer I/O Mapping
- Sie sehen die beiden Kanal-Arrays mit leeren Variable-Spalten
- Klicken Sie in der obersten ReadStatus-Zeile in die leere Zelle Variable
- Geben Sie ReadStatus ein und drücken Sie Enter
- Verfahren Sie für die oberste WriteCommands-Zeile genauso — geben Sie WriteCommands ein und drücken Sie Enter
- Speichern Sie mit Ctrl+S
In der Spalte Mapping erscheint ein Mapping-Indikator, der bestätigt, dass CODESYS die an die Kanal-Arrays gebundenen globalen Variablen angelegt hat.


Hinweis: Ein einfacher Name ohne Punkt-Präfix in der Variable-Spalte legt automatisch eine implizite globale Variable an. Diese Variablen sind dann direkt in PLC_PRG ohne Namespace-Präfix zugänglich.
2.5 Unit-ID setzen
Dies ist ein kritischer Schritt. Die Unit-ID muss mit der Modbus-Unit-Adresse des Zielgeräts auf dem MESHLE Gateway übereinstimmen. Eine Abweichung führt dazu, dass das Gateway alle Anfragen ablehnt — mit wiederholten Connect/Disconnect-Zyklen, die schließlich das Verbindungslimit des Gateways erschöpfen.
- Klicken Sie auf den Tab ModbusTCPServer Parameters
- Suchen Sie Unit-ID
- Setzen Sie sie auf die Unit-Adresse Ihres Geräts — in diesem Beispiel 1
- Setzen Sie außerdem ResponseTimeout auf 5000

Wichtig: Die Standard-Unit-ID ist 255. Wenn Sie sie auf dem Standardwert belassen, während Ihr Gerät eine andere Unit-Adresse hat, lehnt das Gateway alle Anfragen ab. Das Symptom ist eine wiederholte Schleife aus „Connected“ und „Connection aborted: socket keep-alive expired“ im Modbus-TCP-Client-Log, mit stetig steigendem Fehlerzähler. Setzen Sie die Unit-ID immer passend zu Ihrem Zielgerät.
Teil 3: Ethernet-Schnittstelle einstellen
Der Ethernet-Adapter muss an die korrekte physische Netzwerkschnittstelle der CC100 gebunden sein.
- Doppelklicken Sie im Gerätebaum auf Ethernet (Ethernet)
- Klicken Sie neben dem Feld Network interface auf Browse...
- Wählen Sie br0 — das ist die gebrückte Netzwerkschnittstelle der CC100
- Aktivieren Sie NICHT Adjust operating system settings — dies würde die Netzwerkkonfiguration der CC100 überschreiben
Hinweis: Die angezeigte Standard-Schnittstelle kann eine 192.168.x.x-Adresse sein. Prüfen Sie immer, dass die Schnittstelle br0 im richtigen Subnetz ist, bevor Sie online gehen.
Teil 4: SPS-Programm
Öffnen Sie PLC_PRG. Der Editor hat zwei Bereiche: den Deklarationsbereich oben und den Rumpf unten.
Deklaration
PROGRAM PLC_PRG
VAR
(* Actual values read from device - scaled 0..100 % *)
rCh1_Actual : REAL;
rCh2_Actual : REAL;
rCh3_Actual : REAL;
rCh4_Actual : REAL;
bPower_Actual : BOOL;
bOnline : BOOL;
(* Commands to send to device *)
bPower_Cmd : BOOL;
rCh1_Setpoint : REAL;
rCh2_Setpoint : REAL;
rCh3_Setpoint : REAL;
rCh4_Setpoint : REAL;
END_VARRumpf
(* --- Read actual state from device --- *)
(* Registers return 0..1000, divide by 10 to get 0..100 % *)
rCh1_Actual := WORD_TO_REAL(ReadStatus[23]) / 10.0;
rCh2_Actual := WORD_TO_REAL(ReadStatus[24]) / 10.0;
rCh3_Actual := WORD_TO_REAL(ReadStatus[25]) / 10.0;
rCh4_Actual := WORD_TO_REAL(ReadStatus[26]) / 10.0;
bPower_Actual := ReadStatus[10].0; (* bit 0 = power on/off *)
bOnline := ReadStatus[10].2; (* bit 2 = device reachable *)
(* --- Send commands to device --- *)
(* Power: sent as a dedicated power command, independent of channels *)
WriteCommands[0] := BOOL_TO_WORD(bPower_Cmd);
(* Channels: sent independently, multiply by 10 to get 0..1000 register scale *)
WriteCommands[7] := REAL_TO_WORD(rCh1_Setpoint * 10.0);
WriteCommands[8] := REAL_TO_WORD(rCh2_Setpoint * 10.0);
WriteCommands[9] := REAL_TO_WORD(rCh3_Setpoint * 10.0);
WriteCommands[10] := REAL_TO_WORD(rCh4_Setpoint * 10.0);
Die Array-Indizes bilden direkt die Register-Offsets innerhalb des konfigurierten Kanals ab:
ReadStatus[23]= Register-Offset 23 im Geräteblock = OUT32_CH1 aktuellWriteCommands[7]= Register-Offset 7 im Kommandobereich = CMD_OUT32_CH1
Teil 5: Verbinden und herunterladen
5.1 Build-Fehler beheben
Beim ersten Build können 41 Fehler mit Bezug auf DED.DEVICE_STATE erscheinen. Sie stammen vom Knoten Compact_Controller_100_Onboard_IO und werden durch zwei fehlende System-Bibliotheken verursacht. Mit Ihrem Modbus-Code haben sie nichts zu tun.
So beheben Sie das:
- Doppelklicken Sie auf Library Manager
- Klicken Sie in der Symbolleiste auf Download Missing Libraries
- Zwei Bibliotheken werden als fehlend gelistet:
- Redundancy Implementation 3.5.21.0
- CAA Device Diagnosis 3.5.21.0
- Stellen Sie sicher, dass beide angehakt sind, und klicken Sie Download
- Bauen Sie erneut mit F11 — die Fehler sollten verschwinden
5.2 Online gehen
- Prüfen Sie, dass der physische RUN/STOP Schalter der CC100 in der Position RUN steht
- Gehen Sie zu Online > Login
- Wenn ein Hinweis auf keinen aktiven Pfad erscheint, klicken Sie Yes, um das Netzwerk zu durchsuchen
- Wählen Sie CC100 aus den Scan-Ergebnissen und klicken Sie OK
- Erscheint eine Warnung zur Geräteversionsabweichung, klicken Sie OK, um fortzufahren
- Bei der Aufforderung zum Download aktivieren Sie Update boot application und klicken Sie Yes
- Drücken Sie F5, um die Anwendung zu starten

Teil 6: Werte lesen und schreiben
Werte lesen
Sobald Sie online und im Betrieb sind, zeigt der Watch-Bereich von PLC_PRG die Live-Werte. Die Variablen rCh1_Actual bis rCh4_Actual werden über den Kanal ReadStatus automatisch von den MESHLE Gerätekanälen aktualisiert. bOnline bestätigt, dass das Gerät erreichbar ist.

Werte schreiben
Um einen Wert von CODESYS auf das MESHLE Gerät zu schreiben, aktualisieren Sie die Sollwert-Variablen und schreiben Sie sie über das Debug-Fenster.
So schreiben Sie im Debug-Fenster
- Klicken Sie im Watch-Bereich in die Spalte Prepared Value neben rCh1_Setpoint
- Geben Sie den gewünschten Wert ein (0..100 als Prozent)
- Verfahren Sie für weitere Sollwerte und bPower_Cmd genauso
- Klicken Sie in der Debug-Symbolleiste auf Write Values (oder drücken Sie Ctrl+F7)
- Die Werte werden mit 10 skaliert, in WriteCommands geschrieben und per FC16 an das Gerät gesendet


Hinweis: Die Sollwert-Variablen starten bei 0 und werden erst wirksam, wenn sie über das Debug-Fenster oder programmatisch geschrieben werden. Die Ist-Werte spiegeln den aktuellen Gerätezustand wider und aktualisieren sich unabhängig davon.
Bekannte Probleme und Fehlersuche
Wiederholte Connect/Disconnect-Schleife
Symptom: Das Modbus-TCP-Client-Log zeigt einen wiederholten Zyklus aus „Connected“ und unmittelbar darauf „Connection aborted: socket keep-alive expired“. Der Fehlerzähler steigt schnell. Auch andere Modbus-Clients im Netzwerk können blockiert werden.
Ursache: Die Unit-ID am Modbus TCP Server stimmt nicht mit der Unit-Adresse des Zielgeräts auf dem MESHLE Gateway überein. Das Gateway lehnt alle Anfragen ab und der CODESYS-Treiber verbindet sich wiederholt neu, ohne das vorherige Socket ordentlich zu schließen. Das Gateway unterstützt maximal 3 gleichzeitige Verbindungen, sodass die Slots schnell belegt sind.
Lösung: Gehen Sie zum Tab ModbusTCPServer Parameters und setzen Sie Unit-ID auf die Unit-Adresse Ihres Zielgeräts. Stoppen Sie die Anwendung (Online > Stop), melden Sie sich ab (Online > Logout), warten Sie 30 bis 60 Sekunden, bis das Gateway veraltete Verbindungen freigegeben hat, und melden Sie sich dann wieder an.

Build-Fehler: DED.DEVICE_STATE nicht definiert
Ursache: Die Bibliothek CAA Device Diagnosis fehlt in der CODESYS-Installation. Sie wird vom Onboard-IO-Geräteknoten der CC100 benötigt.
Lösung: Klicken Sie im Library Manager auf Download Missing Libraries. Installieren Sie sowohl Redundancy Implementation als auch CAA Device Diagnosis, wenn Sie dazu aufgefordert werden.
Werte stehen nach dem Online-Gehen auf 0
Ursache: Entweder ist der Ethernet-Adapter an die falsche Netzwerkschnittstelle gebunden, oder die Unit-ID stimmt nicht mit dem Zielgerät überein.
Lösung: Prüfen Sie, dass der Ethernet-Adapter auf br0 im richtigen Subnetz gesetzt ist. Verifizieren Sie die Unit-ID in ModbusTCPServer Parameters. Prüfen Sie das Modbus-TCP-Client-Log auf Verbindungsfehler.
Kein separater Download-Schritt erforderlich
Modbus TCP benötigt nur einen einzigen Download-Vorgang — Online > Login in CODESYS. Die gesamte Modbus-Konfiguration ist im CODESYS-Projekt eingebettet und wird mit ihm heruntergeladen.
Über Modbus hinaus — jedes Gerät, jedes Protokoll
Das Lese-/Schreib-Muster, das Sie hier für einen Mehrkanal-Dimmer aufgebaut haben, gilt für jedes Gerät in Ihrem MESHLE Bluetooth Mesh Netzwerk. Sensoren stellen Register bereit, die Sie nur lesen; Aktoren wie Einkanal-Dimmer, HCL und HSV stellen Register bereit, die Sie lesen und schreiben — derselbe Kanal-Workflow, nur mit anderer Registeranzahl. Sobald das MESHLE Gateway im Netzwerk ist, ist Ihr gesamtes drahtlos verbundenes Mesh von jedem kabelgebundenen Steuerungssystem aus als standardmäßiger Modbus-TCP-Server adressierbar.
Modbus TCP ist einer von vier offenen Wegen aus dem Gateway. Wenn Ihr System nicht auf Modbus basiert, sind dieselben MESHLE Geräte über REST API, MQTT und BACnet™ erreichbar. Sie planen eine GLT- oder SPS-Integration rund um MESHLE Beleuchtung? Sprechen Sie mit uns über Ihr Projekt — wir begleiten Integratoren und OEMs durch den gesamten Design-in.
Weiterlesen
- Dieselbe WAGO SPS über BACnet™ statt Modbus mit MESHLE verbinden
- MESHLE Gateway: ein Mesh, offene APIs (REST, MQTT, Modbus, BACnet™)
- Wie MESHLE LED-Treiber in ein Smart-Lighting-Ökosystem passen
- MESHLE Geräte über lokales MQTT mit Node-RED verbinden
- Warum MESHLE Smart Lighting offline-first funktioniert
- MESHLE für eine GLT- oder SPS-Integration kontaktieren
BACnet™ ist eine Marke der ASHRAE.