RevPi als Modbus-RTU-Master verwenden

Dieses Tutorial gilt ab dem Image Jessie. Für Wheezy gilt es leider nicht.

Du kannst Deinen RevPi Basismodul auch als Modbus-RTU-Master verwenden. Dadurch könntest Du z. B. Slaves wie Temperaturfühler, Taster, Bewegungsmelder u. v. m. über Modbus RTU verbinden und die Daten dieser Slaves in Deinem RevPi weiter verarbeiten.

Du benötigst dazu:

  • RevPi Basismodul
  • Slave
  • Passende Kabel (je nach Projekt) mit D-Sub 9-Steckern
  • Adapter (z. B. Shopartikel 200018 oder 200019)
  • Internetverbindung

Voraussetzungen:

  • Du hast einen Webbrowser auf Deinem PC installiert (z. B. Google Chrome oder Mozilla Firefox).
  • RevPi Basismodul befindet sich in Deinem Netzwerk.

Los geht’s!

  • Verbinde die eine USB-Buchse mit dem Adapter.
  • Verbinde den Adapter über die D-Sub-9-Buchse mit den Slaves.
  • Stelle die Adresse der Slaves ein und notiere Dir diese. Hinweise dazu findest Du ggf. in der Bedienungsanleitung des Herstellers.
  • Ermittle den Gerätepfad Deines RevPi und notiere Dir diesen. Hier erfährst Du, wie das geht.
HINWEIS
Wenn Du mehrere Slaves verwendest, musst Du darauf achten, dass jeder Slave eine eigene Adresse hat. Wenn 2 oder mehr Slaves die gleiche Adresse auf einem Port haben, kommt es zu Fehlern in der Kommunikation.
  • Starte RevPi Status.
  • Klicke auf das Register SERVICES.
  • Aktiviere Modbus Master.
  • Klicke Button Save All.

Du kannst die Master-Funktion auch in der Kommandozeile aktivieren. Gib dazu folgendes Kommando ein: sudo revpi-config enable pimodbus-master.

  • Starte PiCtory.
  • Öffne im Device Catalog den Ordner Virtual Devices.
  • Wähle den Modbus-RTU-Master aus.
  • Halte die linke Maustaste gedrückt und ziehe den Modbus-RTU-Master auf Dein RevPi.
  • Der Modbus-RTU-Master erscheint jetzt ganz außen auf dem Configuration Board.
HINWEIS
Dein Modbus-RTU-Master wird immer ganz rechts außen angeordnet. Falls Du ein RevPi Gate verwendest, das Du ja auch nur ganz rechts/links außen anordnen darfst, funktioniert dieses trotzdem wie bisher. Das RevPi Gate ist ein Gerät, das physisch vorhanden ist und nur ganz außen auf der Hutschiene montiert werden darf. Virtuelle Geräte, wie z. B. der Modbus-RTU-Master sind jedoch physisch nicht vorhanden. Deshalb musst Du für diese Geräte keinen eigenen Slot anlegen und PiCtory ordnet sie automatisch außerhalb der Geräte an, die physisch vorhanden sind.
  • Klicke auf den Modbus-RTU-Master.
  • Lege im Bereich „Device Data“ die Grundeinstellungen für Deine Adapter fest. Diese Eingabe ist optional.  Wenn Du viele Geräte verwendest und die Daten später in einem anderen Programm weiterverarbeiten möchtest, kann diese Eingabe sehr hilfreich sein.
  • Lege im “Value Editor” die Einstellungen für Deine RTU-Verbindung fest.  Folgende Werte musst Du angeben:
Parameter Erklärung
Input Hier kannst Du Deine Eingänge konfigurieren. Für jeden Master können insgesamt 32 Werte verwendet werden. Ein Wert ist 16 Bit breit.
Output Hier kannst Du Deine Ausgänge konfigurieren. Für jeden Master können insgesamt 32 Werte verwendet werden. Ein Wert ist 16 Bit breit.
device_path Der Dateipfad zur Linux Gerätedatei,default: /dev/ttyRS485.

Diesen Pfad hast Du ja bereits in den Vorbereitungen notiert. Falls nicht, erfährst Du hier wie Du ihn findest.

Wichtig!: Wenn Du mehrere Geräte des gleichen Types verwendest, können sich die Pfade zu den Linuxgerätedateien bei einem Neustart ändern. Durch Setzen von udev-Regeln die z. B. Zuweisungen von Linuxgerätedateipfaden zu Geräteseriennummern haben, kann dies verhindert werden.

baud rate Die Baudrate bestimmt die Geschwindigkeit der seriellen Verbindung. default: 19200
parity Konfiguration des Paritätsbit

None: kein Paritybit

Even: gerade Parität (default)

Odd: gerade Parität

data_bits Anzahl der Datenbits default:8
Stop_bits Anzahl der Stopbits default:1
  • Klicke mit der rechten Maustaste auf den Modbus-RTU-Master auf dem Configuration Board.
  • Ein Kontextmenü öffnet sich.
  • Wähle den Eintrag “Extended Data”.
  • Eine Eingabemaske öffnet sich.
  • Du kannst hier die Modbusbefehle einstellen.
Parameter Erklärung
Slave Addr. Adresse des Slaves

Diese Adresse stellst Du direkt an Deinem verwendeten Slave ein. Informationen dazu, wie das geht, findest Du sicher in der Bedienungsanleitung des Herstellers.

Wichtig!: Wenn Du mehrere Slaves verwendest, musst Du darauf achten, dass jeder Slave eine eigene Adresse hat. Wenn 2 oder mehr Slaves die gleiche Adresse haben, kommt es zu Fehlern in der Kommunikation.

Die Adresse “0” darf nicht als Slave-Adresse verwendet werden. Sie ist bei Modbus für den Broadcast reserviert.

Function Code Bei Modbus gibt es  Function Codes, die den Zugriff auf Daten in einer bestimmten Weise möglich machen. Wir verwenden folgende Function Codes:

READ_COILS

Einzelne Bits lesen

 

READ_DISCRETE_INPUTS

Einzelnes Eingangs-Bit lesen

 

READ_HOLDING_REGISTERS

Ein ganzes  Ein/Ausgangsregister (16 Bit) lesen

 

READ_INPUT_REGISTERS

Ein ganzes Eingangsregister (16 Bit) lesen

 

WRITE_SINGLE_COIL

Einzelnes Bit schreiben

 

WRITE_SINGLE_REGISTER

Ein ganzes Register schreiben

 

WRITE_MULTIPLE_COILS

Mehrere aufeinanderfolgende Bits schreiben

 

WRITE_MULTIPLE_REGISTERS

Mehrere aufeinanderfolgende Register schreiben

Register Address Die Modbus-Registeradresse oder Bit-Adresse der Daten, auf die Du zugreifen möchtest. In der Bedienungsanleitung des Slaves findest Du die Information, wie die Register des Slaves belegt sind.

Die Registeradressen sind immer im Zusammenhang mit dem jeweiligen Function Code gültig. Das bedeuted, dass z. B. ein read holding register nr. 17  auf einen anderen Wert zugreift zu als ein read input register nr. 17.

Bitte beachte bzgl. der Registeradresse den Hinweis unterhalb dieser Tabelle!

Quantity of Registers Anzahl der Register(oder Bits) die gelesen/geschrieben werden
Action Interval Der Intervall mit dem der Befehl gesendet wird (in Millisekunden)

Beachte, dass sehr kurze Intervalle bei zu hoher Systemlast nicht eingehalten werden können. Die Befehle werden dann, so schnell es die Gegebenheiten zulassen, gesendet.

Device Value Der Variablenname im RevPi Prozessabbild, in dem das erste Word oder Bit des Modbusbefehls gelesen bzw. geschrieben wird

Stelle sicher, dass sich die einzelnen Befehle nicht überschneiden.
Beispiel: 4 Bytes ab “Output_1” belegen auch “Output_2”, “Output_3” und “Output_4”. Um Überschneidungen zu vermeiden, musst Du in diesem Beispiel den nächsten Befehl auf “Output_5” legen.

HINWEIS
Bei unseren Produkten verwenden wir die 1 als erste Registeradresse. Einige Hersteller verwenden bei Ihren Produkten die 0 als erste Registeradresse.
Prüfe, wie die Adressierung bei Deinem Slave angegeben ist. Wenn der Slave, den Du verwenden möchtest, die 0 als erste Registeradresse verwendet, musst Du bei der Konfiguration zum angegebenen Wert eine 1 addieren.
Beispiel: In der Dokumentation zum Slave steht eine Registeradresse 30053. Die Adressen beginnen laut Doku bei 0. Du verwendest für dieses Register also die Adresse 30054 beim Konfigurieren eines Modbusbefehls.

Klicke auf „Add Row“, um einen weiteren Befehl hinzuzufügen.

Tipp: Du kannst Befehle löschen, indem Du das Auswahlhäkchen am Anfang des Befehls setzt und auf “Remove Selected Rows” klickst.

  • Klicke auf „File>Save“. Damit speicherst Du Deine Datei.
  • Klicke auf „Tools>Reset Driver“. Damit aktivierst Du die Änderungen für den Adapter.
  • Möchtest Du die Einstellungen in logiCAD3 oder C weiter verwenden?
  • Dann klicke auf „File>Export“.

Ein Fenster öffnet sich. Du kannst hier das Format der Datei bestimmen und den Dateinamen angeben.

Du kannst aus 2 Formaten wählen:

Export 01 erzeugt eine Datei, die sich für die Verwendung in logiCAD3 eignet.
Export 02 erzeugt eine Offset Liste, die Du als Basisinformation für ein eigenes C-Programm verwenden kannst.

  • Wähle ein Format aus, mit dem Du weiter arbeiten möchtest.
  • Gib einen Dateinamen an.
  • Klicke auf „Ok“.

Tipp!: 32 Werte sind zu wenig für Dein Projekt? Kein Problem, nimm einfach einen weiteren Master und greife mit diesem auf denselben Slave zu. Schon sind es 64 Werte.

Hilfe! Fehler!

Der Modbus-Master hat vorgegebene Modbus-Register für Statusmeldungen.

Tritt ein Kommunikationsfehler auf, wird der Fehlercode in das Modbus-Register „Modbus_Master_Status“ geschrieben.

Der Fehler bleibt so lange in diesem Register, bis man manuell in das Modbus-Register „Master_Status_Reset“ den Wert „1“ schreibt.

Der Modbus_Master_Status liefert spezifische Fehler in Bezug auf den Modbus-TCP/RTU-Master.

ModbusMaster-Status-Fehlercode Bedeutung
0x00 Kein Fehler
0x10 Modbus tcp/rtu-Gerätekontext kann nicht zugewiesen werden
0x11 Die Verbindung zum Modbus-Master-Gerät ist fehlgeschlagen.
0x12 Aufeinanderfolgende Modbus-Aktionen werden verzögert.
0xf0 Interner Fehler

Um einzelne modbusspezifische Verbindungsfehler (z.B. Slave-Verbindungs-Timeout) zu prüfen, musst Du das Modbus_Action_Status-Register der entsprechenden Aktion lesen.

Beispiel: Wenn ‘n’ Modbus-Aktionen verwendet werden, z.B. Modbus_Action_Status_1 bis Modbus_Action_Status_n für einen bestimmten Slave:

Um die modbusspezifischen Fehler abzufangen (z.B.: CONNECTION RESET BY PEER), musst Du alle ‘n’ Modbus-Aktionsstatusregister überwachen. Das Modbus-Aktionsstatusregister, das der Aktion entspricht, bei der der Fehler aufgetreten ist, wird aktualisiert.

Ein Wert 0x00 für Modbus_Master_Status und auch für alle verwendeten Modbus_Action_Status-Register stellt sicher, dass der gesammelte Wert für die entsprechende Aktion zu diesem Zeitpunkt gültig ist.

Die detaillierten Modbus-Anwendungsfehlerprotokolle findest Du im Systemprotokoll:

tail -f /var/log/daemon.log

Der Modbus-Master kann bis zu 32 Aufgaben übernehmen. Für jede Aufgabe gibt es je ein Register für Status und Status Reset. Tritt ein Fehler in einer Aufgabe auf, wird der Fehlercode in das Modbus-Register „Modbus_Action_Status_[1 … 32]“ geschrieben.

Der Fehler bleibt so lange in diesem Register, bis man manuell in das Modbus-Register „Action_Status_Reset_[1 … 32]“ den Wert „1“ schreibt.

Die Fehlercodes entsprechen den Modbus-Exception-Codes wie sie in der Modbus-Spezifikation angegeben sind.

In der folgenden Tabelle werden die wichtigsten Fehlermeldungen angegeben.

Fehlercode Name Bedeutung
0x01 ILLEGAL FUNCTION Der verwendete Functioncode ist nicht erlaubt. Prüfe, ob Du den richtigen Functioncode verwendest.
0x02 ILLEGAL DATA ADDRESS Die verwendete Modbus-Registeradresse ist nicht gültig. Das Register ist entweder schreibgeschützt oder ungültig. Überprüfe die Registeradresse.
0x03 ILLEGAL DATA VALUE Mindestens ein Teil der verwendeten Datenwerte ist ungültig. Es wäre z. B. möglich, dass Du eine zu hohe Registeranzahl angegeben hast. Prüfe Deine Werte.
0x11 Resource temporarily unavailable
0x12 INVALID CRC Vom Slave wurde ein gestörtes Paket empfangen. Das kann z.B. auftreten nachdem die Verbindung unterbrochen wurde. Prüfe deine Verkabelung.
0x13 INVALID DATA Vom Slave wurde ein unvollständiges Paket empfangen. Das kann z.B. auftreten nachdem die Verbindung unterbrochen wurde. Prüfe deine Verkabelung.
0x104 Connection reset by peer
0x110 CONNECTION TIMED OUT Der Slave hat nicht schnell genug oder gar nicht geantwortet. Prüfe Deine Konfiguration und Verkabelung.

 

Mehr zu diesem Thema findest Du in der Spezifikation von Modbus.