S7: Unterschied zwischen den Versionen

Aus FHEMWiki
(Randnotizen eingefügt)
 
(30 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:


{{Infobox Modul
{{Infobox Modul
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM
|ModPurpose=Dieses Modul dient der Integration von Simatic/S7/Logo!/S5 Steuerungen in FHEM.
|ModType=x
|ModType=d
|ModCmdRef=S7
|ModCmdRef=S7
|ModForumArea=Sonstige Systeme
|ModForumArea=Sonstige Systeme
Zeile 8: Zeile 8:
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum]  / [[Benutzer Diskussion:Charlie71|Wiki]])}}
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum]  / [[Benutzer Diskussion:Charlie71|Wiki]])}}


Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.
Die Familie von Siemens Simatic und Logo! Geräten sind Speicherprogrammierbare Steuerungen (SPS/PLC). Dieses Modul unterstützt folgende Siemens Steuerungen über die Ethernet Schnittstelle:
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.
* '''S7''' 300/400/WinAC CPU,
 
* '''S7''' 1200/1500 CPU,
* S7 300/400/WinAC CPU
* '''S7''' 200,
* S7 1200/1500 CPU
* '''LOGO''' 0BA7,
* S7 200/LOGO 0BA7
* '''WINLC''' RTX 4.5
bzw. über die PG-Schnittstelle:
* '''S5''' 90/95/10x/110/115/135/150/155.




== Unterstützte Plattformen ==
== Unterstützte Plattformen ==
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.
Ab der Version V2.0 werden alle Plattformen auf denen FHEM läuft unterstützt. Plattformen auf denen das Modul bereits erfolgreich getestet wurde:
 
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:
 
'''Plattfromtestergebnisse:'''


{| class="wikitable sortable"
{| class="wikitable sortable"
Zeile 32: Zeile 30:
|-
|-
|MIPS||passed||Fritzbox 7390
|MIPS||passed||Fritzbox 7390
|-
|Linux amd64||passed||Mint Linux17.1
|-
|Windows||passed||Windows8.1
|}
|}


== FHEM Modul ==
== FHEM Modul ==
Das FHEM Modul besteht aus folgenden Dateien:
Das FHEM Modul besteht aus diesen 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 {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.
{| class="wikitable sortable"
|-
! Datei !! class="unsortable"  | Beschreibung
|-
|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||erstellen von readonly analogen Datenpunkten
|-
|44_S7_AWrite.pm||erstellen von analogen Datenpunkten zum Schreiben in den SPS-Speicher
|-
|44_S7_DRead.pm||erstellen von digitalen/binary readonly Datenpunkt
|-
|44_S7_DWrite.pm||erstellen von digitalen/binary Datenpunkten zum Schreiben
|-
|44_S7_Client.pm||Dieses Modul beinhaltet die S7 Protokolle. Es basiert auf Snap7 - Settimino.
|}


== Installationsanleitung ==
== Installationsanleitung ==
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.
Die Module sind bei einem aktuellen Updatestand von FHEM standardmäßig installiert. Darum sind grundsätzlich keine Installationsarbeiten notwendig nachdem FHEM durch [[update]] aktualisiert wurde. Eine Erfolgskontrolle des S7-Define und damit der erfolgreichen Verbindung zur SPS ist im Abschnitt Unsorted des FHEM-Webinterfaces möglich:
 
[[File:connected.png]]


== Funktionsprinzip ==
== Funktionsprinzip ==
(nur wichtig fürs Basisverständnis)
Das Modul liest in festen Zeitabständen die Konfiguration der Clientmodule S7_ARead, S7_AWrite, S7_DRead und D7_DWrite für jede konfigurierte SPS ein. Per Voreinstellung wird jede Sekunde geprüft, ob ein Speicherblock zu lesen ist. Diese werden nach:
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:
* area (inputs, outputs, merker, DB),
 
* nach DB,
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.
* und nach Startbyte sortiert. {{Randnotiz | RNTyp=y | RNText=Diese zyklische Abfrage kann zu Geschwindigkeitsproblemen auf dem FHEM-Host führen. Um die Geschwindigkeit des Moduls und damit von FHEM zu optimieren, sollten die Attribute ''''on-change-reading'''' und ''''event-min-interval'''' stets verwendet werden. Besonders bei digitalen Datenpunkten sollte FHEM nur bei Statusänderungen einen Event feuern. Konfigurations-Beispiele sind weiter unten aufgeführt.}}
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:
Aus dem Ergebnis werden Leseblöcke abgeleitet, die dann von der SPS geholt werden. Danach werden die Clientmodule mit den aktualisierten Werten versorgt. Wenn man auf die Writer schreibend zugreift, so wird unmittelbar die entsprechenden Bits/Bytes in der SPS gesetzt.  
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;
== Vorbereitung ==
Außer die S5 müssen die Steuerungen für die Verbindung mit FHEM vorbereitet werden. Die SPS benötigt eine feste IP Adresse. Weiters muss eine Serververbindung auf der SPS eingerichtet werden. Diese kann so konfiguriert werden:


''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)
* Alle Verbindungen zunächst akzeptieren, wenn die Verbindung erfolgreich aufgebaut werden kann, ist es möglich die IP  auf den FHEM Server einzuschränken.
* Die voreingestellte Remote TSAP von FHEM ist 01.00.
* Die weitere Vorgehensweise hängt nun von der SPS ab. Es muss nun entweder Rack und Slot der SPS für die Konfiguration notiert werden oder es muss eine lokale TSAP festgelegt werden. Aus dieser lokalen TSAP muss dann rack und slot nach folgenden Zusammenhang berechnet werden:


== Defines (Config) ==
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.


=== Define für das Modul S7 ===
* Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen, dass eine lokale TSAP  von 02.00 mit Hilfe des Operatorpanels konfiguriert wurde.
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>]
== Define für Steuerungen der S7-Familie ==
Im ersten Schritt muss mit Hilfe des '''S7''' Moduls eine Verbindung mit der SPS eingerichtet, danach die die Attribute für Read* und Write* konfiguriert werden.


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


'''Parameter:'''
'''Parameter:'''
Zeile 96: Zeile 90:
! Parameter !! class="unsortable"  | Beschreibung  
! Parameter !! class="unsortable"  | Beschreibung  
|-
|-
|<name>||FHEM Name des Devices
|<Name>||FHEM Name des Devices
|-
|-
|<ip_address>||IP Adresse der SPS
|<ip_address>||IP Adresse der SPS
Zeile 107: Zeile 101:
|}
|}


Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:
Aus dem rack und dem slot Parameter berechnet das Modul die Remote TSAP:
 
  $RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;
  $RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;
Die LocalTSAP ist fix mit 0x0100 vorgegeben.
Die LocalTSAP ist fix mit 0x0100 vorgegeben.


Zeile 114: Zeile 110:
  define mySPS S7 10.0.0.241 0 0
  define mySPS S7 10.0.0.241 0 0


==== Attribute ====
=== Attribute ===
{| class="wikitable sortable"
|-
! Parameter !! Beschreibung
|-
|MaxMessageLength||Damit kann die maximale Telegrammlänge kleiner als die beim Verbindungsaufbau vereinbarte PDU Länge gesetzt werden.
|
|}


=== Digitale readonly Datenpunkte ===
=== Digitale readonly Datenpunkte ===
Mit diesem Modul kann man ein Bit aus der S7 auslesen.
Mit diesem Modul kann man ein Bit aus der S7 auslesen.


  define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress>
  define <Name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress>


'''Parameter:'''
'''Parameter:'''
Zeile 126: Zeile 129:
! Parameter !! class="unsortable"  | Beschreibung  
! Parameter !! class="unsortable"  | Beschreibung  
|-
|-
|<name>||FHEM Name des digitalen Datenpunktes
|<Name>||FHEM Name des digitalen Datenpunktes
|-
|-
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus
|-
|-
|<DB>||Nummer des Datenbausteins
|<DB>|| für inputs, outputs, flags stets 0, sonst Nummer des Datenbausteins
|-
|-
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits
Zeile 139: Zeile 142:


=== Analoge readonly Datenpunkte ===
=== Analoge readonly Datenpunkte ===
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:
Mit diesem Modul 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}
  define <Name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}


'''Parameter:'''
'''Parameter:'''
Zeile 148: Zeile 151:
! Parameter !! class="unsortable"  | Beschreibung  
! Parameter !! class="unsortable"  | Beschreibung  
|-
|-
|<name>||FHEM Name des digitalen Datenpunktes
|<Name>||FHEM Name des digitalen Datenpunktes
|-
|-
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus
|-
|-
|<DB>||Nummer des Datenbausteins
|<DB>||für inputs, outputs, flags stets 0, sonst Nummer des Datenbausteins
|-
|-
|<start>||Adresse des ersten Bytes
|<start>||Adresse des ersten Bytes
Zeile 187: Zeile 190:
|}
|}


Anmerkung: Es werden auch Standardattribute unterstützt (zb: event-min-interval, event-min-interval, stateFormat, ...).
Standardattribute  wie event-min-interval, event-min-interval, stateFormat usw. werden unterstützt. Um Einheiten anzuzeigen, kann stateFormat verwendet werden. Exemplarisches Beispiel:


Um Einheiten anzeigen zu lassen kann stateFormat wie folgt verwendet werden, ZB:
  attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}
  attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}


=== Digitale Datenpunkte zum Schreiben===
=== Digitale Datenpunkte zum Schreiben===
Mit diesem logischen Modul kann man ein bit in einem DB setzen.
Mit diesem logischen Modul kann man ein Bit setzen.


  define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress>
  define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress>
Zeile 206: Zeile 208:
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus
|-
|-
|<DB>||Nummer des Datenbausteins
|<DB>||für inputs, outputs, flags stets 0, sonst Nummer des Datenbausteins
|-
|-
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits
Zeile 214: Zeile 216:
  define Brenner_Ein S7_DWrite db 0 5.7
  define Brenner_Ein S7_DWrite db 0 5.7


Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.
Geschwindigkeitsoptimierung:
 
    attr Brenner_Ein event-min-interval .*:600
    attr Brenner_Ein event-on-change-reading state
 
Nur wenn sich der Status (state) ändert wird ein Event gefeuert (''event-on-change-reading state''), aber alle 600s wird auf jeden Fall ein Event gefeuert (''event-min-interval .*:600'').


Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen. Darf also nicht vom SPS-Programm beschrieben werden.
==== Attribute ====
{| class="wikitable sortable"
|-
! Parameter !! Beschreibung
|-
|trigger_length||Damit kann die Länge in [s] des Triggerimpulses gesetzt werden. Devault Value = 1s
|}
==== Setter ====
==== Setter ====
{| class="wikitable sortable"
{| class="wikitable sortable"
Zeile 227: Zeile 242:
OFF ... löscht dieses Bit
OFF ... löscht dieses Bit


TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).
TRIGGER ... Das Bit wird für <trigger_length>s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).
|-
|-
|}
|}


=== Analoge Datenpunkte zum Schreiben===
=== Analoge Datenpunkte zum Schreiben===
Mit diesem Modul kann man integer Werte zur SPS übertragen.
Mit diesem Modul kann man integer Werte zur SPS übertragen. Unsigned Integer müssen sich im Bereich von 0 – 32767 befinden.
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}
  define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}
Zeile 246: Zeile 260:
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus
|-
|-
|<DB>||Nummer des Datenbausteins
|<DB>||für inputs,outputs,flags stets 0, sonst Nummer des Datenbausteins
|-
|-
|<start>||Adresse des ersten Bytes
|<start>||Adresse des ersten Bytes
Zeile 278: Zeile 292:
|}
|}


== Defines Siemens LOGO! ==
== Defines für die Siemens LOGO! ==
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.
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.
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.  
Es wird eine Verbindung mit der SPS über das S7-Modul eingerichtet.


  define <name> S7 {LOGO7|LOGO8} <ip_address>
  define <name> S7 {LOGO7|LOGO8} <ip_address>


'''Parameter:'''
'''Parameter:'''
Zeile 298: Zeile 310:
|<ip_address>||IP Adresse der SPS
|<ip_address>||IP Adresse der SPS
|}
|}
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.




Zeile 306: Zeile 316:


==== Attribute ====
==== Attribute ====
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.
Es können die selben Attribute, wie für die S7-Familie beschrieben, verwendet werden. Die Reading Konfigurationen für Eingänge/Ausgänge und Merker werden automatisch eingerichtet, wenn ein entsprechendes S7_DRead oder S7_DWrite Modul angelegt 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 ===
=== Digitale readonly Datenpunkte ===
Mit diesem Modul kann man ein Bit aus der S7 auslesen.
Mit diesem Modul kann man ein Bit aus der Logo auslesen.


  define <name> S7_DRead {I|Q|M|NI|NQ}1..24
  define <name> S7_DRead {I|Q|M|NI|NQ}1..24
Zeile 329: Zeile 338:
  define Lampe S7_DRead I5
  define Lampe S7_DRead I5


Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.
Es wird wenn nötig eine entsprechende Reader Config für das Basismodul angelegt.


=== Digitale Datenpunkte zum Schreiben===
=== Digitale Datenpunkte zum Schreiben===
Mit diesem logischen Modul kann man ein bit in einem DB setzen.
Mit diesem logischen Modul kann man ein Bit in einem DB setzen.


  define <name> S7_DWrite {I|Q|M|NI|NQ}1..24
  define <name> S7_DWrite {I|Q|M|NI|NQ}1..24
Zeile 350: Zeile 359:
'''Konfigurationsbeispiel'''
'''Konfigurationsbeispiel'''
  define Brenner_Ein S7_DWrite M7
  define Brenner_Ein S7_DWrite M7
{{Randnotiz | RNTyp= r | RNText=Wichtig ist es, auf die Eingänge der Logo nicht schreibend zugreifen. Die Logo liest das Eingangswort zu Beginn eines Verarbeitungszyklus von der HW ein (= Eingangsabbild). Wenn das Programm ausgeführt wird, wird ausschließlich auf dieses Eingangsabbild zugegriffen. Ein Netzwerkzugriff kann somit die Eingänge nicht direkt beeinflussen. Aus diesem Grund Netzwerk Eingänge (NI) verwenden!}}
Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.
Geschwindigkeitsoptimierung:
    attr Brenner_Ein event-min-interval .*:600
    attr Brenner_Ein event-on-change-reading state


Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.
Nur wenn sich der Status (state) ändert wird ein Event gefeuert (''event-on-change-reading state''), aber alle 600s wird auf jeden Fall ein Event gefeuert (''event-min-interval .*:600'').


==== Setter ====
==== Setter ====
Zeile 370: Zeile 388:
=== Analoge Datenpunkte ===
=== Analoge Datenpunkte ===
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.
== Defines für die Siemens S5-Familie ==
Für die Verbindung der Siemens S5 wird auch das S7-Modul benutzt. Die von FHEM verwendete serielle Schnittstelle zum Anschluss der Siemens-Programmierleitung muss konfiguriert werden.
define <Name> S7 S5 <Schnittstelle>
'''Parameter:'''
{| class="wikitable sortable"
|-
! Parameter !! class="unsortable"  | Beschreibung
|-
|<Name>||FHEM Name des Devices
|-
|<Schnittstelle>||Gerätedatei der seriellen Schnittstelle
|}
'''Konfigurationsbeispiel'''
define s5test S7 S5 /dev/ttyAMA0
Das Beispiel gilt für den Raspberry Pi mit Anschluss an der Stiftleiste (siehe [[Vorbemerkungen für Einsteiger]]).
===Read und Write===
Die Konfiguration geschieht wie für die S7-Familie beschrieben, aber mit Rücksicht auf die Beschränkungen der S5. Zumindest die Kleinsteuerungen 90/95/100 unterstützen beim Analogzugriff nur die Datentypen u8 und s16. FHEM-Kommawerte können eventuell durch Multiplikation mit 10 oder 100 zu ganzen Zahlen gewandelt werden. Beim Zugriff auf Merker (flags), muss das ganze Byte exklusiv für FHEM reserviert sein. Das auf der S5 laufende Programm darf also keine Wertzuweisungen auf irgendein Bit des betroffenen Bytes enthalten.
===Erfahrungen===
* [[Vorbemerkungen für Einsteiger]]
* [[Siemens S5 Beispielkonfiguration]] (Dokumentation der Arbeitsfortschritte eines Anwenders)
== WinLC RTX 4.5 Beispielconfig ==
Als erstes beginnt man mit der Hardwarekonfiguration:
[[Datei:HarwareKonfiguration.JPG]]
[[Datei:CPU.JPG]]
[[Datei:Netzwerkkonfiguration.JPG]]
Dann erzeugt man am besten als nächstes eine Importdatei XDB für den Komponentenkonfigurator. Diese läßt sich dann auf dem Rechner auf dem die RTX laufen soll mit dem Komponentenkonfigurator importieren.
[[Datei:XDB_Datei_erzeugen.JPG]]
Nach dem Import auf dem Zielrechner sollte der Komponentenkonfigurator so aussehen.
[[Datei:Komponentenkonfigurator.JPG]]
Der OB1 wird jetzt programmiert wie im folgenden Bild dargestellt. Zusätzlich habe ich den Merker 255.5 als Tacktmerker 2sec beider Konfiguration der CPU angeleget. Dann sehe ich das die Verbindung zu RTX steht. Dies ist aber nicht unbedingt erforderlich.
[[Datei:ProgrammOB1.JPG]]
In der fhem.cfg
# S7 Kommunikation
define PCS_7 S7 192.168.0.81 0 2
attr PCS_7 room Keller
# Lichttaster an S7 schaltbar über Icon
define Taster0_Icon S7_DWrite db 33 0.0
attr Taster0_Icon IODev PCS_7
attr Taster0_Icon eventMap on:on off:off
attr Taster0_Icon group Licht
attr Taster0_Icon room Keller
define Taster1_Icon S7_DWrite db 33 0.1
attr Taster1_Icon IODev PCS_7
attr Taster1_Icon eventMap on:on off:off
attr Taster1_Icon group Licht
attr Taster1_Icon room Keller
define Taster2_Icon S7_DWrite db 33 0.2
attr Taster2_Icon IODev PCS_7
attr Taster2_Icon eventMap on:on off:off
attr Taster2_Icon group Licht
attr Taster2_Icon room Keller
define Taster3_Icon S7_DWrite db 33 0.3
attr Taster3_Icon IODev PCS_7
attr Taster3_Icon eventMap on:on off:off
attr Taster3_Icon group Licht
attr Taster3_Icon room Keller
define Taster4_Icon S7_DWrite db 33 0.4
attr Taster4_Icon IODev PCS_7
attr Taster4_Icon eventMap on:on off:off
attr Taster4_Icon group Licht
attr Taster4_Icon room Keller
define Taster5_Icon S7_DWrite db 33 0.5
attr Taster5_Icon IODev PCS_7
attr Taster5_Icon eventMap on:on off:off
attr Taster5_Icon group Licht
attr Taster5_Icon room Keller
define Taster6_Icon S7_DWrite db 33 0.6
attr Taster6_Icon IODev PCS_7
attr Taster6_Icon eventMap on:on off:off
attr Taster6_Icon group Licht
attr Taster6_Icon room Keller
define Taster7_Icon S7_DWrite db 33 0.7
attr Taster7_Icon IODev PCS_7
attr Taster7_Icon eventMap on:on off:off
attr Taster7_Icon group Licht
attr Taster7_Icon room Keller
define Rueckmeldung0 S7_DRead db 31 0.0
attr Rueckmeldung0 IODev PCS_7
attr Rueckmeldung0 group Licht
attr Rueckmeldung0 room Keller
define Rueckmeldung1 S7_DRead db 31 0.1
attr Rueckmeldung1 IODev PCS_7
attr Rueckmeldung1 group Licht
attr Rueckmeldung1 room Keller
define Rueckmeldung2 S7_DRead db 31 0.2
attr Rueckmeldung2 IODev PCS_7
attr Rueckmeldung2 group Licht
attr Rueckmeldung2 room Keller
define Rueckmeldung3 S7_DRead db 31 0.3
attr Rueckmeldung3 IODev PCS_7
attr Rueckmeldung3 group Licht
attr Rueckmeldung3 room Keller
define Rueckmeldung4 S7_DRead db 31 0.4
attr Rueckmeldung4 IODev PCS_7
attr Rueckmeldung4 group Licht
attr Rueckmeldung4 room Keller
define Rueckmeldung5 S7_DRead db 31 0.5
attr Rueckmeldung5 IODev PCS_7
attr Rueckmeldung5 group Licht
attr Rueckmeldung5 room Keller
define Rueckmeldung6 S7_DRead db 31 0.6
attr Rueckmeldung6 IODev PCS_7
attr Rueckmeldung6 group Licht
attr Rueckmeldung6 room Keller
define Rueckmeldung7 S7_DRead db 31 0.7
attr Rueckmeldung7 IODev PCS_7
attr Rueckmeldung7 group Licht
attr Rueckmeldung7 room Keller
[[Datei:fhem.JPG]]


== S7-300 Beispielconfig ==
== S7-300 Beispielconfig ==
Zeile 394: Zeile 560:
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.
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.


In jedem DRead, DWrite, ARead, AWrite ist das attr "event-on-change-reading state" gesetzt (state ohne Hysterese). Dies verhindert das zyklische Feuern eines Events. Nur bei Wertänderung wir das Event ausgelöst.
In jedem DRead, DWrite, ARead, AWrite ist das attr "event-on-change-reading state" gesetzt (state ohne Hysterese). Dies verhindert das zyklische Feuern eines Events. Nur bei Wertänderung wird das Event ausgelöst.


Ich habe noch ein paar Spielerein als Beispiel in der fhem.cfg:
Es sind noch ein paar Spielerein als Beispiel in der fhem.cfg:


- Tasten über Spracheingabe
- Tasten über Spracheingabe
- Rückmeldung über Sprachausgabe
- Rückmeldung über Sprachausgabe
- Temperatur aus dem Weather Modul wird an die S7 geschickt
- Temperatur aus dem Weather Modul wird an die S7 geschickt


Zeile 529: Zeile 693:
  attr speech_Licht_Keller room Keller
  attr speech_Licht_Keller room Keller
   
   
  # Rückmeldung ob 317 DO gesetzt hat als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters
  # Rückmeldung ob Licht eingeschaltet wurde als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters
  define Rueckmeldung_317_ttsSay notify Rueckmeldung_317 {\
define Rueckmeldung_317_ttsSay_on notify Rueckmeldung_317:on {\
  fhem "set Android ttsSay Das Licht im Keller wurde geschaltet";;\
fhem "set Android ttsSay Das Licht im Keller wurde eingeschaltet";;\
}
attr Rueckmeldung_317_ttsSay_on group Licht
attr Rueckmeldung_317_ttsSay_on room Keller
# Rückmeldung ob Licht ausgeschaltet wurde als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters
  define Rueckmeldung_317_ttsSay_off notify Rueckmeldung_317:off {\
  fhem "set Android ttsSay Das Licht im Keller wurde ausgeschaltet";;\
  }
  }
  attr Rueckmeldung_317_ttsSay group Licht
  attr Rueckmeldung_317_ttsSay_off group Licht
  attr Rueckmeldung_317_ttsSay room Keller
  attr Rueckmeldung_317_ttsSay_off room Keller


== Versionshistory ==
== Versionshistory ==
Versionsinfo:
Versionsinfo:
V2.14
* = V10515 first official Version
V2.13
* fix: missing bracked in S7_AWrite.pm
V2.12
* performance optimisation
* fix in rebuild cache function
V2.11
* (fix) memory allocation fix during shutdown/restart sequence
* preperation  for non blocking calls: job caching, clients chache --> speeds up the module
V2.10
* (feature) S7_DWrite: with new attribute trigger_length the impulse length could be controlled
* (feature, performance) S7: with new attribute MaxMessageLength you can control the maximal message length to the plc. it is only used if it is lower than the negioated PDULength
* (fixes) some minor fixes in memory usage
* (fixes) startup: no error messages should be found in the log anymore
* (performance) performance tuning: (reduced dispace Messages) --> up to 4 times faster
V2.9
* fix for DWord (thanks to zicki)
* multiple fix for writing to PLC
V2.8
* minor fix in TCP Socked (TCP_NODELAY option now set)
* minor fix in reconnection (perl gets more time for garbage handling)
* connection to the PLC is now delayed (5sec after creation the connection is build up, 3 seconds later the reading polling is started)
* minor fix AWrite checks now connection status
* fix for fritzbox
V2.7
* fix: for overlapping configuration
V2.6
* fix: reconnection at creation time
* fix: state update on reading
* fix: memory leak during message dispatch
V2.5
* fixes for writing operations for S300
* fix in TCPClient for dedection of writing error


V2.4
V2.4
Zeile 666: Zeile 881:


== Links ==
== Links ==
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls
* {{Link2Forum|Topic=26092}} zur Entwicklung und Support des Moduls


[[Kategorie:Other Components]]
[[Kategorie:Siemens PLC]]

Aktuelle Version vom 20. Dezember 2016, 12:08 Uhr


S7
Zweck / Funktion
Dieses Modul dient der Integration von Simatic/S7/Logo!/S5 Steuerungen in 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!


Die Familie von Siemens Simatic und Logo! Geräten sind Speicherprogrammierbare Steuerungen (SPS/PLC). Dieses Modul unterstützt folgende Siemens Steuerungen über die Ethernet Schnittstelle:

  • S7 300/400/WinAC CPU,
  • S7 1200/1500 CPU,
  • S7 200,
  • LOGO 0BA7,
  • WINLC RTX 4.5

bzw. über die PG-Schnittstelle:

  • S5 90/95/10x/110/115/135/150/155.


Unterstützte Plattformen

Ab der Version V2.0 werden alle Plattformen auf denen FHEM läuft unterstützt. Plattformen auf denen das Modul bereits erfolgreich getestet wurde:

Plattform Teststatus Bemerkung
ARMv6 passed raspberry pi
AMD64 passed Mintlinux
MIPS passed Fritzbox 7390
Linux amd64 passed Mint Linux17.1
Windows passed Windows8.1

FHEM Modul

Das FHEM Modul besteht aus diesen Dateien:

Datei Beschreibung
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 erstellen von readonly analogen Datenpunkten
44_S7_AWrite.pm erstellen von analogen Datenpunkten zum Schreiben in den SPS-Speicher
44_S7_DRead.pm erstellen von digitalen/binary readonly Datenpunkt
44_S7_DWrite.pm erstellen von digitalen/binary Datenpunkten zum Schreiben
44_S7_Client.pm Dieses Modul beinhaltet die S7 Protokolle. Es basiert auf Snap7 - Settimino.

Installationsanleitung

Die Module sind bei einem aktuellen Updatestand von FHEM standardmäßig installiert. Darum sind grundsätzlich keine Installationsarbeiten notwendig nachdem FHEM durch update aktualisiert wurde. Eine Erfolgskontrolle des S7-Define und damit der erfolgreichen Verbindung zur SPS ist im Abschnitt Unsorted des FHEM-Webinterfaces möglich:

Connected.png

Funktionsprinzip

Das Modul liest in festen Zeitabständen die Konfiguration der Clientmodule S7_ARead, S7_AWrite, S7_DRead und D7_DWrite für jede konfigurierte SPS ein. Per Voreinstellung wird jede Sekunde geprüft, ob ein Speicherblock zu lesen ist. Diese werden nach:

  • area (inputs, outputs, merker, DB),
  • nach DB,
  • und nach Startbyte sortiert.
    Emblem-question-yellow.svgDiese zyklische Abfrage kann zu Geschwindigkeitsproblemen auf dem FHEM-Host führen. Um die Geschwindigkeit des Moduls und damit von FHEM zu optimieren, sollten die Attribute 'on-change-reading' und 'event-min-interval' stets verwendet werden. Besonders bei digitalen Datenpunkten sollte FHEM nur bei Statusänderungen einen Event feuern. Konfigurations-Beispiele sind weiter unten aufgeführt.


Aus dem Ergebnis werden Leseblöcke abgeleitet, die dann von der SPS geholt werden. Danach werden die Clientmodule mit den aktualisierten Werten versorgt. Wenn man auf die Writer schreibend zugreift, so wird unmittelbar die entsprechenden Bits/Bytes in der SPS gesetzt.

Vorbereitung

Außer die S5 müssen die Steuerungen für die Verbindung mit FHEM vorbereitet werden. Die SPS benötigt eine feste IP Adresse. Weiters muss eine Serververbindung auf der SPS eingerichtet werden. Diese kann so konfiguriert werden:

  • Alle Verbindungen zunächst akzeptieren, wenn die Verbindung erfolgreich aufgebaut werden kann, ist es möglich die IP auf den FHEM Server einzuschränken.
  • Die voreingestellte Remote TSAP von FHEM ist 01.00.
  • Die weitere Vorgehensweise hängt nun von der SPS ab. Es muss nun entweder Rack und Slot der SPS für die Konfiguration notiert werden oder es muss eine lokale TSAP festgelegt werden. Aus dieser lokalen TSAP muss dann rack und slot nach folgenden Zusammenhang berechnet werden:
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;
  • Bei Verwendung einer Siemens Logo wird davon ausgegangen, dass eine lokale TSAP von 02.00 mit Hilfe des Operatorpanels konfiguriert wurde.

Define für Steuerungen der S7-Familie

Im ersten Schritt muss mit Hilfe des S7 Moduls eine Verbindung mit der SPS eingerichtet, danach die 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 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

Parameter Beschreibung
MaxMessageLength Damit kann die maximale Telegrammlänge kleiner als die beim Verbindungsaufbau vereinbarte PDU Länge gesetzt werden.

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> für inputs, outputs, flags stets 0, sonst Nummer des Datenbausteins
<byteadresse>.<bitadress> Adresse des zu lesenden Bits

Konfigurationsbeispiel

define Lampe S7_DRead db 0 95.3

Analoge readonly Datenpunkte

Mit diesem Modul 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> für inputs, outputs, flags stets 0, sonst 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.

Standardattribute wie event-min-interval, event-min-interval, stateFormat usw. werden unterstützt. Um Einheiten anzuzeigen, kann stateFormat verwendet werden. Exemplarisches Beispiel:

attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}

Digitale Datenpunkte zum Schreiben

Mit diesem logischen Modul kann man ein Bit 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> für inputs, outputs, flags stets 0, sonst Nummer des Datenbausteins
<byteadresse>.<bitadress> Adresse des zu schreibenden Bits

Konfigurationsbeispiel

define Brenner_Ein S7_DWrite db 0 5.7

Geschwindigkeitsoptimierung:

   attr Brenner_Ein event-min-interval .*:600
   attr Brenner_Ein event-on-change-reading state

Nur wenn sich der Status (state) ändert wird ein Event gefeuert (event-on-change-reading state), aber alle 600s wird auf jeden Fall ein Event gefeuert (event-min-interval .*:600).

Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen. Darf also nicht vom SPS-Programm beschrieben werden.

Attribute

Parameter Beschreibung
trigger_length Damit kann die Länge in [s] des Triggerimpulses gesetzt werden. Devault Value = 1s

Setter

Befehl Beschreibung
set schreibender Zugriff

ON ... setzt dieses Bit

OFF ... löscht dieses Bit

TRIGGER ... Das Bit wird für <trigger_length>s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).

Analoge Datenpunkte zum Schreiben

Mit diesem Modul kann man integer Werte zur SPS übertragen. Unsigned Integer müssen sich im Bereich von 0 – 32767 befinden.

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> für inputs,outputs,flags stets 0, sonst 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 für die 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.

Es wird eine Verbindung mit der SPS über das S7-Modul eingerichtet.

define <name> S7 {LOGO7|LOGO8} <ip_address>

Parameter:

Parameter Beschreibung
<name> FHEM Name des Devices
LOGO8 SPS Typ
<ip_address> IP Adresse der SPS


Konfigurationsbeispiel

define myLogo S7 LOGO7 10.0.0.243

Attribute

Es können die selben Attribute, wie für die S7-Familie beschrieben, verwendet werden. Die Reading Konfigurationen für Eingänge/Ausgänge und Merker werden automatisch eingerichtet, wenn ein entsprechendes S7_DRead oder S7_DWrite Modul angelegt werden.

Digitale readonly Datenpunkte

Mit diesem Modul kann man ein Bit aus der Logo 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

Es wird wenn nötig eine 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
X mark.svgWichtig ist es, auf die Eingänge der Logo nicht schreibend zugreifen. Die Logo liest das Eingangswort zu Beginn eines Verarbeitungszyklus von der HW ein (= Eingangsabbild). Wenn das Programm ausgeführt wird, wird ausschließlich auf dieses Eingangsabbild zugegriffen. Ein Netzwerkzugriff kann somit die Eingänge nicht direkt beeinflussen. Aus diesem Grund Netzwerk Eingänge (NI) verwenden!


Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.

Geschwindigkeitsoptimierung:

   attr Brenner_Ein event-min-interval .*:600
   attr Brenner_Ein event-on-change-reading state

Nur wenn sich der Status (state) ändert wird ein Event gefeuert (event-on-change-reading state), aber alle 600s wird auf jeden Fall ein Event gefeuert (event-min-interval .*:600).

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.

Defines für die Siemens S5-Familie

Für die Verbindung der Siemens S5 wird auch das S7-Modul benutzt. Die von FHEM verwendete serielle Schnittstelle zum Anschluss der Siemens-Programmierleitung muss konfiguriert werden.

define <Name> S7 S5 <Schnittstelle>

Parameter:

Parameter Beschreibung
<Name> FHEM Name des Devices
<Schnittstelle> Gerätedatei der seriellen Schnittstelle

Konfigurationsbeispiel

define s5test S7 S5 /dev/ttyAMA0

Das Beispiel gilt für den Raspberry Pi mit Anschluss an der Stiftleiste (siehe Vorbemerkungen für Einsteiger).

Read und Write

Die Konfiguration geschieht wie für die S7-Familie beschrieben, aber mit Rücksicht auf die Beschränkungen der S5. Zumindest die Kleinsteuerungen 90/95/100 unterstützen beim Analogzugriff nur die Datentypen u8 und s16. FHEM-Kommawerte können eventuell durch Multiplikation mit 10 oder 100 zu ganzen Zahlen gewandelt werden. Beim Zugriff auf Merker (flags), muss das ganze Byte exklusiv für FHEM reserviert sein. Das auf der S5 laufende Programm darf also keine Wertzuweisungen auf irgendein Bit des betroffenen Bytes enthalten.

Erfahrungen

WinLC RTX 4.5 Beispielconfig

Als erstes beginnt man mit der Hardwarekonfiguration:

HarwareKonfiguration.JPG

CPU.JPG

Netzwerkkonfiguration.JPG

Dann erzeugt man am besten als nächstes eine Importdatei XDB für den Komponentenkonfigurator. Diese läßt sich dann auf dem Rechner auf dem die RTX laufen soll mit dem Komponentenkonfigurator importieren.

XDB Datei erzeugen.JPG

Nach dem Import auf dem Zielrechner sollte der Komponentenkonfigurator so aussehen.

Komponentenkonfigurator.JPG

Der OB1 wird jetzt programmiert wie im folgenden Bild dargestellt. Zusätzlich habe ich den Merker 255.5 als Tacktmerker 2sec beider Konfiguration der CPU angeleget. Dann sehe ich das die Verbindung zu RTX steht. Dies ist aber nicht unbedingt erforderlich.

ProgrammOB1.JPG

In der fhem.cfg

# S7 Kommunikation
define PCS_7 S7 192.168.0.81 0 2
attr PCS_7 room Keller

# Lichttaster an S7 schaltbar über Icon
define Taster0_Icon S7_DWrite db 33 0.0
attr Taster0_Icon IODev PCS_7
attr Taster0_Icon eventMap on:on off:off
attr Taster0_Icon group Licht
attr Taster0_Icon room Keller

define Taster1_Icon S7_DWrite db 33 0.1
attr Taster1_Icon IODev PCS_7
attr Taster1_Icon eventMap on:on off:off
attr Taster1_Icon group Licht
attr Taster1_Icon room Keller

define Taster2_Icon S7_DWrite db 33 0.2
attr Taster2_Icon IODev PCS_7
attr Taster2_Icon eventMap on:on off:off
attr Taster2_Icon group Licht
attr Taster2_Icon room Keller

define Taster3_Icon S7_DWrite db 33 0.3
attr Taster3_Icon IODev PCS_7
attr Taster3_Icon eventMap on:on off:off
attr Taster3_Icon group Licht
attr Taster3_Icon room Keller

define Taster4_Icon S7_DWrite db 33 0.4
attr Taster4_Icon IODev PCS_7
attr Taster4_Icon eventMap on:on off:off
attr Taster4_Icon group Licht
attr Taster4_Icon room Keller

define Taster5_Icon S7_DWrite db 33 0.5
attr Taster5_Icon IODev PCS_7
attr Taster5_Icon eventMap on:on off:off
attr Taster5_Icon group Licht
attr Taster5_Icon room Keller

define Taster6_Icon S7_DWrite db 33 0.6
attr Taster6_Icon IODev PCS_7
attr Taster6_Icon eventMap on:on off:off
attr Taster6_Icon group Licht
attr Taster6_Icon room Keller

define Taster7_Icon S7_DWrite db 33 0.7
attr Taster7_Icon IODev PCS_7
attr Taster7_Icon eventMap on:on off:off
attr Taster7_Icon group Licht
attr Taster7_Icon room Keller


define Rueckmeldung0 S7_DRead db 31 0.0
attr Rueckmeldung0 IODev PCS_7
attr Rueckmeldung0 group Licht
attr Rueckmeldung0 room Keller

define Rueckmeldung1 S7_DRead db 31 0.1
attr Rueckmeldung1 IODev PCS_7
attr Rueckmeldung1 group Licht
attr Rueckmeldung1 room Keller

define Rueckmeldung2 S7_DRead db 31 0.2
attr Rueckmeldung2 IODev PCS_7
attr Rueckmeldung2 group Licht
attr Rueckmeldung2 room Keller

define Rueckmeldung3 S7_DRead db 31 0.3
attr Rueckmeldung3 IODev PCS_7
attr Rueckmeldung3 group Licht
attr Rueckmeldung3 room Keller

define Rueckmeldung4 S7_DRead db 31 0.4
attr Rueckmeldung4 IODev PCS_7
attr Rueckmeldung4 group Licht
attr Rueckmeldung4 room Keller

define Rueckmeldung5 S7_DRead db 31 0.5
attr Rueckmeldung5 IODev PCS_7
attr Rueckmeldung5 group Licht
attr Rueckmeldung5 room Keller

define Rueckmeldung6 S7_DRead db 31 0.6
attr Rueckmeldung6 IODev PCS_7
attr Rueckmeldung6 group Licht
attr Rueckmeldung6 room Keller

define Rueckmeldung7 S7_DRead db 31 0.7
attr Rueckmeldung7 IODev PCS_7
attr Rueckmeldung7 group Licht
attr Rueckmeldung7 room Keller

Fhem.JPG

S7-300 Beispielconfig

Die Konfiguration (fhem.cfg) der S7-Kommunikation unten ist gültig ab V2.6.

Es sind zwei CPUs im Einsatz, die mit FHEM kommunizieren:

S7-317 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-DB24

S7-315 CPU mit Onboard-Ethernet Schnittstelle, IP-Adresse: 192.168.1.102, R0S2 (Rack 0, Slot 2 aus der Step 7 HW-Config) 4 Kommunikations-DBs, DB70-DB74

DB20, DB70 (symbolischer Name: ANALOG_AN_FHEM = aus Sicht der S7), Länge: 8 byte, Adresse 0.0: Rücklesewert (REAL), Adresse 4.0: Reserve (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 oder, wie im Beispiel, den Wert, der vorher von FHEM geschickt wurde.

DB21, DB71 (symbolischer Name: BINAER_AN_FHEM = aus Sicht der S7), Länge: 2 byte, Adresse 0.0: Rückmeldung (BOOL), Adresse 0.1: Reserve (BOOL) ... Adresse 1.7: Reserve (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, DB72 (symbolischer Name: ANALOG_VON_FHEM = aus Sicht der S7), Länge: 8 byte, Adresse 0.0: Temperaturkorrektur (REAL), Adresse 4.0: Außentemperatur aus dem WWW (bei der 317, Reserve bei der 315 - REAL) Hier legt FHEM die Gleitpunktzahlen ab, die in der S7 angezeigt/ verarbeitet werden sollen, z.B. den Wert eines Sliders zur Sollwertkorrektur (-10..+10).

DB23, DB73 (symbolischer Name: BINAER_VON_FHEM = aus Sicht der S7), Länge: 2 byte, Adresse 0.0: Taster (BOOL), Adresse 0.1: Reserve (BOOL) ... Adresse 1.7: Reserve (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.

In jedem DRead, DWrite, ARead, AWrite ist das attr "event-on-change-reading state" gesetzt (state ohne Hysterese). Dies verhindert das zyklische Feuern eines Events. Nur bei Wertänderung wird das Event ausgelöst.

Es sind noch ein paar Spielerein als Beispiel in der fhem.cfg:

- Tasten über Spracheingabe - Rückmeldung über Sprachausgabe - Temperatur aus dem Weather Modul wird an die S7 geschickt

fhem.cfg

# S7 Kommunikation mit 2 CPUs
define 317 S7 192.168.1.101 0 2
attr 317 room System

define 315 S7 192.168.1.102 0 2
attr 315 room System

# FHEM Taster an 317
define Taster_317 S7_DWrite db 23 0.0
attr Taster_317 IODev 317
attr Taster_317 devStateIcon .*:toggle:TRIGGER
attr Taster_317 event-on-change-reading state
attr Taster_317 group Licht
attr Taster_317 room Keller

# Rückmeldung ob 317 DO gesetzt hat
define Rueckmeldung_317 S7_DRead db 21 0.0
attr Rueckmeldung_317 IODev 317
attr Rueckmeldung_317 event-on-change-reading state
attr Rueckmeldung_317 group Licht
attr Rueckmeldung_317 room Keller

# FHEM Schalter an 315
define Taster_315 S7_DWrite db 73 0.0
attr Taster_315 IODev 315
attr Taster_315 devStateIcon .*:toggle
attr Taster_315 event-on-change-reading state
attr Taster_315 group Licht
attr Taster_315 room Keller
attr Taster_315 webCmd ON:OFF

# Rückmeldung ob 315 DO gesetzt hat
define Rueckmeldung_315 S7_DRead db 71 0.0
attr Rueckmeldung_315 IODev 315
attr Rueckmeldung_315 event-on-change-reading state
attr Rueckmeldung_315 group Licht
attr Rueckmeldung_315 room Keller

# FHEM Sollwertgeber an 317 als Knob
define Temperaturkorrektur_317 S7_AWrite db 22 0 float
attr Temperaturkorrektur_317 IODev 317
attr Temperaturkorrektur_317 event-on-change-reading state
attr Temperaturkorrektur_317 group Raumluft
attr Temperaturkorrektur_317 room Keller
attr Temperaturkorrektur_317 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}

define Temperaturkorrektur_317_Knob dummy
attr Temperaturkorrektur_317_Knob group Raumluft
attr Temperaturkorrektur_317_Knob room Keller
attr Temperaturkorrektur_317_Knob setList state:knob,min:-10,max:10,step:0.5,fgColor:Green,anglearc:180,angleoffset:270,bgcolor:Grey,width:150,linecap:round,thickness:0.1,displayInput:true
attr Temperaturkorrektur_317_Knob stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}
attr Temperaturkorrektur_317_Knob webCmd state

define Temperaturkorrektur_317_Knob_notify notify Temperaturkorrektur_317_Knob {\
fhem "set Temperaturkorrektur_317 ".ReadingsVal("Temperaturkorrektur_317_Knob","state","0");;\
}
attr Temperaturkorrektur_317_Knob_notify group Raumluft
attr Temperaturkorrektur_317_Knob_notify room Keller

# Rücklesewert ob 317 die Temperaturkorrektur bekommen hat
define Ruecklesen_317 S7_ARead db 20 0 float
attr Ruecklesen_317 IODev 317
attr Ruecklesen_317 event-on-change-reading state
attr Ruecklesen_317 group Raumluft
attr Ruecklesen_317 room Keller
attr Ruecklesen_317 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}

# FHEM Sollwertgeber an 315 als Slider
define Temperaturkorrektur_315 S7_AWrite db 72 0 float
attr Temperaturkorrektur_315 IODev 315
attr Temperaturkorrektur_315 event-on-change-reading state
attr Temperaturkorrektur_315 group Raumluft
attr Temperaturkorrektur_315 room Keller
attr Temperaturkorrektur_315 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}

define Temperaturkorrektur_315_Knob dummy
attr Temperaturkorrektur_315_Knob group Raumluft
attr Temperaturkorrektur_315_Knob room Keller
attr Temperaturkorrektur_315_Knob setList state:slider,-10.0,0.5,10.0,1
attr Temperaturkorrektur_315_Knob stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}
attr Temperaturkorrektur_315_Knob webCmd state

define Temperaturkorrektur_315_Knob_notify notify Temperaturkorrektur_315_Knob {\
fhem "set Temperaturkorrektur_315 ".ReadingsVal("Temperaturkorrektur_315_Knob","state","0");;\
}
attr Temperaturkorrektur_315_Knob_notify group Raumluft
attr Temperaturkorrektur_315_Knob_notify room Keller

# Rücklesewert ob 315 die Temperaturkorrektur bekommen hat
define Ruecklesen_315 S7_ARead db 70 0 float
attr Ruecklesen_315 IODev 315
attr Ruecklesen_315 event-on-change-reading state
attr Ruecklesen_315 group Raumluft
attr Ruecklesen_315 room Keller
attr Ruecklesen_315 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}

# Ein paar Spielereien

# Temperatur aus dem Web an 317 schicken
define Wetter Weather 638242 1800 de
attr Wetter room Wetter

define Temp_AU_Web S7_AWrite db 22 4 float
attr Temp_AU_Web IODev 317
attr Temp_AU_Web event-on-change-reading state
attr Temp_AU_Web room Wetter
attr Temp_AU_Web stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}

define Temp_AU_Web_notify notify Wetter {\
fhem "set Temp_AU_Web ".ReadingsVal("Wetter","temp_c","10");;\
}
attr Temp_AU_Web_notify room Wetter

# WebViewControl Fullscreen Android Browser mit Text to Speech und Speech Recognition
define Android webViewControl 12345
attr Android room System

# FHEM Taster an 317 über Sprache bedienen "Licht im Keller schalten"
define speech_Licht_Keller notify .*voiceRecognitionLastResult.*icht.*eller.*(schalten|wechseln|tasten).* \
set Taster_317 TRIGGER
attr speech_Licht_Keller group Licht
attr speech_Licht_Keller room Keller

# Rückmeldung ob Licht eingeschaltet wurde als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters
define Rueckmeldung_317_ttsSay_on notify Rueckmeldung_317:on {\
fhem "set Android ttsSay Das Licht im Keller wurde eingeschaltet";;\
}
attr Rueckmeldung_317_ttsSay_on group Licht
attr Rueckmeldung_317_ttsSay_on room Keller

# Rückmeldung ob Licht ausgeschaltet wurde als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters
define Rueckmeldung_317_ttsSay_off notify Rueckmeldung_317:off {\
fhem "set Android ttsSay Das Licht im Keller wurde ausgeschaltet";;\
}
attr Rueckmeldung_317_ttsSay_off group Licht
attr Rueckmeldung_317_ttsSay_off room Keller

Versionshistory

Versionsinfo:

V2.14

  • = V10515 first official Version

V2.13

  • fix: missing bracked in S7_AWrite.pm

V2.12

  • performance optimisation
  • fix in rebuild cache function

V2.11

  • (fix) memory allocation fix during shutdown/restart sequence
  • preperation for non blocking calls: job caching, clients chache --> speeds up the module

V2.10

  • (feature) S7_DWrite: with new attribute trigger_length the impulse length could be controlled
  • (feature, performance) S7: with new attribute MaxMessageLength you can control the maximal message length to the plc. it is only used if it is lower than the negioated PDULength
  • (fixes) some minor fixes in memory usage
  • (fixes) startup: no error messages should be found in the log anymore
  • (performance) performance tuning: (reduced dispace Messages) --> up to 4 times faster

V2.9

  • fix for DWord (thanks to zicki)
  • multiple fix for writing to PLC

V2.8

  • minor fix in TCP Socked (TCP_NODELAY option now set)
  • minor fix in reconnection (perl gets more time for garbage handling)
  • connection to the PLC is now delayed (5sec after creation the connection is build up, 3 seconds later the reading polling is started)
  • minor fix AWrite checks now connection status
  • fix for fritzbox

V2.7

  • fix: for overlapping configuration

V2.6

  • fix: reconnection at creation time
  • fix: state update on reading
  • fix: memory leak during message dispatch

V2.5

  • fixes for writing operations for S300
  • fix in TCPClient for dedection of writing error

V2.4

  • the requirement of having reading-configs and/or writing-configs are gone

The module calculates based on the logical modul configuration the reading required bocks dynamically The writing is done as a minimal block for AWrite and as a Bit for DWrite This is done every second per default (optional Parameter of the 44_S7 modul)

V2.3

  • FIX: For Logo8 Simple config
  • Error messages for perl PLC communication lib are available
  • standard attributes like event-min-interval, event-min-interval, ... are added
  • PLC Communication client extended for bitwise writing
  • removed attribute unit and precision: please use standard attribute stateFormat instead.

Example for stateFormat with precision=1 and unit=°C:

   define innentemp S7_ARead db 0 6 u16
   attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}

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 zur Entwicklung und Support des Moduls