Siemens S7 mit Arduino und Modbus

Da wir in der Technikerschule (leider) eine S7-SPS einsetzen, musste ich meine Kenntnisse wieder etwas auffrischen. Was bietet sich da besser an, als die S7 mit einem Mikrocontroller zu verbinden?

Ich habe mir ein Gehäuse für die S7 gekauft und ein paar Taster/LEDs eingebaut. Im Gehäuse findet eine S7-1200 (1211C - kostet ca. 160€ ohne Software), Klemmen, ein Netzwerk-Switch und die Ansteuerplatine für die Taster/LEDs inklusive Arduino Platz. Natürlich habe ich zum nachrüsten noch etwas Platz gelassen und auch Anschlüsse vorbereitet.

Auf der Ansteuerplatine befindet sich ein Arduino, ein Schaltregler (24V→5V), ein 433Mhz Sender, ein 433Mhz Empfänger, ein MOSFET für die Beleuchtung und das ENC28J60-Modul (für wenige € aus China) für Ethernet.

Das ganze funktioniert erstaunlich gut. Ich habe zwar keine Tests gemacht, was das Antwortverhalten angeht, aber rein subjektiv ist das ganze echt flott. Wenn ich einen Taster auf die LED verknüpfe, dann kann man an der LED während des Drückens das Prellen als Blinken wahrnehmen (Merke: Das nächste mal hochwertigere Taster nehmen :-D).

Einzige Ausnahme ist das Versenden von einem 433Mhz Funksignal. Da die Bibliothek synchron, mit Warteschleifen funktioniert, entstehen beim Senden Verzögerungen von einigen ms. Das ist noch etwas unschön. Mal schauen, vielleicht kann man die Bibliothek umbauen, dass das Senden auch asynchron funktioniert.

Modbus kann man seriell (RTU) oder über Ethernet (TCP) verwenden. Da meine SPS eine Ethernet-Schnittstelle besitzt, verwende ich die TCP-Variante.

Modbus unterstützt folgende Registertypen:

Registertyp Benutzung Zugriff
Coil Digital Output Read/Write
Holding Register Analog Output Read/Write
Input Status Digital Input Read Only
Input Register Analog Input Read Only

Diese können über Modbus-Funktionen aufgerufen werden. Digital-Werte entsprechen immer einem Bit, während analoge Werte 16-Bit entsprechen.

Die Arduino-Bibliothek unterstützt folgende:

  • 0x01 - Read Coils
  • 0x02 - Read Input Status (Read Discrete Inputs)
  • 0x03 - Read Holding Registers
  • 0x04 - Read Input Registers
  • 0x05 - Write Single Coil
  • 0x06 - Write Single Register
  • 0x0F - Write Multiple Coils
  • 0x10 - Write Multiple Registers

Als Software zum Testen von Modbus kann ich QModMaster empfehlen. Damit habe ich die Funktionsfähigkeit der Arduino-Software getestet.

Es ist auf jeden Fall ratsam die (intigrierte) Hilfe von Siemens zum MB_CLIENT anzusehen, da dort sehr viele wichtige Punkte zur Implementierung enthalten sind. Dort wird beispielsweise erwähnt wie die Modbus-Funktionen in dem Baustein umgesetzt und beschaltet werden:

MB_MODE Modbus-Funktion Datenlänge Funktion und Datentyp MB_DATA_ADDR
0 1 1 bis 2000 Output-Bits lesen: 1 bis 2000 Bits pro Aufruf 1 bis 9999
0 2 1 bis 2000 Input-Bits lesen: 1 bis 2000 Bits pro Aufruf 10001 bis 19999
0 3 1 bis 125 Halteregister lesen: 1 bis 125 WORD pro Aufruf 40001 bis 49999
0 4 1 bis 125 Input-Wörter lesen: 1 bis 125 WORD pro Aufruf 30001 bis 39999
1 5 1 Ein Output-Bit schreiben: Ein Bit pro Aufruf 1 bis 9999
1 6 1 Ein Halteregister schreiben: 1 WORD pro Aufruf 40001 bis 49999
1 15 2 bis 1968 Mehrere Output-Bits schreiben: 2 bis 1968 Bits pro Aufruf 1 bis 9999
1 16 2 bis 123 Mehrere Halteregister schreiben: 2 bis 123 WORD pro Aufruf 40001 bis 49999
2 15 1 bis 1968 Ein oder mehrere Output-Bits schreiben: 1 bis 1968 Bits pro Aufruf 1 bis 9999
2 16 1 bis 123 Ein oder mehrere Halteregister schreiben: 1 bis 123 WORD pro Aufruf 40001 bis 49999

Es kommen folgende Bibliotheken für das Arduino zum Einsatz:

Die Modbus-Bibliothek wird scheinbar leider vom Author nicht mehr weiterentwickelt. Daher muss man zwei Patches anwenden, damit alles korrekt funktioniert:

Code

program.ino

Zur Programmierung der S7 habe ich das TIA-Portal V13 verwendet. Ich verwende die auf ein Jahr begrenzte Version, welche ich von meiner Schule erhalten habe. Im S7-Starterkit ist die Software aber ebenfalls enthalten.

Ich habe die ganze Logik zur Kommunikation in einen Baustein (FB) gepackt. Dieser sieht bei mir aktuell so aus:

Bei der Erstellung des Bausteins muss Beachtet werden, dass beim FB der “Optimierte Bausteinzugriff” deaktiviert ist (Rechtsklick auf Baustein → Eigenschaften). Dies wird von der Modbus-Funktion in S7 so gefordert.

Leider zählt Siemens die Modbus-Adressen anders, weshalb überall eine 1 dazuaddiert wird (siehe Quelltext). Zusätzlich zum MB_DATA_ADDR von der Tabelle oben.

Variablentabelle

Source

Entschuldigt bitte den etwas verwirrenden Schaltplan. Aber ich wusste auf die schnelle nicht, wie ich ihn Übersichtlicher machen kann.


Tests mit unbefestigter Platine


Tests mit unbefestigter Platine

Gehäuse

Download

Deckel

Download

Die SCL-Datei kann in TIA-Portal im Projektbaum unter “externe Quellen” hinzugefügt werden und dann per Kontextmenü entpackt werden.


Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information