WAGO Compact Controller 100 (751-9301) und ein MESHLE Gateway, über Ethernet für die Modbus-TCP-Steuerung verbunden

MESHLE Bluetooth Mesh Geräte über Modbus TCP von einer WAGO SPS steuern (CODESYS-Anleitung)

·MESHLE

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-OffsetAdresseNameBeschreibung
10266STATUS_FLAGSbit0 = Power aktuell, bit2 = Gerät online
23279OUT32_CH1Kanal 1 aktuell, 0..1000 (×10 Prozent)
24280OUT32_CH2Kanal 2 aktuell, 0..1000 (×10 Prozent)
25281OUT32_CH3Kanal 3 aktuell, 0..1000 (×10 Prozent)
26282OUT32_CH4Kanal 4 aktuell, 0..1000 (×10 Prozent)

Kommandoregister (schreiben, FC16, ab Offset 286)

Kommandobasis: 256 + 30 = 286

Register-OffsetAdresseNameBeschreibung
0286CMD_FLAGSbit0 = Power ein/aus
7293CMD_OUT32_CH1Kanal 1 Sollwert, 0..1000 (×10 Prozent)
8294CMD_OUT32_CH2Kanal 2 Sollwert, 0..1000 (×10 Prozent)
9295CMD_OUT32_CH3Kanal 3 Sollwert, 0..1000 (×10 Prozent)
10296CMD_OUT32_CH4Kanal 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

  1. Öffnen Sie CODESYS und gehen Sie zu File > New Project
  2. Wählen Sie Standard Project und klicken Sie OK
  3. Suchen Sie bei der Geräteauswahl nach 751-9301 und wählen Sie WAGO Compact Controller 100
  4. Stellen Sie die Programmiersprache auf Structured Text (ST)
  5. Klicken Sie OK und speichern Sie das Projekt mit Ctrl+S
CODESYS Standard-Project-Dialog mit ausgewählter WAGO CC100 (751-9301)

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

CODESYS Gerätebaum direkt nach dem Anlegen des Projekts

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.

  1. Klicken Sie mit der rechten Maustaste auf den obersten Geräteknoten (Device (751-9301 WAGO Compact Controller 100))
  2. Wählen Sie Properties
  3. Ändern Sie den Namen in CC100
  4. Klicken Sie OK
CODESYS Gerätebaum nach dem Umbenennen des Geräts in CC100

1.3 Ethernet-Adapter hinzufügen

Der Modbus TCP Client muss unter einem Ethernet-Adapter-Knoten liegen. Dieser repräsentiert die Netzwerkschnittstelle der CC100.

  1. Klicken Sie im Gerätebaum mit der rechten Maustaste auf CC100
  2. Wählen Sie Add Device...
  3. Erweitern Sie Ethernet Adapter
  4. Wählen Sie Ethernet
  5. Klicken Sie auf Add Device und schließen Sie den Dialog
CODESYS Gerätebaum mit unter CC100 hinzugefügtem Ethernet-Adapter

1.4 Modbus TCP Client hinzufügen

  1. Klicken Sie im Gerätebaum mit der rechten Maustaste auf Ethernet (Ethernet)
  2. Wählen Sie Add Device...
  3. Erweitern Sie Fieldbuses > Modbus
  4. Erweitern Sie Modbus TCP Client
  5. Wählen Sie Modbus TCP Client (CODESYS, Version 4.5.0.0)
  6. Klicken Sie auf Add Device und schließen Sie den Dialog
Add-Device-Dialog mit dem Pfad Fieldbuses > Modbus > Modbus TCP ClientCODESYS Gerätebaum mit unter Ethernet hinzugefügtem Modbus TCP Client
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

  1. Klicken Sie im Gerätebaum mit der rechten Maustaste auf Modbus_TCP_Client
  2. Wählen Sie Add Device...
  3. Erweitern Sie Fieldbuses > Modbus > Modbus TCP Server
  4. Wählen Sie Modbus TCP Server (CODESYS, Version 4.5.0.0)
  5. Klicken Sie auf Add Device und schließen Sie den Dialog
Add-Device-Dialog mit dem Modbus TCP Server

Der Gerätebaum zeigt nun die vollständige Struktur:

CC100
└── Ethernet (Ethernet)
    └── Modbus_TCP_Client (Modbus TCP Client)
        └── Modbus_TCP_Server (Modbus TCP Server)
CODESYS Gerätebaum mit der vollständigen Modbus-Struktur

Teil 2: Modbus TCP Server konfigurieren

2.1 Gateway-IP und Port einstellen

  1. Doppelklicken Sie im Gerätebaum auf Modbus_TCP_Server
  2. Der Tab General öffnet sich
  3. Setzen Sie Server IP address auf die IP-Adresse Ihres MESHLE Gateways
  4. Setzen Sie Response timeout (ms) auf 5000
  5. Setzen Sie Port auf 502
Tab General mit der Gateway-IP-Adresse und Port 502

2.2 Lesekanal konfigurieren

  1. Klicken Sie auf den Tab Modbus Server Channel
  2. Klicken Sie auf Add Channel
  3. 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
  4. Klicken Sie OK
Modbus-Channel-Dialog mit der ReadStatus-Konfiguration

2.3 Schreibkanal konfigurieren

  1. Klicken Sie im Tab Modbus Server Channel erneut auf Add Channel
  2. 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
  3. Klicken Sie OK

Beide Kanäle sollten nun in der Kanalliste erscheinen:

Tab Modbus Server Channel mit den Kanälen ReadStatus und WriteCommands

2.4 Globale Variablen im I/O-Mapping zuweisen

  1. Klicken Sie auf den Tab ModbusTCPServer I/O Mapping
  2. Sie sehen die beiden Kanal-Arrays mit leeren Variable-Spalten
  3. Klicken Sie in der obersten ReadStatus-Zeile in die leere Zelle Variable
  4. Geben Sie ReadStatus ein und drücken Sie Enter
  5. Verfahren Sie für die oberste WriteCommands-Zeile genauso — geben Sie WriteCommands ein und drücken Sie Enter
  6. 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.

Tab I/O Mapping mit den Array-Registern von ReadStatusTab I/O Mapping mit den Array-Registern von WriteCommands
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.

  1. Klicken Sie auf den Tab ModbusTCPServer Parameters
  2. Suchen Sie Unit-ID
  3. Setzen Sie sie auf die Unit-Adresse Ihres Geräts — in diesem Beispiel 1
  4. Setzen Sie außerdem ResponseTimeout auf 5000
Tab ModbusTCPServer Parameters mit auf 1 gesetzter Unit-ID
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.

  1. Doppelklicken Sie im Gerätebaum auf Ethernet (Ethernet)
  2. Klicken Sie neben dem Feld Network interface auf Browse...
  3. Wählen Sie br0 — das ist die gebrückte Netzwerkschnittstelle der CC100
  4. 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_VAR

Rumpf

(* --- 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);
PLC_PRG mit der fertigen Deklaration und dem Rumpf-Code

Die Array-Indizes bilden direkt die Register-Offsets innerhalb des konfigurierten Kanals ab:

  • ReadStatus[23] = Register-Offset 23 im Geräteblock = OUT32_CH1 aktuell
  • WriteCommands[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:

  1. Doppelklicken Sie auf Library Manager
  2. Klicken Sie in der Symbolleiste auf Download Missing Libraries
  3. Zwei Bibliotheken werden als fehlend gelistet:
    • Redundancy Implementation 3.5.21.0
    • CAA Device Diagnosis 3.5.21.0
  4. Stellen Sie sicher, dass beide angehakt sind, und klicken Sie Download
  5. Bauen Sie erneut mit F11 — die Fehler sollten verschwinden

5.2 Online gehen

  1. Prüfen Sie, dass der physische RUN/STOP Schalter der CC100 in der Position RUN steht
  2. Gehen Sie zu Online > Login
  3. Wenn ein Hinweis auf keinen aktiven Pfad erscheint, klicken Sie Yes, um das Netzwerk zu durchsuchen
  4. Wählen Sie CC100 aus den Scan-Ergebnissen und klicken Sie OK
  5. Erscheint eine Warnung zur Geräteversionsabweichung, klicken Sie OK, um fortzufahren
  6. Bei der Aufforderung zum Download aktivieren Sie Update boot application und klicken Sie Yes
  7. Drücken Sie F5, um die Anwendung zu starten
CC100 Verbindungsansicht mit aktivem Gerät in CODESYS

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.

PLC_PRG Watch-Bereich mit Live-Kanalwerten und bOnline = TRUE

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

  1. Klicken Sie im Watch-Bereich in die Spalte Prepared Value neben rCh1_Setpoint
  2. Geben Sie den gewünschten Wert ein (0..100 als Prozent)
  3. Verfahren Sie für weitere Sollwerte und bPower_Cmd genauso
  4. Klicken Sie in der Debug-Symbolleiste auf Write Values (oder drücken Sie Ctrl+F7)
  5. Die Werte werden mit 10 skaliert, in WriteCommands geschrieben und per FC16 an das Gerät gesendet
Watch-Bereich mit vor dem Schreiben gesetzten Prepared ValuesWatch-Bereich nach dem Schreiben: die Ist-Werte entsprechen den Sollwerten
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.

ModbusTCPServer Parameters mit korrekter Unit-ID = 1 und stabilem Verbindungs-Log

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

BACnet™ ist eine Marke der ASHRAE.