Im sechsten Teil dieser Reihe haben wir uns angesehen, wie man Modbus-TCP-Geräte mit IO-Broker verwendet. Diesmal beschäftigen wir uns mit der leitungsgebundenen Modbus-Kommunikation nach dem Modbus/RTU-Standard.
Das Client-Server-basierende Modbus-Protokoll wurde ursprünglich entwickelt, um die Kommunikation zwischen Industriesteuerungen (SPS) aufzubauen. Das Protokoll gibt es grundsätzlich in drei Varianten mit unterschiedlichen Vor- und Nachteilen (siehe Tabelle “Modbus-Varianten”). Im vorigen Artikel dieser Reihe haben wir uns intensiv mit IO-Broker und Modbus/TCP beschäftigt, diesmal sehen wir uns die Modbus/RTU-Variante genauer an.
Grundsätzlich erfolgt die Datenübertragung bei Modbus/RTU über eine serielle RS485-Schnittstelle. Das Signal arbeitet mit Spannungspegeln von ±1,5 bis ±6 Volt im Gegentakt. Das bedeutet, dass auf einer Datenleitung ein nicht invertiertes Signal liegt und auf der zweiten Leitung ein invertiertes. Dieses Übertragungsverfahren bietet den enormen Vorteil, dass es sehr robust gegen Störungen von außen ist.
|
Variante |
Anmerkung |
|---|---|
|
Modbus/TCP |
Die Daten werden über TCP/IP übertragen. |
|
Modbus/RTU |
Die Daten werden binär über eine serielle RS485-Schnittstelle übertragen. |
|
Modbus/ASCII |
Eine Klartextvariante von Modbus/RTU. Gute Lesbarkeit, allerdings leidet die Übertragungsrate. |
Die modernere Bezeichnung für die RS485-Schnittstelle lautet EIA-485. Wir reden hier von einem Interface, das nicht nur verwendet werden kann, um Punkt-zu-Punkt-Verbindungen herzustellen, sondern auch, um komplette Bussysteme aufzubauen. Die Anzahl der Busteilnehmer hängt dabei vom Eingangswiderstand der angeschlossenen Geräte ab, daher kann die Anzahl der Busteilnehmer zwischen 32 und 256 betragen.
Auf Distanzen bis zu 12 Metern erlaubt die RS485-Schnittstelle Datenraten von bis zu 10 Mbit/s. Mit steigender Leitungslänge sinkt die Übertragungsrate. Die maximale Leitungslänge beträgt 1200 Meter. Meist wird die RS485-Schnittstelle im Halbduplexmodus betrieben (ein Adernpaar). Optional gibt es die Möglichkeit, auch einen Vollduplexmodus zu realisieren, indem man ein zusätzliches Adernpaar nutzt. Allerdings unterstützen viele Modbus-Geräte den Vollduplexmodus nicht.
Jeder Teilnehmer besitzt bei Modbus/RTU eine eindeutige Adresse, über die er sich ansprechen lässt. Das Protokoll verwendet ein Byte, um die Adresse zu übertragen, somit sind Adressen zwischen 0 und 255 möglich. Über die Adresse 0 wird ein Broadcast an alle Geräte am Bus realisiert. Der Busmaster steuert die Kommunikation und benötigt eine eigene Adresse. Zum Sichern der übertragenen Daten kommt das CRC-Verfahren (Cyclic Redundancy Check [1]) zum Einsatz.
Da das Modbus-Protokoll ursprünglich dazu gedacht war, Informationen zwischen Industriesteuerungen auszutauschen, kennt es nur vier Objekttypen: einen einzelnen Ein-/Ausgang (Coil), einen einzelnen Eingang (Discrete Input), mehrere (analoge) Ein-/Ausgänge (Holding Register) und mehrere (analoge) Eingänge (Input Register). Die Registerdatentypen haben hier eine Breite von zwei Byte, die einzelnen Datentypen besitzen nur ein Bit. Falls Sie sich intensiver mit Modbus auseinandersetzen wollen, bietet die Modbus-Homepage einen guten Einstiegspunkt [2].
Testaufbau
Um zu testen, ob der Modbus-Adapter so arbeitet, wie wir uns das vorstellen, bauen wir eine einfache Testumgebung aus zwei eIO-Modulen von PiXtend auf. Die Module haben den Vorteil, dass sie sich komplett über DIP-Schalter konfigurieren lassen. Zum Testen der digitalen Funktionen des Modbus verwenden wir das PiXtend eIO Digital One [3] für 98,40 Euro. Für die analogen Funktionen bietet sich das PiXtend eIO Analog One [4] für 256,50 Euro an. Die zwei Module sind für den Einsatz in der Industrie gedacht und dementsprechend robust. Sie können selbstverständlich auch jedes andere Modbus-Gerät für einen Versuchsaufbau verwenden.
An die digitalen Ein- und Ausgänge schließen wir ein paar Schalter und LEDs an. Um die analogen Werte zu simulieren, verwenden wir zwei Potentiometer sowie ein Zeigermessgerät. Achten Sie darauf, dass alle Module korrekt mit Spannung versorgt werden. Die Leitungen für den Bus schleifen wir von Gerät zu Gerät durch. Abbildung 1 zeigt den fliegend verdrahteten Testaufbau inklusive aller Komponenten.
Die zwei PiXtend-eIO müssen wir für unseren Versuch mithilfe der DIP-Schalter testweise einrichten. Um uns das Leben möglichst leicht zu machen, belassen wir so viele Schalter wie nur möglich auf Off (Werkseinstellung). Das bedeutet, wir verwenden als Kommunikationseinstellungen 19 200 Baud mit Parität Even und einem Stop-Bit. Die Kommunikationseinstellungen müssen an jedem Gerät am Bus gleich sein. Den Mode-Schalter der Module stellen wir auf Off, um RTU zu verwenden.
Es gilt, den Bus an beiden Enden zu terminieren. Das erfolgt durch das Umlegen des Schalters T auf On. Aktivieren Sie die Terminierung so, dass sie für Ihren Aufbau passt; üblicherweise terminieren die Busmaster den Bus immer an einem Ende. Zu guter Letzt müssen Sie den Modulen noch eindeutige Adressen zuweisen. Geben Sie dem Digitalmodul die Adresse 2 und dem analogen die Adresse 3. Die Konfiguration der Adresse erfolgt im Binärformat über die Schalter.
Jedes Gerät hat eine bestimmte Anzahl interner Registeradressen, über die wir später auf die Daten zugreifen. Eine genaue Beschreibung der Register innerhalb der Geräte findet sich im Softwarehandbuch des PiXtend eIO [5]. Falls Fragen zu der Hardware der Module aufkommen, werfen Sie am besten einen Blick in die Anleitung [6].
Der Autor lässt den IO-Broker auf einem RevPi Compact [7] laufen. Der RevPi besitzt ab Werk eine RS485-Schnittstelle. Falls bei Ihnen der IO-Broker auf einer anderen Hardware läuft, finden Sie Hinweise zur Konfiguration im Kasten “Modbus am PC”. Dort wird gezeigt, wie Sie mit einem USB-RS485-Konverter eine Verbindung zum Modbus herstellen. Den RevPi kann man über Schraubverbinder mit dem Modbus verbinden. Hierbei müssen Sie beachten, dass die Leitung A am RevPi mit N verbunden werden muss und die Leitung B mit P.
Modbus am PC
Um ein Modbus-Gerät schnell zu testen, können Sie einen USB-zu-RS485-Adapter verwenden [8]. Solche Adapter sind in Online-Shops schon für knapp 9 Euro zu bekommen. Der Raspberry verfügt zwar auf dem GPIO über serielle Schnittstellen, die man auf RS485 umrüsten könnte. Es empfiehlt sich trotzdem, diese Adapter für den RasPi zu verwenden, weil sie viel leichter zu konfigurieren sind und ohne viel Aufwand die richtigen Spannungspegel liefern.
Verschrauben Sie als Erstes die Modbus-Leitungen am Adapter. Danach verbinden Sie den Adapter per USB mit dem PC oder Raspberry Pi. Jetzt benötigen Sie noch eine Software, die es ermöglicht, auf den Modbus zuzugreifen. Das einfache Tool Modpoll hat uns hierbei schon im letzten Teil dieser Reihe gute Dienste erwiesen [9]. Das Programm spricht selbstverständlich auch Modbus/RTU. Laden Sie die für Ihr Betriebssystem passende Version herunter, entpacken Sie das ZIP-Archiv und wechseln Sie in den Ordner, der Ihrer Hardware entspricht. Hier können Sie nun Modpoll aufrufen und direkt loslegen.
Listing 1 zeigt anhand einer Reihe von Beispielen, wie Sie Daten in den Testaufbau schreiben oder daraus auslesen. Weitere Informationen zu den Beispielkommandos erhalten Sie über die Hilfe, die Sie mit modpoll -h aufrufen. Die Standardeinstellungen von Modpoll entsprechen exakt den Einstellungen unserer Modbus-Geräte. Es ist daher in diesem Fall nicht nötig, die Parameter der RS485-Schnittstelle explizit zu setzen. In einigen Kommandos sind diese Parameter allerdings beispielhaft zu sehen.







