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, %MW4 und %MW6 zur 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.19 und TCP-Port 502.
  • 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.

Drei konfigurierte 1-Wire-Sensoren mit fünf Sekunden Leseintervall: zwei DS18B20 und ein DS2438
Drei konfigurierte 1-Wire-Sensoren mit fünf Sekunden Leseintervall: zwei DS18B20 und ein DS2438

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.

IOZER als Modbus-TCP-Master mit Verbindung Slave 1 zur SPS unter 10.0.1.19 auf Port 502
IOZER als Modbus-TCP-Master mit Verbindung Slave 1 zur SPS unter 10.0.1.19 auf Port 502

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.

TwinCAT PLC Control mit Lifesign, Temperaturvariablen an MW2, MW4 und MW6 sowie Umrechnung in Grad Celsius
TwinCAT PLC Control mit Lifesign, Temperaturvariablen an MW2, MW4 und MW6 sowie Umrechnung in Grad Celsius

Ü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
Temperaturdatenpunkt mit 1-Wire-Quelle Temperatur / T und aktivierter Weiterleitung zum Datenziel
Temperaturdatenpunkt mit 1-Wire-Quelle Temperatur / T und aktivierter Weiterleitung zum Datenziel

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
Modbus-TCP-Ziel für Temp 1 mit Adresse 16385, Datentyp Int16, automatischem Schreib-Funktionscode und Scale 0.1
Modbus-TCP-Ziel für Temp 1 mit Adresse 16385, Datentyp Int16, automatischem Schreib-Funktionscode und Scale 0.1

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
Beckhoff-Lifesign-Datenpunkt mit Modbus-TCP-Quelle, Register 16384, UInt16 und 1000 ms Leseintervall
Beckhoff-Lifesign-Datenpunkt mit Modbus-TCP-Quelle, Register 16384, UInt16 und 1000 ms Leseintervall

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.

IOZER-Datenpunkte mit Beckhoff Lifesign sowie drei 1-Wire-Temperaturen mit Modbus-TCP-Zielen 16385 bis 16387
IOZER-Datenpunkte mit Beckhoff Lifesign sowie drei 1-Wire-Temperaturen mit Modbus-TCP-Zielen 16385 bis 16387

Ö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
TwinCAT-Online-Ansicht mit den empfangenen Rohwerten 252, 246 und 239 sowie den Temperaturen 25.2, 24.6 und 23.9 Grad Celsius
TwinCAT-Online-Ansicht mit den empfangenen Rohwerten 252, 246 und 239 sowie den Temperaturen 25.2, 24.6 und 23.9 Grad Celsius

Die Screenshots wurden zu unterschiedlichen Zeitpunkten aufgenommen und können deshalb unterschiedliche Messwerte zeigen. Vergleichen Sie bei Ihrem Test jeweils die aktuellen Anzeigen:

  1. Ändern Sie die Temperatur eines Sensors, beispielsweise durch Erwärmen mit der Hand.
  2. Warten Sie auf die nächste 1-Wire-Abfrage und die Weiterleitung.
  3. Prüfen Sie den zugehörigen IOZER-Datenpunkt, das richtige SPS-Merkerwort und die REAL-Temperatur.
  4. 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.

IOZER basic
IOZER
Innovative Steuerung für vielseitige Anwendungen.
AnmeldenRegistrieren
DE Deutsch EN English
Produkte
Shop
Docs
Connect
Kontakt
Sprache: DE
DE Deutsch EN English
Warenkorb
AnmeldenRegistrieren