S7
S7 | |
---|---|
Zweck / Funktion | |
Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM | |
Allgemein | |
Typ | Inoffiziell |
Details | |
Dokumentation | siehe Forum |
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! |
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)
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem Beitrag zum Download bereit.
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:
Das Modul liest in fixen Zeitabständen die Konfiguration der Clientmodule (S7_ARead, S7_AWrite, S7_DRead, D7_DWrite) für jede konfigurierte SPS ein. diese werden nach
1) area (inputs, outputs, merker, DB)
2) nach DB
3) nach Startbyte
sortiert. Daraus werden Leseblöcke abgeleitet, die dann von der SPS geholt werden. Danach werden die Clientmodule mit den aktualisierten Werden versorgt.
Wenn man auf die Writer schreibend zugreift, so wird unmittelbar die entsprechenden Bits/Bytes in der SPS gesetzt.
Vorbereitung auf der SPS
Die SPS muss für die Verbindung mit FHEM vorbereitet werden. Die SPS benötigt selbstverständlich eine fixe IP Adresse.
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:
- Es sollten alle Verbindungen akzeptiert werden (Wenn die Verbindung erfolgreich aufgebaut werden kann kann die IP natürlich auf den FHEM Server eingeschränkt werden.)
- Die Remote TSAP von FHEM beträgt defaultmäßig 01.00
Die weitere Vorgehensweise hängt nun von der SPS ab: Es muss nun entweder Rack und Slot der SPS für die Konfig notiert werden oder es muss eine lokale TSAP festgelegt werden. Aus dieser lokale TSAP muss dann rack und slot nach folgenden Zusammenhang berechnet werden:
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;
Anmerkung: Bei Verwendung einer Siemens Logo wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)
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. Es müssen die Attribute für Read* und Write* konfiguriert werden.
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
Digitale readonly Datenpunkte
Mit diesem Modul kann man ein Bit aus der S7 auslesen.
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress>
Parameter:
Parameter | Beschreibung |
---|---|
<name> | FHEM Name des digitalen Datenpunktes |
outputs|flags|db | wählt den Bausteintyp auf der SPS aus |
<DB> | Nummer des Datenbausteins |
<byteadresse>.<bitadress> | Adresse des zu lesenden Bits |
Konfigurationsbeispiel
define Lampe S7_DRead db 0 95.3
Analoge readonly Datenpunkte
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}
Parameter:
Parameter | Beschreibung |
---|---|
<name> | FHEM Name des digitalen Datenpunktes |
outputs|flags|db | wählt den Bausteintyp auf der SPS aus |
<DB> | Nummer des Datenbausteins |
<start> | Adresse des ersten Bytes |
s8|u16|s16|u32|s32|float | Datentyp des Datenpunkts:
u8 = unsigned char , 1 Byte , 0 to 255 s8 = signed char , 1 Byte , -128 to 127 u16 = unsigned int , 2 Byte , 0 to 65,535 s16 = signed int , 2 Byte , -32,768 to 32,767 u32 = unsigned long , 4 Byte , 0 to 4,294,967,295 s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647 float = float , 4 Byte , 1.2E-38 to 3.4E+38 |
Konfigurationsbeispiel
define Innentemperatur S7_ARead db 0 44 float
Attribute
Parameter | Beschreibung |
---|---|
multiplicator | Dient zur Berechnung des angezeigten Wertes:
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset |
offset | Dient zur Berechnung des angezeigten Wertes. |
Anmerkung: Es werden auch Standardattribute unterstützt (zb: event-min-interval, event-min-interval, stateFormat, ...).
Um Einheiten anzeigen zu lassen kann stateFormat wie folgt verwendet werden, ZB:
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}
Digitale Datenpunkte zum Schreiben
Mit diesem logischen Modul kann man ein bit in einem DB setzen.
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress>
Parameter:
Parameter | Beschreibung |
---|---|
<name> | FHEM Name des digitalen Datenpunktes |
outputs|flags|db | wählt den Bausteintyp auf der SPS aus |
<DB> | Nummer des Datenbausteins |
<byteadresse>.<bitadress> | Adresse des zu schreibenden Bits |
Konfigurationsbeispiel
define Brenner_Ein S7_DWrite db 0 5.7
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.
Setter
Befehl | Beschreibung |
---|---|
set | schreibender Zugriff
ON ... setzt dieses Bit OFF ... löscht dieses Bit TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW). |
Analoge Datenpunkte zum Schreiben
Mit diesem Modul kann man integer Werte zur SPS übertragen. Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}
Parameter:
Parameter | Beschreibung |
---|---|
<name> | FHEM Name des digitalen Datenpunktes |
outputs|flags|db | wählt den Bausteintyp auf der SPS aus |
<DB> | Nummer des Datenbausteins |
<start> | Adresse des ersten Bytes |
s8|u16|s16|u32|s32|float | Datentyp des Datenpunkts:
u8 = unsigned char , 1 Byte , 0 to 255 s8 = signed char , 1 Byte , -128 to 127 u16 = unsigned int , 2 Byte , 0 to 65,535 s16 = signed int , 2 Byte , -32,768 to 32,767 u32 = unsigned long , 4 Byte , 0 to 4,294,967,295 s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647 float = float , 4 Byte , 1.2E-38 to 3.4E+38 |
Konfigurationsbeispiel
define Brennersollwert S7_AWrite db 0 601 float
Setter
Befehl | Beschreibung |
---|---|
set | schreibender Zugriff mit einer Zahl als Parameter. |
Defines Siemens LOGO!
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax. Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das S7 Modul.
define <name> S7 {LOGO7|LOGO8} <ip_address>
Parameter:
Parameter | Beschreibung |
---|---|
<name> | FHEM Name des Devices |
LOGO8 | SPS Typ |
<ip_address> | IP Adresse der SPS |
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.
Konfigurationsbeispiel
define myLogo S7 LOGO7 10.0.0.243
Attribute
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden. Anmerkung: Die Reading Konfigurationen für Eingänge/Ausgänge und Merker werden automatisch eingerichtet wenn ein Entsprechendes S7_DRead oder S7_DWrite Modul angelegt wird.
Digitale readonly Datenpunkte
Mit diesem Modul kann man ein Bit aus der S7 auslesen.
define <name> S7_DRead {I|Q|M|NI|NQ}1..24
Parameter:
Parameter | Beschreibung |
---|---|
<name> | FHEM Name des digitalen Datenpunktes |
I,Q,M,NI,NQ 1..24 | Auswahl des binären Datenpunktes* |
Wichtig: NI, NQ ... nur LOGO8
Konfigurationsbeispiel
define Lampe S7_DRead I5
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.
Digitale Datenpunkte zum Schreiben
Mit diesem logischen Modul kann man ein bit in einem DB setzen.
define <name> S7_DWrite {I|Q|M|NI|NQ}1..24
Parameter:
Parameter | Beschreibung |
---|---|
<name> | FHEM Name des digitalen Datenpunktes |
I,Q,M,NI,NQ 1..24 | Auswahl des binären Datenpunktes |
NI,NQ ... nur für LOGO8
Konfigurationsbeispiel
define Brenner_Ein S7_DWrite M7
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.
Setter
Befehl | Beschreibung |
---|---|
set | schreibender Zugriff
ON ... setzt dieses Bit OFF ... löscht dieses Bit TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW). |
Analoge Datenpunkte
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.
S7-300 Beispielconfig
Die Konfiguration der S7 unten ist gültig bis V2.3. Die aktuelle Version ist V2.4, sobald diese (oder die nächste) Version stabil läuft, wird das WIKI entsprechend angepasst.
S7-318 CPU mit Ethernet CP 343-1, IP-Adresse: 192.168.1.101, R0S2 (Rack 0, Slot 2 aus der Step 7 HW-Config) 4 Kommunikations-DBs, DB20 und DB21 werden jede Sekunde gelesen:
DB20 (symbolischer Name: ANALOG_AN_FHEM = aus Sicht der S7), Länge: 8 byte, Adresse 0.0: Temperatur (REAL), Adresse 4.0: Feuchte (REAL) Hier legt die S7 die Gleitpunktzahlen ab, die in FHEM angezeigt/ verarbeitet werden sollen, z.B. den Wert eines PT100 Fühlers, der an einem Analogeingangsmodul der S7 hängt
DB21 (symbolischer Name: BINAER_AN_FHEM = aus Sicht der S7), Länge: 2 byte, Adresse 0.0: Ausgang 1 (BOOL), Adresse 0.1: Ausgang 2 (BOOL) ... Adresse 1.7: Ausgang 16 (BOOL) Hier legt die S7 die Binärwerte ab, die in FHEM angezeigt/ verarbeitet werden sollen, z.B. den Digitalausgang zum Ansteuern einer Pumpe (Anzeige) oder das Betätigen eines Tasters (Digitaleingang)
DB22 (symbolischer Name: ANALOG_VON_FHEM = aus Sicht der S7), Länge: 8 byte, Adresse 0.0: Temperatur_Sollwert (REAL), Adresse 4.0: Außentemperatur aus dem WWW (REAL, über das Weather Modul) Hier legt FHEM die Gleitpunktzahlen ab, die in der S7 angezeigt/ verarbeitet werden sollen, z.B. den Wert eines Sliders zur Sollwertkorrektur (-3..+3)
DB23 (symbolischer Name: BINAER_VON_FHEM = aus Sicht der S7), Länge: 2 byte, Adresse 0.0: Licht 1 (BOOL), Adresse 0.1: Licht 2 (BOOL) ... Adresse 1.7: Licht 16 (BOOL) Hier legt FHEM die Binärwerte ab, die in der S7 angezeigt/ verarbeitet werden sollen, z.B. um neben einem echten Hardwaretaster über FHEM Licht zu schalten
fhem.cfg
# S7 Kommunikation define myS7 S7 192.168.1.101 0 2 attr myS7 ReadDB-Config 20 0 8 1 21 0 2 1 attr myS7 WriteDB-Config 22 0 8 23 0 2 # Lichttaster an S7 schaltbar über Icon define Taster_Icon S7_DWrite db 23 0.0 attr Taster_Icon IODev myS7 attr Taster_Icon devStateIcon .*:toggle:TRIGGER # Rueckmeldung, ob der Digitalausgang gesetzt wurde define Rueckmeldung S7_DRead db 21 0.0 attr Rueckmeldung IODev myS7 # Temperatur aus der S7 in FHEM anzeigen define Temperatur S7_ARead db 20 0 float attr Temperatur IODev myS7 # Sollwertkorrektur über Slider an S7 schicken define Temperaturkorrektur S7_AWrite db 22 0 float attr Temperaturkorrektur IODev myS7 define Temperaturkorrektur_Slider dummy attr Temperaturkorrektur_Slider setList state:slider,-3.0,0.5,3.0,1 attr Temperaturkorrektur_Slider webCmd state define Temperaturkorrektur_Slider_notify notify Temperaturkorrektur_Slider {\ fhem "set Temperaturkorrektur ".ReadingsVal("Temperaturkorrektur_Slider","state","0");;\ } # Temperatur aus dem Web and S7 schicken define Wetter Weather 00000000 1800 de define Temp_AU_Web S7_AWrite db 22 4 float attr Temp_AU_Web IODev myS7 define Temp_AU_Web_notify notify Wetter {\ fhem "set Temp_AU_Web ".ReadingsVal("Wetter","temp_c","10");;\ }
Versionshistory
V2.2
- Fix: for Multi DB configurations
- Fix: FHEM does not chrash if PLC is not available
- New Feature for Logo 8: Now NI and NQ for simply config method is supported
V2.1
- Fix: DB > 0 are working
- Fix: AnalogRead und Analog Write
V2.00
- keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt.
Achtung: die Konfigurationssyntax des Moduls hat sich geändert!!!!
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
Links
- Thema zum Download, Entwicklung und Support des Moduls