S7

Aus FHEMWiki


S7
Zweck / Funktion
Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM
Allgemein
Typ Gerätemodul
Details
Dokumentation EN / DE
Support (Forum) Sonstige Systeme
Modulname 44_S7.pm
Ersteller Charlie71 (Forum / Wiki)
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!


under Construction

Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung. Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.

  • S7 300/400/WinAC CPU
  • S7 1200/1500 CPU
  • S7 200/LOGO 0BA7


Unterstützte Plattformen

Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.

Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:

Plattfromtestergebnisse:

Plattform Teststatus Bemerkung
ARMv6 passed raspberry pi
AMD64 passed Mintlinux
MIPS passed Fritzbox 7390

FHEM Modul

Das FHEM Modul besteht aus folgenden Dateien:

  • 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.
  • 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen
  • 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen
  • 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen
  • 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen
  • 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)

Installationsanleitung

Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.

Funktionsprinzip

(nur wichtig fürs Basisverständnis) Hier wird die grundsätzliche Funktionsweise des Moduls erklärt: Es lassen sich Lesespeicherblöcke (Readings) und Schreibspeicherblöcke (Writings) konfigurieren.

Lesespeicherblock (SPS --> FHEM): Der konfigurierte Speicherblock wird in diskreten Zeitabständen von der SPS gelesen. Anschließend werden alle Analogen readonly Datenpunkte und alle Digitalen/binary readonly Datenpunkte die an diesem Speicherblock 'hängen' aktualisiert.

Schreibspeicherblock (FHEM --> SPS): Die Schreibspeicherblöcke werden nur 'on demand' an die SPS geschickt. DH wird ein wert eines analogen Datenpunkts (zum Schreiben) geändert so wird der Wert im internen Abbild des Speicherblocks aktualisiert und anschliessend der gesamte Speicherblock zur SPS geschoben.

Aus diesem Konzept ergeben sich folgende Rahmenbedingungen: Ein Speicherbyte in der SPS kann entweder einem Reading oder einem Writing zugeordnet werden. Auf jeden Fall soll vermieden werden, dass ein Byte sowohl Reading gelesen als auch Writing überschrieben wird.

Vorbereitung auf der SPS

Defines (Config)

Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.

Define für das Modul S7

Als ersten Schritt muss eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das S7 Modul.

define <name> S7 <ip_address> <rack> <slot> [<Intervall>]


Parameter:

Parameter Beschreibung
<name> FHEM Name des Devices
<ip_address> IP Adresse der SPS
<rack> hängt von den Einstellungen der SPS ab
<slot> hängt von den Einstellungen der SPS ab
<Intervall> Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)

Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:

$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;

Die LocalTSAP ist fix mit 0x0100 vorgegeben.

Konfigurationsbeispiel

define mySPS S7 10.0.0.241 0 0

Attribute


2) im zweiten Schritt können dann die Speicherblöcke definiert werden die von der SPS gelesen werden sollen. Hierzu sind die folgen Attribute zu setzten (natürlich nur die die man auch benötigt):

ReadDB-Config … used for reading out of DB ReadFlags-Config … used for reading of flag (Merker) ReadInputs-Config … used to read the inputs ReadOutputs-Config … used to read the outputs

Code: [Auswählen] set <name> ReadDB-Config <DB> <STARTPOSITION> <LENGTH> <INTERVAL> [<DB> <STARTPOSITION> <LENGTH> <INTERVAL>]

DB … Number of the DB STARTPOSITION … start byte of the reading LENGTH … number of bytes to be read INTERVAL ... wie oft der Speicherblock von der SPS geholt werden soll (in s)

Anmerkung: Die Speicherblöcke werden alle INTERVAL s von der SPS gelesen und in den interen Buffer geschrieben.

Tipp: Wenn ihr Analoge Daten auf FHEM loggen möchtet, dann ist es sinnvoll eine eigenen Speicherbereich zu definieren, der wesentlich langsamer gelesen wird als digitale Eingänge. Grund: Es wird sonst im logfile sehr viele Daten gespeichert, außerdem benötigt der Aufbau einer Grafik mit vielen Daten sehr lange.


3) im dritten Schritt kann dann ein Schreibspeicherblock über das Attribut WriteDB-Config definiert werden (FHEM → SPS).

Code: [Auswählen] set <name> WriteDB-Config <DB> <STARTPOSITION> <LENGTH> [<DB> <STARTPOSITION> <LENGTH>] DB … Number of the DB STARTPOSITION … start byte of the writing LENGH … number of bytes to be write

Das Modul erzeugt intern einen Speicherblock in diesem speicher werden alle Writeoperationen durchgeführt. Anschliessend wird immer der gesamte Speicherblock zur SPS geschoben.

nun ist das physikalische Modul fertig. Un nun kann man die logischen Module einrichten:

Digitale readonly Datenpunkte

S7_DRead Mit diesem Modul kann man ein Bit aus der S7 auslesen.

Code: [Auswählen] define <name> S7_DRead {inputs|outputs|flags|db} <DB> <address>

inputs|outputs|flags|db … defines where to read. DB … Number of the DB address … Speicheradresse die gelesen werden soll. Beispiel: 942.3

Analoge readonly Datenpunkte

S7_ARead Mit diesem Mudul kann man integer/float Werte von der SPS lesen: Code: [Auswählen] define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}


inputs|outputs|flags|db … defines where to read. DB … Number of the DB start … start byte of the reading {u8|s8|u16|s16|u32|s32} … defines the datatype: u8 …. unsigned 8 Bit integer s8 …. signed 8 Bit integer u16 …. unsigned 16 Bit integer s16 …. signed 16 Bit integer u32 …. unsigned 32 Bit integer s32 …. signed 32 Bit integer float …. float (4Byte)

Digitale Datenpunkte zum Schreiben

S7_DWrite Mit diesem logischen Modul kann man ein bit in einem DB setzen.

Code: [Auswählen] define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <address>

inputs|outputs|flags|db … defines where to write. DB … Number of the DB address … Speicheradresse die geschrieben werden soll. Beispiel: 945.8

Note: the required memory area need to be within the configured PLC writing of the physical modul.

Zum Setzen/löschen eines Bits kann man wie folgt vorgehen: Code: [Auswählen] set <name> S7_AWrite {ON|OFF|TRIGGER}

Anmerkung: Mit dem TRIGGER wird das Bit 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).

Analoge Datenpunkte zum Schreiben

S7_AWrite Mit diesem Modul kann man integer Werte zur SPS übertragen. Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.

Code: [Auswählen] define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}

inputs|outputs|flags|db … defines where to write. DB … Number of the DB start … start byte of the writing {u8|s8|u16|s16|u32|s32} … defines the datatype: u8 …. unsigned 8 Bit integer s8 …. signed 8 Bit integer u16 …. unsigned 16 Bit integer s16 …. signed 16 Bit integer u32 …. unsigned 32 Bit integer s32 …. signed 32 Bit integer float …. float (4 Bytes)

Zum Setzen eines Analog Wertes kann man wie folgt vorgehen: Code: [Auswählen] set <name> S7_AWrite <value>

value … an numeric value Beispiel: Code: [Auswählen] set temperatursollwert 334


Defines Siemens LOGO!

Configurationsbeispiele

Versionshistory

V1.15

  • PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks

New Feature

  • New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value
  • New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown
  • fix für simple config LOGO8
  • cleanup logging info

V1.14

  • Fehler in recreation behoben. (IMPORTANT FIX!!!!)
  • PLC reconnection function improved
  • Minor Fix for Logo addressing
  • Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen

V1.13

  • Fix für multiple Writings
  • Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden

(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)

  define Q1_Logo2 S7_DRead Q1
  define Q2_Logo2 S7_DWrite Q2

alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.

V1.12

  • Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen
  • Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!

New Features:

  • Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:
  define logo2 S7 LOGO7 10.0.0.242
  define logo3 S7 LOGO8 10.0.0.243

alle internen Settings werden dann automatisch generiert. V1.11

  • libnodave timeout is set now to 500ms
  • the bocklength is now checked against the maxPDUlength

V1.10

  • now also float data can be read and written
  • I have changed the addressing of the bit readings:

Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817. NEW you can address it directly. Example Code: [Auswählen] define Logo7_Q1 S7_DRead db 0 942.1

Note: The module detects if you are using the old syntax. Therfore no config changes are required.

V1.9

  • now support multiple writing config

V1.8

  • changed bufferhandling (this should fix the timeout error)
  • now supports u8, u32, s8, s16, s32 writing

V1.7

  • Support for more then one PLC activated

V1.6

  • New Feature "connections to one than one PLC" deactivated

V1.5 New Feature

  • Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)

Fixes

  • fix for recoonection includes (many thanks to thmarx)
  • doku more FHEM conform (many thanks to Cnetrwal)
  • some minor fixes

V1.4 Fix für multiple reading

V1.3 Fix für multiple reading

V1.2

  • Fixes von "Cnetrwal" merged (many thanks)
  • Automatisches Reconnect wenn ein reading fehlschlägt

V1.1

  • support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)
  • supports reading fram addresses > 1024 (requirement for 0BA8)
  • Take care Configuration Change is needed if upgrading from V1.0:

a) you have to add a reading interval in the modul S7 modul definition after the portNo example:

   oldConfig: S7 2 0 10.0.0.241 0 0 102 960
   newConfig: S7 2 0 10.0.0.241 0 0 102 2 960

2 ... means that every 2 seconds the requirement for a PLC reading is checked b) you have to add at reading attribute of the S7 modul the reading intervall:

  oldConfig: attr logo ReadDB-Config 0 0 8 
  newConfig: attr logo ReadDB-Config 0 0 8 300 

300 ... means that all 5min the modul reads the data from the PLC

(modul S7 interval in define as well as reading attribute for S7 modul)

V1.0 Erstversion