1-Wire zu Modbus TCP
Szenario
Ein IOZER basic liest drei 1-Wire-Temperatursensoren und schreibt die Messwerte über Modbus TCP in den Merkerbereich eines Beckhoff BC9020. Die SPS verarbeitet die empfangenen Werte anschließend als Temperaturen in Grad Celsius.
| Komponente | Aufgabe |
|---|---|
| IOZER basic | 1-Wire-Sensoren auslesen und als Modbus-TCP-Master (Client) die Temperaturen schreiben |
| Beckhoff BC9020 | Als Modbus-TCP-Slave (Server) die Register bereitstellen und die Temperaturen im SPS-Programm verwenden |
Auf dem IOZER genügt die Datenpunktkonfiguration mit aktivierter Weiterleitung. Ein Blockly- oder JavaScript-Programm ist für diese Übertragung nicht erforderlich. Der unten gezeigte Structured-Text-Code läuft auf dem BC9020.
Ziel
Nach Abschluss der Konfiguration:
- liest der IOZER alle fünf Sekunden drei Temperaturwerte,
- überträgt er jede Temperatur als vorzeichenbehafteten 16-Bit-Wert in Zehntelgrad,
- stehen die Werte im BC9020 an
%MW2,%MW4und%MW6zur Verfügung und - liest ein zusätzlicher IOZER-Datenpunkt ein Lifesign aus der SPS zurück.
Eingesetzte Hardware
- IOZER basic (IOZ-B-10) mit geeigneter Spannungsversorgung
- drei 1-Wire-Sensoren; im Beispiel zwei DS18B20 und ein DS2438
- Beckhoff BC9020 mit betriebsbereitem K-Bus-Aufbau
- gemeinsames IP-Netzwerk für IOZER, BC9020 und Engineering-Rechner
- Rechner mit Zugriff auf die IOZER-Weboberfläche und TwinCAT PLC Control
Voraussetzungen
- Die Geräte und Sensoren sind gemäß den Sicherheitshinweisen und dem elektrischen Anschluss installiert.
- I/O & Schnittstellen sind auf dem IOZER aktiviert.
- Der BC9020 ist erreichbar; der Beispielaufbau verwendet die IP-Adresse
10.0.1.19und TCP-Port502. - Die verwendeten Merkeradressen sind im SPS-Projekt reserviert und werden nicht von anderer Logik überschrieben.
- Die Kommunikationsintervalle und die Watchdog-Einstellung des BC9020 sind aufeinander abgestimmt; siehe Schritt 5.
Umsetzung
1. 1-Wire-Sensoren konfigurieren
Öffnen Sie I/O & Schnittstellen → 1-Wire. Starten Sie Entdeckung starten, übernehmen Sie die drei Sensoren und aktivieren Sie jeweils den Temperaturwert T.
| Einstellung | Wert |
|---|---|
| Leseintervall | 5 Sekunden |
| Faktor des Temperaturwerts | 1 |
| Offset des Temperaturwerts | 0 |
| Einheit | °C |
Der Beispielaufbau verwendet folgende Zuordnung:
| Sensorbezeichnung | Typ | Adresse im Screenshot | Späterer Datenpunkt |
|---|---|---|---|
Temperatur |
DS18B20 |
28-67-05-18-44-24-06-26 |
Temp 1 |
Temp 2 |
DS18B20 |
28-37-3C-26-45-24-06-89 |
Temp 2 |
Temp 3 |
DS2438 |
26-83-FF-19-02-00-00-FF |
Temp 3 |
Verwenden Sie die Adressen Ihrer eigenen Sensoren. Beim DS2438 wählen Sie ausdrücklich den Temperaturwert T; die Vorlage keine (Rohdaten) im Screenshot liefert diesen ohne zusätzliche Sensorvorlage.

Speichern und übernehmen Sie die Konfiguration. Prüfen Sie die Messwerte und ihre Aktualisierungszeit. Weitere Details stehen unter 1-Wire.
2. Modbus-TCP-Verbindung zur SPS anlegen
Wechseln Sie zu I/O & Schnittstellen → Modbus. Stellen Sie Modbus TCP → Modus auf Master (Client) und legen Sie über Slave hinzufügen den BC9020 an.
| Einstellung | Wert |
|---|---|
| Bezeichnung | Slave 1, wie im Screenshot |
| Host | 10.0.1.19 oder die IP-Adresse Ihres BC9020 |
| Port | 502 |
| Unit-ID | beispielsweise 1 |
| Timeout und Wiederholungen | passend zum Netzwerk beziehungsweise Standardwerte |
| Modbus RTU | Deaktiviert |
Slave 1 bezeichnet hier die Verbindung zum BC9020. Der IOZER arbeitet als Client. Beim BC9020 ist die Modbus-Unit laut Beckhoff-Dokumentation, Kapitel 6.2.1 frei wählbar; die Unit-ID 1 ist eine Wahl für dieses Beispiel und im Screenshot nicht eingeblendet.

Speichern und übernehmen Sie die Konfiguration. Kontrollieren Sie unter Modbus Status, dass die Verbindung Slave 1 den Status Verbunden besitzt. Ein erfolgreicher Lese- oder Schreibzugriff bestätigt anschließend den Registerzugriff.
3. Register und TwinCAT-Programm vorbereiten
Der Beckhoff-Merkerbereich für Modbus TCP beginnt bei 0x4000, dezimal 16384. Für den Beispielaufbau gilt:
| Inhalt | Modbus-Adresse im IOZER, 0-basiert | Hexadezimal | SPS-Adresse | SPS-Datentyp | Datenrichtung |
|---|---|---|---|---|---|
| Lifesign | 16384 |
0x4000 |
%MB0, zweites Byte %MB1 reserviert |
BYTE |
BC9020 → IOZER |
| Temperatur 1 × 10 | 16385 |
0x4001 |
%MW2 |
INT |
IOZER → BC9020 |
| Temperatur 2 × 10 | 16386 |
0x4002 |
%MW4 |
INT |
IOZER → BC9020 |
| Temperatur 3 × 10 | 16387 |
0x4003 |
%MW6 |
INT |
IOZER → BC9020 |
Eine Modbus-Registeradresse zählt 16-Bit-Wörter. Die absoluten Merkeradressen dieses BC9020-Projekts zählen Bytes. Deshalb folgt auf Register 16385 mit %MW2 das Register 16386 mit %MW4. Tragen Sie die Dezimaladressen aus der Tabelle direkt in den IOZER ein, ohne einen zusätzlichen 4xxxx-Präfix.
Erstellen Sie in TwinCAT PLC Control ein Programm MAIN in Structured Text. Deklarieren Sie:
PROGRAM MAIN
VAR
lifesign AT %MB0 : BYTE;
lifesign_high AT %MB1 : BYTE;
temp_1_x10 AT %MW2 : INT;
temp_2_x10 AT %MW4 : INT;
temp_3_x10 AT %MW6 : INT;
temp_1 : REAL;
temp_2 : REAL;
temp_3 : REAL;
END_VAR
Fügen Sie im Implementierungsbereich ein:
lifesign_high := 0;
lifesign := lifesign + 1;
temp_1 := INT_TO_REAL(temp_1_x10) / 10.0;
temp_2 := INT_TO_REAL(temp_2_x10) / 10.0;
temp_3 := INT_TO_REAL(temp_3_x10) / 10.0;
Das Lifesign wird pro SPS-Zyklus erhöht. Da der IOZER ein vollständiges 16-Bit-Register liest, reserviert die Ergänzung lifesign_high das zweite Byte und hält es auf 0. Die drei Temperaturwörter werden durch den IOZER beschrieben; das SPS-Programm rechnet sie in REAL-Temperaturen um.

Übersetzen und laden Sie das Projekt auf den BC9020 und starten Sie die SPS. Speichern Sie für den späteren Betrieb bei Bedarf ein Bootprojekt.
4. Temperaturdatenpunkte mit Modbus-Ziel konfigurieren
Legen Sie unter Datenpunkte drei aktivierte Datenpunkte an:
| Bezeichnung | Technischer Name | Datentyp | Einheit | Modbus-Zieladresse |
|---|---|---|---|---|
Temp 1 |
temp_1 |
Float |
°C |
16385 |
Temp 2 |
temp_2 |
Float |
°C |
16386 |
Temp 3 |
temp_3 |
Float |
°C |
16387 |
Wählen Sie jeweils die Klasse Temperatur und lassen Sie Nur lesen ausgeschaltet, damit die Weiterleitung an das Datenziel möglich ist.
Konfigurieren Sie im Reiter Datenquelle & Ziel zunächst die Quelle:
| Einstellung | Wert |
|---|---|
| Datenbindung | 1-Wire |
| 1-Wire | Temperaturwert T des jeweils zugeordneten Sensors |
| Adresse | Hardwareadresse des jeweiligen Sensors |
| Wert | 0, der erste Messwert T im Beispiel |
| Key | leer |
| Zum Datenziel weiterleiten | Ein |

Konfigurieren Sie das Ziel jedes Temperaturdatenpunkts:
| Einstellung | Wert |
|---|---|
| Datenbindung | Modbus |
| Transport | TCP |
| Verbindung | Slave 1 |
| Funktion | Holding Register |
| Adresse | 16385, 16386 beziehungsweise 16387 |
| Datentyp | Int16 |
| Schreib-Funktionscode | Automatisch |
| Scale | 0.1 |
| Offset | 0 |
| Wortfolge | MSW first |
| Byte-Swap | Aus |

Float beschreibt den IOZER-Datenpunkt in Grad Celsius; Int16 beschreibt die Darstellung im Modbus-Ziel. Beim Schreiben verwendet der IOZER die inverse Skalierung:
Registerwert = (Datenpunktwert − Offset) / Scale
25,5 °C / 0,1 = 255
−5,2 °C / 0,1 = −52
Der Registerwert wird auf eine ganze Zahl gerundet. In der SPS ergibt INT_TO_REAL(Registerwert) / 10.0 wieder die Temperatur in Grad Celsius mit einer Auflösung von 0,1 °C. Verwenden Sie Int16 im IOZER und INT in der SPS, damit auch negative Temperaturen richtig ankommen.
Bei Automatisch wird ein einzelnes 16-Bit-Holding-Register mit Schreibfunktion 06 geschrieben. Die Anzeige F3 in der Datenpunktübersicht kennzeichnet den Holding-Registerbereich und ist nicht der ausgeführte Schreibbefehl.
Konfigurieren Sie zuerst Temp 1 vollständig und verwenden Sie anschließend Datenpunkt kopieren. Ändern Sie in den Kopien Bezeichnung, technischen Namen, Sensorquelle und Modbus-Adresse gemäß den Tabellen.
Speichern und übernehmen Sie die Konfiguration. Mit Zum Datenziel weiterleiten werden der erste gültige Quellwert und spätere Wertänderungen automatisch geschrieben. Unveränderte Messwerte lösen keinen weiteren Schreibbefehl aus. Siehe Datenpunkt-Weiterleitung.
5. Lifesign aus der SPS zurücklesen
Legen Sie einen zusätzlichen Datenpunkt an, um einen zyklisch veränderten Wert aus dem BC9020 zu lesen:
| Einstellung | Wert |
|---|---|
| Bezeichnung | Beckhoff Lifesign |
| Name | beckhoff_lifesign |
| Datentyp des Datenpunkts | Integer |
| Datenquelle → Datenbindung | Modbus |
| Transport / Verbindung | TCP / Slave 1 |
| Funktion | Holding Register, Lesen mit Funktion 03 |
| Adresse | 16384 |
| Datentyp der Modbus-Quelle | UInt16 |
| Intervall | 1000 ms, wie im Screenshot; Watchdog beachten |
| Scale / Offset | 1 / 0 |
| Wortfolge / Byte-Swap | MSW first / Aus |
| Datenziel | keines |

Der SPS-Zähler ist als BYTE deklariert und läuft nach 255 über. Der gelesene Wert muss daher nicht fortlaufend größer werden. Das Lifesign prüft den Rückweg und die Ausführung des SPS-Programms; die Temperaturübertragung prüfen Sie zusätzlich in TwinCAT.
Beckhoff dokumentiert einen standardmäßig aktiven Watchdog von 1000 ms. Das gezeigte Leseintervall lässt dazu keine Zeitreserve. Stimmen Sie Intervall und Watchdog mit Reserve ab. Im Telegramm-Modus können die Lesezugriffe den Watchdog bedienen; im Schreibtelegramm-Modus genügen sie nicht. Die Temperaturweiterleitung schreibt nur bei Änderungen. Details: Beckhoff Modbus-TCP-Watchdog.
6. Übertragung prüfen
Kontrollieren Sie die IOZER-Datenpunktübersicht. Die drei Temperaturen und das Lifesign sollten gültige Werte mit Status OK anzeigen.

Öffnen Sie in TwinCAT die Online-Ansicht von MAIN. Prüfen Sie die Rohwerte und die daraus berechneten Temperaturen. Der bereitgestellte Screenshot zeigt:
| Variable | Rohwert | Berechnete Temperatur |
|---|---|---|
temp_1_x10 → temp_1 |
252 |
25,2 °C |
temp_2_x10 → temp_2 |
246 |
24,6 °C |
temp_3_x10 → temp_3 |
239 |
23,9 °C |

Die Screenshots wurden zu unterschiedlichen Zeitpunkten aufgenommen und können deshalb unterschiedliche Messwerte zeigen. Vergleichen Sie bei Ihrem Test jeweils die aktuellen Anzeigen:
- Ändern Sie die Temperatur eines Sensors, beispielsweise durch Erwärmen mit der Hand.
- Warten Sie auf die nächste 1-Wire-Abfrage und die Weiterleitung.
- Prüfen Sie den zugehörigen IOZER-Datenpunkt, das richtige SPS-Merkerwort und die
REAL-Temperatur. - Wiederholen Sie den Test für die beiden anderen Sensoren.
Ein sich änderndes Lifesign allein bestätigt noch keinen erfolgreichen Schreibzugriff auf die Temperaturregister. Die PLC-Online-Ansicht liefert hierfür die direkte Rückmeldung. Die gezeigte Registerbelegung enthält keinen eigenen Gültigkeits- oder Zeitstempelwert für die Temperaturen; bei ausbleibender Aktualisierung kann ein zuvor geschriebener Wert im Merker stehen bleiben.
Fehlerbehebung
| Fehlerbild | Mögliche Ursache und Prüfung |
|---|---|
| Ein Sensor fehlt oder liefert keinen Wert | 1-Wire-Verdrahtung, Sensoradresse, Aktivierung und Temperaturwert T prüfen. |
| BC9020 ist nicht verbunden | IP-Adresse, Port 502, Netzwerk und IOZER-Modus Master (Client) prüfen. |
| IOZER zeigt Temperaturen, die SPS aber nicht | Datenziel, Zum Datenziel weiterleiten, ausgeschaltetes Nur lesen und Registeradressen prüfen. |
| Temperatur ist um Faktor zehn falsch | Am Modbus-Ziel Scale = 0.1 und im SPS-Programm die Division durch 10.0 prüfen. |
| Negative Temperatur erscheint als große positive Zahl | Modbus-Typ Int16 und SPS-Typ INT verwenden. |
| Sensorwerte sind vertauscht oder überschneiden sich | Zuordnung 16385 → %MW2, 16386 → %MW4, 16387 → %MW6 und freie Merkerbereiche prüfen. |
| Lifesign ändert sich, Temperaturen bleiben stehen | Lifesign ist ein Lesezugriff. Temperatur-Schreibziele und Weiterleitung getrennt prüfen; bei unverändertem Sensorwert ist kein neuer Schreibbefehl zu erwarten. |
| Kommunikation bricht nach kurzer Zeit ab | Watchdog-Modus und Zeitreserve zu den tatsächlichen Lese- beziehungsweise Schreibintervallen prüfen. |
| Modbus meldet einen Serverfehler | Zusätzlich K-Bus-Aufbau und Diagnose des BC9020 prüfen. |
Ergebnis und Erweiterung
Der IOZER bindet drei 1-Wire-Temperaturen in das SPS-Projekt ein. Jeder Wert belegt ein Holding-Register und steht im BC9020 als INT in Zehntelgrad sowie als berechneter REAL-Wert zur Verfügung. Weitere Sensoren lassen sich mit zusätzlichen Datenpunkten und freien, nicht überlappenden Register- und Merkeradressen ergänzen.