Modbus-Kommunikation zwischen Host und Smart Display
Um Entwicklern den Einstieg in die WINSTAR Smart Displays zu erleichtern und die Funktionsweise anschaulich zu vermitteln, stellen wir regelmäßig praxisorientierte Demo-Projekte für unterschiedliche Anwendungsszenarien vor. In diesem Beitrag zeigen wir ein weiteres Modbus-Beispiel, das sowohl Einsteigern als auch erfahrenen Entwicklern einen schnellen Überblick über die grundlegende Funktionsweise vermittelt.
Modbus ist ein in der Industrieautomation weit verbreitetes Kommunikationsprotokoll zur Anbindung und Steuerung verschiedener Geräte und Sensoren. In dieser Anwendung übernimmt ein Arduino-Board die Funktion des Host-Controllers für die Systemintegration. Über Modbus kann der Arduino verschiedene Sensoren und Toggle Buttons einbinden und damit das Smart Display, Gauge, Indicator sowie LEDs steuern. In diesem Demo-Projekt kommuniziert ein Arduino Mega 2560 mit RS485 Shield über Modbus mit dem Smart Display.
Das Programm zeigt, wie Sensorwerte über Modbus-Register ausgelesen, Display-Seiten gewechselt und LEDs abhängig von den erfassten Sensorwerten gesteuert werden.

Systemblockdiagramm
Für diese Anwendung werden folgende Komponenten benötigt:
- 7-Zoll Smart Display mit Modbus
- Arduino Mega 2560
- RS485 Modbus Shield für Arduino Mega 2560
- Arduino IDE v2.0.4
- Modbus RS485 Dongle
- Physischer Taster
- Potentiometer-Sensor (Rotary Angle Sensor)
- LED
- GUI Builder v0.4.2 oder höher
Das Demo-Projekt gliedert sich in drei Schritte:
- Demo-Projekt im GUI Builder erstellen.
- Projekt erstellen und hochladen.
- Arduino-Host programmieren.
Demo-Projekt im GUI Builder erstellen
Öffnen Sie zunächst eine aktuelle Version des GUI Builders und erstellen Sie ein neues Projekt. Geben Sie den Projektnamen ein und überprüfen Sie den standardmäßig automatisch ausgewählten Projektordner. Wählen Sie anschließend den Gerätetyp aus; für diese Anwendung wird ein 7-Zoll-Gerät verwendet. Wählen Sie danach das Kommunikationsprotokoll aus und übernehmen Sie für die Display-Ausrichtung die Standardeinstellung Landscape. Wählen Sie unter UI Template die Option Blank und klicken Sie abschließend auf die Schaltfläche Create, um das neue Projekt wie in der folgenden Abbildung dargestellt anzulegen.

Nach dem Erstellen des Projekts wird die folgende Ansicht angezeigt.

Für das vorgesehene Demo-Szenario wird eine weitere Seite benötigt. Klicken Sie dazu auf die Schaltfläche Page und anschließend auf die Schaltfläche +, um eine neue Seite hinzuzufügen.

Im Bereich Resource kann ein benutzerdefinierter Hintergrund ausgewählt und als Hintergrund der Seite verwendet werden.

Der Hintergrund kann auch im Bereich Page ausgewählt werden.

Wechseln Sie anschließend zurück zum Bereich Controls auf der ersten Seite. Wählen Sie entsprechend dem Demo-Szenario den Toggle Button aus und ziehen Sie ihn per Drag-and-drop in den Layoutbereich der Seite. Platzieren Sie Gauge und Indicator auf die gleiche Weise.

Projekt erstellen und hochladen
Nachdem die vorherigen Schritte abgeschlossen, zwei separate Seiten erstellt und die Widgets Toggle Button, Gauge und Indicator auf der ersten Seite platziert wurden, kann das Projekt erstellt werden. Wechseln Sie zum Bereich Page Info. Klicken Sie auf die Schaltfläche Device und wählen Sie Device Properties. Überprüfen Sie die Einstellung unter Protocol, wählen Sie anschließend den COM-Port aus und stellen Sie die Baudrate ein. Klicken Sie danach auf "Connect to device", um die Verbindung zum Gerät herzustellen. Klicken Sie abschließend wie in der folgenden Abbildung gezeigt auf Upload, um das Projekt hochzuladen, und warten Sie, bis der Upload abgeschlossen ist.

Nach Abschluss des Projekt-Uploads klicken Sie wie in der folgenden Abbildung gezeigt auf OK.

Nach Abschluss des Uploads wird der Startbildschirm wie in der folgenden Abbildung angezeigt.

Nach dem Startbildschirm wechselt das Display zur ersten Seite. Damit sind das Erstellen und Hochladen des Projekts über den GUI Builder abgeschlossen.

Arduino-Host programmieren
Die folgende Abbildung zeigt die im Arduino-IDE-Programm definierten Registeradressen und weiteren erforderlichen Einstellungen. Zu Beginn werden die Pins für den physischen Taster, den Drehwinkelsensor und die LEDs festgelegt. Anschließend wird die Modbus-Kommunikation mithilfe der ModbusMaster-Bibliothek initialisiert. Darüber hinaus werden die Modbus-Registeradressen für die Seitenumschaltung sowie für die Widgets Indicator, Gauge und Toggle Button definiert.

Weitere Details zum Kommunikationsablauf lassen sich im Bereich „Test Device“ bzw. „Simulator“ des Kommunikationsprotokolls im GUI Builder nachvollziehen. Dort ist ersichtlich, wie der Host über Modbus RS485 mit dem Smart Display kommuniziert.
Die folgende Abbildung zeigt die Log-Daten des „Toggle Button“. Anhand dieser Daten lässt sich erkennen, über welche Adresse auf das Widget zugegriffen wird. Das zweite Byte im Feld Data Byte enthält den Hexadezimalwert 00 06. Dieser Wert entspricht der Adresse des Toggle Button und ergibt nach der Umrechnung in das Dezimalsystem den Wert 6. Über diese Adresse können Daten in das Widget geschrieben werden. In diesem Beispiel wird der Toggle Button jedoch zum Lesen von Daten aus dem Smart Display verwendet. Hierfür wird die Registeradresse „7“ verwendet.

Warum wird zum Auslesen des Toggle Button die Registeradresse „7“ verwendet? Detaillierte Informationen zur Registerbelegung und zum Kommunikationsablauf finden Sie im Datenblatt des Modbus Smart Display. Der folgende Ausschnitt aus dem Datenblatt zeigt die für das erste Objekt (Widget), den Toggle Button, verwendeten Adressen.

Die folgende Abbildung zeigt die Log-Daten des „Gauge“. Daraus lässt sich die Adresse des Gauge-Widgets ermitteln. Das zweite Byte im Feld Data Byte enthält den Hexadezimalwert 00 6A. Dieser entspricht der Adresse des Gauge und ergibt nach der Umrechnung in das Dezimalsystem den Wert 106. Über diese Adresse können Daten in das Gauge-Widget geschrieben werden.

Die folgende Abbildung zeigt die Log-Daten des „Indicator“. Daraus lässt sich die Adresse des Indicator-Widgets ermitteln. Das zweite Byte im Feld Data Byte enthält den Hexadezimalwert 00 CE. Dieser entspricht der Adresse des Indicator und ergibt nach der Umrechnung in das Dezimalsystem den Wert 206. Über diese Adresse können Daten in das Indicator-Widget geschrieben werden.

Die Konstante ADC_REF ist auf 5 V gesetzt und definiert die Referenzspannung des ADC (Analog-Digital-Wandler). Sie wird zur Verarbeitung des Signals des angeschlossenen Sensors verwendet. GROVE_VCC ist auf den Wert 5 gesetzt und definiert die VCC-Spannung der in der Schaltung verwendeten Grove-Schnittstelle. FULL_ANGLE ist auf 300 gesetzt und gibt den vollständigen Drehwinkel des verwendeten Drehwinkelsensors in Grad an.

Im nächsten Abschnitt werden die erforderlichen Variablen und Datentypen definiert und mit dem Wert 0 initialisiert.

Anschließend werden die Pin-Modi und Einstellungen für die externen Komponenten, beispielsweise den physischen Taster und die LEDs, festgelegt. Zusätzlich wird die Baudrate für die serielle Kommunikation konfiguriert, wie in der folgenden Abbildung dargestellt.

Die folgende Abbildung zeigt die Definition der Funktion „ChangePageFunction“. Zum Schreiben der Daten in das entsprechende Modbus-Register wird die Funktion „writeSingleRegister“ verwendet.

Die folgende Abbildung zeigt die Verarbeitung des Drehwinkelsensors (Variable Resistor / Rotary Angle Sensor). Erkennt der Arduino-Host eine Änderung des Sensorwerts, wird der neue Wert über das Modbus-Protokoll an das Smart Display übertragen und zur Aktualisierung des Gauge verwendet. Liegt der Gauge-Wert unter 120, bleibt die LED an Pin 13 ausgeschaltet und der Indicator wird grün dargestellt. Bei einem Wert von 120 oder höher wird die LED eingeschaltet und der Indicator wechselt auf Rot.

Die folgende Abbildung zeigt die Verarbeitung des physischen Tasters. Erkennt der Arduino-Host eine Änderung des Tasterzustands, wird der entsprechende Wert über das Modbus-Protokoll an das Smart Display übertragen, um die angezeigte Seite umzuschalten.

Die folgende Abbildung zeigt, wie der Arduino-Host den Zustand des Toggle Button über das Modbus-Protokoll vom Smart Display ausliest. Abhängig vom empfangenen Wert wird die an Pin 12 angeschlossene LED ein- oder ausgeschaltet.

Ein wichtiger Punkt in diesem Programm ist die Verwendung der Funktionen „writeSingleRegister“ und „readHoldingRegisters“. Mit „writeSingleRegister“ werden Daten in Register des Smart Display geschrieben, während „readHoldingRegisters“ zum Auslesen von Daten aus dem Smart Display dient. Bei der Kommunikation mit aktiven Widgets wie dem Gauge ist außerdem auf ausreichende Verzögerungszeiten zwischen den einzelnen Modbus-Kommunikationsvorgängen zu achten. Nachdem eine Anfrage übertragen und die entsprechende Antwort empfangen wurde, kann der nächste Kommunikationsvorgang ausgeführt werden. Daher werden im Programm entsprechende Verzögerungen zwischen den Lese- und Schreibvorgängen berücksichtigt.

Nachdem das Programm in der Arduino IDE erfolgreich überprüft und auf den Arduino geladen wurde, können die vorgesehenen Demo-Szenarien ausgeführt werden. Befindet sich der Toggle Button im Zustand OFF, ist auch die extern an Pin 12 angeschlossene LED ausgeschaltet. Wird der Toggle Button auf ON gesetzt, schaltet sich die LED unmittelbar ein, wie in der folgenden Abbildung dargestellt.

Im Demo-Szenario wird das Gauge über den Drehwinkelsensor gesteuert. Liegt der Gauge-Wert zwischen 0 und unter 120, wird der Indicator grün dargestellt und die LED an Pin 13 bleibt ausgeschaltet. Erreicht oder überschreitet der Gauge-Wert 120, wechselt der Indicator auf Rot und die LED an Pin 13 wird eingeschaltet, wie in der folgenden Abbildung dargestellt.

In diesem Demo-Szenario kann außerdem mithilfe des physischen Tasters zwischen den Seiten gewechselt werden. Beim ersten Betätigen des Tasters wechselt das Display auf die zweite Seite. Wird der Taster erneut gedrückt, kehrt das Display zur ersten Seite zurück, wie in der folgenden Abbildung dargestellt.

Damit ist das Demo-Projekt für das 7-Zoll Smart Display vollständig eingerichtet. In diesem Beispiel werden verschiedene Sensoren und LEDs eingesetzt, um über einen physischen Taster zwischen den Displayseiten zu wechseln sowie das Gauge, die Indicators und externe LEDs zu steuern. Das vollständige Programm und weitere Informationen zu diesem Demo-Projekt finden Sie im GitHub-Demoprogramm.
Hinweis: Weitere Informationen zum in diesem Demo-Projekt verwendeten Modbus RS485 Shield finden Sie in der Dokumentation zum Modbus RS485 Shield. Der tatsächliche Hardwareaufbau ist in der folgenden Abbildung dargestellt.

Fazit
Zusammenfassend zeigt dieses Programm beispielhaft, wie ein Arduino-Board über das Modbus-Protokoll mit einem Smart Display kommuniziert. Dabei werden Sensorwerte ausgelesen, Displayseiten umgeschaltet sowie Indicators und externe LEDs über Modbus-Register gesteuert. Das Beispiel vermittelt damit praxisnah die grundlegende Modbus-Kommunikation und deren Einsatz bei der Steuerung eines Smart Display.