http://wiki.fhem.de/w/api.php?action=feedcontributions&user=Charlie71&feedformat=atomFHEMWiki - Benutzerbeiträge [de]2024-03-28T09:36:12ZBenutzerbeiträgeMediaWiki 1.39.3http://wiki.fhem.de/w/index.php?title=S7&diff=13443S72016-01-04T08:32:42Z<p>Charlie71: /* Versionshistory */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
* WINLC RTX 4.5<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|-<br />
|Linux amd64||passed||Mint Linux17.1<br />
|-<br />
|Windows||passed||Windows8.1<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
<br />
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.<br />
diese werden nach <br />
<br />
1) area (inputs, outputs, merker, DB)<br />
<br />
2) nach DB<br />
<br />
3) nach Startbyte<br />
<br />
sortiert.<br />
Daraus werden Leseblöcke abgeleitet, die dann von der SPS geholt werden. Danach werden die Clientmodule mit den aktualisierten Werden versorgt.<br />
<br />
Wenn man auf die Writer schreibend zugreift, so wird unmittelbar die entsprechenden Bits/Bytes in der SPS gesetzt.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|MaxMessageLength||Damit kann die maximale Telegrammlänge kleiner als, die beim Verbindungsaufbau vereinbarte, PDU Länge gesetzt werden.<br />
offset<br />
|<br />
|}<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|}<br />
<br />
Anmerkung: Es werden auch Standardattribute unterstützt (zb: event-min-interval, event-min-interval, stateFormat, ...).<br />
<br />
Um Einheiten anzeigen zu lassen kann stateFormat wie folgt verwendet werden, ZB:<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|trigger_length||Damit kann die Länge in [s] des Triggerimpulses gesetzt werden. Devault Value = 1s<br />
|}<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für <trigger_length>s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes*<br />
|}<br />
<br />
Wichtig: NI, NQ ... nur LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
NI,NQ ... nur für LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
'''Wichtig: NICHT auf die Eingänge der Logo schreibend zugreifen. Das macht KEINEN SINN, die Logo liest das Eingangswort zu Beginn eines Verarbeitungszyklus von der HW ein (= Eingangsabbild). Wenn das Programm ausgeführt wird wir ausschließlich auf dieses Eingangsabbild zugegriffen. Ein Netzwerkzugriff kann somit die Eingänge nicht direkt beeinflussen. Aus diesem Grund Netzwerk Eingänge (NI) verwenden!'''<br />
<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== WinLC RTX 4.5 Beispielconfig ==<br />
Als erstes beginnt man mit der Hardwarekonfiguration:<br />
<br />
[[Datei:HarwareKonfiguration.JPG]]<br />
<br />
[[Datei:CPU.JPG]]<br />
<br />
[[Datei:Netzwerkkonfiguration.JPG]]<br />
<br />
Dann erzeugt man am besten als nächstes eine Importdatei XDB für den<br />
Komponentenkonfigurator. Diese läßt sich dann auf dem Rechner auf dem<br />
die RTX laufen soll mit dem Komponentenkonfigurator importieren.<br />
<br />
[[Datei:XDB_Datei_erzeugen.JPG]]<br />
<br />
Nach dem Import auf dem Zielrechner sollte der Komponentenkonfigurator<br />
so aussehen.<br />
<br />
[[Datei:Komponentenkonfigurator.JPG]]<br />
<br />
Der OB1 wird jetzt programmiert wie im folgenden Bild dargestellt.<br />
Zusätzlich habe ich den Merker 255.5 als Tacktmerker 2sec beider Konfiguration<br />
der CPU angeleget. Dann sehe ich das die Verbindung zu RTX steht. Dies ist<br />
aber nicht unbedingt erforderlich.<br />
<br />
[[Datei:ProgrammOB1.JPG]]<br />
<br />
In der fhem.cfg<br />
<br />
# S7 Kommunikation<br />
define PCS_7 S7 192.168.0.81 0 2<br />
attr PCS_7 room Keller<br />
<br />
# Lichttaster an S7 schaltbar über Icon<br />
define Taster0_Icon S7_DWrite db 33 0.0<br />
attr Taster0_Icon IODev PCS_7<br />
attr Taster0_Icon eventMap on:on off:off<br />
attr Taster0_Icon group Licht<br />
attr Taster0_Icon room Keller<br />
<br />
define Taster1_Icon S7_DWrite db 33 0.1<br />
attr Taster1_Icon IODev PCS_7<br />
attr Taster1_Icon eventMap on:on off:off<br />
attr Taster1_Icon group Licht<br />
attr Taster1_Icon room Keller<br />
<br />
define Taster2_Icon S7_DWrite db 33 0.2<br />
attr Taster2_Icon IODev PCS_7<br />
attr Taster2_Icon eventMap on:on off:off<br />
attr Taster2_Icon group Licht<br />
attr Taster2_Icon room Keller<br />
<br />
define Taster3_Icon S7_DWrite db 33 0.3<br />
attr Taster3_Icon IODev PCS_7<br />
attr Taster3_Icon eventMap on:on off:off<br />
attr Taster3_Icon group Licht<br />
attr Taster3_Icon room Keller<br />
<br />
define Taster4_Icon S7_DWrite db 33 0.4<br />
attr Taster4_Icon IODev PCS_7<br />
attr Taster4_Icon eventMap on:on off:off<br />
attr Taster4_Icon group Licht<br />
attr Taster4_Icon room Keller<br />
<br />
define Taster5_Icon S7_DWrite db 33 0.5<br />
attr Taster5_Icon IODev PCS_7<br />
attr Taster5_Icon eventMap on:on off:off<br />
attr Taster5_Icon group Licht<br />
attr Taster5_Icon room Keller<br />
<br />
define Taster6_Icon S7_DWrite db 33 0.6<br />
attr Taster6_Icon IODev PCS_7<br />
attr Taster6_Icon eventMap on:on off:off<br />
attr Taster6_Icon group Licht<br />
attr Taster6_Icon room Keller<br />
<br />
define Taster7_Icon S7_DWrite db 33 0.7<br />
attr Taster7_Icon IODev PCS_7<br />
attr Taster7_Icon eventMap on:on off:off<br />
attr Taster7_Icon group Licht<br />
attr Taster7_Icon room Keller<br />
<br />
<br />
define Rueckmeldung0 S7_DRead db 31 0.0<br />
attr Rueckmeldung0 IODev PCS_7<br />
attr Rueckmeldung0 group Licht<br />
attr Rueckmeldung0 room Keller<br />
<br />
define Rueckmeldung1 S7_DRead db 31 0.1<br />
attr Rueckmeldung1 IODev PCS_7<br />
attr Rueckmeldung1 group Licht<br />
attr Rueckmeldung1 room Keller<br />
<br />
define Rueckmeldung2 S7_DRead db 31 0.2<br />
attr Rueckmeldung2 IODev PCS_7<br />
attr Rueckmeldung2 group Licht<br />
attr Rueckmeldung2 room Keller<br />
<br />
define Rueckmeldung3 S7_DRead db 31 0.3<br />
attr Rueckmeldung3 IODev PCS_7<br />
attr Rueckmeldung3 group Licht<br />
attr Rueckmeldung3 room Keller<br />
<br />
define Rueckmeldung4 S7_DRead db 31 0.4<br />
attr Rueckmeldung4 IODev PCS_7<br />
attr Rueckmeldung4 group Licht<br />
attr Rueckmeldung4 room Keller<br />
<br />
define Rueckmeldung5 S7_DRead db 31 0.5<br />
attr Rueckmeldung5 IODev PCS_7<br />
attr Rueckmeldung5 group Licht<br />
attr Rueckmeldung5 room Keller<br />
<br />
define Rueckmeldung6 S7_DRead db 31 0.6<br />
attr Rueckmeldung6 IODev PCS_7<br />
attr Rueckmeldung6 group Licht<br />
attr Rueckmeldung6 room Keller<br />
<br />
define Rueckmeldung7 S7_DRead db 31 0.7<br />
attr Rueckmeldung7 IODev PCS_7<br />
attr Rueckmeldung7 group Licht<br />
attr Rueckmeldung7 room Keller<br />
<br />
<br />
[[Datei:fhem.JPG]]<br />
<br />
== S7-300 Beispielconfig ==<br />
'''Die Konfiguration (fhem.cfg) der S7-Kommunikation unten ist gültig ab V2.6.'''<br />
<br />
Es sind zwei CPUs im Einsatz, die mit FHEM kommunizieren:<br />
<br />
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)<br />
4 Kommunikations-DBs, DB20-DB24<br />
<br />
S7-315 CPU mit Onboard-Ethernet Schnittstelle, IP-Adresse: 192.168.1.102, R0S2 ('''Rack 0, Slot 2''' aus der Step 7 HW-Config)<br />
4 Kommunikations-DBs, DB70-DB74<br />
<br />
'''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)<br />
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.<br />
<br />
'''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)<br />
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).<br />
<br />
'''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) <br />
Hier legt FHEM die Gleitpunktzahlen ab, die in der S7 angezeigt/ verarbeitet werden sollen, z.B. den Wert eines Sliders zur Sollwertkorrektur (-10..+10).<br />
<br />
'''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)<br />
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.<br />
<br />
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.<br />
<br />
Es sind noch ein paar Spielerein als Beispiel in der fhem.cfg:<br />
<br />
- Tasten über Spracheingabe<br />
<br />
- Rückmeldung über Sprachausgabe<br />
<br />
- Temperatur aus dem Weather Modul wird an die S7 geschickt<br />
<br />
===fhem.cfg===<br />
<br />
# S7 Kommunikation mit 2 CPUs<br />
define 317 S7 192.168.1.101 0 2<br />
attr 317 room System<br />
<br />
define 315 S7 192.168.1.102 0 2<br />
attr 315 room System<br />
<br />
# FHEM Taster an 317<br />
define Taster_317 S7_DWrite db 23 0.0<br />
attr Taster_317 IODev 317<br />
attr Taster_317 devStateIcon .*:toggle:TRIGGER<br />
attr Taster_317 event-on-change-reading state<br />
attr Taster_317 group Licht<br />
attr Taster_317 room Keller<br />
<br />
# Rückmeldung ob 317 DO gesetzt hat<br />
define Rueckmeldung_317 S7_DRead db 21 0.0<br />
attr Rueckmeldung_317 IODev 317<br />
attr Rueckmeldung_317 event-on-change-reading state<br />
attr Rueckmeldung_317 group Licht<br />
attr Rueckmeldung_317 room Keller<br />
<br />
# FHEM Schalter an 315<br />
define Taster_315 S7_DWrite db 73 0.0<br />
attr Taster_315 IODev 315<br />
attr Taster_315 devStateIcon .*:toggle<br />
attr Taster_315 event-on-change-reading state<br />
attr Taster_315 group Licht<br />
attr Taster_315 room Keller<br />
attr Taster_315 webCmd ON:OFF<br />
<br />
# Rückmeldung ob 315 DO gesetzt hat<br />
define Rueckmeldung_315 S7_DRead db 71 0.0<br />
attr Rueckmeldung_315 IODev 315<br />
attr Rueckmeldung_315 event-on-change-reading state<br />
attr Rueckmeldung_315 group Licht<br />
attr Rueckmeldung_315 room Keller<br />
<br />
# FHEM Sollwertgeber an 317 als Knob<br />
define Temperaturkorrektur_317 S7_AWrite db 22 0 float<br />
attr Temperaturkorrektur_317 IODev 317<br />
attr Temperaturkorrektur_317 event-on-change-reading state<br />
attr Temperaturkorrektur_317 group Raumluft<br />
attr Temperaturkorrektur_317 room Keller<br />
attr Temperaturkorrektur_317 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
define Temperaturkorrektur_317_Knob dummy<br />
attr Temperaturkorrektur_317_Knob group Raumluft<br />
attr Temperaturkorrektur_317_Knob room Keller<br />
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<br />
attr Temperaturkorrektur_317_Knob stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
attr Temperaturkorrektur_317_Knob webCmd state<br />
<br />
define Temperaturkorrektur_317_Knob_notify notify Temperaturkorrektur_317_Knob {\<br />
fhem "set Temperaturkorrektur_317 ".ReadingsVal("Temperaturkorrektur_317_Knob","state","0");;\<br />
}<br />
attr Temperaturkorrektur_317_Knob_notify group Raumluft<br />
attr Temperaturkorrektur_317_Knob_notify room Keller<br />
<br />
# Rücklesewert ob 317 die Temperaturkorrektur bekommen hat<br />
define Ruecklesen_317 S7_ARead db 20 0 float<br />
attr Ruecklesen_317 IODev 317<br />
attr Ruecklesen_317 event-on-change-reading state<br />
attr Ruecklesen_317 group Raumluft<br />
attr Ruecklesen_317 room Keller<br />
attr Ruecklesen_317 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
# FHEM Sollwertgeber an 315 als Slider<br />
define Temperaturkorrektur_315 S7_AWrite db 72 0 float<br />
attr Temperaturkorrektur_315 IODev 315<br />
attr Temperaturkorrektur_315 event-on-change-reading state<br />
attr Temperaturkorrektur_315 group Raumluft<br />
attr Temperaturkorrektur_315 room Keller<br />
attr Temperaturkorrektur_315 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
define Temperaturkorrektur_315_Knob dummy<br />
attr Temperaturkorrektur_315_Knob group Raumluft<br />
attr Temperaturkorrektur_315_Knob room Keller<br />
attr Temperaturkorrektur_315_Knob setList state:slider,-10.0,0.5,10.0,1<br />
attr Temperaturkorrektur_315_Knob stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
attr Temperaturkorrektur_315_Knob webCmd state<br />
<br />
define Temperaturkorrektur_315_Knob_notify notify Temperaturkorrektur_315_Knob {\<br />
fhem "set Temperaturkorrektur_315 ".ReadingsVal("Temperaturkorrektur_315_Knob","state","0");;\<br />
}<br />
attr Temperaturkorrektur_315_Knob_notify group Raumluft<br />
attr Temperaturkorrektur_315_Knob_notify room Keller<br />
<br />
# Rücklesewert ob 315 die Temperaturkorrektur bekommen hat<br />
define Ruecklesen_315 S7_ARead db 70 0 float<br />
attr Ruecklesen_315 IODev 315<br />
attr Ruecklesen_315 event-on-change-reading state<br />
attr Ruecklesen_315 group Raumluft<br />
attr Ruecklesen_315 room Keller<br />
attr Ruecklesen_315 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
# Ein paar Spielereien<br />
<br />
# Temperatur aus dem Web an 317 schicken<br />
define Wetter Weather 638242 1800 de<br />
attr Wetter room Wetter<br />
<br />
define Temp_AU_Web S7_AWrite db 22 4 float<br />
attr Temp_AU_Web IODev 317<br />
attr Temp_AU_Web event-on-change-reading state<br />
attr Temp_AU_Web room Wetter<br />
attr Temp_AU_Web stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
define Temp_AU_Web_notify notify Wetter {\<br />
fhem "set Temp_AU_Web ".ReadingsVal("Wetter","temp_c","10");;\<br />
}<br />
attr Temp_AU_Web_notify room Wetter<br />
<br />
# WebViewControl Fullscreen Android Browser mit Text to Speech und Speech Recognition<br />
define Android webViewControl 12345<br />
attr Android room System<br />
<br />
# FHEM Taster an 317 über Sprache bedienen "Licht im Keller schalten"<br />
define speech_Licht_Keller notify .*voiceRecognitionLastResult.*icht.*eller.*(schalten|wechseln|tasten).* \<br />
set Taster_317 TRIGGER<br />
attr speech_Licht_Keller group Licht<br />
attr speech_Licht_Keller room Keller<br />
<br />
# Rückmeldung ob Licht eingeschaltet wurde als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters<br />
define Rueckmeldung_317_ttsSay_on notify Rueckmeldung_317:on {\<br />
fhem "set Android ttsSay Das Licht im Keller wurde eingeschaltet";;\<br />
}<br />
attr Rueckmeldung_317_ttsSay_on group Licht<br />
attr Rueckmeldung_317_ttsSay_on room Keller<br />
<br />
# Rückmeldung ob Licht ausgeschaltet wurde als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters<br />
define Rueckmeldung_317_ttsSay_off notify Rueckmeldung_317:off {\<br />
fhem "set Android ttsSay Das Licht im Keller wurde ausgeschaltet";;\<br />
}<br />
attr Rueckmeldung_317_ttsSay_off group Licht<br />
attr Rueckmeldung_317_ttsSay_off room Keller<br />
<br />
== Geschwindigkeit ==<br />
Um die Geschwindigkeit des Moduls / FHEM zu optimieren sollte man folgende Attribute verwenden:<br />
* on-change-reading <br />
* event-min-interval<br />
<br />
Insbesondere bei digitalen Datenpunkten macht es Sinn, dass FHEM nur bei Statusänderungen einen Event feuert.<br />
<br />
Configbeispiel:<br />
<br />
define L1_Q7 S7_DRead Q7<br />
attr L1_Q7 IODev logo<br />
attr L1_Q7 event-min-interval .*:600<br />
attr L1_Q7 event-on-change-reading state<br />
attr L1_Q7 eventMap on:Ein off:Aus<br />
<br />
Erklärung:<br />
nur wenn sich der State ändert wird ein Event gefeuert (''attr L1_Q7 event-on-change-reading state''), aber alle 600s wird auf jeden Fall ein Event gefeuert (''attr L1_Q7 event-min-interval .*:600'')<br />
<br />
== Versionshistory ==<br />
Versionsinfo:<br />
<br />
V2.13<br />
* fix: missing bracked in S7_AWrite.pm<br />
<br />
V2.12<br />
* performance optimisation<br />
* fix in rebuild cache function<br />
<br />
V2.11<br />
* (fix) memory allocation fix during shutdown/restart sequence<br />
* preperation for non blocking calls: job caching, clients chache --> speeds up the module<br />
<br />
V2.10<br />
* (feature) S7_DWrite: with new attribute trigger_length the impulse length could be controlled<br />
* (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<br />
* (fixes) some minor fixes in memory usage<br />
* (fixes) startup: no error messages should be found in the log anymore<br />
* (performance) performance tuning: (reduced dispace Messages) --> up to 4 times faster<br />
<br />
<br />
V2.9<br />
* fix for DWord (thanks to zicki)<br />
* multiple fix for writing to PLC<br />
<br />
V2.8<br />
* minor fix in TCP Socked (TCP_NODELAY option now set)<br />
* minor fix in reconnection (perl gets more time for garbage handling)<br />
* connection to the PLC is now delayed (5sec after creation the connection is build up, 3 seconds later the reading polling is started)<br />
* minor fix AWrite checks now connection status<br />
* fix for fritzbox<br />
<br />
V2.7<br />
* fix: for overlapping configuration<br />
<br />
V2.6<br />
* fix: reconnection at creation time<br />
* fix: state update on reading<br />
* fix: memory leak during message dispatch<br />
<br />
V2.5<br />
* fixes for writing operations for S300<br />
* fix in TCPClient for dedection of writing error<br />
<br />
V2.4<br />
* the requirement of having reading-configs and/or writing-configs are gone<br />
The module calculates based on the logical modul configuration the reading required bocks dynamically<br />
The writing is done as a minimal block for AWrite and as a Bit for DWrite<br />
This is done every second per default (optional Parameter of the 44_S7 modul)<br />
<br />
V2.3<br />
* FIX: For Logo8 Simple config<br />
* Error messages for perl PLC communication lib are available<br />
* standard attributes like event-min-interval, event-min-interval, ... are added<br />
* PLC Communication client extended for bitwise writing <br />
* removed attribute unit and precision: please use standard attribute stateFormat instead.<br />
<br />
Example for stateFormat with precision=1 and unit=°C:<br />
define innentemp S7_ARead db 0 6 u16<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=13229S72015-12-11T20:22:01Z<p>Charlie71: /* Versionshistory */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
* WINLC RTX 4.5<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|-<br />
|Linux amd64||passed||Mint Linux17.1<br />
|-<br />
|Windows||passed||Windows8.1<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
<br />
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.<br />
diese werden nach <br />
<br />
1) area (inputs, outputs, merker, DB)<br />
<br />
2) nach DB<br />
<br />
3) nach Startbyte<br />
<br />
sortiert.<br />
Daraus werden Leseblöcke abgeleitet, die dann von der SPS geholt werden. Danach werden die Clientmodule mit den aktualisierten Werden versorgt.<br />
<br />
Wenn man auf die Writer schreibend zugreift, so wird unmittelbar die entsprechenden Bits/Bytes in der SPS gesetzt.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|MaxMessageLength||Damit kann die maximale Telegrammlänge kleiner als, die beim Verbindungsaufbau vereinbarte, PDU Länge gesetzt werden.<br />
offset<br />
|<br />
|}<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|}<br />
<br />
Anmerkung: Es werden auch Standardattribute unterstützt (zb: event-min-interval, event-min-interval, stateFormat, ...).<br />
<br />
Um Einheiten anzeigen zu lassen kann stateFormat wie folgt verwendet werden, ZB:<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|trigger_length||Damit kann die Länge in [s] des Triggerimpulses gesetzt werden. Devault Value = 1s<br />
|}<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für <trigger_length>s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes*<br />
|}<br />
<br />
Wichtig: NI, NQ ... nur LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
NI,NQ ... nur für LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
'''Wichtig: NICHT auf die Eingänge der Logo schreibend zugreifen. Das macht KEINEN SINN, die Logo liest das Eingangswort zu Beginn eines Verarbeitungszyklus von der HW ein (= Eingangsabbild). Wenn das Programm ausgeführt wird wir ausschließlich auf dieses Eingangsabbild zugegriffen. Ein Netzwerkzugriff kann somit die Eingänge nicht direkt beeinflussen. Aus diesem Grund Netzwerk Eingänge (NI) verwenden!'''<br />
<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== WinLC RTX 4.5 Beispielconfig ==<br />
Als erstes beginnt man mit der Hardwarekonfiguration:<br />
<br />
[[Datei:HarwareKonfiguration.JPG]]<br />
<br />
[[Datei:CPU.JPG]]<br />
<br />
[[Datei:Netzwerkkonfiguration.JPG]]<br />
<br />
Dann erzeugt man am besten als nächstes eine Importdatei XDB für den<br />
Komponentenkonfigurator. Diese läßt sich dann auf dem Rechner auf dem<br />
die RTX laufen soll mit dem Komponentenkonfigurator importieren.<br />
<br />
[[Datei:XDB_Datei_erzeugen.JPG]]<br />
<br />
Nach dem Import auf dem Zielrechner sollte der Komponentenkonfigurator<br />
so aussehen.<br />
<br />
[[Datei:Komponentenkonfigurator.JPG]]<br />
<br />
Der OB1 wird jetzt programmiert wie im folgenden Bild dargestellt.<br />
Zusätzlich habe ich den Merker 255.5 als Tacktmerker 2sec beider Konfiguration<br />
der CPU angeleget. Dann sehe ich das die Verbindung zu RTX steht. Dies ist<br />
aber nicht unbedingt erforderlich.<br />
<br />
[[Datei:ProgrammOB1.JPG]]<br />
<br />
In der fhem.cfg<br />
<br />
# S7 Kommunikation<br />
define PCS_7 S7 192.168.0.81 0 2<br />
attr PCS_7 room Keller<br />
<br />
# Lichttaster an S7 schaltbar über Icon<br />
define Taster0_Icon S7_DWrite db 33 0.0<br />
attr Taster0_Icon IODev PCS_7<br />
attr Taster0_Icon eventMap on:on off:off<br />
attr Taster0_Icon group Licht<br />
attr Taster0_Icon room Keller<br />
<br />
define Taster1_Icon S7_DWrite db 33 0.1<br />
attr Taster1_Icon IODev PCS_7<br />
attr Taster1_Icon eventMap on:on off:off<br />
attr Taster1_Icon group Licht<br />
attr Taster1_Icon room Keller<br />
<br />
define Taster2_Icon S7_DWrite db 33 0.2<br />
attr Taster2_Icon IODev PCS_7<br />
attr Taster2_Icon eventMap on:on off:off<br />
attr Taster2_Icon group Licht<br />
attr Taster2_Icon room Keller<br />
<br />
define Taster3_Icon S7_DWrite db 33 0.3<br />
attr Taster3_Icon IODev PCS_7<br />
attr Taster3_Icon eventMap on:on off:off<br />
attr Taster3_Icon group Licht<br />
attr Taster3_Icon room Keller<br />
<br />
define Taster4_Icon S7_DWrite db 33 0.4<br />
attr Taster4_Icon IODev PCS_7<br />
attr Taster4_Icon eventMap on:on off:off<br />
attr Taster4_Icon group Licht<br />
attr Taster4_Icon room Keller<br />
<br />
define Taster5_Icon S7_DWrite db 33 0.5<br />
attr Taster5_Icon IODev PCS_7<br />
attr Taster5_Icon eventMap on:on off:off<br />
attr Taster5_Icon group Licht<br />
attr Taster5_Icon room Keller<br />
<br />
define Taster6_Icon S7_DWrite db 33 0.6<br />
attr Taster6_Icon IODev PCS_7<br />
attr Taster6_Icon eventMap on:on off:off<br />
attr Taster6_Icon group Licht<br />
attr Taster6_Icon room Keller<br />
<br />
define Taster7_Icon S7_DWrite db 33 0.7<br />
attr Taster7_Icon IODev PCS_7<br />
attr Taster7_Icon eventMap on:on off:off<br />
attr Taster7_Icon group Licht<br />
attr Taster7_Icon room Keller<br />
<br />
<br />
define Rueckmeldung0 S7_DRead db 31 0.0<br />
attr Rueckmeldung0 IODev PCS_7<br />
attr Rueckmeldung0 group Licht<br />
attr Rueckmeldung0 room Keller<br />
<br />
define Rueckmeldung1 S7_DRead db 31 0.1<br />
attr Rueckmeldung1 IODev PCS_7<br />
attr Rueckmeldung1 group Licht<br />
attr Rueckmeldung1 room Keller<br />
<br />
define Rueckmeldung2 S7_DRead db 31 0.2<br />
attr Rueckmeldung2 IODev PCS_7<br />
attr Rueckmeldung2 group Licht<br />
attr Rueckmeldung2 room Keller<br />
<br />
define Rueckmeldung3 S7_DRead db 31 0.3<br />
attr Rueckmeldung3 IODev PCS_7<br />
attr Rueckmeldung3 group Licht<br />
attr Rueckmeldung3 room Keller<br />
<br />
define Rueckmeldung4 S7_DRead db 31 0.4<br />
attr Rueckmeldung4 IODev PCS_7<br />
attr Rueckmeldung4 group Licht<br />
attr Rueckmeldung4 room Keller<br />
<br />
define Rueckmeldung5 S7_DRead db 31 0.5<br />
attr Rueckmeldung5 IODev PCS_7<br />
attr Rueckmeldung5 group Licht<br />
attr Rueckmeldung5 room Keller<br />
<br />
define Rueckmeldung6 S7_DRead db 31 0.6<br />
attr Rueckmeldung6 IODev PCS_7<br />
attr Rueckmeldung6 group Licht<br />
attr Rueckmeldung6 room Keller<br />
<br />
define Rueckmeldung7 S7_DRead db 31 0.7<br />
attr Rueckmeldung7 IODev PCS_7<br />
attr Rueckmeldung7 group Licht<br />
attr Rueckmeldung7 room Keller<br />
<br />
<br />
[[Datei:fhem.JPG]]<br />
<br />
== S7-300 Beispielconfig ==<br />
'''Die Konfiguration (fhem.cfg) der S7-Kommunikation unten ist gültig ab V2.6.'''<br />
<br />
Es sind zwei CPUs im Einsatz, die mit FHEM kommunizieren:<br />
<br />
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)<br />
4 Kommunikations-DBs, DB20-DB24<br />
<br />
S7-315 CPU mit Onboard-Ethernet Schnittstelle, IP-Adresse: 192.168.1.102, R0S2 ('''Rack 0, Slot 2''' aus der Step 7 HW-Config)<br />
4 Kommunikations-DBs, DB70-DB74<br />
<br />
'''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)<br />
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.<br />
<br />
'''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)<br />
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).<br />
<br />
'''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) <br />
Hier legt FHEM die Gleitpunktzahlen ab, die in der S7 angezeigt/ verarbeitet werden sollen, z.B. den Wert eines Sliders zur Sollwertkorrektur (-10..+10).<br />
<br />
'''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)<br />
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.<br />
<br />
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.<br />
<br />
Es sind noch ein paar Spielerein als Beispiel in der fhem.cfg:<br />
<br />
- Tasten über Spracheingabe<br />
<br />
- Rückmeldung über Sprachausgabe<br />
<br />
- Temperatur aus dem Weather Modul wird an die S7 geschickt<br />
<br />
===fhem.cfg===<br />
<br />
# S7 Kommunikation mit 2 CPUs<br />
define 317 S7 192.168.1.101 0 2<br />
attr 317 room System<br />
<br />
define 315 S7 192.168.1.102 0 2<br />
attr 315 room System<br />
<br />
# FHEM Taster an 317<br />
define Taster_317 S7_DWrite db 23 0.0<br />
attr Taster_317 IODev 317<br />
attr Taster_317 devStateIcon .*:toggle:TRIGGER<br />
attr Taster_317 event-on-change-reading state<br />
attr Taster_317 group Licht<br />
attr Taster_317 room Keller<br />
<br />
# Rückmeldung ob 317 DO gesetzt hat<br />
define Rueckmeldung_317 S7_DRead db 21 0.0<br />
attr Rueckmeldung_317 IODev 317<br />
attr Rueckmeldung_317 event-on-change-reading state<br />
attr Rueckmeldung_317 group Licht<br />
attr Rueckmeldung_317 room Keller<br />
<br />
# FHEM Schalter an 315<br />
define Taster_315 S7_DWrite db 73 0.0<br />
attr Taster_315 IODev 315<br />
attr Taster_315 devStateIcon .*:toggle<br />
attr Taster_315 event-on-change-reading state<br />
attr Taster_315 group Licht<br />
attr Taster_315 room Keller<br />
attr Taster_315 webCmd ON:OFF<br />
<br />
# Rückmeldung ob 315 DO gesetzt hat<br />
define Rueckmeldung_315 S7_DRead db 71 0.0<br />
attr Rueckmeldung_315 IODev 315<br />
attr Rueckmeldung_315 event-on-change-reading state<br />
attr Rueckmeldung_315 group Licht<br />
attr Rueckmeldung_315 room Keller<br />
<br />
# FHEM Sollwertgeber an 317 als Knob<br />
define Temperaturkorrektur_317 S7_AWrite db 22 0 float<br />
attr Temperaturkorrektur_317 IODev 317<br />
attr Temperaturkorrektur_317 event-on-change-reading state<br />
attr Temperaturkorrektur_317 group Raumluft<br />
attr Temperaturkorrektur_317 room Keller<br />
attr Temperaturkorrektur_317 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
define Temperaturkorrektur_317_Knob dummy<br />
attr Temperaturkorrektur_317_Knob group Raumluft<br />
attr Temperaturkorrektur_317_Knob room Keller<br />
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<br />
attr Temperaturkorrektur_317_Knob stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
attr Temperaturkorrektur_317_Knob webCmd state<br />
<br />
define Temperaturkorrektur_317_Knob_notify notify Temperaturkorrektur_317_Knob {\<br />
fhem "set Temperaturkorrektur_317 ".ReadingsVal("Temperaturkorrektur_317_Knob","state","0");;\<br />
}<br />
attr Temperaturkorrektur_317_Knob_notify group Raumluft<br />
attr Temperaturkorrektur_317_Knob_notify room Keller<br />
<br />
# Rücklesewert ob 317 die Temperaturkorrektur bekommen hat<br />
define Ruecklesen_317 S7_ARead db 20 0 float<br />
attr Ruecklesen_317 IODev 317<br />
attr Ruecklesen_317 event-on-change-reading state<br />
attr Ruecklesen_317 group Raumluft<br />
attr Ruecklesen_317 room Keller<br />
attr Ruecklesen_317 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
# FHEM Sollwertgeber an 315 als Slider<br />
define Temperaturkorrektur_315 S7_AWrite db 72 0 float<br />
attr Temperaturkorrektur_315 IODev 315<br />
attr Temperaturkorrektur_315 event-on-change-reading state<br />
attr Temperaturkorrektur_315 group Raumluft<br />
attr Temperaturkorrektur_315 room Keller<br />
attr Temperaturkorrektur_315 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
define Temperaturkorrektur_315_Knob dummy<br />
attr Temperaturkorrektur_315_Knob group Raumluft<br />
attr Temperaturkorrektur_315_Knob room Keller<br />
attr Temperaturkorrektur_315_Knob setList state:slider,-10.0,0.5,10.0,1<br />
attr Temperaturkorrektur_315_Knob stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
attr Temperaturkorrektur_315_Knob webCmd state<br />
<br />
define Temperaturkorrektur_315_Knob_notify notify Temperaturkorrektur_315_Knob {\<br />
fhem "set Temperaturkorrektur_315 ".ReadingsVal("Temperaturkorrektur_315_Knob","state","0");;\<br />
}<br />
attr Temperaturkorrektur_315_Knob_notify group Raumluft<br />
attr Temperaturkorrektur_315_Knob_notify room Keller<br />
<br />
# Rücklesewert ob 315 die Temperaturkorrektur bekommen hat<br />
define Ruecklesen_315 S7_ARead db 70 0 float<br />
attr Ruecklesen_315 IODev 315<br />
attr Ruecklesen_315 event-on-change-reading state<br />
attr Ruecklesen_315 group Raumluft<br />
attr Ruecklesen_315 room Keller<br />
attr Ruecklesen_315 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
# Ein paar Spielereien<br />
<br />
# Temperatur aus dem Web an 317 schicken<br />
define Wetter Weather 638242 1800 de<br />
attr Wetter room Wetter<br />
<br />
define Temp_AU_Web S7_AWrite db 22 4 float<br />
attr Temp_AU_Web IODev 317<br />
attr Temp_AU_Web event-on-change-reading state<br />
attr Temp_AU_Web room Wetter<br />
attr Temp_AU_Web stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
define Temp_AU_Web_notify notify Wetter {\<br />
fhem "set Temp_AU_Web ".ReadingsVal("Wetter","temp_c","10");;\<br />
}<br />
attr Temp_AU_Web_notify room Wetter<br />
<br />
# WebViewControl Fullscreen Android Browser mit Text to Speech und Speech Recognition<br />
define Android webViewControl 12345<br />
attr Android room System<br />
<br />
# FHEM Taster an 317 über Sprache bedienen "Licht im Keller schalten"<br />
define speech_Licht_Keller notify .*voiceRecognitionLastResult.*icht.*eller.*(schalten|wechseln|tasten).* \<br />
set Taster_317 TRIGGER<br />
attr speech_Licht_Keller group Licht<br />
attr speech_Licht_Keller room Keller<br />
<br />
# Rückmeldung ob Licht eingeschaltet wurde als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters<br />
define Rueckmeldung_317_ttsSay_on notify Rueckmeldung_317:on {\<br />
fhem "set Android ttsSay Das Licht im Keller wurde eingeschaltet";;\<br />
}<br />
attr Rueckmeldung_317_ttsSay_on group Licht<br />
attr Rueckmeldung_317_ttsSay_on room Keller<br />
<br />
# Rückmeldung ob Licht ausgeschaltet wurde als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters<br />
define Rueckmeldung_317_ttsSay_off notify Rueckmeldung_317:off {\<br />
fhem "set Android ttsSay Das Licht im Keller wurde ausgeschaltet";;\<br />
}<br />
attr Rueckmeldung_317_ttsSay_off group Licht<br />
attr Rueckmeldung_317_ttsSay_off room Keller<br />
<br />
== Geschwindigkeit ==<br />
Um die Geschwindigkeit des Moduls / FHEM zu optimieren sollte man folgende Attribute verwenden:<br />
* on-change-reading <br />
* event-min-interval<br />
<br />
Insbesondere bei digitalen Datenpunkten macht es Sinn, dass FHEM nur bei Statusänderungen einen Event feuert.<br />
<br />
Configbeispiel:<br />
<br />
define L1_Q7 S7_DRead Q7<br />
attr L1_Q7 IODev logo<br />
attr L1_Q7 event-min-interval .*:600<br />
attr L1_Q7 event-on-change-reading state<br />
attr L1_Q7 eventMap on:Ein off:Aus<br />
<br />
Erklärung:<br />
nur wenn sich der State ändert wird ein Event gefeuert (''attr L1_Q7 event-on-change-reading state''), aber alle 600s wird auf jeden Fall ein Event gefeuert (''attr L1_Q7 event-min-interval .*:600'')<br />
<br />
== Versionshistory ==<br />
Versionsinfo:<br />
<br />
V2.12<br />
* performance optimisation<br />
* fix in rebuild cache function<br />
<br />
V2.11<br />
* (fix) memory allocation fix during shutdown/restart sequence<br />
* preperation for non blocking calls: job caching, clients chache --> speeds up the module<br />
<br />
V2.10<br />
* (feature) S7_DWrite: with new attribute trigger_length the impulse length could be controlled<br />
* (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<br />
* (fixes) some minor fixes in memory usage<br />
* (fixes) startup: no error messages should be found in the log anymore<br />
* (performance) performance tuning: (reduced dispace Messages) --> up to 4 times faster<br />
<br />
<br />
V2.9<br />
* fix for DWord (thanks to zicki)<br />
* multiple fix for writing to PLC<br />
<br />
V2.8<br />
* minor fix in TCP Socked (TCP_NODELAY option now set)<br />
* minor fix in reconnection (perl gets more time for garbage handling)<br />
* connection to the PLC is now delayed (5sec after creation the connection is build up, 3 seconds later the reading polling is started)<br />
* minor fix AWrite checks now connection status<br />
* fix for fritzbox<br />
<br />
V2.7<br />
* fix: for overlapping configuration<br />
<br />
V2.6<br />
* fix: reconnection at creation time<br />
* fix: state update on reading<br />
* fix: memory leak during message dispatch<br />
<br />
V2.5<br />
* fixes for writing operations for S300<br />
* fix in TCPClient for dedection of writing error<br />
<br />
V2.4<br />
* the requirement of having reading-configs and/or writing-configs are gone<br />
The module calculates based on the logical modul configuration the reading required bocks dynamically<br />
The writing is done as a minimal block for AWrite and as a Bit for DWrite<br />
This is done every second per default (optional Parameter of the 44_S7 modul)<br />
<br />
V2.3<br />
* FIX: For Logo8 Simple config<br />
* Error messages for perl PLC communication lib are available<br />
* standard attributes like event-min-interval, event-min-interval, ... are added<br />
* PLC Communication client extended for bitwise writing <br />
* removed attribute unit and precision: please use standard attribute stateFormat instead.<br />
<br />
Example for stateFormat with precision=1 and unit=°C:<br />
define innentemp S7_ARead db 0 6 u16<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=13228S72015-12-11T20:08:23Z<p>Charlie71: /* Versionshistory */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
* WINLC RTX 4.5<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|-<br />
|Linux amd64||passed||Mint Linux17.1<br />
|-<br />
|Windows||passed||Windows8.1<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
<br />
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.<br />
diese werden nach <br />
<br />
1) area (inputs, outputs, merker, DB)<br />
<br />
2) nach DB<br />
<br />
3) nach Startbyte<br />
<br />
sortiert.<br />
Daraus werden Leseblöcke abgeleitet, die dann von der SPS geholt werden. Danach werden die Clientmodule mit den aktualisierten Werden versorgt.<br />
<br />
Wenn man auf die Writer schreibend zugreift, so wird unmittelbar die entsprechenden Bits/Bytes in der SPS gesetzt.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|MaxMessageLength||Damit kann die maximale Telegrammlänge kleiner als, die beim Verbindungsaufbau vereinbarte, PDU Länge gesetzt werden.<br />
offset<br />
|<br />
|}<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|}<br />
<br />
Anmerkung: Es werden auch Standardattribute unterstützt (zb: event-min-interval, event-min-interval, stateFormat, ...).<br />
<br />
Um Einheiten anzeigen zu lassen kann stateFormat wie folgt verwendet werden, ZB:<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|trigger_length||Damit kann die Länge in [s] des Triggerimpulses gesetzt werden. Devault Value = 1s<br />
|}<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für <trigger_length>s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes*<br />
|}<br />
<br />
Wichtig: NI, NQ ... nur LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
NI,NQ ... nur für LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
'''Wichtig: NICHT auf die Eingänge der Logo schreibend zugreifen. Das macht KEINEN SINN, die Logo liest das Eingangswort zu Beginn eines Verarbeitungszyklus von der HW ein (= Eingangsabbild). Wenn das Programm ausgeführt wird wir ausschließlich auf dieses Eingangsabbild zugegriffen. Ein Netzwerkzugriff kann somit die Eingänge nicht direkt beeinflussen. Aus diesem Grund Netzwerk Eingänge (NI) verwenden!'''<br />
<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== WinLC RTX 4.5 Beispielconfig ==<br />
Als erstes beginnt man mit der Hardwarekonfiguration:<br />
<br />
[[Datei:HarwareKonfiguration.JPG]]<br />
<br />
[[Datei:CPU.JPG]]<br />
<br />
[[Datei:Netzwerkkonfiguration.JPG]]<br />
<br />
Dann erzeugt man am besten als nächstes eine Importdatei XDB für den<br />
Komponentenkonfigurator. Diese läßt sich dann auf dem Rechner auf dem<br />
die RTX laufen soll mit dem Komponentenkonfigurator importieren.<br />
<br />
[[Datei:XDB_Datei_erzeugen.JPG]]<br />
<br />
Nach dem Import auf dem Zielrechner sollte der Komponentenkonfigurator<br />
so aussehen.<br />
<br />
[[Datei:Komponentenkonfigurator.JPG]]<br />
<br />
Der OB1 wird jetzt programmiert wie im folgenden Bild dargestellt.<br />
Zusätzlich habe ich den Merker 255.5 als Tacktmerker 2sec beider Konfiguration<br />
der CPU angeleget. Dann sehe ich das die Verbindung zu RTX steht. Dies ist<br />
aber nicht unbedingt erforderlich.<br />
<br />
[[Datei:ProgrammOB1.JPG]]<br />
<br />
In der fhem.cfg<br />
<br />
# S7 Kommunikation<br />
define PCS_7 S7 192.168.0.81 0 2<br />
attr PCS_7 room Keller<br />
<br />
# Lichttaster an S7 schaltbar über Icon<br />
define Taster0_Icon S7_DWrite db 33 0.0<br />
attr Taster0_Icon IODev PCS_7<br />
attr Taster0_Icon eventMap on:on off:off<br />
attr Taster0_Icon group Licht<br />
attr Taster0_Icon room Keller<br />
<br />
define Taster1_Icon S7_DWrite db 33 0.1<br />
attr Taster1_Icon IODev PCS_7<br />
attr Taster1_Icon eventMap on:on off:off<br />
attr Taster1_Icon group Licht<br />
attr Taster1_Icon room Keller<br />
<br />
define Taster2_Icon S7_DWrite db 33 0.2<br />
attr Taster2_Icon IODev PCS_7<br />
attr Taster2_Icon eventMap on:on off:off<br />
attr Taster2_Icon group Licht<br />
attr Taster2_Icon room Keller<br />
<br />
define Taster3_Icon S7_DWrite db 33 0.3<br />
attr Taster3_Icon IODev PCS_7<br />
attr Taster3_Icon eventMap on:on off:off<br />
attr Taster3_Icon group Licht<br />
attr Taster3_Icon room Keller<br />
<br />
define Taster4_Icon S7_DWrite db 33 0.4<br />
attr Taster4_Icon IODev PCS_7<br />
attr Taster4_Icon eventMap on:on off:off<br />
attr Taster4_Icon group Licht<br />
attr Taster4_Icon room Keller<br />
<br />
define Taster5_Icon S7_DWrite db 33 0.5<br />
attr Taster5_Icon IODev PCS_7<br />
attr Taster5_Icon eventMap on:on off:off<br />
attr Taster5_Icon group Licht<br />
attr Taster5_Icon room Keller<br />
<br />
define Taster6_Icon S7_DWrite db 33 0.6<br />
attr Taster6_Icon IODev PCS_7<br />
attr Taster6_Icon eventMap on:on off:off<br />
attr Taster6_Icon group Licht<br />
attr Taster6_Icon room Keller<br />
<br />
define Taster7_Icon S7_DWrite db 33 0.7<br />
attr Taster7_Icon IODev PCS_7<br />
attr Taster7_Icon eventMap on:on off:off<br />
attr Taster7_Icon group Licht<br />
attr Taster7_Icon room Keller<br />
<br />
<br />
define Rueckmeldung0 S7_DRead db 31 0.0<br />
attr Rueckmeldung0 IODev PCS_7<br />
attr Rueckmeldung0 group Licht<br />
attr Rueckmeldung0 room Keller<br />
<br />
define Rueckmeldung1 S7_DRead db 31 0.1<br />
attr Rueckmeldung1 IODev PCS_7<br />
attr Rueckmeldung1 group Licht<br />
attr Rueckmeldung1 room Keller<br />
<br />
define Rueckmeldung2 S7_DRead db 31 0.2<br />
attr Rueckmeldung2 IODev PCS_7<br />
attr Rueckmeldung2 group Licht<br />
attr Rueckmeldung2 room Keller<br />
<br />
define Rueckmeldung3 S7_DRead db 31 0.3<br />
attr Rueckmeldung3 IODev PCS_7<br />
attr Rueckmeldung3 group Licht<br />
attr Rueckmeldung3 room Keller<br />
<br />
define Rueckmeldung4 S7_DRead db 31 0.4<br />
attr Rueckmeldung4 IODev PCS_7<br />
attr Rueckmeldung4 group Licht<br />
attr Rueckmeldung4 room Keller<br />
<br />
define Rueckmeldung5 S7_DRead db 31 0.5<br />
attr Rueckmeldung5 IODev PCS_7<br />
attr Rueckmeldung5 group Licht<br />
attr Rueckmeldung5 room Keller<br />
<br />
define Rueckmeldung6 S7_DRead db 31 0.6<br />
attr Rueckmeldung6 IODev PCS_7<br />
attr Rueckmeldung6 group Licht<br />
attr Rueckmeldung6 room Keller<br />
<br />
define Rueckmeldung7 S7_DRead db 31 0.7<br />
attr Rueckmeldung7 IODev PCS_7<br />
attr Rueckmeldung7 group Licht<br />
attr Rueckmeldung7 room Keller<br />
<br />
<br />
[[Datei:fhem.JPG]]<br />
<br />
== S7-300 Beispielconfig ==<br />
'''Die Konfiguration (fhem.cfg) der S7-Kommunikation unten ist gültig ab V2.6.'''<br />
<br />
Es sind zwei CPUs im Einsatz, die mit FHEM kommunizieren:<br />
<br />
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)<br />
4 Kommunikations-DBs, DB20-DB24<br />
<br />
S7-315 CPU mit Onboard-Ethernet Schnittstelle, IP-Adresse: 192.168.1.102, R0S2 ('''Rack 0, Slot 2''' aus der Step 7 HW-Config)<br />
4 Kommunikations-DBs, DB70-DB74<br />
<br />
'''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)<br />
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.<br />
<br />
'''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)<br />
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).<br />
<br />
'''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) <br />
Hier legt FHEM die Gleitpunktzahlen ab, die in der S7 angezeigt/ verarbeitet werden sollen, z.B. den Wert eines Sliders zur Sollwertkorrektur (-10..+10).<br />
<br />
'''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)<br />
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.<br />
<br />
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.<br />
<br />
Es sind noch ein paar Spielerein als Beispiel in der fhem.cfg:<br />
<br />
- Tasten über Spracheingabe<br />
<br />
- Rückmeldung über Sprachausgabe<br />
<br />
- Temperatur aus dem Weather Modul wird an die S7 geschickt<br />
<br />
===fhem.cfg===<br />
<br />
# S7 Kommunikation mit 2 CPUs<br />
define 317 S7 192.168.1.101 0 2<br />
attr 317 room System<br />
<br />
define 315 S7 192.168.1.102 0 2<br />
attr 315 room System<br />
<br />
# FHEM Taster an 317<br />
define Taster_317 S7_DWrite db 23 0.0<br />
attr Taster_317 IODev 317<br />
attr Taster_317 devStateIcon .*:toggle:TRIGGER<br />
attr Taster_317 event-on-change-reading state<br />
attr Taster_317 group Licht<br />
attr Taster_317 room Keller<br />
<br />
# Rückmeldung ob 317 DO gesetzt hat<br />
define Rueckmeldung_317 S7_DRead db 21 0.0<br />
attr Rueckmeldung_317 IODev 317<br />
attr Rueckmeldung_317 event-on-change-reading state<br />
attr Rueckmeldung_317 group Licht<br />
attr Rueckmeldung_317 room Keller<br />
<br />
# FHEM Schalter an 315<br />
define Taster_315 S7_DWrite db 73 0.0<br />
attr Taster_315 IODev 315<br />
attr Taster_315 devStateIcon .*:toggle<br />
attr Taster_315 event-on-change-reading state<br />
attr Taster_315 group Licht<br />
attr Taster_315 room Keller<br />
attr Taster_315 webCmd ON:OFF<br />
<br />
# Rückmeldung ob 315 DO gesetzt hat<br />
define Rueckmeldung_315 S7_DRead db 71 0.0<br />
attr Rueckmeldung_315 IODev 315<br />
attr Rueckmeldung_315 event-on-change-reading state<br />
attr Rueckmeldung_315 group Licht<br />
attr Rueckmeldung_315 room Keller<br />
<br />
# FHEM Sollwertgeber an 317 als Knob<br />
define Temperaturkorrektur_317 S7_AWrite db 22 0 float<br />
attr Temperaturkorrektur_317 IODev 317<br />
attr Temperaturkorrektur_317 event-on-change-reading state<br />
attr Temperaturkorrektur_317 group Raumluft<br />
attr Temperaturkorrektur_317 room Keller<br />
attr Temperaturkorrektur_317 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
define Temperaturkorrektur_317_Knob dummy<br />
attr Temperaturkorrektur_317_Knob group Raumluft<br />
attr Temperaturkorrektur_317_Knob room Keller<br />
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<br />
attr Temperaturkorrektur_317_Knob stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
attr Temperaturkorrektur_317_Knob webCmd state<br />
<br />
define Temperaturkorrektur_317_Knob_notify notify Temperaturkorrektur_317_Knob {\<br />
fhem "set Temperaturkorrektur_317 ".ReadingsVal("Temperaturkorrektur_317_Knob","state","0");;\<br />
}<br />
attr Temperaturkorrektur_317_Knob_notify group Raumluft<br />
attr Temperaturkorrektur_317_Knob_notify room Keller<br />
<br />
# Rücklesewert ob 317 die Temperaturkorrektur bekommen hat<br />
define Ruecklesen_317 S7_ARead db 20 0 float<br />
attr Ruecklesen_317 IODev 317<br />
attr Ruecklesen_317 event-on-change-reading state<br />
attr Ruecklesen_317 group Raumluft<br />
attr Ruecklesen_317 room Keller<br />
attr Ruecklesen_317 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
# FHEM Sollwertgeber an 315 als Slider<br />
define Temperaturkorrektur_315 S7_AWrite db 72 0 float<br />
attr Temperaturkorrektur_315 IODev 315<br />
attr Temperaturkorrektur_315 event-on-change-reading state<br />
attr Temperaturkorrektur_315 group Raumluft<br />
attr Temperaturkorrektur_315 room Keller<br />
attr Temperaturkorrektur_315 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
define Temperaturkorrektur_315_Knob dummy<br />
attr Temperaturkorrektur_315_Knob group Raumluft<br />
attr Temperaturkorrektur_315_Knob room Keller<br />
attr Temperaturkorrektur_315_Knob setList state:slider,-10.0,0.5,10.0,1<br />
attr Temperaturkorrektur_315_Knob stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
attr Temperaturkorrektur_315_Knob webCmd state<br />
<br />
define Temperaturkorrektur_315_Knob_notify notify Temperaturkorrektur_315_Knob {\<br />
fhem "set Temperaturkorrektur_315 ".ReadingsVal("Temperaturkorrektur_315_Knob","state","0");;\<br />
}<br />
attr Temperaturkorrektur_315_Knob_notify group Raumluft<br />
attr Temperaturkorrektur_315_Knob_notify room Keller<br />
<br />
# Rücklesewert ob 315 die Temperaturkorrektur bekommen hat<br />
define Ruecklesen_315 S7_ARead db 70 0 float<br />
attr Ruecklesen_315 IODev 315<br />
attr Ruecklesen_315 event-on-change-reading state<br />
attr Ruecklesen_315 group Raumluft<br />
attr Ruecklesen_315 room Keller<br />
attr Ruecklesen_315 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
# Ein paar Spielereien<br />
<br />
# Temperatur aus dem Web an 317 schicken<br />
define Wetter Weather 638242 1800 de<br />
attr Wetter room Wetter<br />
<br />
define Temp_AU_Web S7_AWrite db 22 4 float<br />
attr Temp_AU_Web IODev 317<br />
attr Temp_AU_Web event-on-change-reading state<br />
attr Temp_AU_Web room Wetter<br />
attr Temp_AU_Web stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
define Temp_AU_Web_notify notify Wetter {\<br />
fhem "set Temp_AU_Web ".ReadingsVal("Wetter","temp_c","10");;\<br />
}<br />
attr Temp_AU_Web_notify room Wetter<br />
<br />
# WebViewControl Fullscreen Android Browser mit Text to Speech und Speech Recognition<br />
define Android webViewControl 12345<br />
attr Android room System<br />
<br />
# FHEM Taster an 317 über Sprache bedienen "Licht im Keller schalten"<br />
define speech_Licht_Keller notify .*voiceRecognitionLastResult.*icht.*eller.*(schalten|wechseln|tasten).* \<br />
set Taster_317 TRIGGER<br />
attr speech_Licht_Keller group Licht<br />
attr speech_Licht_Keller room Keller<br />
<br />
# Rückmeldung ob Licht eingeschaltet wurde als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters<br />
define Rueckmeldung_317_ttsSay_on notify Rueckmeldung_317:on {\<br />
fhem "set Android ttsSay Das Licht im Keller wurde eingeschaltet";;\<br />
}<br />
attr Rueckmeldung_317_ttsSay_on group Licht<br />
attr Rueckmeldung_317_ttsSay_on room Keller<br />
<br />
# Rückmeldung ob Licht ausgeschaltet wurde als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters<br />
define Rueckmeldung_317_ttsSay_off notify Rueckmeldung_317:off {\<br />
fhem "set Android ttsSay Das Licht im Keller wurde ausgeschaltet";;\<br />
}<br />
attr Rueckmeldung_317_ttsSay_off group Licht<br />
attr Rueckmeldung_317_ttsSay_off room Keller<br />
<br />
== Versionshistory ==<br />
Versionsinfo:<br />
<br />
V2.12<br />
* performance optimisation<br />
* fix in rebuild cache function<br />
<br />
V2.11<br />
* (fix) memory allocation fix during shutdown/restart sequence<br />
* preperation for non blocking calls: job caching, clients chache --> speeds up the module<br />
<br />
V2.10<br />
* (feature) S7_DWrite: with new attribute trigger_length the impulse length could be controlled<br />
* (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<br />
* (fixes) some minor fixes in memory usage<br />
* (fixes) startup: no error messages should be found in the log anymore<br />
* (performance) performance tuning: (reduced dispace Messages) --> up to 4 times faster<br />
<br />
<br />
V2.9<br />
* fix for DWord (thanks to zicki)<br />
* multiple fix for writing to PLC<br />
<br />
V2.8<br />
* minor fix in TCP Socked (TCP_NODELAY option now set)<br />
* minor fix in reconnection (perl gets more time for garbage handling)<br />
* connection to the PLC is now delayed (5sec after creation the connection is build up, 3 seconds later the reading polling is started)<br />
* minor fix AWrite checks now connection status<br />
* fix for fritzbox<br />
<br />
V2.7<br />
* fix: for overlapping configuration<br />
<br />
V2.6<br />
* fix: reconnection at creation time<br />
* fix: state update on reading<br />
* fix: memory leak during message dispatch<br />
<br />
V2.5<br />
* fixes for writing operations for S300<br />
* fix in TCPClient for dedection of writing error<br />
<br />
V2.4<br />
* the requirement of having reading-configs and/or writing-configs are gone<br />
The module calculates based on the logical modul configuration the reading required bocks dynamically<br />
The writing is done as a minimal block for AWrite and as a Bit for DWrite<br />
This is done every second per default (optional Parameter of the 44_S7 modul)<br />
<br />
V2.3<br />
* FIX: For Logo8 Simple config<br />
* Error messages for perl PLC communication lib are available<br />
* standard attributes like event-min-interval, event-min-interval, ... are added<br />
* PLC Communication client extended for bitwise writing <br />
* removed attribute unit and precision: please use standard attribute stateFormat instead.<br />
<br />
Example for stateFormat with precision=1 and unit=°C:<br />
define innentemp S7_ARead db 0 6 u16<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=12911S72015-11-17T13:16:36Z<p>Charlie71: /* Digitale Datenpunkte zum Schreiben */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
* WINLC RTX 4.5<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|-<br />
|Linux amd64||passed||Mint Linux17.1<br />
|-<br />
|Windows||passed||Windows8.1<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
<br />
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.<br />
diese werden nach <br />
<br />
1) area (inputs, outputs, merker, DB)<br />
<br />
2) nach DB<br />
<br />
3) nach Startbyte<br />
<br />
sortiert.<br />
Daraus werden Leseblöcke abgeleitet, die dann von der SPS geholt werden. Danach werden die Clientmodule mit den aktualisierten Werden versorgt.<br />
<br />
Wenn man auf die Writer schreibend zugreift, so wird unmittelbar die entsprechenden Bits/Bytes in der SPS gesetzt.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|MaxMessageLength||Damit kann die maximale Telegrammlänge kleiner als, die beim Verbindungsaufbau vereinbarte, PDU Länge gesetzt werden.<br />
offset<br />
|<br />
|}<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|}<br />
<br />
Anmerkung: Es werden auch Standardattribute unterstützt (zb: event-min-interval, event-min-interval, stateFormat, ...).<br />
<br />
Um Einheiten anzeigen zu lassen kann stateFormat wie folgt verwendet werden, ZB:<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|trigger_length||Damit kann die Länge in [s] des Triggerimpulses gesetzt werden. Devault Value = 1s<br />
|}<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für <trigger_length>s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes*<br />
|}<br />
<br />
Wichtig: NI, NQ ... nur LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
NI,NQ ... nur für LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
'''Wichtig: NICHT auf die Eingänge der Logo schreibend zugreifen. Das macht KEINEN SINN, die Logo liest das Eingangswort zu Beginn eines Verarbeitungszyklus von der HW ein (= Eingangsabbild). Wenn das Programm ausgeführt wird wir ausschließlich auf dieses Eingangsabbild zugegriffen. Ein Netzwerkzugriff kann somit die Eingänge nicht direkt beeinflussen. Aus diesem Grund Netzwerk Eingänge (NI) verwenden!'''<br />
<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== WinLC RTX 4.5 Beispielconfig ==<br />
Als erstes beginnt man mit der Hardwarekonfiguration:<br />
<br />
[[Datei:HarwareKonfiguration.JPG]]<br />
<br />
[[Datei:CPU.JPG]]<br />
<br />
[[Datei:Netzwerkkonfiguration.JPG]]<br />
<br />
Dann erzeugt man am besten als nächstes eine Importdatei XDB für den<br />
Komponentenkonfigurator. Diese läßt sich dann auf dem Rechner auf dem<br />
die RTX laufen soll mit dem Komponentenkonfigurator importieren.<br />
<br />
[[Datei:XDB_Datei_erzeugen.JPG]]<br />
<br />
Nach dem Import auf dem Zielrechner sollte der Komponentenkonfigurator<br />
so aussehen.<br />
<br />
[[Datei:Komponentenkonfigurator.JPG]]<br />
<br />
Der OB1 wird jetzt programmiert wie im folgenden Bild dargestellt.<br />
Zusätzlich habe ich den Merker 255.5 als Tacktmerker 2sec beider Konfiguration<br />
der CPU angeleget. Dann sehe ich das die Verbindung zu RTX steht. Dies ist<br />
aber nicht unbedingt erforderlich.<br />
<br />
[[Datei:ProgrammOB1.JPG]]<br />
<br />
In der fhem.cfg<br />
<br />
# S7 Kommunikation<br />
define PCS_7 S7 192.168.0.81 0 2<br />
attr PCS_7 room Keller<br />
<br />
# Lichttaster an S7 schaltbar über Icon<br />
define Taster0_Icon S7_DWrite db 33 0.0<br />
attr Taster0_Icon IODev PCS_7<br />
attr Taster0_Icon eventMap on:on off:off<br />
attr Taster0_Icon group Licht<br />
attr Taster0_Icon room Keller<br />
<br />
define Taster1_Icon S7_DWrite db 33 0.1<br />
attr Taster1_Icon IODev PCS_7<br />
attr Taster1_Icon eventMap on:on off:off<br />
attr Taster1_Icon group Licht<br />
attr Taster1_Icon room Keller<br />
<br />
define Taster2_Icon S7_DWrite db 33 0.2<br />
attr Taster2_Icon IODev PCS_7<br />
attr Taster2_Icon eventMap on:on off:off<br />
attr Taster2_Icon group Licht<br />
attr Taster2_Icon room Keller<br />
<br />
define Taster3_Icon S7_DWrite db 33 0.3<br />
attr Taster3_Icon IODev PCS_7<br />
attr Taster3_Icon eventMap on:on off:off<br />
attr Taster3_Icon group Licht<br />
attr Taster3_Icon room Keller<br />
<br />
define Taster4_Icon S7_DWrite db 33 0.4<br />
attr Taster4_Icon IODev PCS_7<br />
attr Taster4_Icon eventMap on:on off:off<br />
attr Taster4_Icon group Licht<br />
attr Taster4_Icon room Keller<br />
<br />
define Taster5_Icon S7_DWrite db 33 0.5<br />
attr Taster5_Icon IODev PCS_7<br />
attr Taster5_Icon eventMap on:on off:off<br />
attr Taster5_Icon group Licht<br />
attr Taster5_Icon room Keller<br />
<br />
define Taster6_Icon S7_DWrite db 33 0.6<br />
attr Taster6_Icon IODev PCS_7<br />
attr Taster6_Icon eventMap on:on off:off<br />
attr Taster6_Icon group Licht<br />
attr Taster6_Icon room Keller<br />
<br />
define Taster7_Icon S7_DWrite db 33 0.7<br />
attr Taster7_Icon IODev PCS_7<br />
attr Taster7_Icon eventMap on:on off:off<br />
attr Taster7_Icon group Licht<br />
attr Taster7_Icon room Keller<br />
<br />
<br />
define Rueckmeldung0 S7_DRead db 31 0.0<br />
attr Rueckmeldung0 IODev PCS_7<br />
attr Rueckmeldung0 group Licht<br />
attr Rueckmeldung0 room Keller<br />
<br />
define Rueckmeldung1 S7_DRead db 31 0.1<br />
attr Rueckmeldung1 IODev PCS_7<br />
attr Rueckmeldung1 group Licht<br />
attr Rueckmeldung1 room Keller<br />
<br />
define Rueckmeldung2 S7_DRead db 31 0.2<br />
attr Rueckmeldung2 IODev PCS_7<br />
attr Rueckmeldung2 group Licht<br />
attr Rueckmeldung2 room Keller<br />
<br />
define Rueckmeldung3 S7_DRead db 31 0.3<br />
attr Rueckmeldung3 IODev PCS_7<br />
attr Rueckmeldung3 group Licht<br />
attr Rueckmeldung3 room Keller<br />
<br />
define Rueckmeldung4 S7_DRead db 31 0.4<br />
attr Rueckmeldung4 IODev PCS_7<br />
attr Rueckmeldung4 group Licht<br />
attr Rueckmeldung4 room Keller<br />
<br />
define Rueckmeldung5 S7_DRead db 31 0.5<br />
attr Rueckmeldung5 IODev PCS_7<br />
attr Rueckmeldung5 group Licht<br />
attr Rueckmeldung5 room Keller<br />
<br />
define Rueckmeldung6 S7_DRead db 31 0.6<br />
attr Rueckmeldung6 IODev PCS_7<br />
attr Rueckmeldung6 group Licht<br />
attr Rueckmeldung6 room Keller<br />
<br />
define Rueckmeldung7 S7_DRead db 31 0.7<br />
attr Rueckmeldung7 IODev PCS_7<br />
attr Rueckmeldung7 group Licht<br />
attr Rueckmeldung7 room Keller<br />
<br />
<br />
[[Datei:fhem.JPG]]<br />
<br />
== S7-300 Beispielconfig ==<br />
'''Die Konfiguration (fhem.cfg) der S7-Kommunikation unten ist gültig ab V2.6.'''<br />
<br />
Es sind zwei CPUs im Einsatz, die mit FHEM kommunizieren:<br />
<br />
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)<br />
4 Kommunikations-DBs, DB20-DB24<br />
<br />
S7-315 CPU mit Onboard-Ethernet Schnittstelle, IP-Adresse: 192.168.1.102, R0S2 ('''Rack 0, Slot 2''' aus der Step 7 HW-Config)<br />
4 Kommunikations-DBs, DB70-DB74<br />
<br />
'''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)<br />
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.<br />
<br />
'''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)<br />
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).<br />
<br />
'''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) <br />
Hier legt FHEM die Gleitpunktzahlen ab, die in der S7 angezeigt/ verarbeitet werden sollen, z.B. den Wert eines Sliders zur Sollwertkorrektur (-10..+10).<br />
<br />
'''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)<br />
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.<br />
<br />
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.<br />
<br />
Es sind noch ein paar Spielerein als Beispiel in der fhem.cfg:<br />
<br />
- Tasten über Spracheingabe<br />
<br />
- Rückmeldung über Sprachausgabe<br />
<br />
- Temperatur aus dem Weather Modul wird an die S7 geschickt<br />
<br />
===fhem.cfg===<br />
<br />
# S7 Kommunikation mit 2 CPUs<br />
define 317 S7 192.168.1.101 0 2<br />
attr 317 room System<br />
<br />
define 315 S7 192.168.1.102 0 2<br />
attr 315 room System<br />
<br />
# FHEM Taster an 317<br />
define Taster_317 S7_DWrite db 23 0.0<br />
attr Taster_317 IODev 317<br />
attr Taster_317 devStateIcon .*:toggle:TRIGGER<br />
attr Taster_317 event-on-change-reading state<br />
attr Taster_317 group Licht<br />
attr Taster_317 room Keller<br />
<br />
# Rückmeldung ob 317 DO gesetzt hat<br />
define Rueckmeldung_317 S7_DRead db 21 0.0<br />
attr Rueckmeldung_317 IODev 317<br />
attr Rueckmeldung_317 event-on-change-reading state<br />
attr Rueckmeldung_317 group Licht<br />
attr Rueckmeldung_317 room Keller<br />
<br />
# FHEM Schalter an 315<br />
define Taster_315 S7_DWrite db 73 0.0<br />
attr Taster_315 IODev 315<br />
attr Taster_315 devStateIcon .*:toggle<br />
attr Taster_315 event-on-change-reading state<br />
attr Taster_315 group Licht<br />
attr Taster_315 room Keller<br />
attr Taster_315 webCmd ON:OFF<br />
<br />
# Rückmeldung ob 315 DO gesetzt hat<br />
define Rueckmeldung_315 S7_DRead db 71 0.0<br />
attr Rueckmeldung_315 IODev 315<br />
attr Rueckmeldung_315 event-on-change-reading state<br />
attr Rueckmeldung_315 group Licht<br />
attr Rueckmeldung_315 room Keller<br />
<br />
# FHEM Sollwertgeber an 317 als Knob<br />
define Temperaturkorrektur_317 S7_AWrite db 22 0 float<br />
attr Temperaturkorrektur_317 IODev 317<br />
attr Temperaturkorrektur_317 event-on-change-reading state<br />
attr Temperaturkorrektur_317 group Raumluft<br />
attr Temperaturkorrektur_317 room Keller<br />
attr Temperaturkorrektur_317 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
define Temperaturkorrektur_317_Knob dummy<br />
attr Temperaturkorrektur_317_Knob group Raumluft<br />
attr Temperaturkorrektur_317_Knob room Keller<br />
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<br />
attr Temperaturkorrektur_317_Knob stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
attr Temperaturkorrektur_317_Knob webCmd state<br />
<br />
define Temperaturkorrektur_317_Knob_notify notify Temperaturkorrektur_317_Knob {\<br />
fhem "set Temperaturkorrektur_317 ".ReadingsVal("Temperaturkorrektur_317_Knob","state","0");;\<br />
}<br />
attr Temperaturkorrektur_317_Knob_notify group Raumluft<br />
attr Temperaturkorrektur_317_Knob_notify room Keller<br />
<br />
# Rücklesewert ob 317 die Temperaturkorrektur bekommen hat<br />
define Ruecklesen_317 S7_ARead db 20 0 float<br />
attr Ruecklesen_317 IODev 317<br />
attr Ruecklesen_317 event-on-change-reading state<br />
attr Ruecklesen_317 group Raumluft<br />
attr Ruecklesen_317 room Keller<br />
attr Ruecklesen_317 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
# FHEM Sollwertgeber an 315 als Slider<br />
define Temperaturkorrektur_315 S7_AWrite db 72 0 float<br />
attr Temperaturkorrektur_315 IODev 315<br />
attr Temperaturkorrektur_315 event-on-change-reading state<br />
attr Temperaturkorrektur_315 group Raumluft<br />
attr Temperaturkorrektur_315 room Keller<br />
attr Temperaturkorrektur_315 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
define Temperaturkorrektur_315_Knob dummy<br />
attr Temperaturkorrektur_315_Knob group Raumluft<br />
attr Temperaturkorrektur_315_Knob room Keller<br />
attr Temperaturkorrektur_315_Knob setList state:slider,-10.0,0.5,10.0,1<br />
attr Temperaturkorrektur_315_Knob stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
attr Temperaturkorrektur_315_Knob webCmd state<br />
<br />
define Temperaturkorrektur_315_Knob_notify notify Temperaturkorrektur_315_Knob {\<br />
fhem "set Temperaturkorrektur_315 ".ReadingsVal("Temperaturkorrektur_315_Knob","state","0");;\<br />
}<br />
attr Temperaturkorrektur_315_Knob_notify group Raumluft<br />
attr Temperaturkorrektur_315_Knob_notify room Keller<br />
<br />
# Rücklesewert ob 315 die Temperaturkorrektur bekommen hat<br />
define Ruecklesen_315 S7_ARead db 70 0 float<br />
attr Ruecklesen_315 IODev 315<br />
attr Ruecklesen_315 event-on-change-reading state<br />
attr Ruecklesen_315 group Raumluft<br />
attr Ruecklesen_315 room Keller<br />
attr Ruecklesen_315 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
# Ein paar Spielereien<br />
<br />
# Temperatur aus dem Web an 317 schicken<br />
define Wetter Weather 638242 1800 de<br />
attr Wetter room Wetter<br />
<br />
define Temp_AU_Web S7_AWrite db 22 4 float<br />
attr Temp_AU_Web IODev 317<br />
attr Temp_AU_Web event-on-change-reading state<br />
attr Temp_AU_Web room Wetter<br />
attr Temp_AU_Web stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
define Temp_AU_Web_notify notify Wetter {\<br />
fhem "set Temp_AU_Web ".ReadingsVal("Wetter","temp_c","10");;\<br />
}<br />
attr Temp_AU_Web_notify room Wetter<br />
<br />
# WebViewControl Fullscreen Android Browser mit Text to Speech und Speech Recognition<br />
define Android webViewControl 12345<br />
attr Android room System<br />
<br />
# FHEM Taster an 317 über Sprache bedienen "Licht im Keller schalten"<br />
define speech_Licht_Keller notify .*voiceRecognitionLastResult.*icht.*eller.*(schalten|wechseln|tasten).* \<br />
set Taster_317 TRIGGER<br />
attr speech_Licht_Keller group Licht<br />
attr speech_Licht_Keller room Keller<br />
<br />
# Rückmeldung ob Licht eingeschaltet wurde als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters<br />
define Rueckmeldung_317_ttsSay_on notify Rueckmeldung_317:on {\<br />
fhem "set Android ttsSay Das Licht im Keller wurde eingeschaltet";;\<br />
}<br />
attr Rueckmeldung_317_ttsSay_on group Licht<br />
attr Rueckmeldung_317_ttsSay_on room Keller<br />
<br />
# Rückmeldung ob Licht ausgeschaltet wurde als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters<br />
define Rueckmeldung_317_ttsSay_off notify Rueckmeldung_317:off {\<br />
fhem "set Android ttsSay Das Licht im Keller wurde ausgeschaltet";;\<br />
}<br />
attr Rueckmeldung_317_ttsSay_off group Licht<br />
attr Rueckmeldung_317_ttsSay_off room Keller<br />
<br />
== Versionshistory ==<br />
Versionsinfo:<br />
<br />
V2.10<br />
* (feature) S7_DWrite: with new attribute trigger_length the impulse length could be controlled<br />
* (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<br />
* (fixes) some minor fixes in memory usage<br />
* (fixes) startup: no error messages should be found in the log anymore<br />
* (performance) performance tuning: (reduced dispace Messages) --> up to 4 times faster<br />
<br />
<br />
V2.9<br />
* fix for DWord (thanks to zicki)<br />
* multiple fix for writing to PLC<br />
<br />
V2.8<br />
* minor fix in TCP Socked (TCP_NODELAY option now set)<br />
* minor fix in reconnection (perl gets more time for garbage handling)<br />
* connection to the PLC is now delayed (5sec after creation the connection is build up, 3 seconds later the reading polling is started)<br />
* minor fix AWrite checks now connection status<br />
* fix for fritzbox<br />
<br />
V2.7<br />
* fix: for overlapping configuration<br />
<br />
V2.6<br />
* fix: reconnection at creation time<br />
* fix: state update on reading<br />
* fix: memory leak during message dispatch<br />
<br />
V2.5<br />
* fixes for writing operations for S300<br />
* fix in TCPClient for dedection of writing error<br />
<br />
V2.4<br />
* the requirement of having reading-configs and/or writing-configs are gone<br />
The module calculates based on the logical modul configuration the reading required bocks dynamically<br />
The writing is done as a minimal block for AWrite and as a Bit for DWrite<br />
This is done every second per default (optional Parameter of the 44_S7 modul)<br />
<br />
V2.3<br />
* FIX: For Logo8 Simple config<br />
* Error messages for perl PLC communication lib are available<br />
* standard attributes like event-min-interval, event-min-interval, ... are added<br />
* PLC Communication client extended for bitwise writing <br />
* removed attribute unit and precision: please use standard attribute stateFormat instead.<br />
<br />
Example for stateFormat with precision=1 and unit=°C:<br />
define innentemp S7_ARead db 0 6 u16<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=12910S72015-11-17T13:13:44Z<p>Charlie71: /* Attribute */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
* WINLC RTX 4.5<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|-<br />
|Linux amd64||passed||Mint Linux17.1<br />
|-<br />
|Windows||passed||Windows8.1<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
<br />
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.<br />
diese werden nach <br />
<br />
1) area (inputs, outputs, merker, DB)<br />
<br />
2) nach DB<br />
<br />
3) nach Startbyte<br />
<br />
sortiert.<br />
Daraus werden Leseblöcke abgeleitet, die dann von der SPS geholt werden. Danach werden die Clientmodule mit den aktualisierten Werden versorgt.<br />
<br />
Wenn man auf die Writer schreibend zugreift, so wird unmittelbar die entsprechenden Bits/Bytes in der SPS gesetzt.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|MaxMessageLength||Damit kann die maximale Telegrammlänge kleiner als, die beim Verbindungsaufbau vereinbarte, PDU Länge gesetzt werden.<br />
offset<br />
|<br />
|}<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|}<br />
<br />
Anmerkung: Es werden auch Standardattribute unterstützt (zb: event-min-interval, event-min-interval, stateFormat, ...).<br />
<br />
Um Einheiten anzeigen zu lassen kann stateFormat wie folgt verwendet werden, ZB:<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes*<br />
|}<br />
<br />
Wichtig: NI, NQ ... nur LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
NI,NQ ... nur für LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
'''Wichtig: NICHT auf die Eingänge der Logo schreibend zugreifen. Das macht KEINEN SINN, die Logo liest das Eingangswort zu Beginn eines Verarbeitungszyklus von der HW ein (= Eingangsabbild). Wenn das Programm ausgeführt wird wir ausschließlich auf dieses Eingangsabbild zugegriffen. Ein Netzwerkzugriff kann somit die Eingänge nicht direkt beeinflussen. Aus diesem Grund Netzwerk Eingänge (NI) verwenden!'''<br />
<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== WinLC RTX 4.5 Beispielconfig ==<br />
Als erstes beginnt man mit der Hardwarekonfiguration:<br />
<br />
[[Datei:HarwareKonfiguration.JPG]]<br />
<br />
[[Datei:CPU.JPG]]<br />
<br />
[[Datei:Netzwerkkonfiguration.JPG]]<br />
<br />
Dann erzeugt man am besten als nächstes eine Importdatei XDB für den<br />
Komponentenkonfigurator. Diese läßt sich dann auf dem Rechner auf dem<br />
die RTX laufen soll mit dem Komponentenkonfigurator importieren.<br />
<br />
[[Datei:XDB_Datei_erzeugen.JPG]]<br />
<br />
Nach dem Import auf dem Zielrechner sollte der Komponentenkonfigurator<br />
so aussehen.<br />
<br />
[[Datei:Komponentenkonfigurator.JPG]]<br />
<br />
Der OB1 wird jetzt programmiert wie im folgenden Bild dargestellt.<br />
Zusätzlich habe ich den Merker 255.5 als Tacktmerker 2sec beider Konfiguration<br />
der CPU angeleget. Dann sehe ich das die Verbindung zu RTX steht. Dies ist<br />
aber nicht unbedingt erforderlich.<br />
<br />
[[Datei:ProgrammOB1.JPG]]<br />
<br />
In der fhem.cfg<br />
<br />
# S7 Kommunikation<br />
define PCS_7 S7 192.168.0.81 0 2<br />
attr PCS_7 room Keller<br />
<br />
# Lichttaster an S7 schaltbar über Icon<br />
define Taster0_Icon S7_DWrite db 33 0.0<br />
attr Taster0_Icon IODev PCS_7<br />
attr Taster0_Icon eventMap on:on off:off<br />
attr Taster0_Icon group Licht<br />
attr Taster0_Icon room Keller<br />
<br />
define Taster1_Icon S7_DWrite db 33 0.1<br />
attr Taster1_Icon IODev PCS_7<br />
attr Taster1_Icon eventMap on:on off:off<br />
attr Taster1_Icon group Licht<br />
attr Taster1_Icon room Keller<br />
<br />
define Taster2_Icon S7_DWrite db 33 0.2<br />
attr Taster2_Icon IODev PCS_7<br />
attr Taster2_Icon eventMap on:on off:off<br />
attr Taster2_Icon group Licht<br />
attr Taster2_Icon room Keller<br />
<br />
define Taster3_Icon S7_DWrite db 33 0.3<br />
attr Taster3_Icon IODev PCS_7<br />
attr Taster3_Icon eventMap on:on off:off<br />
attr Taster3_Icon group Licht<br />
attr Taster3_Icon room Keller<br />
<br />
define Taster4_Icon S7_DWrite db 33 0.4<br />
attr Taster4_Icon IODev PCS_7<br />
attr Taster4_Icon eventMap on:on off:off<br />
attr Taster4_Icon group Licht<br />
attr Taster4_Icon room Keller<br />
<br />
define Taster5_Icon S7_DWrite db 33 0.5<br />
attr Taster5_Icon IODev PCS_7<br />
attr Taster5_Icon eventMap on:on off:off<br />
attr Taster5_Icon group Licht<br />
attr Taster5_Icon room Keller<br />
<br />
define Taster6_Icon S7_DWrite db 33 0.6<br />
attr Taster6_Icon IODev PCS_7<br />
attr Taster6_Icon eventMap on:on off:off<br />
attr Taster6_Icon group Licht<br />
attr Taster6_Icon room Keller<br />
<br />
define Taster7_Icon S7_DWrite db 33 0.7<br />
attr Taster7_Icon IODev PCS_7<br />
attr Taster7_Icon eventMap on:on off:off<br />
attr Taster7_Icon group Licht<br />
attr Taster7_Icon room Keller<br />
<br />
<br />
define Rueckmeldung0 S7_DRead db 31 0.0<br />
attr Rueckmeldung0 IODev PCS_7<br />
attr Rueckmeldung0 group Licht<br />
attr Rueckmeldung0 room Keller<br />
<br />
define Rueckmeldung1 S7_DRead db 31 0.1<br />
attr Rueckmeldung1 IODev PCS_7<br />
attr Rueckmeldung1 group Licht<br />
attr Rueckmeldung1 room Keller<br />
<br />
define Rueckmeldung2 S7_DRead db 31 0.2<br />
attr Rueckmeldung2 IODev PCS_7<br />
attr Rueckmeldung2 group Licht<br />
attr Rueckmeldung2 room Keller<br />
<br />
define Rueckmeldung3 S7_DRead db 31 0.3<br />
attr Rueckmeldung3 IODev PCS_7<br />
attr Rueckmeldung3 group Licht<br />
attr Rueckmeldung3 room Keller<br />
<br />
define Rueckmeldung4 S7_DRead db 31 0.4<br />
attr Rueckmeldung4 IODev PCS_7<br />
attr Rueckmeldung4 group Licht<br />
attr Rueckmeldung4 room Keller<br />
<br />
define Rueckmeldung5 S7_DRead db 31 0.5<br />
attr Rueckmeldung5 IODev PCS_7<br />
attr Rueckmeldung5 group Licht<br />
attr Rueckmeldung5 room Keller<br />
<br />
define Rueckmeldung6 S7_DRead db 31 0.6<br />
attr Rueckmeldung6 IODev PCS_7<br />
attr Rueckmeldung6 group Licht<br />
attr Rueckmeldung6 room Keller<br />
<br />
define Rueckmeldung7 S7_DRead db 31 0.7<br />
attr Rueckmeldung7 IODev PCS_7<br />
attr Rueckmeldung7 group Licht<br />
attr Rueckmeldung7 room Keller<br />
<br />
<br />
[[Datei:fhem.JPG]]<br />
<br />
== S7-300 Beispielconfig ==<br />
'''Die Konfiguration (fhem.cfg) der S7-Kommunikation unten ist gültig ab V2.6.'''<br />
<br />
Es sind zwei CPUs im Einsatz, die mit FHEM kommunizieren:<br />
<br />
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)<br />
4 Kommunikations-DBs, DB20-DB24<br />
<br />
S7-315 CPU mit Onboard-Ethernet Schnittstelle, IP-Adresse: 192.168.1.102, R0S2 ('''Rack 0, Slot 2''' aus der Step 7 HW-Config)<br />
4 Kommunikations-DBs, DB70-DB74<br />
<br />
'''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)<br />
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.<br />
<br />
'''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)<br />
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).<br />
<br />
'''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) <br />
Hier legt FHEM die Gleitpunktzahlen ab, die in der S7 angezeigt/ verarbeitet werden sollen, z.B. den Wert eines Sliders zur Sollwertkorrektur (-10..+10).<br />
<br />
'''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)<br />
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.<br />
<br />
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.<br />
<br />
Es sind noch ein paar Spielerein als Beispiel in der fhem.cfg:<br />
<br />
- Tasten über Spracheingabe<br />
<br />
- Rückmeldung über Sprachausgabe<br />
<br />
- Temperatur aus dem Weather Modul wird an die S7 geschickt<br />
<br />
===fhem.cfg===<br />
<br />
# S7 Kommunikation mit 2 CPUs<br />
define 317 S7 192.168.1.101 0 2<br />
attr 317 room System<br />
<br />
define 315 S7 192.168.1.102 0 2<br />
attr 315 room System<br />
<br />
# FHEM Taster an 317<br />
define Taster_317 S7_DWrite db 23 0.0<br />
attr Taster_317 IODev 317<br />
attr Taster_317 devStateIcon .*:toggle:TRIGGER<br />
attr Taster_317 event-on-change-reading state<br />
attr Taster_317 group Licht<br />
attr Taster_317 room Keller<br />
<br />
# Rückmeldung ob 317 DO gesetzt hat<br />
define Rueckmeldung_317 S7_DRead db 21 0.0<br />
attr Rueckmeldung_317 IODev 317<br />
attr Rueckmeldung_317 event-on-change-reading state<br />
attr Rueckmeldung_317 group Licht<br />
attr Rueckmeldung_317 room Keller<br />
<br />
# FHEM Schalter an 315<br />
define Taster_315 S7_DWrite db 73 0.0<br />
attr Taster_315 IODev 315<br />
attr Taster_315 devStateIcon .*:toggle<br />
attr Taster_315 event-on-change-reading state<br />
attr Taster_315 group Licht<br />
attr Taster_315 room Keller<br />
attr Taster_315 webCmd ON:OFF<br />
<br />
# Rückmeldung ob 315 DO gesetzt hat<br />
define Rueckmeldung_315 S7_DRead db 71 0.0<br />
attr Rueckmeldung_315 IODev 315<br />
attr Rueckmeldung_315 event-on-change-reading state<br />
attr Rueckmeldung_315 group Licht<br />
attr Rueckmeldung_315 room Keller<br />
<br />
# FHEM Sollwertgeber an 317 als Knob<br />
define Temperaturkorrektur_317 S7_AWrite db 22 0 float<br />
attr Temperaturkorrektur_317 IODev 317<br />
attr Temperaturkorrektur_317 event-on-change-reading state<br />
attr Temperaturkorrektur_317 group Raumluft<br />
attr Temperaturkorrektur_317 room Keller<br />
attr Temperaturkorrektur_317 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
define Temperaturkorrektur_317_Knob dummy<br />
attr Temperaturkorrektur_317_Knob group Raumluft<br />
attr Temperaturkorrektur_317_Knob room Keller<br />
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<br />
attr Temperaturkorrektur_317_Knob stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
attr Temperaturkorrektur_317_Knob webCmd state<br />
<br />
define Temperaturkorrektur_317_Knob_notify notify Temperaturkorrektur_317_Knob {\<br />
fhem "set Temperaturkorrektur_317 ".ReadingsVal("Temperaturkorrektur_317_Knob","state","0");;\<br />
}<br />
attr Temperaturkorrektur_317_Knob_notify group Raumluft<br />
attr Temperaturkorrektur_317_Knob_notify room Keller<br />
<br />
# Rücklesewert ob 317 die Temperaturkorrektur bekommen hat<br />
define Ruecklesen_317 S7_ARead db 20 0 float<br />
attr Ruecklesen_317 IODev 317<br />
attr Ruecklesen_317 event-on-change-reading state<br />
attr Ruecklesen_317 group Raumluft<br />
attr Ruecklesen_317 room Keller<br />
attr Ruecklesen_317 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
# FHEM Sollwertgeber an 315 als Slider<br />
define Temperaturkorrektur_315 S7_AWrite db 72 0 float<br />
attr Temperaturkorrektur_315 IODev 315<br />
attr Temperaturkorrektur_315 event-on-change-reading state<br />
attr Temperaturkorrektur_315 group Raumluft<br />
attr Temperaturkorrektur_315 room Keller<br />
attr Temperaturkorrektur_315 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
define Temperaturkorrektur_315_Knob dummy<br />
attr Temperaturkorrektur_315_Knob group Raumluft<br />
attr Temperaturkorrektur_315_Knob room Keller<br />
attr Temperaturkorrektur_315_Knob setList state:slider,-10.0,0.5,10.0,1<br />
attr Temperaturkorrektur_315_Knob stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
attr Temperaturkorrektur_315_Knob webCmd state<br />
<br />
define Temperaturkorrektur_315_Knob_notify notify Temperaturkorrektur_315_Knob {\<br />
fhem "set Temperaturkorrektur_315 ".ReadingsVal("Temperaturkorrektur_315_Knob","state","0");;\<br />
}<br />
attr Temperaturkorrektur_315_Knob_notify group Raumluft<br />
attr Temperaturkorrektur_315_Knob_notify room Keller<br />
<br />
# Rücklesewert ob 315 die Temperaturkorrektur bekommen hat<br />
define Ruecklesen_315 S7_ARead db 70 0 float<br />
attr Ruecklesen_315 IODev 315<br />
attr Ruecklesen_315 event-on-change-reading state<br />
attr Ruecklesen_315 group Raumluft<br />
attr Ruecklesen_315 room Keller<br />
attr Ruecklesen_315 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
# Ein paar Spielereien<br />
<br />
# Temperatur aus dem Web an 317 schicken<br />
define Wetter Weather 638242 1800 de<br />
attr Wetter room Wetter<br />
<br />
define Temp_AU_Web S7_AWrite db 22 4 float<br />
attr Temp_AU_Web IODev 317<br />
attr Temp_AU_Web event-on-change-reading state<br />
attr Temp_AU_Web room Wetter<br />
attr Temp_AU_Web stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
define Temp_AU_Web_notify notify Wetter {\<br />
fhem "set Temp_AU_Web ".ReadingsVal("Wetter","temp_c","10");;\<br />
}<br />
attr Temp_AU_Web_notify room Wetter<br />
<br />
# WebViewControl Fullscreen Android Browser mit Text to Speech und Speech Recognition<br />
define Android webViewControl 12345<br />
attr Android room System<br />
<br />
# FHEM Taster an 317 über Sprache bedienen "Licht im Keller schalten"<br />
define speech_Licht_Keller notify .*voiceRecognitionLastResult.*icht.*eller.*(schalten|wechseln|tasten).* \<br />
set Taster_317 TRIGGER<br />
attr speech_Licht_Keller group Licht<br />
attr speech_Licht_Keller room Keller<br />
<br />
# Rückmeldung ob Licht eingeschaltet wurde als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters<br />
define Rueckmeldung_317_ttsSay_on notify Rueckmeldung_317:on {\<br />
fhem "set Android ttsSay Das Licht im Keller wurde eingeschaltet";;\<br />
}<br />
attr Rueckmeldung_317_ttsSay_on group Licht<br />
attr Rueckmeldung_317_ttsSay_on room Keller<br />
<br />
# Rückmeldung ob Licht ausgeschaltet wurde als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters<br />
define Rueckmeldung_317_ttsSay_off notify Rueckmeldung_317:off {\<br />
fhem "set Android ttsSay Das Licht im Keller wurde ausgeschaltet";;\<br />
}<br />
attr Rueckmeldung_317_ttsSay_off group Licht<br />
attr Rueckmeldung_317_ttsSay_off room Keller<br />
<br />
== Versionshistory ==<br />
Versionsinfo:<br />
<br />
V2.10<br />
* (feature) S7_DWrite: with new attribute trigger_length the impulse length could be controlled<br />
* (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<br />
* (fixes) some minor fixes in memory usage<br />
* (fixes) startup: no error messages should be found in the log anymore<br />
* (performance) performance tuning: (reduced dispace Messages) --> up to 4 times faster<br />
<br />
<br />
V2.9<br />
* fix for DWord (thanks to zicki)<br />
* multiple fix for writing to PLC<br />
<br />
V2.8<br />
* minor fix in TCP Socked (TCP_NODELAY option now set)<br />
* minor fix in reconnection (perl gets more time for garbage handling)<br />
* connection to the PLC is now delayed (5sec after creation the connection is build up, 3 seconds later the reading polling is started)<br />
* minor fix AWrite checks now connection status<br />
* fix for fritzbox<br />
<br />
V2.7<br />
* fix: for overlapping configuration<br />
<br />
V2.6<br />
* fix: reconnection at creation time<br />
* fix: state update on reading<br />
* fix: memory leak during message dispatch<br />
<br />
V2.5<br />
* fixes for writing operations for S300<br />
* fix in TCPClient for dedection of writing error<br />
<br />
V2.4<br />
* the requirement of having reading-configs and/or writing-configs are gone<br />
The module calculates based on the logical modul configuration the reading required bocks dynamically<br />
The writing is done as a minimal block for AWrite and as a Bit for DWrite<br />
This is done every second per default (optional Parameter of the 44_S7 modul)<br />
<br />
V2.3<br />
* FIX: For Logo8 Simple config<br />
* Error messages for perl PLC communication lib are available<br />
* standard attributes like event-min-interval, event-min-interval, ... are added<br />
* PLC Communication client extended for bitwise writing <br />
* removed attribute unit and precision: please use standard attribute stateFormat instead.<br />
<br />
Example for stateFormat with precision=1 and unit=°C:<br />
define innentemp S7_ARead db 0 6 u16<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=12909S72015-11-17T13:09:18Z<p>Charlie71: /* Versionshistory */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
* WINLC RTX 4.5<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|-<br />
|Linux amd64||passed||Mint Linux17.1<br />
|-<br />
|Windows||passed||Windows8.1<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
<br />
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.<br />
diese werden nach <br />
<br />
1) area (inputs, outputs, merker, DB)<br />
<br />
2) nach DB<br />
<br />
3) nach Startbyte<br />
<br />
sortiert.<br />
Daraus werden Leseblöcke abgeleitet, die dann von der SPS geholt werden. Danach werden die Clientmodule mit den aktualisierten Werden versorgt.<br />
<br />
Wenn man auf die Writer schreibend zugreift, so wird unmittelbar die entsprechenden Bits/Bytes in der SPS gesetzt.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|}<br />
<br />
Anmerkung: Es werden auch Standardattribute unterstützt (zb: event-min-interval, event-min-interval, stateFormat, ...).<br />
<br />
Um Einheiten anzeigen zu lassen kann stateFormat wie folgt verwendet werden, ZB:<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes*<br />
|}<br />
<br />
Wichtig: NI, NQ ... nur LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
NI,NQ ... nur für LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
'''Wichtig: NICHT auf die Eingänge der Logo schreibend zugreifen. Das macht KEINEN SINN, die Logo liest das Eingangswort zu Beginn eines Verarbeitungszyklus von der HW ein (= Eingangsabbild). Wenn das Programm ausgeführt wird wir ausschließlich auf dieses Eingangsabbild zugegriffen. Ein Netzwerkzugriff kann somit die Eingänge nicht direkt beeinflussen. Aus diesem Grund Netzwerk Eingänge (NI) verwenden!'''<br />
<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== WinLC RTX 4.5 Beispielconfig ==<br />
Als erstes beginnt man mit der Hardwarekonfiguration:<br />
<br />
[[Datei:HarwareKonfiguration.JPG]]<br />
<br />
[[Datei:CPU.JPG]]<br />
<br />
[[Datei:Netzwerkkonfiguration.JPG]]<br />
<br />
Dann erzeugt man am besten als nächstes eine Importdatei XDB für den<br />
Komponentenkonfigurator. Diese läßt sich dann auf dem Rechner auf dem<br />
die RTX laufen soll mit dem Komponentenkonfigurator importieren.<br />
<br />
[[Datei:XDB_Datei_erzeugen.JPG]]<br />
<br />
Nach dem Import auf dem Zielrechner sollte der Komponentenkonfigurator<br />
so aussehen.<br />
<br />
[[Datei:Komponentenkonfigurator.JPG]]<br />
<br />
Der OB1 wird jetzt programmiert wie im folgenden Bild dargestellt.<br />
Zusätzlich habe ich den Merker 255.5 als Tacktmerker 2sec beider Konfiguration<br />
der CPU angeleget. Dann sehe ich das die Verbindung zu RTX steht. Dies ist<br />
aber nicht unbedingt erforderlich.<br />
<br />
[[Datei:ProgrammOB1.JPG]]<br />
<br />
In der fhem.cfg<br />
<br />
# S7 Kommunikation<br />
define PCS_7 S7 192.168.0.81 0 2<br />
attr PCS_7 room Keller<br />
<br />
# Lichttaster an S7 schaltbar über Icon<br />
define Taster0_Icon S7_DWrite db 33 0.0<br />
attr Taster0_Icon IODev PCS_7<br />
attr Taster0_Icon eventMap on:on off:off<br />
attr Taster0_Icon group Licht<br />
attr Taster0_Icon room Keller<br />
<br />
define Taster1_Icon S7_DWrite db 33 0.1<br />
attr Taster1_Icon IODev PCS_7<br />
attr Taster1_Icon eventMap on:on off:off<br />
attr Taster1_Icon group Licht<br />
attr Taster1_Icon room Keller<br />
<br />
define Taster2_Icon S7_DWrite db 33 0.2<br />
attr Taster2_Icon IODev PCS_7<br />
attr Taster2_Icon eventMap on:on off:off<br />
attr Taster2_Icon group Licht<br />
attr Taster2_Icon room Keller<br />
<br />
define Taster3_Icon S7_DWrite db 33 0.3<br />
attr Taster3_Icon IODev PCS_7<br />
attr Taster3_Icon eventMap on:on off:off<br />
attr Taster3_Icon group Licht<br />
attr Taster3_Icon room Keller<br />
<br />
define Taster4_Icon S7_DWrite db 33 0.4<br />
attr Taster4_Icon IODev PCS_7<br />
attr Taster4_Icon eventMap on:on off:off<br />
attr Taster4_Icon group Licht<br />
attr Taster4_Icon room Keller<br />
<br />
define Taster5_Icon S7_DWrite db 33 0.5<br />
attr Taster5_Icon IODev PCS_7<br />
attr Taster5_Icon eventMap on:on off:off<br />
attr Taster5_Icon group Licht<br />
attr Taster5_Icon room Keller<br />
<br />
define Taster6_Icon S7_DWrite db 33 0.6<br />
attr Taster6_Icon IODev PCS_7<br />
attr Taster6_Icon eventMap on:on off:off<br />
attr Taster6_Icon group Licht<br />
attr Taster6_Icon room Keller<br />
<br />
define Taster7_Icon S7_DWrite db 33 0.7<br />
attr Taster7_Icon IODev PCS_7<br />
attr Taster7_Icon eventMap on:on off:off<br />
attr Taster7_Icon group Licht<br />
attr Taster7_Icon room Keller<br />
<br />
<br />
define Rueckmeldung0 S7_DRead db 31 0.0<br />
attr Rueckmeldung0 IODev PCS_7<br />
attr Rueckmeldung0 group Licht<br />
attr Rueckmeldung0 room Keller<br />
<br />
define Rueckmeldung1 S7_DRead db 31 0.1<br />
attr Rueckmeldung1 IODev PCS_7<br />
attr Rueckmeldung1 group Licht<br />
attr Rueckmeldung1 room Keller<br />
<br />
define Rueckmeldung2 S7_DRead db 31 0.2<br />
attr Rueckmeldung2 IODev PCS_7<br />
attr Rueckmeldung2 group Licht<br />
attr Rueckmeldung2 room Keller<br />
<br />
define Rueckmeldung3 S7_DRead db 31 0.3<br />
attr Rueckmeldung3 IODev PCS_7<br />
attr Rueckmeldung3 group Licht<br />
attr Rueckmeldung3 room Keller<br />
<br />
define Rueckmeldung4 S7_DRead db 31 0.4<br />
attr Rueckmeldung4 IODev PCS_7<br />
attr Rueckmeldung4 group Licht<br />
attr Rueckmeldung4 room Keller<br />
<br />
define Rueckmeldung5 S7_DRead db 31 0.5<br />
attr Rueckmeldung5 IODev PCS_7<br />
attr Rueckmeldung5 group Licht<br />
attr Rueckmeldung5 room Keller<br />
<br />
define Rueckmeldung6 S7_DRead db 31 0.6<br />
attr Rueckmeldung6 IODev PCS_7<br />
attr Rueckmeldung6 group Licht<br />
attr Rueckmeldung6 room Keller<br />
<br />
define Rueckmeldung7 S7_DRead db 31 0.7<br />
attr Rueckmeldung7 IODev PCS_7<br />
attr Rueckmeldung7 group Licht<br />
attr Rueckmeldung7 room Keller<br />
<br />
<br />
[[Datei:fhem.JPG]]<br />
<br />
== S7-300 Beispielconfig ==<br />
'''Die Konfiguration (fhem.cfg) der S7-Kommunikation unten ist gültig ab V2.6.'''<br />
<br />
Es sind zwei CPUs im Einsatz, die mit FHEM kommunizieren:<br />
<br />
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)<br />
4 Kommunikations-DBs, DB20-DB24<br />
<br />
S7-315 CPU mit Onboard-Ethernet Schnittstelle, IP-Adresse: 192.168.1.102, R0S2 ('''Rack 0, Slot 2''' aus der Step 7 HW-Config)<br />
4 Kommunikations-DBs, DB70-DB74<br />
<br />
'''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)<br />
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.<br />
<br />
'''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)<br />
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).<br />
<br />
'''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) <br />
Hier legt FHEM die Gleitpunktzahlen ab, die in der S7 angezeigt/ verarbeitet werden sollen, z.B. den Wert eines Sliders zur Sollwertkorrektur (-10..+10).<br />
<br />
'''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)<br />
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.<br />
<br />
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.<br />
<br />
Es sind noch ein paar Spielerein als Beispiel in der fhem.cfg:<br />
<br />
- Tasten über Spracheingabe<br />
<br />
- Rückmeldung über Sprachausgabe<br />
<br />
- Temperatur aus dem Weather Modul wird an die S7 geschickt<br />
<br />
===fhem.cfg===<br />
<br />
# S7 Kommunikation mit 2 CPUs<br />
define 317 S7 192.168.1.101 0 2<br />
attr 317 room System<br />
<br />
define 315 S7 192.168.1.102 0 2<br />
attr 315 room System<br />
<br />
# FHEM Taster an 317<br />
define Taster_317 S7_DWrite db 23 0.0<br />
attr Taster_317 IODev 317<br />
attr Taster_317 devStateIcon .*:toggle:TRIGGER<br />
attr Taster_317 event-on-change-reading state<br />
attr Taster_317 group Licht<br />
attr Taster_317 room Keller<br />
<br />
# Rückmeldung ob 317 DO gesetzt hat<br />
define Rueckmeldung_317 S7_DRead db 21 0.0<br />
attr Rueckmeldung_317 IODev 317<br />
attr Rueckmeldung_317 event-on-change-reading state<br />
attr Rueckmeldung_317 group Licht<br />
attr Rueckmeldung_317 room Keller<br />
<br />
# FHEM Schalter an 315<br />
define Taster_315 S7_DWrite db 73 0.0<br />
attr Taster_315 IODev 315<br />
attr Taster_315 devStateIcon .*:toggle<br />
attr Taster_315 event-on-change-reading state<br />
attr Taster_315 group Licht<br />
attr Taster_315 room Keller<br />
attr Taster_315 webCmd ON:OFF<br />
<br />
# Rückmeldung ob 315 DO gesetzt hat<br />
define Rueckmeldung_315 S7_DRead db 71 0.0<br />
attr Rueckmeldung_315 IODev 315<br />
attr Rueckmeldung_315 event-on-change-reading state<br />
attr Rueckmeldung_315 group Licht<br />
attr Rueckmeldung_315 room Keller<br />
<br />
# FHEM Sollwertgeber an 317 als Knob<br />
define Temperaturkorrektur_317 S7_AWrite db 22 0 float<br />
attr Temperaturkorrektur_317 IODev 317<br />
attr Temperaturkorrektur_317 event-on-change-reading state<br />
attr Temperaturkorrektur_317 group Raumluft<br />
attr Temperaturkorrektur_317 room Keller<br />
attr Temperaturkorrektur_317 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
define Temperaturkorrektur_317_Knob dummy<br />
attr Temperaturkorrektur_317_Knob group Raumluft<br />
attr Temperaturkorrektur_317_Knob room Keller<br />
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<br />
attr Temperaturkorrektur_317_Knob stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
attr Temperaturkorrektur_317_Knob webCmd state<br />
<br />
define Temperaturkorrektur_317_Knob_notify notify Temperaturkorrektur_317_Knob {\<br />
fhem "set Temperaturkorrektur_317 ".ReadingsVal("Temperaturkorrektur_317_Knob","state","0");;\<br />
}<br />
attr Temperaturkorrektur_317_Knob_notify group Raumluft<br />
attr Temperaturkorrektur_317_Knob_notify room Keller<br />
<br />
# Rücklesewert ob 317 die Temperaturkorrektur bekommen hat<br />
define Ruecklesen_317 S7_ARead db 20 0 float<br />
attr Ruecklesen_317 IODev 317<br />
attr Ruecklesen_317 event-on-change-reading state<br />
attr Ruecklesen_317 group Raumluft<br />
attr Ruecklesen_317 room Keller<br />
attr Ruecklesen_317 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
# FHEM Sollwertgeber an 315 als Slider<br />
define Temperaturkorrektur_315 S7_AWrite db 72 0 float<br />
attr Temperaturkorrektur_315 IODev 315<br />
attr Temperaturkorrektur_315 event-on-change-reading state<br />
attr Temperaturkorrektur_315 group Raumluft<br />
attr Temperaturkorrektur_315 room Keller<br />
attr Temperaturkorrektur_315 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
define Temperaturkorrektur_315_Knob dummy<br />
attr Temperaturkorrektur_315_Knob group Raumluft<br />
attr Temperaturkorrektur_315_Knob room Keller<br />
attr Temperaturkorrektur_315_Knob setList state:slider,-10.0,0.5,10.0,1<br />
attr Temperaturkorrektur_315_Knob stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
attr Temperaturkorrektur_315_Knob webCmd state<br />
<br />
define Temperaturkorrektur_315_Knob_notify notify Temperaturkorrektur_315_Knob {\<br />
fhem "set Temperaturkorrektur_315 ".ReadingsVal("Temperaturkorrektur_315_Knob","state","0");;\<br />
}<br />
attr Temperaturkorrektur_315_Knob_notify group Raumluft<br />
attr Temperaturkorrektur_315_Knob_notify room Keller<br />
<br />
# Rücklesewert ob 315 die Temperaturkorrektur bekommen hat<br />
define Ruecklesen_315 S7_ARead db 70 0 float<br />
attr Ruecklesen_315 IODev 315<br />
attr Ruecklesen_315 event-on-change-reading state<br />
attr Ruecklesen_315 group Raumluft<br />
attr Ruecklesen_315 room Keller<br />
attr Ruecklesen_315 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
# Ein paar Spielereien<br />
<br />
# Temperatur aus dem Web an 317 schicken<br />
define Wetter Weather 638242 1800 de<br />
attr Wetter room Wetter<br />
<br />
define Temp_AU_Web S7_AWrite db 22 4 float<br />
attr Temp_AU_Web IODev 317<br />
attr Temp_AU_Web event-on-change-reading state<br />
attr Temp_AU_Web room Wetter<br />
attr Temp_AU_Web stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
define Temp_AU_Web_notify notify Wetter {\<br />
fhem "set Temp_AU_Web ".ReadingsVal("Wetter","temp_c","10");;\<br />
}<br />
attr Temp_AU_Web_notify room Wetter<br />
<br />
# WebViewControl Fullscreen Android Browser mit Text to Speech und Speech Recognition<br />
define Android webViewControl 12345<br />
attr Android room System<br />
<br />
# FHEM Taster an 317 über Sprache bedienen "Licht im Keller schalten"<br />
define speech_Licht_Keller notify .*voiceRecognitionLastResult.*icht.*eller.*(schalten|wechseln|tasten).* \<br />
set Taster_317 TRIGGER<br />
attr speech_Licht_Keller group Licht<br />
attr speech_Licht_Keller room Keller<br />
<br />
# Rückmeldung ob Licht eingeschaltet wurde als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters<br />
define Rueckmeldung_317_ttsSay_on notify Rueckmeldung_317:on {\<br />
fhem "set Android ttsSay Das Licht im Keller wurde eingeschaltet";;\<br />
}<br />
attr Rueckmeldung_317_ttsSay_on group Licht<br />
attr Rueckmeldung_317_ttsSay_on room Keller<br />
<br />
# Rückmeldung ob Licht ausgeschaltet wurde als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters<br />
define Rueckmeldung_317_ttsSay_off notify Rueckmeldung_317:off {\<br />
fhem "set Android ttsSay Das Licht im Keller wurde ausgeschaltet";;\<br />
}<br />
attr Rueckmeldung_317_ttsSay_off group Licht<br />
attr Rueckmeldung_317_ttsSay_off room Keller<br />
<br />
== Versionshistory ==<br />
Versionsinfo:<br />
<br />
V2.10<br />
* (feature) S7_DWrite: with new attribute trigger_length the impulse length could be controlled<br />
* (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<br />
* (fixes) some minor fixes in memory usage<br />
* (fixes) startup: no error messages should be found in the log anymore<br />
* (performance) performance tuning: (reduced dispace Messages) --> up to 4 times faster<br />
<br />
<br />
V2.9<br />
* fix for DWord (thanks to zicki)<br />
* multiple fix for writing to PLC<br />
<br />
V2.8<br />
* minor fix in TCP Socked (TCP_NODELAY option now set)<br />
* minor fix in reconnection (perl gets more time for garbage handling)<br />
* connection to the PLC is now delayed (5sec after creation the connection is build up, 3 seconds later the reading polling is started)<br />
* minor fix AWrite checks now connection status<br />
* fix for fritzbox<br />
<br />
V2.7<br />
* fix: for overlapping configuration<br />
<br />
V2.6<br />
* fix: reconnection at creation time<br />
* fix: state update on reading<br />
* fix: memory leak during message dispatch<br />
<br />
V2.5<br />
* fixes for writing operations for S300<br />
* fix in TCPClient for dedection of writing error<br />
<br />
V2.4<br />
* the requirement of having reading-configs and/or writing-configs are gone<br />
The module calculates based on the logical modul configuration the reading required bocks dynamically<br />
The writing is done as a minimal block for AWrite and as a Bit for DWrite<br />
This is done every second per default (optional Parameter of the 44_S7 modul)<br />
<br />
V2.3<br />
* FIX: For Logo8 Simple config<br />
* Error messages for perl PLC communication lib are available<br />
* standard attributes like event-min-interval, event-min-interval, ... are added<br />
* PLC Communication client extended for bitwise writing <br />
* removed attribute unit and precision: please use standard attribute stateFormat instead.<br />
<br />
Example for stateFormat with precision=1 and unit=°C:<br />
define innentemp S7_ARead db 0 6 u16<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=12103S72015-09-10T08:33:19Z<p>Charlie71: /* Digitale Datenpunkte zum Schreiben */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
* WINLC RTX 4.5<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|-<br />
|Linux amd64||passed||Mint Linux17.1<br />
|-<br />
|Windows||passed||Windows8.1<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
<br />
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.<br />
diese werden nach <br />
<br />
1) area (inputs, outputs, merker, DB)<br />
<br />
2) nach DB<br />
<br />
3) nach Startbyte<br />
<br />
sortiert.<br />
Daraus werden Leseblöcke abgeleitet, die dann von der SPS geholt werden. Danach werden die Clientmodule mit den aktualisierten Werden versorgt.<br />
<br />
Wenn man auf die Writer schreibend zugreift, so wird unmittelbar die entsprechenden Bits/Bytes in der SPS gesetzt.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|}<br />
<br />
Anmerkung: Es werden auch Standardattribute unterstützt (zb: event-min-interval, event-min-interval, stateFormat, ...).<br />
<br />
Um Einheiten anzeigen zu lassen kann stateFormat wie folgt verwendet werden, ZB:<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes*<br />
|}<br />
<br />
Wichtig: NI, NQ ... nur LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
NI,NQ ... nur für LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
'''Wichtig: NICHT auf die Eingänge der Logo schreibend zugreifen. Das macht KEINEN SINN, die Logo liest das Eingangswort zu Beginn eines Verarbeitungszyklus von der HW ein (= Eingangsabbild). Wenn das Programm ausgeführt wird wir ausschließlich auf dieses Eingangsabbild zugegriffen. Ein Netzwerkzugriff kann somit die Eingänge nicht direkt beeinflussen. Aus diesem Grund Netzwerk Eingänge (NI) verwenden!'''<br />
<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== WinLC RTX 4.5 Beispielconfig ==<br />
Als erstes beginnt man mit der Hardwarekonfiguration:<br />
<br />
[[Datei:HarwareKonfiguration.JPG]]<br />
<br />
[[Datei:CPU.JPG]]<br />
<br />
[[Datei:Netzwerkkonfiguration.JPG]]<br />
<br />
Dann erzeugt man am besten als nächstes eine Importdatei XDB für den<br />
Komponentenkonfigurator. Diese läßt sich dann auf dem Rechner auf dem<br />
die RTX laufen soll mit dem Komponentenkonfigurator importieren.<br />
<br />
[[Datei:XDB_Datei_erzeugen.JPG]]<br />
<br />
Nach dem Import auf dem Zielrechner sollte der Komponentenkonfigurator<br />
so aussehen.<br />
<br />
[[Datei:Komponentenkonfigurator.JPG]]<br />
<br />
Der OB1 wird jetzt programmiert wie im folgenden Bild dargestellt.<br />
Zusätzlich habe ich den Merker 255.5 als Tacktmerker 2sec beider Konfiguration<br />
der CPU angeleget. Dann sehe ich das die Verbindung zu RTX steht. Dies ist<br />
aber nicht unbedingt erforderlich.<br />
<br />
[[Datei:ProgrammOB1.JPG]]<br />
<br />
In der fhem.cfg<br />
<br />
# S7 Kommunikation<br />
define PCS_7 S7 192.168.0.81 0 2<br />
attr PCS_7 room Keller<br />
<br />
# Lichttaster an S7 schaltbar über Icon<br />
define Taster0_Icon S7_DWrite db 33 0.0<br />
attr Taster0_Icon IODev PCS_7<br />
attr Taster0_Icon eventMap on:on off:off<br />
attr Taster0_Icon group Licht<br />
attr Taster0_Icon room Keller<br />
<br />
define Taster1_Icon S7_DWrite db 33 0.1<br />
attr Taster1_Icon IODev PCS_7<br />
attr Taster1_Icon eventMap on:on off:off<br />
attr Taster1_Icon group Licht<br />
attr Taster1_Icon room Keller<br />
<br />
define Taster2_Icon S7_DWrite db 33 0.2<br />
attr Taster2_Icon IODev PCS_7<br />
attr Taster2_Icon eventMap on:on off:off<br />
attr Taster2_Icon group Licht<br />
attr Taster2_Icon room Keller<br />
<br />
define Taster3_Icon S7_DWrite db 33 0.3<br />
attr Taster3_Icon IODev PCS_7<br />
attr Taster3_Icon eventMap on:on off:off<br />
attr Taster3_Icon group Licht<br />
attr Taster3_Icon room Keller<br />
<br />
define Taster4_Icon S7_DWrite db 33 0.4<br />
attr Taster4_Icon IODev PCS_7<br />
attr Taster4_Icon eventMap on:on off:off<br />
attr Taster4_Icon group Licht<br />
attr Taster4_Icon room Keller<br />
<br />
define Taster5_Icon S7_DWrite db 33 0.5<br />
attr Taster5_Icon IODev PCS_7<br />
attr Taster5_Icon eventMap on:on off:off<br />
attr Taster5_Icon group Licht<br />
attr Taster5_Icon room Keller<br />
<br />
define Taster6_Icon S7_DWrite db 33 0.6<br />
attr Taster6_Icon IODev PCS_7<br />
attr Taster6_Icon eventMap on:on off:off<br />
attr Taster6_Icon group Licht<br />
attr Taster6_Icon room Keller<br />
<br />
define Taster7_Icon S7_DWrite db 33 0.7<br />
attr Taster7_Icon IODev PCS_7<br />
attr Taster7_Icon eventMap on:on off:off<br />
attr Taster7_Icon group Licht<br />
attr Taster7_Icon room Keller<br />
<br />
<br />
define Rueckmeldung0 S7_DRead db 31 0.0<br />
attr Rueckmeldung0 IODev PCS_7<br />
attr Rueckmeldung0 group Licht<br />
attr Rueckmeldung0 room Keller<br />
<br />
define Rueckmeldung1 S7_DRead db 31 0.1<br />
attr Rueckmeldung1 IODev PCS_7<br />
attr Rueckmeldung1 group Licht<br />
attr Rueckmeldung1 room Keller<br />
<br />
define Rueckmeldung2 S7_DRead db 31 0.2<br />
attr Rueckmeldung2 IODev PCS_7<br />
attr Rueckmeldung2 group Licht<br />
attr Rueckmeldung2 room Keller<br />
<br />
define Rueckmeldung3 S7_DRead db 31 0.3<br />
attr Rueckmeldung3 IODev PCS_7<br />
attr Rueckmeldung3 group Licht<br />
attr Rueckmeldung3 room Keller<br />
<br />
define Rueckmeldung4 S7_DRead db 31 0.4<br />
attr Rueckmeldung4 IODev PCS_7<br />
attr Rueckmeldung4 group Licht<br />
attr Rueckmeldung4 room Keller<br />
<br />
define Rueckmeldung5 S7_DRead db 31 0.5<br />
attr Rueckmeldung5 IODev PCS_7<br />
attr Rueckmeldung5 group Licht<br />
attr Rueckmeldung5 room Keller<br />
<br />
define Rueckmeldung6 S7_DRead db 31 0.6<br />
attr Rueckmeldung6 IODev PCS_7<br />
attr Rueckmeldung6 group Licht<br />
attr Rueckmeldung6 room Keller<br />
<br />
define Rueckmeldung7 S7_DRead db 31 0.7<br />
attr Rueckmeldung7 IODev PCS_7<br />
attr Rueckmeldung7 group Licht<br />
attr Rueckmeldung7 room Keller<br />
<br />
<br />
[[Datei:fhem.JPG]]<br />
<br />
== S7-300 Beispielconfig ==<br />
'''Die Konfiguration (fhem.cfg) der S7-Kommunikation unten ist gültig ab V2.6.'''<br />
<br />
Es sind zwei CPUs im Einsatz, die mit FHEM kommunizieren:<br />
<br />
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)<br />
4 Kommunikations-DBs, DB20-DB24<br />
<br />
S7-315 CPU mit Onboard-Ethernet Schnittstelle, IP-Adresse: 192.168.1.102, R0S2 ('''Rack 0, Slot 2''' aus der Step 7 HW-Config)<br />
4 Kommunikations-DBs, DB70-DB74<br />
<br />
'''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)<br />
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.<br />
<br />
'''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)<br />
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).<br />
<br />
'''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) <br />
Hier legt FHEM die Gleitpunktzahlen ab, die in der S7 angezeigt/ verarbeitet werden sollen, z.B. den Wert eines Sliders zur Sollwertkorrektur (-10..+10).<br />
<br />
'''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)<br />
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.<br />
<br />
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.<br />
<br />
Es sind noch ein paar Spielerein als Beispiel in der fhem.cfg:<br />
<br />
- Tasten über Spracheingabe<br />
<br />
- Rückmeldung über Sprachausgabe<br />
<br />
- Temperatur aus dem Weather Modul wird an die S7 geschickt<br />
<br />
===fhem.cfg===<br />
<br />
# S7 Kommunikation mit 2 CPUs<br />
define 317 S7 192.168.1.101 0 2<br />
attr 317 room System<br />
<br />
define 315 S7 192.168.1.102 0 2<br />
attr 315 room System<br />
<br />
# FHEM Taster an 317<br />
define Taster_317 S7_DWrite db 23 0.0<br />
attr Taster_317 IODev 317<br />
attr Taster_317 devStateIcon .*:toggle:TRIGGER<br />
attr Taster_317 event-on-change-reading state<br />
attr Taster_317 group Licht<br />
attr Taster_317 room Keller<br />
<br />
# Rückmeldung ob 317 DO gesetzt hat<br />
define Rueckmeldung_317 S7_DRead db 21 0.0<br />
attr Rueckmeldung_317 IODev 317<br />
attr Rueckmeldung_317 event-on-change-reading state<br />
attr Rueckmeldung_317 group Licht<br />
attr Rueckmeldung_317 room Keller<br />
<br />
# FHEM Schalter an 315<br />
define Taster_315 S7_DWrite db 73 0.0<br />
attr Taster_315 IODev 315<br />
attr Taster_315 devStateIcon .*:toggle<br />
attr Taster_315 event-on-change-reading state<br />
attr Taster_315 group Licht<br />
attr Taster_315 room Keller<br />
attr Taster_315 webCmd ON:OFF<br />
<br />
# Rückmeldung ob 315 DO gesetzt hat<br />
define Rueckmeldung_315 S7_DRead db 71 0.0<br />
attr Rueckmeldung_315 IODev 315<br />
attr Rueckmeldung_315 event-on-change-reading state<br />
attr Rueckmeldung_315 group Licht<br />
attr Rueckmeldung_315 room Keller<br />
<br />
# FHEM Sollwertgeber an 317 als Knob<br />
define Temperaturkorrektur_317 S7_AWrite db 22 0 float<br />
attr Temperaturkorrektur_317 IODev 317<br />
attr Temperaturkorrektur_317 event-on-change-reading state<br />
attr Temperaturkorrektur_317 group Raumluft<br />
attr Temperaturkorrektur_317 room Keller<br />
attr Temperaturkorrektur_317 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
define Temperaturkorrektur_317_Knob dummy<br />
attr Temperaturkorrektur_317_Knob group Raumluft<br />
attr Temperaturkorrektur_317_Knob room Keller<br />
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<br />
attr Temperaturkorrektur_317_Knob stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
attr Temperaturkorrektur_317_Knob webCmd state<br />
<br />
define Temperaturkorrektur_317_Knob_notify notify Temperaturkorrektur_317_Knob {\<br />
fhem "set Temperaturkorrektur_317 ".ReadingsVal("Temperaturkorrektur_317_Knob","state","0");;\<br />
}<br />
attr Temperaturkorrektur_317_Knob_notify group Raumluft<br />
attr Temperaturkorrektur_317_Knob_notify room Keller<br />
<br />
# Rücklesewert ob 317 die Temperaturkorrektur bekommen hat<br />
define Ruecklesen_317 S7_ARead db 20 0 float<br />
attr Ruecklesen_317 IODev 317<br />
attr Ruecklesen_317 event-on-change-reading state<br />
attr Ruecklesen_317 group Raumluft<br />
attr Ruecklesen_317 room Keller<br />
attr Ruecklesen_317 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
# FHEM Sollwertgeber an 315 als Slider<br />
define Temperaturkorrektur_315 S7_AWrite db 72 0 float<br />
attr Temperaturkorrektur_315 IODev 315<br />
attr Temperaturkorrektur_315 event-on-change-reading state<br />
attr Temperaturkorrektur_315 group Raumluft<br />
attr Temperaturkorrektur_315 room Keller<br />
attr Temperaturkorrektur_315 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
define Temperaturkorrektur_315_Knob dummy<br />
attr Temperaturkorrektur_315_Knob group Raumluft<br />
attr Temperaturkorrektur_315_Knob room Keller<br />
attr Temperaturkorrektur_315_Knob setList state:slider,-10.0,0.5,10.0,1<br />
attr Temperaturkorrektur_315_Knob stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
attr Temperaturkorrektur_315_Knob webCmd state<br />
<br />
define Temperaturkorrektur_315_Knob_notify notify Temperaturkorrektur_315_Knob {\<br />
fhem "set Temperaturkorrektur_315 ".ReadingsVal("Temperaturkorrektur_315_Knob","state","0");;\<br />
}<br />
attr Temperaturkorrektur_315_Knob_notify group Raumluft<br />
attr Temperaturkorrektur_315_Knob_notify room Keller<br />
<br />
# Rücklesewert ob 315 die Temperaturkorrektur bekommen hat<br />
define Ruecklesen_315 S7_ARead db 70 0 float<br />
attr Ruecklesen_315 IODev 315<br />
attr Ruecklesen_315 event-on-change-reading state<br />
attr Ruecklesen_315 group Raumluft<br />
attr Ruecklesen_315 room Keller<br />
attr Ruecklesen_315 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
# Ein paar Spielereien<br />
<br />
# Temperatur aus dem Web an 317 schicken<br />
define Wetter Weather 638242 1800 de<br />
attr Wetter room Wetter<br />
<br />
define Temp_AU_Web S7_AWrite db 22 4 float<br />
attr Temp_AU_Web IODev 317<br />
attr Temp_AU_Web event-on-change-reading state<br />
attr Temp_AU_Web room Wetter<br />
attr Temp_AU_Web stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
define Temp_AU_Web_notify notify Wetter {\<br />
fhem "set Temp_AU_Web ".ReadingsVal("Wetter","temp_c","10");;\<br />
}<br />
attr Temp_AU_Web_notify room Wetter<br />
<br />
# WebViewControl Fullscreen Android Browser mit Text to Speech und Speech Recognition<br />
define Android webViewControl 12345<br />
attr Android room System<br />
<br />
# FHEM Taster an 317 über Sprache bedienen "Licht im Keller schalten"<br />
define speech_Licht_Keller notify .*voiceRecognitionLastResult.*icht.*eller.*(schalten|wechseln|tasten).* \<br />
set Taster_317 TRIGGER<br />
attr speech_Licht_Keller group Licht<br />
attr speech_Licht_Keller room Keller<br />
<br />
# Rückmeldung ob Licht eingeschaltet wurde als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters<br />
define Rueckmeldung_317_ttsSay_on notify Rueckmeldung_317:on {\<br />
fhem "set Android ttsSay Das Licht im Keller wurde eingeschaltet";;\<br />
}<br />
attr Rueckmeldung_317_ttsSay_on group Licht<br />
attr Rueckmeldung_317_ttsSay_on room Keller<br />
<br />
# Rückmeldung ob Licht ausgeschaltet wurde als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters<br />
define Rueckmeldung_317_ttsSay_off notify Rueckmeldung_317:off {\<br />
fhem "set Android ttsSay Das Licht im Keller wurde ausgeschaltet";;\<br />
}<br />
attr Rueckmeldung_317_ttsSay_off group Licht<br />
attr Rueckmeldung_317_ttsSay_off room Keller<br />
<br />
== Versionshistory ==<br />
Versionsinfo:<br />
<br />
V2.9<br />
* fix for DWord (thanks to zicki)<br />
* multiple fix for writing to PLC<br />
<br />
V2.8<br />
* minor fix in TCP Socked (TCP_NODELAY option now set)<br />
* minor fix in reconnection (perl gets more time for garbage handling)<br />
* connection to the PLC is now delayed (5sec after creation the connection is build up, 3 seconds later the reading polling is started)<br />
* minor fix AWrite checks now connection status<br />
* fix for fritzbox<br />
<br />
V2.7<br />
* fix: for overlapping configuration<br />
<br />
V2.6<br />
* fix: reconnection at creation time<br />
* fix: state update on reading<br />
* fix: memory leak during message dispatch<br />
<br />
V2.5<br />
* fixes for writing operations for S300<br />
* fix in TCPClient for dedection of writing error<br />
<br />
V2.4<br />
* the requirement of having reading-configs and/or writing-configs are gone<br />
The module calculates based on the logical modul configuration the reading required bocks dynamically<br />
The writing is done as a minimal block for AWrite and as a Bit for DWrite<br />
This is done every second per default (optional Parameter of the 44_S7 modul)<br />
<br />
V2.3<br />
* FIX: For Logo8 Simple config<br />
* Error messages for perl PLC communication lib are available<br />
* standard attributes like event-min-interval, event-min-interval, ... are added<br />
* PLC Communication client extended for bitwise writing <br />
* removed attribute unit and precision: please use standard attribute stateFormat instead.<br />
<br />
Example for stateFormat with precision=1 and unit=°C:<br />
define innentemp S7_ARead db 0 6 u16<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=10391S72015-03-01T17:48:08Z<p>Charlie71: /* Unterstützte Plattformen */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
* WINLC RTX 4.5<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|-<br />
|Linux amd64||passed||Mint Linux17.1<br />
|-<br />
|Windows||passed||Windows8.1<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
<br />
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.<br />
diese werden nach <br />
<br />
1) area (inputs, outputs, merker, DB)<br />
<br />
2) nach DB<br />
<br />
3) nach Startbyte<br />
<br />
sortiert.<br />
Daraus werden Leseblöcke abgeleitet, die dann von der SPS geholt werden. Danach werden die Clientmodule mit den aktualisierten Werden versorgt.<br />
<br />
Wenn man auf die Writer schreibend zugreift, so wird unmittelbar die entsprechenden Bits/Bytes in der SPS gesetzt.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|}<br />
<br />
Anmerkung: Es werden auch Standardattribute unterstützt (zb: event-min-interval, event-min-interval, stateFormat, ...).<br />
<br />
Um Einheiten anzeigen zu lassen kann stateFormat wie folgt verwendet werden, ZB:<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes*<br />
|}<br />
<br />
Wichtig: NI, NQ ... nur LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
NI,NQ ... nur für LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== WinLC RTX 4.5 Beispielconfig ==<br />
Als erstes beginnt man mit der Hardwarekonfiguration:<br />
<br />
[[Datei:HarwareKonfiguration.JPG]]<br />
<br />
[[Datei:CPU.JPG]]<br />
<br />
[[Datei:Netzwerkkonfiguration.JPG]]<br />
<br />
Dann erzeugt man am besten als nächstes eine Importdatei XDB für den<br />
Komponentenkonfigurator. Diese läßt sich dann auf dem Rechner auf dem<br />
die RTX laufen soll mit dem Komponentenkonfigurator importieren.<br />
<br />
[[Datei:XDB_Datei_erzeugen.JPG]]<br />
<br />
Nach dem Import auf dem Zielrechner sollte der Komponentenkonfigurator<br />
so aussehen.<br />
<br />
[[Datei:Komponentenkonfigurator.JPG]]<br />
<br />
Der OB1 wird jetzt programmiert wie im folgenden Bild dargestellt.<br />
Zusätzlich habe ich den Merker 255.5 als Tacktmerker 2sec beider Konfiguration<br />
der CPU angeleget. Dann sehe ich das die Verbindung zu RTX steht. Dies ist<br />
aber nicht unbedingt erforderlich.<br />
<br />
[[Datei:ProgrammOB1.JPG]]<br />
<br />
In der fhem.cfg<br />
<br />
# S7 Kommunikation<br />
define PCS_7 S7 192.168.0.81 0 2<br />
attr PCS_7 room Keller<br />
<br />
# Lichttaster an S7 schaltbar über Icon<br />
define Taster0_Icon S7_DWrite db 33 0.0<br />
attr Taster0_Icon IODev PCS_7<br />
attr Taster0_Icon eventMap on:on off:off<br />
attr Taster0_Icon group Licht<br />
attr Taster0_Icon room Keller<br />
<br />
define Taster1_Icon S7_DWrite db 33 0.1<br />
attr Taster1_Icon IODev PCS_7<br />
attr Taster1_Icon eventMap on:on off:off<br />
attr Taster1_Icon group Licht<br />
attr Taster1_Icon room Keller<br />
<br />
define Taster2_Icon S7_DWrite db 33 0.2<br />
attr Taster2_Icon IODev PCS_7<br />
attr Taster2_Icon eventMap on:on off:off<br />
attr Taster2_Icon group Licht<br />
attr Taster2_Icon room Keller<br />
<br />
define Taster3_Icon S7_DWrite db 33 0.3<br />
attr Taster3_Icon IODev PCS_7<br />
attr Taster3_Icon eventMap on:on off:off<br />
attr Taster3_Icon group Licht<br />
attr Taster3_Icon room Keller<br />
<br />
define Taster4_Icon S7_DWrite db 33 0.4<br />
attr Taster4_Icon IODev PCS_7<br />
attr Taster4_Icon eventMap on:on off:off<br />
attr Taster4_Icon group Licht<br />
attr Taster4_Icon room Keller<br />
<br />
define Taster5_Icon S7_DWrite db 33 0.5<br />
attr Taster5_Icon IODev PCS_7<br />
attr Taster5_Icon eventMap on:on off:off<br />
attr Taster5_Icon group Licht<br />
attr Taster5_Icon room Keller<br />
<br />
define Taster6_Icon S7_DWrite db 33 0.6<br />
attr Taster6_Icon IODev PCS_7<br />
attr Taster6_Icon eventMap on:on off:off<br />
attr Taster6_Icon group Licht<br />
attr Taster6_Icon room Keller<br />
<br />
define Taster7_Icon S7_DWrite db 33 0.7<br />
attr Taster7_Icon IODev PCS_7<br />
attr Taster7_Icon eventMap on:on off:off<br />
attr Taster7_Icon group Licht<br />
attr Taster7_Icon room Keller<br />
<br />
<br />
define Rueckmeldung0 S7_DRead db 31 0.0<br />
attr Rueckmeldung0 IODev PCS_7<br />
attr Rueckmeldung0 group Licht<br />
attr Rueckmeldung0 room Keller<br />
<br />
define Rueckmeldung1 S7_DRead db 31 0.1<br />
attr Rueckmeldung1 IODev PCS_7<br />
attr Rueckmeldung1 group Licht<br />
attr Rueckmeldung1 room Keller<br />
<br />
define Rueckmeldung2 S7_DRead db 31 0.2<br />
attr Rueckmeldung2 IODev PCS_7<br />
attr Rueckmeldung2 group Licht<br />
attr Rueckmeldung2 room Keller<br />
<br />
define Rueckmeldung3 S7_DRead db 31 0.3<br />
attr Rueckmeldung3 IODev PCS_7<br />
attr Rueckmeldung3 group Licht<br />
attr Rueckmeldung3 room Keller<br />
<br />
define Rueckmeldung4 S7_DRead db 31 0.4<br />
attr Rueckmeldung4 IODev PCS_7<br />
attr Rueckmeldung4 group Licht<br />
attr Rueckmeldung4 room Keller<br />
<br />
define Rueckmeldung5 S7_DRead db 31 0.5<br />
attr Rueckmeldung5 IODev PCS_7<br />
attr Rueckmeldung5 group Licht<br />
attr Rueckmeldung5 room Keller<br />
<br />
define Rueckmeldung6 S7_DRead db 31 0.6<br />
attr Rueckmeldung6 IODev PCS_7<br />
attr Rueckmeldung6 group Licht<br />
attr Rueckmeldung6 room Keller<br />
<br />
define Rueckmeldung7 S7_DRead db 31 0.7<br />
attr Rueckmeldung7 IODev PCS_7<br />
attr Rueckmeldung7 group Licht<br />
attr Rueckmeldung7 room Keller<br />
<br />
<br />
[[Datei:fhem.JPG]]<br />
<br />
== S7-300 Beispielconfig ==<br />
'''Die Konfiguration (fhem.cfg) der S7-Kommunikation unten ist gültig ab V2.6.'''<br />
<br />
Es sind zwei CPUs im Einsatz, die mit FHEM kommunizieren:<br />
<br />
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)<br />
4 Kommunikations-DBs, DB20-DB24<br />
<br />
S7-315 CPU mit Onboard-Ethernet Schnittstelle, IP-Adresse: 192.168.1.102, R0S2 ('''Rack 0, Slot 2''' aus der Step 7 HW-Config)<br />
4 Kommunikations-DBs, DB70-DB74<br />
<br />
'''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)<br />
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.<br />
<br />
'''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)<br />
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).<br />
<br />
'''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) <br />
Hier legt FHEM die Gleitpunktzahlen ab, die in der S7 angezeigt/ verarbeitet werden sollen, z.B. den Wert eines Sliders zur Sollwertkorrektur (-10..+10).<br />
<br />
'''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)<br />
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.<br />
<br />
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.<br />
<br />
Es sind noch ein paar Spielerein als Beispiel in der fhem.cfg:<br />
<br />
- Tasten über Spracheingabe<br />
<br />
- Rückmeldung über Sprachausgabe<br />
<br />
- Temperatur aus dem Weather Modul wird an die S7 geschickt<br />
<br />
===fhem.cfg===<br />
<br />
# S7 Kommunikation mit 2 CPUs<br />
define 317 S7 192.168.1.101 0 2<br />
attr 317 room System<br />
<br />
define 315 S7 192.168.1.102 0 2<br />
attr 315 room System<br />
<br />
# FHEM Taster an 317<br />
define Taster_317 S7_DWrite db 23 0.0<br />
attr Taster_317 IODev 317<br />
attr Taster_317 devStateIcon .*:toggle:TRIGGER<br />
attr Taster_317 event-on-change-reading state<br />
attr Taster_317 group Licht<br />
attr Taster_317 room Keller<br />
<br />
# Rückmeldung ob 317 DO gesetzt hat<br />
define Rueckmeldung_317 S7_DRead db 21 0.0<br />
attr Rueckmeldung_317 IODev 317<br />
attr Rueckmeldung_317 event-on-change-reading state<br />
attr Rueckmeldung_317 group Licht<br />
attr Rueckmeldung_317 room Keller<br />
<br />
# FHEM Schalter an 315<br />
define Taster_315 S7_DWrite db 73 0.0<br />
attr Taster_315 IODev 315<br />
attr Taster_315 devStateIcon .*:toggle<br />
attr Taster_315 event-on-change-reading state<br />
attr Taster_315 group Licht<br />
attr Taster_315 room Keller<br />
attr Taster_315 webCmd ON:OFF<br />
<br />
# Rückmeldung ob 315 DO gesetzt hat<br />
define Rueckmeldung_315 S7_DRead db 71 0.0<br />
attr Rueckmeldung_315 IODev 315<br />
attr Rueckmeldung_315 event-on-change-reading state<br />
attr Rueckmeldung_315 group Licht<br />
attr Rueckmeldung_315 room Keller<br />
<br />
# FHEM Sollwertgeber an 317 als Knob<br />
define Temperaturkorrektur_317 S7_AWrite db 22 0 float<br />
attr Temperaturkorrektur_317 IODev 317<br />
attr Temperaturkorrektur_317 event-on-change-reading state<br />
attr Temperaturkorrektur_317 group Raumluft<br />
attr Temperaturkorrektur_317 room Keller<br />
attr Temperaturkorrektur_317 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
define Temperaturkorrektur_317_Knob dummy<br />
attr Temperaturkorrektur_317_Knob group Raumluft<br />
attr Temperaturkorrektur_317_Knob room Keller<br />
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<br />
attr Temperaturkorrektur_317_Knob stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
attr Temperaturkorrektur_317_Knob webCmd state<br />
<br />
define Temperaturkorrektur_317_Knob_notify notify Temperaturkorrektur_317_Knob {\<br />
fhem "set Temperaturkorrektur_317 ".ReadingsVal("Temperaturkorrektur_317_Knob","state","0");;\<br />
}<br />
attr Temperaturkorrektur_317_Knob_notify group Raumluft<br />
attr Temperaturkorrektur_317_Knob_notify room Keller<br />
<br />
# Rücklesewert ob 317 die Temperaturkorrektur bekommen hat<br />
define Ruecklesen_317 S7_ARead db 20 0 float<br />
attr Ruecklesen_317 IODev 317<br />
attr Ruecklesen_317 event-on-change-reading state<br />
attr Ruecklesen_317 group Raumluft<br />
attr Ruecklesen_317 room Keller<br />
attr Ruecklesen_317 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
# FHEM Sollwertgeber an 315 als Slider<br />
define Temperaturkorrektur_315 S7_AWrite db 72 0 float<br />
attr Temperaturkorrektur_315 IODev 315<br />
attr Temperaturkorrektur_315 event-on-change-reading state<br />
attr Temperaturkorrektur_315 group Raumluft<br />
attr Temperaturkorrektur_315 room Keller<br />
attr Temperaturkorrektur_315 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
define Temperaturkorrektur_315_Knob dummy<br />
attr Temperaturkorrektur_315_Knob group Raumluft<br />
attr Temperaturkorrektur_315_Knob room Keller<br />
attr Temperaturkorrektur_315_Knob setList state:slider,-10.0,0.5,10.0,1<br />
attr Temperaturkorrektur_315_Knob stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
attr Temperaturkorrektur_315_Knob webCmd state<br />
<br />
define Temperaturkorrektur_315_Knob_notify notify Temperaturkorrektur_315_Knob {\<br />
fhem "set Temperaturkorrektur_315 ".ReadingsVal("Temperaturkorrektur_315_Knob","state","0");;\<br />
}<br />
attr Temperaturkorrektur_315_Knob_notify group Raumluft<br />
attr Temperaturkorrektur_315_Knob_notify room Keller<br />
<br />
# Rücklesewert ob 315 die Temperaturkorrektur bekommen hat<br />
define Ruecklesen_315 S7_ARead db 70 0 float<br />
attr Ruecklesen_315 IODev 315<br />
attr Ruecklesen_315 event-on-change-reading state<br />
attr Ruecklesen_315 group Raumluft<br />
attr Ruecklesen_315 room Keller<br />
attr Ruecklesen_315 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
# Ein paar Spielereien<br />
<br />
# Temperatur aus dem Web an 317 schicken<br />
define Wetter Weather 638242 1800 de<br />
attr Wetter room Wetter<br />
<br />
define Temp_AU_Web S7_AWrite db 22 4 float<br />
attr Temp_AU_Web IODev 317<br />
attr Temp_AU_Web event-on-change-reading state<br />
attr Temp_AU_Web room Wetter<br />
attr Temp_AU_Web stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
define Temp_AU_Web_notify notify Wetter {\<br />
fhem "set Temp_AU_Web ".ReadingsVal("Wetter","temp_c","10");;\<br />
}<br />
attr Temp_AU_Web_notify room Wetter<br />
<br />
# WebViewControl Fullscreen Android Browser mit Text to Speech und Speech Recognition<br />
define Android webViewControl 12345<br />
attr Android room System<br />
<br />
# FHEM Taster an 317 über Sprache bedienen "Licht im Keller schalten"<br />
define speech_Licht_Keller notify .*voiceRecognitionLastResult.*icht.*eller.*(schalten|wechseln|tasten).* \<br />
set Taster_317 TRIGGER<br />
attr speech_Licht_Keller group Licht<br />
attr speech_Licht_Keller room Keller<br />
<br />
# Rückmeldung ob Licht eingeschaltet wurde als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters<br />
define Rueckmeldung_317_ttsSay_on notify Rueckmeldung_317:on {\<br />
fhem "set Android ttsSay Das Licht im Keller wurde eingeschaltet";;\<br />
}<br />
attr Rueckmeldung_317_ttsSay_on group Licht<br />
attr Rueckmeldung_317_ttsSay_on room Keller<br />
<br />
# Rückmeldung ob Licht ausgeschaltet wurde als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters<br />
define Rueckmeldung_317_ttsSay_off notify Rueckmeldung_317:off {\<br />
fhem "set Android ttsSay Das Licht im Keller wurde ausgeschaltet";;\<br />
}<br />
attr Rueckmeldung_317_ttsSay_off group Licht<br />
attr Rueckmeldung_317_ttsSay_off room Keller<br />
<br />
== Versionshistory ==<br />
Versionsinfo:<br />
<br />
V2.9<br />
* fix for DWord (thanks to zicki)<br />
* multiple fix for writing to PLC<br />
<br />
V2.8<br />
* minor fix in TCP Socked (TCP_NODELAY option now set)<br />
* minor fix in reconnection (perl gets more time for garbage handling)<br />
* connection to the PLC is now delayed (5sec after creation the connection is build up, 3 seconds later the reading polling is started)<br />
* minor fix AWrite checks now connection status<br />
* fix for fritzbox<br />
<br />
V2.7<br />
* fix: for overlapping configuration<br />
<br />
V2.6<br />
* fix: reconnection at creation time<br />
* fix: state update on reading<br />
* fix: memory leak during message dispatch<br />
<br />
V2.5<br />
* fixes for writing operations for S300<br />
* fix in TCPClient for dedection of writing error<br />
<br />
V2.4<br />
* the requirement of having reading-configs and/or writing-configs are gone<br />
The module calculates based on the logical modul configuration the reading required bocks dynamically<br />
The writing is done as a minimal block for AWrite and as a Bit for DWrite<br />
This is done every second per default (optional Parameter of the 44_S7 modul)<br />
<br />
V2.3<br />
* FIX: For Logo8 Simple config<br />
* Error messages for perl PLC communication lib are available<br />
* standard attributes like event-min-interval, event-min-interval, ... are added<br />
* PLC Communication client extended for bitwise writing <br />
* removed attribute unit and precision: please use standard attribute stateFormat instead.<br />
<br />
Example for stateFormat with precision=1 and unit=°C:<br />
define innentemp S7_ARead db 0 6 u16<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=10390S72015-03-01T17:46:10Z<p>Charlie71: /* Versionshistory */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
* WINLC RTX 4.5<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
<br />
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.<br />
diese werden nach <br />
<br />
1) area (inputs, outputs, merker, DB)<br />
<br />
2) nach DB<br />
<br />
3) nach Startbyte<br />
<br />
sortiert.<br />
Daraus werden Leseblöcke abgeleitet, die dann von der SPS geholt werden. Danach werden die Clientmodule mit den aktualisierten Werden versorgt.<br />
<br />
Wenn man auf die Writer schreibend zugreift, so wird unmittelbar die entsprechenden Bits/Bytes in der SPS gesetzt.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|}<br />
<br />
Anmerkung: Es werden auch Standardattribute unterstützt (zb: event-min-interval, event-min-interval, stateFormat, ...).<br />
<br />
Um Einheiten anzeigen zu lassen kann stateFormat wie folgt verwendet werden, ZB:<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes*<br />
|}<br />
<br />
Wichtig: NI, NQ ... nur LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
NI,NQ ... nur für LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== WinLC RTX 4.5 Beispielconfig ==<br />
Als erstes beginnt man mit der Hardwarekonfiguration:<br />
<br />
[[Datei:HarwareKonfiguration.JPG]]<br />
<br />
[[Datei:CPU.JPG]]<br />
<br />
[[Datei:Netzwerkkonfiguration.JPG]]<br />
<br />
Dann erzeugt man am besten als nächstes eine Importdatei XDB für den<br />
Komponentenkonfigurator. Diese läßt sich dann auf dem Rechner auf dem<br />
die RTX laufen soll mit dem Komponentenkonfigurator importieren.<br />
<br />
[[Datei:XDB_Datei_erzeugen.JPG]]<br />
<br />
Nach dem Import auf dem Zielrechner sollte der Komponentenkonfigurator<br />
so aussehen.<br />
<br />
[[Datei:Komponentenkonfigurator.JPG]]<br />
<br />
Der OB1 wird jetzt programmiert wie im folgenden Bild dargestellt.<br />
Zusätzlich habe ich den Merker 255.5 als Tacktmerker 2sec beider Konfiguration<br />
der CPU angeleget. Dann sehe ich das die Verbindung zu RTX steht. Dies ist<br />
aber nicht unbedingt erforderlich.<br />
<br />
[[Datei:ProgrammOB1.JPG]]<br />
<br />
In der fhem.cfg<br />
<br />
# S7 Kommunikation<br />
define PCS_7 S7 192.168.0.81 0 2<br />
attr PCS_7 room Keller<br />
<br />
# Lichttaster an S7 schaltbar über Icon<br />
define Taster0_Icon S7_DWrite db 33 0.0<br />
attr Taster0_Icon IODev PCS_7<br />
attr Taster0_Icon eventMap on:on off:off<br />
attr Taster0_Icon group Licht<br />
attr Taster0_Icon room Keller<br />
<br />
define Taster1_Icon S7_DWrite db 33 0.1<br />
attr Taster1_Icon IODev PCS_7<br />
attr Taster1_Icon eventMap on:on off:off<br />
attr Taster1_Icon group Licht<br />
attr Taster1_Icon room Keller<br />
<br />
define Taster2_Icon S7_DWrite db 33 0.2<br />
attr Taster2_Icon IODev PCS_7<br />
attr Taster2_Icon eventMap on:on off:off<br />
attr Taster2_Icon group Licht<br />
attr Taster2_Icon room Keller<br />
<br />
define Taster3_Icon S7_DWrite db 33 0.3<br />
attr Taster3_Icon IODev PCS_7<br />
attr Taster3_Icon eventMap on:on off:off<br />
attr Taster3_Icon group Licht<br />
attr Taster3_Icon room Keller<br />
<br />
define Taster4_Icon S7_DWrite db 33 0.4<br />
attr Taster4_Icon IODev PCS_7<br />
attr Taster4_Icon eventMap on:on off:off<br />
attr Taster4_Icon group Licht<br />
attr Taster4_Icon room Keller<br />
<br />
define Taster5_Icon S7_DWrite db 33 0.5<br />
attr Taster5_Icon IODev PCS_7<br />
attr Taster5_Icon eventMap on:on off:off<br />
attr Taster5_Icon group Licht<br />
attr Taster5_Icon room Keller<br />
<br />
define Taster6_Icon S7_DWrite db 33 0.6<br />
attr Taster6_Icon IODev PCS_7<br />
attr Taster6_Icon eventMap on:on off:off<br />
attr Taster6_Icon group Licht<br />
attr Taster6_Icon room Keller<br />
<br />
define Taster7_Icon S7_DWrite db 33 0.7<br />
attr Taster7_Icon IODev PCS_7<br />
attr Taster7_Icon eventMap on:on off:off<br />
attr Taster7_Icon group Licht<br />
attr Taster7_Icon room Keller<br />
<br />
<br />
define Rueckmeldung0 S7_DRead db 31 0.0<br />
attr Rueckmeldung0 IODev PCS_7<br />
attr Rueckmeldung0 group Licht<br />
attr Rueckmeldung0 room Keller<br />
<br />
define Rueckmeldung1 S7_DRead db 31 0.1<br />
attr Rueckmeldung1 IODev PCS_7<br />
attr Rueckmeldung1 group Licht<br />
attr Rueckmeldung1 room Keller<br />
<br />
define Rueckmeldung2 S7_DRead db 31 0.2<br />
attr Rueckmeldung2 IODev PCS_7<br />
attr Rueckmeldung2 group Licht<br />
attr Rueckmeldung2 room Keller<br />
<br />
define Rueckmeldung3 S7_DRead db 31 0.3<br />
attr Rueckmeldung3 IODev PCS_7<br />
attr Rueckmeldung3 group Licht<br />
attr Rueckmeldung3 room Keller<br />
<br />
define Rueckmeldung4 S7_DRead db 31 0.4<br />
attr Rueckmeldung4 IODev PCS_7<br />
attr Rueckmeldung4 group Licht<br />
attr Rueckmeldung4 room Keller<br />
<br />
define Rueckmeldung5 S7_DRead db 31 0.5<br />
attr Rueckmeldung5 IODev PCS_7<br />
attr Rueckmeldung5 group Licht<br />
attr Rueckmeldung5 room Keller<br />
<br />
define Rueckmeldung6 S7_DRead db 31 0.6<br />
attr Rueckmeldung6 IODev PCS_7<br />
attr Rueckmeldung6 group Licht<br />
attr Rueckmeldung6 room Keller<br />
<br />
define Rueckmeldung7 S7_DRead db 31 0.7<br />
attr Rueckmeldung7 IODev PCS_7<br />
attr Rueckmeldung7 group Licht<br />
attr Rueckmeldung7 room Keller<br />
<br />
<br />
[[Datei:fhem.JPG]]<br />
<br />
== S7-300 Beispielconfig ==<br />
'''Die Konfiguration (fhem.cfg) der S7-Kommunikation unten ist gültig ab V2.6.'''<br />
<br />
Es sind zwei CPUs im Einsatz, die mit FHEM kommunizieren:<br />
<br />
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)<br />
4 Kommunikations-DBs, DB20-DB24<br />
<br />
S7-315 CPU mit Onboard-Ethernet Schnittstelle, IP-Adresse: 192.168.1.102, R0S2 ('''Rack 0, Slot 2''' aus der Step 7 HW-Config)<br />
4 Kommunikations-DBs, DB70-DB74<br />
<br />
'''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)<br />
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.<br />
<br />
'''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)<br />
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).<br />
<br />
'''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) <br />
Hier legt FHEM die Gleitpunktzahlen ab, die in der S7 angezeigt/ verarbeitet werden sollen, z.B. den Wert eines Sliders zur Sollwertkorrektur (-10..+10).<br />
<br />
'''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)<br />
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.<br />
<br />
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.<br />
<br />
Es sind noch ein paar Spielerein als Beispiel in der fhem.cfg:<br />
<br />
- Tasten über Spracheingabe<br />
<br />
- Rückmeldung über Sprachausgabe<br />
<br />
- Temperatur aus dem Weather Modul wird an die S7 geschickt<br />
<br />
===fhem.cfg===<br />
<br />
# S7 Kommunikation mit 2 CPUs<br />
define 317 S7 192.168.1.101 0 2<br />
attr 317 room System<br />
<br />
define 315 S7 192.168.1.102 0 2<br />
attr 315 room System<br />
<br />
# FHEM Taster an 317<br />
define Taster_317 S7_DWrite db 23 0.0<br />
attr Taster_317 IODev 317<br />
attr Taster_317 devStateIcon .*:toggle:TRIGGER<br />
attr Taster_317 event-on-change-reading state<br />
attr Taster_317 group Licht<br />
attr Taster_317 room Keller<br />
<br />
# Rückmeldung ob 317 DO gesetzt hat<br />
define Rueckmeldung_317 S7_DRead db 21 0.0<br />
attr Rueckmeldung_317 IODev 317<br />
attr Rueckmeldung_317 event-on-change-reading state<br />
attr Rueckmeldung_317 group Licht<br />
attr Rueckmeldung_317 room Keller<br />
<br />
# FHEM Schalter an 315<br />
define Taster_315 S7_DWrite db 73 0.0<br />
attr Taster_315 IODev 315<br />
attr Taster_315 devStateIcon .*:toggle<br />
attr Taster_315 event-on-change-reading state<br />
attr Taster_315 group Licht<br />
attr Taster_315 room Keller<br />
attr Taster_315 webCmd ON:OFF<br />
<br />
# Rückmeldung ob 315 DO gesetzt hat<br />
define Rueckmeldung_315 S7_DRead db 71 0.0<br />
attr Rueckmeldung_315 IODev 315<br />
attr Rueckmeldung_315 event-on-change-reading state<br />
attr Rueckmeldung_315 group Licht<br />
attr Rueckmeldung_315 room Keller<br />
<br />
# FHEM Sollwertgeber an 317 als Knob<br />
define Temperaturkorrektur_317 S7_AWrite db 22 0 float<br />
attr Temperaturkorrektur_317 IODev 317<br />
attr Temperaturkorrektur_317 event-on-change-reading state<br />
attr Temperaturkorrektur_317 group Raumluft<br />
attr Temperaturkorrektur_317 room Keller<br />
attr Temperaturkorrektur_317 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
define Temperaturkorrektur_317_Knob dummy<br />
attr Temperaturkorrektur_317_Knob group Raumluft<br />
attr Temperaturkorrektur_317_Knob room Keller<br />
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<br />
attr Temperaturkorrektur_317_Knob stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
attr Temperaturkorrektur_317_Knob webCmd state<br />
<br />
define Temperaturkorrektur_317_Knob_notify notify Temperaturkorrektur_317_Knob {\<br />
fhem "set Temperaturkorrektur_317 ".ReadingsVal("Temperaturkorrektur_317_Knob","state","0");;\<br />
}<br />
attr Temperaturkorrektur_317_Knob_notify group Raumluft<br />
attr Temperaturkorrektur_317_Knob_notify room Keller<br />
<br />
# Rücklesewert ob 317 die Temperaturkorrektur bekommen hat<br />
define Ruecklesen_317 S7_ARead db 20 0 float<br />
attr Ruecklesen_317 IODev 317<br />
attr Ruecklesen_317 event-on-change-reading state<br />
attr Ruecklesen_317 group Raumluft<br />
attr Ruecklesen_317 room Keller<br />
attr Ruecklesen_317 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
# FHEM Sollwertgeber an 315 als Slider<br />
define Temperaturkorrektur_315 S7_AWrite db 72 0 float<br />
attr Temperaturkorrektur_315 IODev 315<br />
attr Temperaturkorrektur_315 event-on-change-reading state<br />
attr Temperaturkorrektur_315 group Raumluft<br />
attr Temperaturkorrektur_315 room Keller<br />
attr Temperaturkorrektur_315 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
define Temperaturkorrektur_315_Knob dummy<br />
attr Temperaturkorrektur_315_Knob group Raumluft<br />
attr Temperaturkorrektur_315_Knob room Keller<br />
attr Temperaturkorrektur_315_Knob setList state:slider,-10.0,0.5,10.0,1<br />
attr Temperaturkorrektur_315_Knob stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
attr Temperaturkorrektur_315_Knob webCmd state<br />
<br />
define Temperaturkorrektur_315_Knob_notify notify Temperaturkorrektur_315_Knob {\<br />
fhem "set Temperaturkorrektur_315 ".ReadingsVal("Temperaturkorrektur_315_Knob","state","0");;\<br />
}<br />
attr Temperaturkorrektur_315_Knob_notify group Raumluft<br />
attr Temperaturkorrektur_315_Knob_notify room Keller<br />
<br />
# Rücklesewert ob 315 die Temperaturkorrektur bekommen hat<br />
define Ruecklesen_315 S7_ARead db 70 0 float<br />
attr Ruecklesen_315 IODev 315<br />
attr Ruecklesen_315 event-on-change-reading state<br />
attr Ruecklesen_315 group Raumluft<br />
attr Ruecklesen_315 room Keller<br />
attr Ruecklesen_315 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
# Ein paar Spielereien<br />
<br />
# Temperatur aus dem Web an 317 schicken<br />
define Wetter Weather 638242 1800 de<br />
attr Wetter room Wetter<br />
<br />
define Temp_AU_Web S7_AWrite db 22 4 float<br />
attr Temp_AU_Web IODev 317<br />
attr Temp_AU_Web event-on-change-reading state<br />
attr Temp_AU_Web room Wetter<br />
attr Temp_AU_Web stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
define Temp_AU_Web_notify notify Wetter {\<br />
fhem "set Temp_AU_Web ".ReadingsVal("Wetter","temp_c","10");;\<br />
}<br />
attr Temp_AU_Web_notify room Wetter<br />
<br />
# WebViewControl Fullscreen Android Browser mit Text to Speech und Speech Recognition<br />
define Android webViewControl 12345<br />
attr Android room System<br />
<br />
# FHEM Taster an 317 über Sprache bedienen "Licht im Keller schalten"<br />
define speech_Licht_Keller notify .*voiceRecognitionLastResult.*icht.*eller.*(schalten|wechseln|tasten).* \<br />
set Taster_317 TRIGGER<br />
attr speech_Licht_Keller group Licht<br />
attr speech_Licht_Keller room Keller<br />
<br />
# Rückmeldung ob Licht eingeschaltet wurde als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters<br />
define Rueckmeldung_317_ttsSay_on notify Rueckmeldung_317:on {\<br />
fhem "set Android ttsSay Das Licht im Keller wurde eingeschaltet";;\<br />
}<br />
attr Rueckmeldung_317_ttsSay_on group Licht<br />
attr Rueckmeldung_317_ttsSay_on room Keller<br />
<br />
# Rückmeldung ob Licht ausgeschaltet wurde als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters<br />
define Rueckmeldung_317_ttsSay_off notify Rueckmeldung_317:off {\<br />
fhem "set Android ttsSay Das Licht im Keller wurde ausgeschaltet";;\<br />
}<br />
attr Rueckmeldung_317_ttsSay_off group Licht<br />
attr Rueckmeldung_317_ttsSay_off room Keller<br />
<br />
== Versionshistory ==<br />
Versionsinfo:<br />
<br />
V2.9<br />
* fix for DWord (thanks to zicki)<br />
* multiple fix for writing to PLC<br />
<br />
V2.8<br />
* minor fix in TCP Socked (TCP_NODELAY option now set)<br />
* minor fix in reconnection (perl gets more time for garbage handling)<br />
* connection to the PLC is now delayed (5sec after creation the connection is build up, 3 seconds later the reading polling is started)<br />
* minor fix AWrite checks now connection status<br />
* fix for fritzbox<br />
<br />
V2.7<br />
* fix: for overlapping configuration<br />
<br />
V2.6<br />
* fix: reconnection at creation time<br />
* fix: state update on reading<br />
* fix: memory leak during message dispatch<br />
<br />
V2.5<br />
* fixes for writing operations for S300<br />
* fix in TCPClient for dedection of writing error<br />
<br />
V2.4<br />
* the requirement of having reading-configs and/or writing-configs are gone<br />
The module calculates based on the logical modul configuration the reading required bocks dynamically<br />
The writing is done as a minimal block for AWrite and as a Bit for DWrite<br />
This is done every second per default (optional Parameter of the 44_S7 modul)<br />
<br />
V2.3<br />
* FIX: For Logo8 Simple config<br />
* Error messages for perl PLC communication lib are available<br />
* standard attributes like event-min-interval, event-min-interval, ... are added<br />
* PLC Communication client extended for bitwise writing <br />
* removed attribute unit and precision: please use standard attribute stateFormat instead.<br />
<br />
Example for stateFormat with precision=1 and unit=°C:<br />
define innentemp S7_ARead db 0 6 u16<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9847S72015-02-04T17:27:58Z<p>Charlie71: /* WinLC RTX 4.5 Beispielconfig */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
* WINLC RTX 4.5<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
<br />
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.<br />
diese werden nach <br />
<br />
1) area (inputs, outputs, merker, DB)<br />
<br />
2) nach DB<br />
<br />
3) nach Startbyte<br />
<br />
sortiert.<br />
Daraus werden Leseblöcke abgeleitet, die dann von der SPS geholt werden. Danach werden die Clientmodule mit den aktualisierten Werden versorgt.<br />
<br />
Wenn man auf die Writer schreibend zugreift, so wird unmittelbar die entsprechenden Bits/Bytes in der SPS gesetzt.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|}<br />
<br />
Anmerkung: Es werden auch Standardattribute unterstützt (zb: event-min-interval, event-min-interval, stateFormat, ...).<br />
<br />
Um Einheiten anzeigen zu lassen kann stateFormat wie folgt verwendet werden, ZB:<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes*<br />
|}<br />
<br />
Wichtig: NI, NQ ... nur LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
NI,NQ ... nur für LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== WinLC RTX 4.5 Beispielconfig ==<br />
Als erstes beginnt man mit der Hardwarekonfiguration:<br />
<br />
[[Datei:HarwareKonfiguration.JPG]]<br />
<br />
[[Datei:CPU.JPG]]<br />
<br />
[[Datei:Netzwerkkonfiguration.JPG]]<br />
<br />
Dann erzeugt man am besten als nächstes eine Importdatei XDB für den<br />
Komponentenkonfigurator. Diese läßt sich dann auf dem Rechner auf dem<br />
die RTX laufen soll mit dem Komponentenkonfigurator importieren.<br />
<br />
[[Datei:XDB_Datei_erzeugen.JPG]]<br />
<br />
Nach dem Import auf dem Zielrechner sollte der Komponentenkonfigurator<br />
so aussehen.<br />
<br />
[[Datei:Komponentenkonfigurator.JPG]]<br />
<br />
Der OB1 wird jetzt programmiert wie im folgenden Bild dargestellt.<br />
Zusätzlich habe ich den Merker 255.5 als Tacktmerker 2sec beider Konfiguration<br />
der CPU angeleget. Dann sehe ich das die Verbindung zu RTX steht. Dies ist<br />
aber nicht unbedingt erforderlich.<br />
<br />
[[Datei:ProgrammOB1.JPG]]<br />
<br />
In der fhem.cfg<br />
<br />
# S7 Kommunikation<br />
define PCS_7 S7 192.168.0.81 0 2<br />
attr PCS_7 room Keller<br />
<br />
# Lichttaster an S7 schaltbar über Icon<br />
define Taster0_Icon S7_DWrite db 33 0.0<br />
attr Taster0_Icon IODev PCS_7<br />
attr Taster0_Icon eventMap on:on off:off<br />
attr Taster0_Icon group Licht<br />
attr Taster0_Icon room Keller<br />
<br />
define Taster1_Icon S7_DWrite db 33 0.1<br />
attr Taster1_Icon IODev PCS_7<br />
attr Taster1_Icon eventMap on:on off:off<br />
attr Taster1_Icon group Licht<br />
attr Taster1_Icon room Keller<br />
<br />
define Taster2_Icon S7_DWrite db 33 0.2<br />
attr Taster2_Icon IODev PCS_7<br />
attr Taster2_Icon eventMap on:on off:off<br />
attr Taster2_Icon group Licht<br />
attr Taster2_Icon room Keller<br />
<br />
define Taster3_Icon S7_DWrite db 33 0.3<br />
attr Taster3_Icon IODev PCS_7<br />
attr Taster3_Icon eventMap on:on off:off<br />
attr Taster3_Icon group Licht<br />
attr Taster3_Icon room Keller<br />
<br />
define Taster4_Icon S7_DWrite db 33 0.4<br />
attr Taster4_Icon IODev PCS_7<br />
attr Taster4_Icon eventMap on:on off:off<br />
attr Taster4_Icon group Licht<br />
attr Taster4_Icon room Keller<br />
<br />
define Taster5_Icon S7_DWrite db 33 0.5<br />
attr Taster5_Icon IODev PCS_7<br />
attr Taster5_Icon eventMap on:on off:off<br />
attr Taster5_Icon group Licht<br />
attr Taster5_Icon room Keller<br />
<br />
define Taster6_Icon S7_DWrite db 33 0.6<br />
attr Taster6_Icon IODev PCS_7<br />
attr Taster6_Icon eventMap on:on off:off<br />
attr Taster6_Icon group Licht<br />
attr Taster6_Icon room Keller<br />
<br />
define Taster7_Icon S7_DWrite db 33 0.7<br />
attr Taster7_Icon IODev PCS_7<br />
attr Taster7_Icon eventMap on:on off:off<br />
attr Taster7_Icon group Licht<br />
attr Taster7_Icon room Keller<br />
<br />
<br />
define Rueckmeldung0 S7_DRead db 31 0.0<br />
attr Rueckmeldung0 IODev PCS_7<br />
attr Rueckmeldung0 group Licht<br />
attr Rueckmeldung0 room Keller<br />
<br />
define Rueckmeldung1 S7_DRead db 31 0.1<br />
attr Rueckmeldung1 IODev PCS_7<br />
attr Rueckmeldung1 group Licht<br />
attr Rueckmeldung1 room Keller<br />
<br />
define Rueckmeldung2 S7_DRead db 31 0.2<br />
attr Rueckmeldung2 IODev PCS_7<br />
attr Rueckmeldung2 group Licht<br />
attr Rueckmeldung2 room Keller<br />
<br />
define Rueckmeldung3 S7_DRead db 31 0.3<br />
attr Rueckmeldung3 IODev PCS_7<br />
attr Rueckmeldung3 group Licht<br />
attr Rueckmeldung3 room Keller<br />
<br />
define Rueckmeldung4 S7_DRead db 31 0.4<br />
attr Rueckmeldung4 IODev PCS_7<br />
attr Rueckmeldung4 group Licht<br />
attr Rueckmeldung4 room Keller<br />
<br />
define Rueckmeldung5 S7_DRead db 31 0.5<br />
attr Rueckmeldung5 IODev PCS_7<br />
attr Rueckmeldung5 group Licht<br />
attr Rueckmeldung5 room Keller<br />
<br />
define Rueckmeldung6 S7_DRead db 31 0.6<br />
attr Rueckmeldung6 IODev PCS_7<br />
attr Rueckmeldung6 group Licht<br />
attr Rueckmeldung6 room Keller<br />
<br />
define Rueckmeldung7 S7_DRead db 31 0.7<br />
attr Rueckmeldung7 IODev PCS_7<br />
attr Rueckmeldung7 group Licht<br />
attr Rueckmeldung7 room Keller<br />
<br />
<br />
[[Datei:fhem.JPG]]<br />
<br />
== S7-300 Beispielconfig ==<br />
'''Die Konfiguration (fhem.cfg) der S7-Kommunikation unten ist gültig ab V2.6.'''<br />
<br />
Es sind zwei CPUs im Einsatz, die mit FHEM kommunizieren:<br />
<br />
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)<br />
4 Kommunikations-DBs, DB20-DB24<br />
<br />
S7-315 CPU mit Onboard-Ethernet Schnittstelle, IP-Adresse: 192.168.1.102, R0S2 ('''Rack 0, Slot 2''' aus der Step 7 HW-Config)<br />
4 Kommunikations-DBs, DB70-DB74<br />
<br />
'''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)<br />
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.<br />
<br />
'''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)<br />
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).<br />
<br />
'''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) <br />
Hier legt FHEM die Gleitpunktzahlen ab, die in der S7 angezeigt/ verarbeitet werden sollen, z.B. den Wert eines Sliders zur Sollwertkorrektur (-10..+10).<br />
<br />
'''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)<br />
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.<br />
<br />
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.<br />
<br />
Es sind noch ein paar Spielerein als Beispiel in der fhem.cfg:<br />
<br />
- Tasten über Spracheingabe<br />
<br />
- Rückmeldung über Sprachausgabe<br />
<br />
- Temperatur aus dem Weather Modul wird an die S7 geschickt<br />
<br />
===fhem.cfg===<br />
<br />
# S7 Kommunikation mit 2 CPUs<br />
define 317 S7 192.168.1.101 0 2<br />
attr 317 room System<br />
<br />
define 315 S7 192.168.1.102 0 2<br />
attr 315 room System<br />
<br />
# FHEM Taster an 317<br />
define Taster_317 S7_DWrite db 23 0.0<br />
attr Taster_317 IODev 317<br />
attr Taster_317 devStateIcon .*:toggle:TRIGGER<br />
attr Taster_317 event-on-change-reading state<br />
attr Taster_317 group Licht<br />
attr Taster_317 room Keller<br />
<br />
# Rückmeldung ob 317 DO gesetzt hat<br />
define Rueckmeldung_317 S7_DRead db 21 0.0<br />
attr Rueckmeldung_317 IODev 317<br />
attr Rueckmeldung_317 event-on-change-reading state<br />
attr Rueckmeldung_317 group Licht<br />
attr Rueckmeldung_317 room Keller<br />
<br />
# FHEM Schalter an 315<br />
define Taster_315 S7_DWrite db 73 0.0<br />
attr Taster_315 IODev 315<br />
attr Taster_315 devStateIcon .*:toggle<br />
attr Taster_315 event-on-change-reading state<br />
attr Taster_315 group Licht<br />
attr Taster_315 room Keller<br />
attr Taster_315 webCmd ON:OFF<br />
<br />
# Rückmeldung ob 315 DO gesetzt hat<br />
define Rueckmeldung_315 S7_DRead db 71 0.0<br />
attr Rueckmeldung_315 IODev 315<br />
attr Rueckmeldung_315 event-on-change-reading state<br />
attr Rueckmeldung_315 group Licht<br />
attr Rueckmeldung_315 room Keller<br />
<br />
# FHEM Sollwertgeber an 317 als Knob<br />
define Temperaturkorrektur_317 S7_AWrite db 22 0 float<br />
attr Temperaturkorrektur_317 IODev 317<br />
attr Temperaturkorrektur_317 event-on-change-reading state<br />
attr Temperaturkorrektur_317 group Raumluft<br />
attr Temperaturkorrektur_317 room Keller<br />
attr Temperaturkorrektur_317 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
define Temperaturkorrektur_317_Knob dummy<br />
attr Temperaturkorrektur_317_Knob group Raumluft<br />
attr Temperaturkorrektur_317_Knob room Keller<br />
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<br />
attr Temperaturkorrektur_317_Knob stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
attr Temperaturkorrektur_317_Knob webCmd state<br />
<br />
define Temperaturkorrektur_317_Knob_notify notify Temperaturkorrektur_317_Knob {\<br />
fhem "set Temperaturkorrektur_317 ".ReadingsVal("Temperaturkorrektur_317_Knob","state","0");;\<br />
}<br />
attr Temperaturkorrektur_317_Knob_notify group Raumluft<br />
attr Temperaturkorrektur_317_Knob_notify room Keller<br />
<br />
# Rücklesewert ob 317 die Temperaturkorrektur bekommen hat<br />
define Ruecklesen_317 S7_ARead db 20 0 float<br />
attr Ruecklesen_317 IODev 317<br />
attr Ruecklesen_317 event-on-change-reading state<br />
attr Ruecklesen_317 group Raumluft<br />
attr Ruecklesen_317 room Keller<br />
attr Ruecklesen_317 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
# FHEM Sollwertgeber an 315 als Slider<br />
define Temperaturkorrektur_315 S7_AWrite db 72 0 float<br />
attr Temperaturkorrektur_315 IODev 315<br />
attr Temperaturkorrektur_315 event-on-change-reading state<br />
attr Temperaturkorrektur_315 group Raumluft<br />
attr Temperaturkorrektur_315 room Keller<br />
attr Temperaturkorrektur_315 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
define Temperaturkorrektur_315_Knob dummy<br />
attr Temperaturkorrektur_315_Knob group Raumluft<br />
attr Temperaturkorrektur_315_Knob room Keller<br />
attr Temperaturkorrektur_315_Knob setList state:slider,-10.0,0.5,10.0,1<br />
attr Temperaturkorrektur_315_Knob stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
attr Temperaturkorrektur_315_Knob webCmd state<br />
<br />
define Temperaturkorrektur_315_Knob_notify notify Temperaturkorrektur_315_Knob {\<br />
fhem "set Temperaturkorrektur_315 ".ReadingsVal("Temperaturkorrektur_315_Knob","state","0");;\<br />
}<br />
attr Temperaturkorrektur_315_Knob_notify group Raumluft<br />
attr Temperaturkorrektur_315_Knob_notify room Keller<br />
<br />
# Rücklesewert ob 315 die Temperaturkorrektur bekommen hat<br />
define Ruecklesen_315 S7_ARead db 70 0 float<br />
attr Ruecklesen_315 IODev 315<br />
attr Ruecklesen_315 event-on-change-reading state<br />
attr Ruecklesen_315 group Raumluft<br />
attr Ruecklesen_315 room Keller<br />
attr Ruecklesen_315 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
# Ein paar Spielereien<br />
<br />
# Temperatur aus dem Web an 317 schicken<br />
define Wetter Weather 638242 1800 de<br />
attr Wetter room Wetter<br />
<br />
define Temp_AU_Web S7_AWrite db 22 4 float<br />
attr Temp_AU_Web IODev 317<br />
attr Temp_AU_Web event-on-change-reading state<br />
attr Temp_AU_Web room Wetter<br />
attr Temp_AU_Web stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
define Temp_AU_Web_notify notify Wetter {\<br />
fhem "set Temp_AU_Web ".ReadingsVal("Wetter","temp_c","10");;\<br />
}<br />
attr Temp_AU_Web_notify room Wetter<br />
<br />
# WebViewControl Fullscreen Android Browser mit Text to Speech und Speech Recognition<br />
define Android webViewControl 12345<br />
attr Android room System<br />
<br />
# FHEM Taster an 317 über Sprache bedienen "Licht im Keller schalten"<br />
define speech_Licht_Keller notify .*voiceRecognitionLastResult.*icht.*eller.*(schalten|wechseln|tasten).* \<br />
set Taster_317 TRIGGER<br />
attr speech_Licht_Keller group Licht<br />
attr speech_Licht_Keller room Keller<br />
<br />
# Rückmeldung ob 317 DO gesetzt hat als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters<br />
define Rueckmeldung_317_ttsSay notify Rueckmeldung_317 {\<br />
fhem "set Android ttsSay Das Licht im Keller wurde geschaltet";;\<br />
}<br />
attr Rueckmeldung_317_ttsSay group Licht<br />
attr Rueckmeldung_317_ttsSay room Keller<br />
<br />
== Versionshistory ==<br />
Versionsinfo:<br />
<br />
V2.7<br />
* fix: for overlapping configuration<br />
<br />
V2.6<br />
* fix: reconnection at creation time<br />
* fix: state update on reading<br />
* fix: memory leak during message dispatch<br />
<br />
V2.5<br />
* fixes for writing operations for S300<br />
* fix in TCPClient for dedection of writing error<br />
<br />
V2.4<br />
* the requirement of having reading-configs and/or writing-configs are gone<br />
The module calculates based on the logical modul configuration the reading required bocks dynamically<br />
The writing is done as a minimal block for AWrite and as a Bit for DWrite<br />
This is done every second per default (optional Parameter of the 44_S7 modul)<br />
<br />
V2.3<br />
* FIX: For Logo8 Simple config<br />
* Error messages for perl PLC communication lib are available<br />
* standard attributes like event-min-interval, event-min-interval, ... are added<br />
* PLC Communication client extended for bitwise writing <br />
* removed attribute unit and precision: please use standard attribute stateFormat instead.<br />
<br />
Example for stateFormat with precision=1 and unit=°C:<br />
define innentemp S7_ARead db 0 6 u16<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=Datei:Fhem.JPG&diff=9846Datei:Fhem.JPG2015-02-04T17:27:00Z<p>Charlie71: </p>
<hr />
<div></div>Charlie71http://wiki.fhem.de/w/index.php?title=Datei:ProgrammOB1.JPG&diff=9845Datei:ProgrammOB1.JPG2015-02-04T17:26:26Z<p>Charlie71: </p>
<hr />
<div></div>Charlie71http://wiki.fhem.de/w/index.php?title=Datei:Komponentenkonfigurator.JPG&diff=9844Datei:Komponentenkonfigurator.JPG2015-02-04T17:26:08Z<p>Charlie71: </p>
<hr />
<div></div>Charlie71http://wiki.fhem.de/w/index.php?title=Datei:XDB_Datei_erzeugen.JPG&diff=9843Datei:XDB Datei erzeugen.JPG2015-02-04T17:25:49Z<p>Charlie71: </p>
<hr />
<div></div>Charlie71http://wiki.fhem.de/w/index.php?title=Datei:Netzwerkkonfiguration.JPG&diff=9842Datei:Netzwerkkonfiguration.JPG2015-02-04T17:25:15Z<p>Charlie71: </p>
<hr />
<div></div>Charlie71http://wiki.fhem.de/w/index.php?title=Datei:CPU.JPG&diff=9841Datei:CPU.JPG2015-02-04T17:24:52Z<p>Charlie71: </p>
<hr />
<div></div>Charlie71http://wiki.fhem.de/w/index.php?title=Datei:HarwareKonfiguration.JPG&diff=9840Datei:HarwareKonfiguration.JPG2015-02-04T17:24:07Z<p>Charlie71: </p>
<hr />
<div></div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9839S72015-02-04T17:22:49Z<p>Charlie71: WinLC RTX Beispiel wurden hinzugefügt</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
* WINLC RTX 4.5<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
<br />
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.<br />
diese werden nach <br />
<br />
1) area (inputs, outputs, merker, DB)<br />
<br />
2) nach DB<br />
<br />
3) nach Startbyte<br />
<br />
sortiert.<br />
Daraus werden Leseblöcke abgeleitet, die dann von der SPS geholt werden. Danach werden die Clientmodule mit den aktualisierten Werden versorgt.<br />
<br />
Wenn man auf die Writer schreibend zugreift, so wird unmittelbar die entsprechenden Bits/Bytes in der SPS gesetzt.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|}<br />
<br />
Anmerkung: Es werden auch Standardattribute unterstützt (zb: event-min-interval, event-min-interval, stateFormat, ...).<br />
<br />
Um Einheiten anzeigen zu lassen kann stateFormat wie folgt verwendet werden, ZB:<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes*<br />
|}<br />
<br />
Wichtig: NI, NQ ... nur LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
NI,NQ ... nur für LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== WinLC RTX 4.5 Beispielconfig ==<br />
Als erstes beginnt man mit der Hardwarekonfiguration:<br />
Bild: <br />
[[Datei:HarwareKonfiguration.JPG]]<br />
[[Datei:CPU.JPG]]<br />
[[Datei:Netzwerkkonfiguration.JPG]]<br />
<br />
Dann erzeugt man am besten als nächstes eine Importdatei XDB für den<br />
Komponentenkonfigurator. Diese läßt sich dann auf dem Rechner auf dem<br />
die RTX laufen soll mit dem Komponentenkonfigurator importieren.<br />
[[Datei:XDB_Datei_erzeugen.JPG]]<br />
<br />
Nach dem Import auf dem Zielrechner sollte der Komponentenkonfigurator<br />
so aussehen.<br />
[[Datei:Komponentenkonfigurator.JPG]]<br />
<br />
Der OB1 wird jetzt programmiert wie im folgenden Bild dargestellt.<br />
Zusätzlich habe ich den Merker 255.5 als Tacktmerker 2sec beider Konfiguration<br />
der CPU angeleget. Dann sehe ich das die Verbindung zu RTX steht. Dies ist<br />
aber nicht unbedingt erforderlich.<br />
[[Datei:ProgrammOB1.JPG]]<br />
<br />
In der fhem.cfg<br />
<br />
# S7 Kommunikation<br />
define PCS_7 S7 192.168.0.81 0 2<br />
attr PCS_7 room Keller<br />
<br />
# Lichttaster an S7 schaltbar über Icon<br />
define Taster0_Icon S7_DWrite db 33 0.0<br />
attr Taster0_Icon IODev PCS_7<br />
attr Taster0_Icon eventMap on:on off:off<br />
attr Taster0_Icon group Licht<br />
attr Taster0_Icon room Keller<br />
<br />
define Taster1_Icon S7_DWrite db 33 0.1<br />
attr Taster1_Icon IODev PCS_7<br />
attr Taster1_Icon eventMap on:on off:off<br />
attr Taster1_Icon group Licht<br />
attr Taster1_Icon room Keller<br />
<br />
define Taster2_Icon S7_DWrite db 33 0.2<br />
attr Taster2_Icon IODev PCS_7<br />
attr Taster2_Icon eventMap on:on off:off<br />
attr Taster2_Icon group Licht<br />
attr Taster2_Icon room Keller<br />
<br />
define Taster3_Icon S7_DWrite db 33 0.3<br />
attr Taster3_Icon IODev PCS_7<br />
attr Taster3_Icon eventMap on:on off:off<br />
attr Taster3_Icon group Licht<br />
attr Taster3_Icon room Keller<br />
<br />
define Taster4_Icon S7_DWrite db 33 0.4<br />
attr Taster4_Icon IODev PCS_7<br />
attr Taster4_Icon eventMap on:on off:off<br />
attr Taster4_Icon group Licht<br />
attr Taster4_Icon room Keller<br />
<br />
define Taster5_Icon S7_DWrite db 33 0.5<br />
attr Taster5_Icon IODev PCS_7<br />
attr Taster5_Icon eventMap on:on off:off<br />
attr Taster5_Icon group Licht<br />
attr Taster5_Icon room Keller<br />
<br />
define Taster6_Icon S7_DWrite db 33 0.6<br />
attr Taster6_Icon IODev PCS_7<br />
attr Taster6_Icon eventMap on:on off:off<br />
attr Taster6_Icon group Licht<br />
attr Taster6_Icon room Keller<br />
<br />
define Taster7_Icon S7_DWrite db 33 0.7<br />
attr Taster7_Icon IODev PCS_7<br />
attr Taster7_Icon eventMap on:on off:off<br />
attr Taster7_Icon group Licht<br />
attr Taster7_Icon room Keller<br />
<br />
<br />
define Rueckmeldung0 S7_DRead db 31 0.0<br />
attr Rueckmeldung0 IODev PCS_7<br />
attr Rueckmeldung0 group Licht<br />
attr Rueckmeldung0 room Keller<br />
<br />
define Rueckmeldung1 S7_DRead db 31 0.1<br />
attr Rueckmeldung1 IODev PCS_7<br />
attr Rueckmeldung1 group Licht<br />
attr Rueckmeldung1 room Keller<br />
<br />
define Rueckmeldung2 S7_DRead db 31 0.2<br />
attr Rueckmeldung2 IODev PCS_7<br />
attr Rueckmeldung2 group Licht<br />
attr Rueckmeldung2 room Keller<br />
<br />
define Rueckmeldung3 S7_DRead db 31 0.3<br />
attr Rueckmeldung3 IODev PCS_7<br />
attr Rueckmeldung3 group Licht<br />
attr Rueckmeldung3 room Keller<br />
<br />
define Rueckmeldung4 S7_DRead db 31 0.4<br />
attr Rueckmeldung4 IODev PCS_7<br />
attr Rueckmeldung4 group Licht<br />
attr Rueckmeldung4 room Keller<br />
<br />
define Rueckmeldung5 S7_DRead db 31 0.5<br />
attr Rueckmeldung5 IODev PCS_7<br />
attr Rueckmeldung5 group Licht<br />
attr Rueckmeldung5 room Keller<br />
<br />
define Rueckmeldung6 S7_DRead db 31 0.6<br />
attr Rueckmeldung6 IODev PCS_7<br />
attr Rueckmeldung6 group Licht<br />
attr Rueckmeldung6 room Keller<br />
<br />
define Rueckmeldung7 S7_DRead db 31 0.7<br />
attr Rueckmeldung7 IODev PCS_7<br />
attr Rueckmeldung7 group Licht<br />
attr Rueckmeldung7 room Keller<br />
<br />
<br />
[[Datei:fhem.JPG]]<br />
<br />
<br />
== S7-300 Beispielconfig ==<br />
'''Die Konfiguration (fhem.cfg) der S7-Kommunikation unten ist gültig ab V2.6.'''<br />
<br />
Es sind zwei CPUs im Einsatz, die mit FHEM kommunizieren:<br />
<br />
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)<br />
4 Kommunikations-DBs, DB20-DB24<br />
<br />
S7-315 CPU mit Onboard-Ethernet Schnittstelle, IP-Adresse: 192.168.1.102, R0S2 ('''Rack 0, Slot 2''' aus der Step 7 HW-Config)<br />
4 Kommunikations-DBs, DB70-DB74<br />
<br />
'''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)<br />
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.<br />
<br />
'''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)<br />
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).<br />
<br />
'''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) <br />
Hier legt FHEM die Gleitpunktzahlen ab, die in der S7 angezeigt/ verarbeitet werden sollen, z.B. den Wert eines Sliders zur Sollwertkorrektur (-10..+10).<br />
<br />
'''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)<br />
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.<br />
<br />
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.<br />
<br />
Es sind noch ein paar Spielerein als Beispiel in der fhem.cfg:<br />
<br />
- Tasten über Spracheingabe<br />
<br />
- Rückmeldung über Sprachausgabe<br />
<br />
- Temperatur aus dem Weather Modul wird an die S7 geschickt<br />
<br />
===fhem.cfg===<br />
<br />
# S7 Kommunikation mit 2 CPUs<br />
define 317 S7 192.168.1.101 0 2<br />
attr 317 room System<br />
<br />
define 315 S7 192.168.1.102 0 2<br />
attr 315 room System<br />
<br />
# FHEM Taster an 317<br />
define Taster_317 S7_DWrite db 23 0.0<br />
attr Taster_317 IODev 317<br />
attr Taster_317 devStateIcon .*:toggle:TRIGGER<br />
attr Taster_317 event-on-change-reading state<br />
attr Taster_317 group Licht<br />
attr Taster_317 room Keller<br />
<br />
# Rückmeldung ob 317 DO gesetzt hat<br />
define Rueckmeldung_317 S7_DRead db 21 0.0<br />
attr Rueckmeldung_317 IODev 317<br />
attr Rueckmeldung_317 event-on-change-reading state<br />
attr Rueckmeldung_317 group Licht<br />
attr Rueckmeldung_317 room Keller<br />
<br />
# FHEM Schalter an 315<br />
define Taster_315 S7_DWrite db 73 0.0<br />
attr Taster_315 IODev 315<br />
attr Taster_315 devStateIcon .*:toggle<br />
attr Taster_315 event-on-change-reading state<br />
attr Taster_315 group Licht<br />
attr Taster_315 room Keller<br />
attr Taster_315 webCmd ON:OFF<br />
<br />
# Rückmeldung ob 315 DO gesetzt hat<br />
define Rueckmeldung_315 S7_DRead db 71 0.0<br />
attr Rueckmeldung_315 IODev 315<br />
attr Rueckmeldung_315 event-on-change-reading state<br />
attr Rueckmeldung_315 group Licht<br />
attr Rueckmeldung_315 room Keller<br />
<br />
# FHEM Sollwertgeber an 317 als Knob<br />
define Temperaturkorrektur_317 S7_AWrite db 22 0 float<br />
attr Temperaturkorrektur_317 IODev 317<br />
attr Temperaturkorrektur_317 event-on-change-reading state<br />
attr Temperaturkorrektur_317 group Raumluft<br />
attr Temperaturkorrektur_317 room Keller<br />
attr Temperaturkorrektur_317 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
define Temperaturkorrektur_317_Knob dummy<br />
attr Temperaturkorrektur_317_Knob group Raumluft<br />
attr Temperaturkorrektur_317_Knob room Keller<br />
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<br />
attr Temperaturkorrektur_317_Knob stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
attr Temperaturkorrektur_317_Knob webCmd state<br />
<br />
define Temperaturkorrektur_317_Knob_notify notify Temperaturkorrektur_317_Knob {\<br />
fhem "set Temperaturkorrektur_317 ".ReadingsVal("Temperaturkorrektur_317_Knob","state","0");;\<br />
}<br />
attr Temperaturkorrektur_317_Knob_notify group Raumluft<br />
attr Temperaturkorrektur_317_Knob_notify room Keller<br />
<br />
# Rücklesewert ob 317 die Temperaturkorrektur bekommen hat<br />
define Ruecklesen_317 S7_ARead db 20 0 float<br />
attr Ruecklesen_317 IODev 317<br />
attr Ruecklesen_317 event-on-change-reading state<br />
attr Ruecklesen_317 group Raumluft<br />
attr Ruecklesen_317 room Keller<br />
attr Ruecklesen_317 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
# FHEM Sollwertgeber an 315 als Slider<br />
define Temperaturkorrektur_315 S7_AWrite db 72 0 float<br />
attr Temperaturkorrektur_315 IODev 315<br />
attr Temperaturkorrektur_315 event-on-change-reading state<br />
attr Temperaturkorrektur_315 group Raumluft<br />
attr Temperaturkorrektur_315 room Keller<br />
attr Temperaturkorrektur_315 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
define Temperaturkorrektur_315_Knob dummy<br />
attr Temperaturkorrektur_315_Knob group Raumluft<br />
attr Temperaturkorrektur_315_Knob room Keller<br />
attr Temperaturkorrektur_315_Knob setList state:slider,-10.0,0.5,10.0,1<br />
attr Temperaturkorrektur_315_Knob stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
attr Temperaturkorrektur_315_Knob webCmd state<br />
<br />
define Temperaturkorrektur_315_Knob_notify notify Temperaturkorrektur_315_Knob {\<br />
fhem "set Temperaturkorrektur_315 ".ReadingsVal("Temperaturkorrektur_315_Knob","state","0");;\<br />
}<br />
attr Temperaturkorrektur_315_Knob_notify group Raumluft<br />
attr Temperaturkorrektur_315_Knob_notify room Keller<br />
<br />
# Rücklesewert ob 315 die Temperaturkorrektur bekommen hat<br />
define Ruecklesen_315 S7_ARead db 70 0 float<br />
attr Ruecklesen_315 IODev 315<br />
attr Ruecklesen_315 event-on-change-reading state<br />
attr Ruecklesen_315 group Raumluft<br />
attr Ruecklesen_315 room Keller<br />
attr Ruecklesen_315 stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." K"}<br />
<br />
# Ein paar Spielereien<br />
<br />
# Temperatur aus dem Web an 317 schicken<br />
define Wetter Weather 638242 1800 de<br />
attr Wetter room Wetter<br />
<br />
define Temp_AU_Web S7_AWrite db 22 4 float<br />
attr Temp_AU_Web IODev 317<br />
attr Temp_AU_Web event-on-change-reading state<br />
attr Temp_AU_Web room Wetter<br />
attr Temp_AU_Web stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
define Temp_AU_Web_notify notify Wetter {\<br />
fhem "set Temp_AU_Web ".ReadingsVal("Wetter","temp_c","10");;\<br />
}<br />
attr Temp_AU_Web_notify room Wetter<br />
<br />
# WebViewControl Fullscreen Android Browser mit Text to Speech und Speech Recognition<br />
define Android webViewControl 12345<br />
attr Android room System<br />
<br />
# FHEM Taster an 317 über Sprache bedienen "Licht im Keller schalten"<br />
define speech_Licht_Keller notify .*voiceRecognitionLastResult.*icht.*eller.*(schalten|wechseln|tasten).* \<br />
set Taster_317 TRIGGER<br />
attr speech_Licht_Keller group Licht<br />
attr speech_Licht_Keller room Keller<br />
<br />
# Rückmeldung ob 317 DO gesetzt hat als Sprachausgabe, Ansage erfolgt nach Sprachkommando ODER Bedienung des Tasters<br />
define Rueckmeldung_317_ttsSay notify Rueckmeldung_317 {\<br />
fhem "set Android ttsSay Das Licht im Keller wurde geschaltet";;\<br />
}<br />
attr Rueckmeldung_317_ttsSay group Licht<br />
attr Rueckmeldung_317_ttsSay room Keller<br />
<br />
== Versionshistory ==<br />
Versionsinfo:<br />
<br />
V2.7<br />
* fix: for overlapping configuration<br />
<br />
V2.6<br />
* fix: reconnection at creation time<br />
* fix: state update on reading<br />
* fix: memory leak during message dispatch<br />
<br />
V2.5<br />
* fixes for writing operations for S300<br />
* fix in TCPClient for dedection of writing error<br />
<br />
V2.4<br />
* the requirement of having reading-configs and/or writing-configs are gone<br />
The module calculates based on the logical modul configuration the reading required bocks dynamically<br />
The writing is done as a minimal block for AWrite and as a Bit for DWrite<br />
This is done every second per default (optional Parameter of the 44_S7 modul)<br />
<br />
V2.3<br />
* FIX: For Logo8 Simple config<br />
* Error messages for perl PLC communication lib are available<br />
* standard attributes like event-min-interval, event-min-interval, ... are added<br />
* PLC Communication client extended for bitwise writing <br />
* removed attribute unit and precision: please use standard attribute stateFormat instead.<br />
<br />
Example for stateFormat with precision=1 and unit=°C:<br />
define innentemp S7_ARead db 0 6 u16<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9761S72015-02-02T13:28:46Z<p>Charlie71: /* Versionshistory */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
<br />
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.<br />
diese werden nach <br />
<br />
1) area (inputs, outputs, merker, DB)<br />
<br />
2) nach DB<br />
<br />
3) nach Startbyte<br />
<br />
sortiert.<br />
Daraus werden Leseblöcke abgeleitet, die dann von der SPS geholt werden. Danach werden die Clientmodule mit den aktualisierten Werden versorgt.<br />
<br />
Wenn man auf die Writer schreibend zugreift, so wird unmittelbar die entsprechenden Bits/Bytes in der SPS gesetzt.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|}<br />
<br />
Anmerkung: Es werden auch Standardattribute unterstützt (zb: event-min-interval, event-min-interval, stateFormat, ...).<br />
<br />
Um Einheiten anzeigen zu lassen kann stateFormat wie folgt verwendet werden, ZB:<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes*<br />
|}<br />
<br />
Wichtig: NI, NQ ... nur LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
NI,NQ ... nur für LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== S7-300 Beispielconfig ==<br />
'''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.'''<br />
<br />
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)<br />
4 Kommunikations-DBs, DB20 und DB21 werden jede Sekunde gelesen:<br />
<br />
'''DB20''' (symbolischer Name: ANALOG_AN_FHEM = aus Sicht der S7), Länge: 8 byte, Adresse 0.0: Temperatur (REAL), Adresse 4.0: Feuchte (REAL)<br />
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<br />
<br />
'''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)<br />
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)<br />
<br />
'''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)<br />
Hier legt FHEM die Gleitpunktzahlen ab, die in der S7 angezeigt/ verarbeitet werden sollen, z.B. den Wert eines Sliders zur Sollwertkorrektur (-3..+3)<br />
<br />
'''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)<br />
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<br />
<br />
===fhem.cfg===<br />
<br />
# S7 Kommunikation<br />
define myS7 S7 192.168.1.101 0 2<br />
<br />
# Lichttaster an S7 schaltbar über Icon<br />
define Taster_Icon S7_DWrite db 23 0.0<br />
attr Taster_Icon IODev myS7<br />
attr Taster_Icon devStateIcon .*:toggle:TRIGGER<br />
<br />
# Rueckmeldung, ob der Digitalausgang gesetzt wurde<br />
define Rueckmeldung S7_DRead db 21 0.0<br />
attr Rueckmeldung IODev myS7<br />
<br />
# Temperatur aus der S7 in FHEM anzeigen<br />
define Temperatur S7_ARead db 20 0 float<br />
attr Temperatur IODev myS7<br />
<br />
# Sollwertkorrektur über Slider an S7 schicken<br />
define Temperaturkorrektur S7_AWrite db 22 0 float<br />
attr Temperaturkorrektur IODev myS7<br />
<br />
define Temperaturkorrektur_Slider dummy<br />
attr Temperaturkorrektur_Slider setList state:slider,-3.0,0.5,3.0,1<br />
attr Temperaturkorrektur_Slider webCmd state<br />
<br />
define Temperaturkorrektur_Slider_notify notify Temperaturkorrektur_Slider {\<br />
fhem "set Temperaturkorrektur ".ReadingsVal("Temperaturkorrektur_Slider","state","0");;\<br />
}<br />
<br />
# Temperatur aus dem Web and S7 schicken<br />
define Wetter Weather 00000000 1800 de<br />
<br />
define Temp_AU_Web S7_AWrite db 22 4 float<br />
attr Temp_AU_Web IODev myS7<br />
<br />
define Temp_AU_Web_notify notify Wetter {\<br />
fhem "set Temp_AU_Web ".ReadingsVal("Wetter","temp_c","10");;\<br />
}<br />
<br />
== Versionshistory ==<br />
Versionsinfo:<br />
<br />
V2.4<br />
* the requirement of having reading-configs and/or writing-configs are gone<br />
The module calculates based on the logical modul configuration the reading required bocks dynamically<br />
The writing is done as a minimal block for AWrite and as a Bit for DWrite<br />
This is done every second per default (optional Parameter of the 44_S7 modul)<br />
<br />
V2.3<br />
* FIX: For Logo8 Simple config<br />
* Error messages for perl PLC communication lib are available<br />
* standard attributes like event-min-interval, event-min-interval, ... are added<br />
* PLC Communication client extended for bitwise writing <br />
* removed attribute unit and precision: please use standard attribute stateFormat instead.<br />
<br />
Example for stateFormat with precision=1 and unit=°C:<br />
define innentemp S7_ARead db 0 6 u16<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9760S72015-02-02T13:25:34Z<p>Charlie71: /* fhem.cfg */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
<br />
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.<br />
diese werden nach <br />
<br />
1) area (inputs, outputs, merker, DB)<br />
<br />
2) nach DB<br />
<br />
3) nach Startbyte<br />
<br />
sortiert.<br />
Daraus werden Leseblöcke abgeleitet, die dann von der SPS geholt werden. Danach werden die Clientmodule mit den aktualisierten Werden versorgt.<br />
<br />
Wenn man auf die Writer schreibend zugreift, so wird unmittelbar die entsprechenden Bits/Bytes in der SPS gesetzt.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|}<br />
<br />
Anmerkung: Es werden auch Standardattribute unterstützt (zb: event-min-interval, event-min-interval, stateFormat, ...).<br />
<br />
Um Einheiten anzeigen zu lassen kann stateFormat wie folgt verwendet werden, ZB:<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes*<br />
|}<br />
<br />
Wichtig: NI, NQ ... nur LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
NI,NQ ... nur für LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== S7-300 Beispielconfig ==<br />
'''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.'''<br />
<br />
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)<br />
4 Kommunikations-DBs, DB20 und DB21 werden jede Sekunde gelesen:<br />
<br />
'''DB20''' (symbolischer Name: ANALOG_AN_FHEM = aus Sicht der S7), Länge: 8 byte, Adresse 0.0: Temperatur (REAL), Adresse 4.0: Feuchte (REAL)<br />
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<br />
<br />
'''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)<br />
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)<br />
<br />
'''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)<br />
Hier legt FHEM die Gleitpunktzahlen ab, die in der S7 angezeigt/ verarbeitet werden sollen, z.B. den Wert eines Sliders zur Sollwertkorrektur (-3..+3)<br />
<br />
'''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)<br />
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<br />
<br />
===fhem.cfg===<br />
<br />
# S7 Kommunikation<br />
define myS7 S7 192.168.1.101 0 2<br />
<br />
# Lichttaster an S7 schaltbar über Icon<br />
define Taster_Icon S7_DWrite db 23 0.0<br />
attr Taster_Icon IODev myS7<br />
attr Taster_Icon devStateIcon .*:toggle:TRIGGER<br />
<br />
# Rueckmeldung, ob der Digitalausgang gesetzt wurde<br />
define Rueckmeldung S7_DRead db 21 0.0<br />
attr Rueckmeldung IODev myS7<br />
<br />
# Temperatur aus der S7 in FHEM anzeigen<br />
define Temperatur S7_ARead db 20 0 float<br />
attr Temperatur IODev myS7<br />
<br />
# Sollwertkorrektur über Slider an S7 schicken<br />
define Temperaturkorrektur S7_AWrite db 22 0 float<br />
attr Temperaturkorrektur IODev myS7<br />
<br />
define Temperaturkorrektur_Slider dummy<br />
attr Temperaturkorrektur_Slider setList state:slider,-3.0,0.5,3.0,1<br />
attr Temperaturkorrektur_Slider webCmd state<br />
<br />
define Temperaturkorrektur_Slider_notify notify Temperaturkorrektur_Slider {\<br />
fhem "set Temperaturkorrektur ".ReadingsVal("Temperaturkorrektur_Slider","state","0");;\<br />
}<br />
<br />
# Temperatur aus dem Web and S7 schicken<br />
define Wetter Weather 00000000 1800 de<br />
<br />
define Temp_AU_Web S7_AWrite db 22 4 float<br />
attr Temp_AU_Web IODev myS7<br />
<br />
define Temp_AU_Web_notify notify Wetter {\<br />
fhem "set Temp_AU_Web ".ReadingsVal("Wetter","temp_c","10");;\<br />
}<br />
<br />
== Versionshistory ==<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9759S72015-02-02T13:24:26Z<p>Charlie71: /* Attribute */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
<br />
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.<br />
diese werden nach <br />
<br />
1) area (inputs, outputs, merker, DB)<br />
<br />
2) nach DB<br />
<br />
3) nach Startbyte<br />
<br />
sortiert.<br />
Daraus werden Leseblöcke abgeleitet, die dann von der SPS geholt werden. Danach werden die Clientmodule mit den aktualisierten Werden versorgt.<br />
<br />
Wenn man auf die Writer schreibend zugreift, so wird unmittelbar die entsprechenden Bits/Bytes in der SPS gesetzt.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|}<br />
<br />
Anmerkung: Es werden auch Standardattribute unterstützt (zb: event-min-interval, event-min-interval, stateFormat, ...).<br />
<br />
Um Einheiten anzeigen zu lassen kann stateFormat wie folgt verwendet werden, ZB:<br />
attr innentemp stateFormat {sprintf("%.1f",ReadingsVal($name,"state",0))." °C"}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes*<br />
|}<br />
<br />
Wichtig: NI, NQ ... nur LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
NI,NQ ... nur für LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== S7-300 Beispielconfig ==<br />
'''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.'''<br />
<br />
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)<br />
4 Kommunikations-DBs, DB20 und DB21 werden jede Sekunde gelesen:<br />
<br />
'''DB20''' (symbolischer Name: ANALOG_AN_FHEM = aus Sicht der S7), Länge: 8 byte, Adresse 0.0: Temperatur (REAL), Adresse 4.0: Feuchte (REAL)<br />
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<br />
<br />
'''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)<br />
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)<br />
<br />
'''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)<br />
Hier legt FHEM die Gleitpunktzahlen ab, die in der S7 angezeigt/ verarbeitet werden sollen, z.B. den Wert eines Sliders zur Sollwertkorrektur (-3..+3)<br />
<br />
'''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)<br />
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<br />
<br />
===fhem.cfg===<br />
<br />
# S7 Kommunikation<br />
define myS7 S7 192.168.1.101 0 2<br />
attr myS7 ReadDB-Config 20 0 8 1 21 0 2 1<br />
attr myS7 WriteDB-Config 22 0 8 23 0 2<br />
<br />
# Lichttaster an S7 schaltbar über Icon<br />
define Taster_Icon S7_DWrite db 23 0.0<br />
attr Taster_Icon IODev myS7<br />
attr Taster_Icon devStateIcon .*:toggle:TRIGGER<br />
<br />
# Rueckmeldung, ob der Digitalausgang gesetzt wurde<br />
define Rueckmeldung S7_DRead db 21 0.0<br />
attr Rueckmeldung IODev myS7<br />
<br />
# Temperatur aus der S7 in FHEM anzeigen<br />
define Temperatur S7_ARead db 20 0 float<br />
attr Temperatur IODev myS7<br />
<br />
# Sollwertkorrektur über Slider an S7 schicken<br />
define Temperaturkorrektur S7_AWrite db 22 0 float<br />
attr Temperaturkorrektur IODev myS7<br />
<br />
define Temperaturkorrektur_Slider dummy<br />
attr Temperaturkorrektur_Slider setList state:slider,-3.0,0.5,3.0,1<br />
attr Temperaturkorrektur_Slider webCmd state<br />
<br />
define Temperaturkorrektur_Slider_notify notify Temperaturkorrektur_Slider {\<br />
fhem "set Temperaturkorrektur ".ReadingsVal("Temperaturkorrektur_Slider","state","0");;\<br />
}<br />
<br />
# Temperatur aus dem Web and S7 schicken<br />
define Wetter Weather 00000000 1800 de<br />
<br />
define Temp_AU_Web S7_AWrite db 22 4 float<br />
attr Temp_AU_Web IODev myS7<br />
<br />
define Temp_AU_Web_notify notify Wetter {\<br />
fhem "set Temp_AU_Web ".ReadingsVal("Wetter","temp_c","10");;\<br />
}<br />
<br />
== Versionshistory ==<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9758S72015-02-02T13:17:19Z<p>Charlie71: /* Attribute */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
<br />
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.<br />
diese werden nach <br />
<br />
1) area (inputs, outputs, merker, DB)<br />
<br />
2) nach DB<br />
<br />
3) nach Startbyte<br />
<br />
sortiert.<br />
Daraus werden Leseblöcke abgeleitet, die dann von der SPS geholt werden. Danach werden die Clientmodule mit den aktualisierten Werden versorgt.<br />
<br />
Wenn man auf die Writer schreibend zugreift, so wird unmittelbar die entsprechenden Bits/Bytes in der SPS gesetzt.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|-<br />
|precision||Legt fest mit wie vielen Nachkommastellen der Datenpunkt angezeigt werden soll<br />
|-<br />
|unit||Einheit des Datenpunktes<br />
|}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes*<br />
|}<br />
<br />
Wichtig: NI, NQ ... nur LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
NI,NQ ... nur für LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== S7-300 Beispielconfig ==<br />
'''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.'''<br />
<br />
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)<br />
4 Kommunikations-DBs, DB20 und DB21 werden jede Sekunde gelesen:<br />
<br />
'''DB20''' (symbolischer Name: ANALOG_AN_FHEM = aus Sicht der S7), Länge: 8 byte, Adresse 0.0: Temperatur (REAL), Adresse 4.0: Feuchte (REAL)<br />
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<br />
<br />
'''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)<br />
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)<br />
<br />
'''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)<br />
Hier legt FHEM die Gleitpunktzahlen ab, die in der S7 angezeigt/ verarbeitet werden sollen, z.B. den Wert eines Sliders zur Sollwertkorrektur (-3..+3)<br />
<br />
'''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)<br />
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<br />
<br />
===fhem.cfg===<br />
<br />
# S7 Kommunikation<br />
define myS7 S7 192.168.1.101 0 2<br />
attr myS7 ReadDB-Config 20 0 8 1 21 0 2 1<br />
attr myS7 WriteDB-Config 22 0 8 23 0 2<br />
<br />
# Lichttaster an S7 schaltbar über Icon<br />
define Taster_Icon S7_DWrite db 23 0.0<br />
attr Taster_Icon IODev myS7<br />
attr Taster_Icon devStateIcon .*:toggle:TRIGGER<br />
<br />
# Rueckmeldung, ob der Digitalausgang gesetzt wurde<br />
define Rueckmeldung S7_DRead db 21 0.0<br />
attr Rueckmeldung IODev myS7<br />
<br />
# Temperatur aus der S7 in FHEM anzeigen<br />
define Temperatur S7_ARead db 20 0 float<br />
attr Temperatur IODev myS7<br />
<br />
# Sollwertkorrektur über Slider an S7 schicken<br />
define Temperaturkorrektur S7_AWrite db 22 0 float<br />
attr Temperaturkorrektur IODev myS7<br />
<br />
define Temperaturkorrektur_Slider dummy<br />
attr Temperaturkorrektur_Slider setList state:slider,-3.0,0.5,3.0,1<br />
attr Temperaturkorrektur_Slider webCmd state<br />
<br />
define Temperaturkorrektur_Slider_notify notify Temperaturkorrektur_Slider {\<br />
fhem "set Temperaturkorrektur ".ReadingsVal("Temperaturkorrektur_Slider","state","0");;\<br />
}<br />
<br />
# Temperatur aus dem Web and S7 schicken<br />
define Wetter Weather 00000000 1800 de<br />
<br />
define Temp_AU_Web S7_AWrite db 22 4 float<br />
attr Temp_AU_Web IODev myS7<br />
<br />
define Temp_AU_Web_notify notify Wetter {\<br />
fhem "set Temp_AU_Web ".ReadingsVal("Wetter","temp_c","10");;\<br />
}<br />
<br />
== Versionshistory ==<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9757S72015-02-02T13:16:41Z<p>Charlie71: /* Funktionsprinzip */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
<br />
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.<br />
diese werden nach <br />
<br />
1) area (inputs, outputs, merker, DB)<br />
<br />
2) nach DB<br />
<br />
3) nach Startbyte<br />
<br />
sortiert.<br />
Daraus werden Leseblöcke abgeleitet, die dann von der SPS geholt werden. Danach werden die Clientmodule mit den aktualisierten Werden versorgt.<br />
<br />
Wenn man auf die Writer schreibend zugreift, so wird unmittelbar die entsprechenden Bits/Bytes in der SPS gesetzt.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|ReadDB-Config||Konfiguration eines DB Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadFlags-Config||Konfiguration eines Merker Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadInputs-Config||Konfiguration eines Eingangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|WriteDB-Config||Konfiguration eines DB Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteFlags-Config||Konfiguration eines Merker Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteInputs-Config||Konfiguration eines Eingangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|}<br />
<br />
Die Attribute ReadDB-Config, ReadFlags-Config, ReadInputs-Config, ReadOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> <INTERVAL> [<DB> <STARTPOSITION> <LENGTH> <INTERVAL>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|-<br />
|<INTERVAL>||Aktualisierungsintervall [s]<br />
|}<br />
<br />
Hinweis: Es lassen sich mehrere Lesespeicherblöcke mit unterschiedlichen Aktualisierungsintervallen konfigurieren. <br />
<br />
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.<br />
<br />
Die Attribute WriteDB-Config, WriteFlags-Config, WriteInputs-Config, WriteOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> [<DB> <STARTPOSITION> <LENGTH>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|}<br />
<br />
Hinweis: Bei jeder Schreiboperation wird IMMER der komplette Speicherblock vom FHEM zur SPS geschrieben.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|-<br />
|precision||Legt fest mit wie vielen Nachkommastellen der Datenpunkt angezeigt werden soll<br />
|-<br />
|unit||Einheit des Datenpunktes<br />
|}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes*<br />
|}<br />
<br />
Wichtig: NI, NQ ... nur LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
NI,NQ ... nur für LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== S7-300 Beispielconfig ==<br />
'''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.'''<br />
<br />
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)<br />
4 Kommunikations-DBs, DB20 und DB21 werden jede Sekunde gelesen:<br />
<br />
'''DB20''' (symbolischer Name: ANALOG_AN_FHEM = aus Sicht der S7), Länge: 8 byte, Adresse 0.0: Temperatur (REAL), Adresse 4.0: Feuchte (REAL)<br />
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<br />
<br />
'''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)<br />
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)<br />
<br />
'''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)<br />
Hier legt FHEM die Gleitpunktzahlen ab, die in der S7 angezeigt/ verarbeitet werden sollen, z.B. den Wert eines Sliders zur Sollwertkorrektur (-3..+3)<br />
<br />
'''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)<br />
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<br />
<br />
===fhem.cfg===<br />
<br />
# S7 Kommunikation<br />
define myS7 S7 192.168.1.101 0 2<br />
attr myS7 ReadDB-Config 20 0 8 1 21 0 2 1<br />
attr myS7 WriteDB-Config 22 0 8 23 0 2<br />
<br />
# Lichttaster an S7 schaltbar über Icon<br />
define Taster_Icon S7_DWrite db 23 0.0<br />
attr Taster_Icon IODev myS7<br />
attr Taster_Icon devStateIcon .*:toggle:TRIGGER<br />
<br />
# Rueckmeldung, ob der Digitalausgang gesetzt wurde<br />
define Rueckmeldung S7_DRead db 21 0.0<br />
attr Rueckmeldung IODev myS7<br />
<br />
# Temperatur aus der S7 in FHEM anzeigen<br />
define Temperatur S7_ARead db 20 0 float<br />
attr Temperatur IODev myS7<br />
<br />
# Sollwertkorrektur über Slider an S7 schicken<br />
define Temperaturkorrektur S7_AWrite db 22 0 float<br />
attr Temperaturkorrektur IODev myS7<br />
<br />
define Temperaturkorrektur_Slider dummy<br />
attr Temperaturkorrektur_Slider setList state:slider,-3.0,0.5,3.0,1<br />
attr Temperaturkorrektur_Slider webCmd state<br />
<br />
define Temperaturkorrektur_Slider_notify notify Temperaturkorrektur_Slider {\<br />
fhem "set Temperaturkorrektur ".ReadingsVal("Temperaturkorrektur_Slider","state","0");;\<br />
}<br />
<br />
# Temperatur aus dem Web and S7 schicken<br />
define Wetter Weather 00000000 1800 de<br />
<br />
define Temp_AU_Web S7_AWrite db 22 4 float<br />
attr Temp_AU_Web IODev myS7<br />
<br />
define Temp_AU_Web_notify notify Wetter {\<br />
fhem "set Temp_AU_Web ".ReadingsVal("Wetter","temp_c","10");;\<br />
}<br />
<br />
== Versionshistory ==<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9533S72015-01-24T18:36:39Z<p>Charlie71: </p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
Es lassen sich Lesespeicherblöcke (Readings) und Schreibspeicherblöcke (Writings) konfigurieren.<br />
<br />
'''Lesespeicherblock (SPS --> FHEM):''' <br />
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.<br />
<br />
'''Schreibspeicherblock (FHEM --> SPS):''' <br />
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.<br />
<br />
Aus diesem Konzept ergeben sich folgende Rahmenbedingungen:<br />
Ein Speicherbyte in der SPS kann entweder einem Reading oder einem Writing zugeordnet werden.<br />
Auf jeden Fall soll vermieden werden, dass ein Byte sowohl Reading gelesen als auch Writing überschrieben wird.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|ReadDB-Config||Konfiguration eines DB Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadFlags-Config||Konfiguration eines Merker Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadInputs-Config||Konfiguration eines Eingangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|WriteDB-Config||Konfiguration eines DB Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteFlags-Config||Konfiguration eines Merker Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteInputs-Config||Konfiguration eines Eingangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|}<br />
<br />
Die Attribute ReadDB-Config, ReadFlags-Config, ReadInputs-Config, ReadOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> <INTERVAL> [<DB> <STARTPOSITION> <LENGTH> <INTERVAL>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|-<br />
|<INTERVAL>||Aktualisierungsintervall [s]<br />
|}<br />
<br />
Hinweis: Es lassen sich mehrere Lesespeicherblöcke mit unterschiedlichen Aktualisierungsintervallen konfigurieren. <br />
<br />
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.<br />
<br />
Die Attribute WriteDB-Config, WriteFlags-Config, WriteInputs-Config, WriteOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> [<DB> <STARTPOSITION> <LENGTH>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|}<br />
<br />
Hinweis: Bei jeder Schreiboperation wird IMMER der komplette Speicherblock vom FHEM zur SPS geschrieben.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|-<br />
|precision||Legt fest mit wie vielen Nachkommastellen der Datenpunkt angezeigt werden soll<br />
|-<br />
|unit||Einheit des Datenpunktes<br />
|}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes*<br />
|}<br />
<br />
Wichtig: NI, NQ ... nur LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
NI,NQ ... nur für LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== S300 Beispielconfig ==<br />
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)<br />
4 Kommunikations-DBs, DB20 und DB21 werden jede Sekunde gelesen:<br />
'''DB20''' (symbolischer Name: ANALOG_AN_FHEM = aus Sicht der S7), Länge: 8 byte, Adresse 0.0: Temperatur (REAL), Adresse 4.0: Feuchte (REAL)<br />
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<br />
<br />
'''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)<br />
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)<br />
<br />
'''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)<br />
Hier legt FHEM die Gleitpunktzahlen ab, die in der S7 angezeigt/ verarbeitet werden sollen, z.B. den Wert eines Sliders zur Sollwertkorrektur (-3..+3)<br />
<br />
'''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)<br />
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<br />
<br />
===fhem.cfg===<br />
<br />
# S7 Kommunikation<br />
define myS7 S7 192.168.1.101 0 2<br />
attr myS7 ReadDB-Config 20 0 8 1 21 0 2 1<br />
attr myS7 WriteDB-Config 22 0 8 23 0 2<br />
<br />
# Lichttaster an S7 schaltbar über Icon<br />
define Taster_Icon S7_DWrite db 23 0.0<br />
attr Taster_Icon IODev myS7<br />
attr Taster_Icon devStateIcon .*:toggle:TRIGGER<br />
<br />
# Rueckmeldung, ob der Digitalausgang gesetzt wurde<br />
define Rueckmeldung S7_DRead db 21 0.0<br />
attr Rueckmeldung IODev myS7<br />
<br />
# Temperatur aus der S7 in FHEM anzeigen<br />
define Temperatur S7_ARead db 20 0 float<br />
attr Temperatur IODev myS7<br />
attr Temperatur precision 1<br />
attr Temperatur unit °C<br />
<br />
# Sollwertkorrektur über Slider an S7 schicken<br />
define Temperaturkorrektur S7_AWrite db 22 0 float<br />
attr Temperaturkorrektur IODev myS7<br />
attr Temperaturkorrektur precision 1<br />
attr Temperaturkorrektur unit K<br />
<br />
define Temperaturkorrektur_Slider dummy<br />
attr Temperaturkorrektur_Slider setList state:slider,-3.0,0.5,3.0,1<br />
attr Temperaturkorrektur_Slider webCmd state<br />
<br />
define Temperaturkorrektur_Slider_notify notify Temperaturkorrektur_Slider {\<br />
fhem "set Temperaturkorrektur ".ReadingsVal("Temperaturkorrektur_Slider","state","0");;\<br />
}<br />
<br />
# Temperatur aus dem Web and S7 schicken<br />
define Wetter Weather 00000000 1800 de<br />
<br />
define Temp_AU_Web S7_AWrite db 22 4 float<br />
attr Temp_AU_Web IODev myS7<br />
attr Temp_AU_Web precision 1<br />
attr Temp_AU_Web unit °C<br />
<br />
define Temp_AU_Web_notify notify Wetter {\<br />
fhem "set Temp_AU_Web ".ReadingsVal("Wetter","temp_c","10");;\<br />
}<br />
<br />
== Versionshistory ==<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9531S72015-01-24T17:04:06Z<p>Charlie71: /* Digitale Datenpunkte zum Schreiben */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
Es lassen sich Lesespeicherblöcke (Readings) und Schreibspeicherblöcke (Writings) konfigurieren.<br />
<br />
'''Lesespeicherblock (SPS --> FHEM):''' <br />
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.<br />
<br />
'''Schreibspeicherblock (FHEM --> SPS):''' <br />
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.<br />
<br />
Aus diesem Konzept ergeben sich folgende Rahmenbedingungen:<br />
Ein Speicherbyte in der SPS kann entweder einem Reading oder einem Writing zugeordnet werden.<br />
Auf jeden Fall soll vermieden werden, dass ein Byte sowohl Reading gelesen als auch Writing überschrieben wird.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|ReadDB-Config||Konfiguration eines DB Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadFlags-Config||Konfiguration eines Merker Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadInputs-Config||Konfiguration eines Eingangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|WriteDB-Config||Konfiguration eines DB Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteFlags-Config||Konfiguration eines Merker Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteInputs-Config||Konfiguration eines Eingangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|}<br />
<br />
Die Attribute ReadDB-Config, ReadFlags-Config, ReadInputs-Config, ReadOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> <INTERVAL> [<DB> <STARTPOSITION> <LENGTH> <INTERVAL>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|-<br />
|<INTERVAL>||Aktualisierungsintervall [s]<br />
|}<br />
<br />
Hinweis: Es lassen sich mehrere Lesespeicherblöcke mit unterschiedlichen Aktualisierungsintervallen konfigurieren. <br />
<br />
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.<br />
<br />
Die Attribute WriteDB-Config, WriteFlags-Config, WriteInputs-Config, WriteOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> [<DB> <STARTPOSITION> <LENGTH>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|}<br />
<br />
Hinweis: Bei jeder Schreiboperation wird IMMER der komplette Speicherblock vom FHEM zur SPS geschrieben.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|-<br />
|precision||Legt fest mit wie vielen Nachkommastellen der Datenpunkt angezeigt werden soll<br />
|-<br />
|unit||Einheit des Datenpunktes<br />
|}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes*<br />
|}<br />
<br />
Wichtig: NI, NQ ... nur LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
NI,NQ ... nur für LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== Versionshistory ==<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9530S72015-01-24T17:03:47Z<p>Charlie71: /* Digitale readonly Datenpunkte */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
Es lassen sich Lesespeicherblöcke (Readings) und Schreibspeicherblöcke (Writings) konfigurieren.<br />
<br />
'''Lesespeicherblock (SPS --> FHEM):''' <br />
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.<br />
<br />
'''Schreibspeicherblock (FHEM --> SPS):''' <br />
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.<br />
<br />
Aus diesem Konzept ergeben sich folgende Rahmenbedingungen:<br />
Ein Speicherbyte in der SPS kann entweder einem Reading oder einem Writing zugeordnet werden.<br />
Auf jeden Fall soll vermieden werden, dass ein Byte sowohl Reading gelesen als auch Writing überschrieben wird.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|ReadDB-Config||Konfiguration eines DB Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadFlags-Config||Konfiguration eines Merker Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadInputs-Config||Konfiguration eines Eingangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|WriteDB-Config||Konfiguration eines DB Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteFlags-Config||Konfiguration eines Merker Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteInputs-Config||Konfiguration eines Eingangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|}<br />
<br />
Die Attribute ReadDB-Config, ReadFlags-Config, ReadInputs-Config, ReadOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> <INTERVAL> [<DB> <STARTPOSITION> <LENGTH> <INTERVAL>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|-<br />
|<INTERVAL>||Aktualisierungsintervall [s]<br />
|}<br />
<br />
Hinweis: Es lassen sich mehrere Lesespeicherblöcke mit unterschiedlichen Aktualisierungsintervallen konfigurieren. <br />
<br />
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.<br />
<br />
Die Attribute WriteDB-Config, WriteFlags-Config, WriteInputs-Config, WriteOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> [<DB> <STARTPOSITION> <LENGTH>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|}<br />
<br />
Hinweis: Bei jeder Schreiboperation wird IMMER der komplette Speicherblock vom FHEM zur SPS geschrieben.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|-<br />
|precision||Legt fest mit wie vielen Nachkommastellen der Datenpunkt angezeigt werden soll<br />
|-<br />
|unit||Einheit des Datenpunktes<br />
|}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I,Q,M,NI,NQ 1..24||Auswahl des binären Datenpunktes*<br />
|}<br />
<br />
Wichtig: NI, NQ ... nur LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I|Q|M|NI|NQ 1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
NI,NQ ... nur für LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== Versionshistory ==<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9529S72015-01-24T16:57:59Z<p>Charlie71: /* Digitale Datenpunkte zum Schreiben */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
Es lassen sich Lesespeicherblöcke (Readings) und Schreibspeicherblöcke (Writings) konfigurieren.<br />
<br />
'''Lesespeicherblock (SPS --> FHEM):''' <br />
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.<br />
<br />
'''Schreibspeicherblock (FHEM --> SPS):''' <br />
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.<br />
<br />
Aus diesem Konzept ergeben sich folgende Rahmenbedingungen:<br />
Ein Speicherbyte in der SPS kann entweder einem Reading oder einem Writing zugeordnet werden.<br />
Auf jeden Fall soll vermieden werden, dass ein Byte sowohl Reading gelesen als auch Writing überschrieben wird.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|ReadDB-Config||Konfiguration eines DB Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadFlags-Config||Konfiguration eines Merker Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadInputs-Config||Konfiguration eines Eingangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|WriteDB-Config||Konfiguration eines DB Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteFlags-Config||Konfiguration eines Merker Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteInputs-Config||Konfiguration eines Eingangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|}<br />
<br />
Die Attribute ReadDB-Config, ReadFlags-Config, ReadInputs-Config, ReadOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> <INTERVAL> [<DB> <STARTPOSITION> <LENGTH> <INTERVAL>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|-<br />
|<INTERVAL>||Aktualisierungsintervall [s]<br />
|}<br />
<br />
Hinweis: Es lassen sich mehrere Lesespeicherblöcke mit unterschiedlichen Aktualisierungsintervallen konfigurieren. <br />
<br />
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.<br />
<br />
Die Attribute WriteDB-Config, WriteFlags-Config, WriteInputs-Config, WriteOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> [<DB> <STARTPOSITION> <LENGTH>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|}<br />
<br />
Hinweis: Bei jeder Schreiboperation wird IMMER der komplette Speicherblock vom FHEM zur SPS geschrieben.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|-<br />
|precision||Legt fest mit wie vielen Nachkommastellen der Datenpunkt angezeigt werden soll<br />
|-<br />
|unit||Einheit des Datenpunktes<br />
|}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|I|Q|M|NI|NQ 1..24||Auswahl des binären Datenpunktes*<br />
|}<br />
<br />
Wichtig: NI, NQ ... nur LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| I|Q|M|NI|NQ 1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
NI,NQ ... nur für LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== Versionshistory ==<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9528S72015-01-24T16:57:13Z<p>Charlie71: /* Digitale Datenpunkte zum Schreiben */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
Es lassen sich Lesespeicherblöcke (Readings) und Schreibspeicherblöcke (Writings) konfigurieren.<br />
<br />
'''Lesespeicherblock (SPS --> FHEM):''' <br />
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.<br />
<br />
'''Schreibspeicherblock (FHEM --> SPS):''' <br />
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.<br />
<br />
Aus diesem Konzept ergeben sich folgende Rahmenbedingungen:<br />
Ein Speicherbyte in der SPS kann entweder einem Reading oder einem Writing zugeordnet werden.<br />
Auf jeden Fall soll vermieden werden, dass ein Byte sowohl Reading gelesen als auch Writing überschrieben wird.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|ReadDB-Config||Konfiguration eines DB Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadFlags-Config||Konfiguration eines Merker Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadInputs-Config||Konfiguration eines Eingangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|WriteDB-Config||Konfiguration eines DB Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteFlags-Config||Konfiguration eines Merker Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteInputs-Config||Konfiguration eines Eingangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|}<br />
<br />
Die Attribute ReadDB-Config, ReadFlags-Config, ReadInputs-Config, ReadOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> <INTERVAL> [<DB> <STARTPOSITION> <LENGTH> <INTERVAL>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|-<br />
|<INTERVAL>||Aktualisierungsintervall [s]<br />
|}<br />
<br />
Hinweis: Es lassen sich mehrere Lesespeicherblöcke mit unterschiedlichen Aktualisierungsintervallen konfigurieren. <br />
<br />
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.<br />
<br />
Die Attribute WriteDB-Config, WriteFlags-Config, WriteInputs-Config, WriteOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> [<DB> <STARTPOSITION> <LENGTH>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|}<br />
<br />
Hinweis: Bei jeder Schreiboperation wird IMMER der komplette Speicherblock vom FHEM zur SPS geschrieben.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|-<br />
|precision||Legt fest mit wie vielen Nachkommastellen der Datenpunkt angezeigt werden soll<br />
|-<br />
|unit||Einheit des Datenpunktes<br />
|}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|I|Q|M|NI|NQ 1..24||Auswahl des binären Datenpunktes*<br />
|}<br />
<br />
Wichtig: NI, NQ ... nur LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|I|Q|M|NI|NQ 1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
NI,NQ ... nur für LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== Versionshistory ==<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9527S72015-01-24T16:56:31Z<p>Charlie71: /* Digitale readonly Datenpunkte */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
Es lassen sich Lesespeicherblöcke (Readings) und Schreibspeicherblöcke (Writings) konfigurieren.<br />
<br />
'''Lesespeicherblock (SPS --> FHEM):''' <br />
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.<br />
<br />
'''Schreibspeicherblock (FHEM --> SPS):''' <br />
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.<br />
<br />
Aus diesem Konzept ergeben sich folgende Rahmenbedingungen:<br />
Ein Speicherbyte in der SPS kann entweder einem Reading oder einem Writing zugeordnet werden.<br />
Auf jeden Fall soll vermieden werden, dass ein Byte sowohl Reading gelesen als auch Writing überschrieben wird.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|ReadDB-Config||Konfiguration eines DB Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadFlags-Config||Konfiguration eines Merker Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadInputs-Config||Konfiguration eines Eingangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|WriteDB-Config||Konfiguration eines DB Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteFlags-Config||Konfiguration eines Merker Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteInputs-Config||Konfiguration eines Eingangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|}<br />
<br />
Die Attribute ReadDB-Config, ReadFlags-Config, ReadInputs-Config, ReadOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> <INTERVAL> [<DB> <STARTPOSITION> <LENGTH> <INTERVAL>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|-<br />
|<INTERVAL>||Aktualisierungsintervall [s]<br />
|}<br />
<br />
Hinweis: Es lassen sich mehrere Lesespeicherblöcke mit unterschiedlichen Aktualisierungsintervallen konfigurieren. <br />
<br />
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.<br />
<br />
Die Attribute WriteDB-Config, WriteFlags-Config, WriteInputs-Config, WriteOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> [<DB> <STARTPOSITION> <LENGTH>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|}<br />
<br />
Hinweis: Bei jeder Schreiboperation wird IMMER der komplette Speicherblock vom FHEM zur SPS geschrieben.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|-<br />
|precision||Legt fest mit wie vielen Nachkommastellen der Datenpunkt angezeigt werden soll<br />
|-<br />
|unit||Einheit des Datenpunktes<br />
|}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|I|Q|M|NI|NQ 1..24||Auswahl des binären Datenpunktes*<br />
|}<br />
<br />
Wichtig: NI, NQ ... nur LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|{I|Q|M}1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== Versionshistory ==<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9526S72015-01-24T16:56:07Z<p>Charlie71: /* Digitale readonly Datenpunkte */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
Es lassen sich Lesespeicherblöcke (Readings) und Schreibspeicherblöcke (Writings) konfigurieren.<br />
<br />
'''Lesespeicherblock (SPS --> FHEM):''' <br />
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.<br />
<br />
'''Schreibspeicherblock (FHEM --> SPS):''' <br />
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.<br />
<br />
Aus diesem Konzept ergeben sich folgende Rahmenbedingungen:<br />
Ein Speicherbyte in der SPS kann entweder einem Reading oder einem Writing zugeordnet werden.<br />
Auf jeden Fall soll vermieden werden, dass ein Byte sowohl Reading gelesen als auch Writing überschrieben wird.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|ReadDB-Config||Konfiguration eines DB Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadFlags-Config||Konfiguration eines Merker Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadInputs-Config||Konfiguration eines Eingangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|WriteDB-Config||Konfiguration eines DB Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteFlags-Config||Konfiguration eines Merker Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteInputs-Config||Konfiguration eines Eingangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|}<br />
<br />
Die Attribute ReadDB-Config, ReadFlags-Config, ReadInputs-Config, ReadOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> <INTERVAL> [<DB> <STARTPOSITION> <LENGTH> <INTERVAL>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|-<br />
|<INTERVAL>||Aktualisierungsintervall [s]<br />
|}<br />
<br />
Hinweis: Es lassen sich mehrere Lesespeicherblöcke mit unterschiedlichen Aktualisierungsintervallen konfigurieren. <br />
<br />
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.<br />
<br />
Die Attribute WriteDB-Config, WriteFlags-Config, WriteInputs-Config, WriteOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> [<DB> <STARTPOSITION> <LENGTH>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|}<br />
<br />
Hinweis: Bei jeder Schreiboperation wird IMMER der komplette Speicherblock vom FHEM zur SPS geschrieben.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|-<br />
|precision||Legt fest mit wie vielen Nachkommastellen der Datenpunkt angezeigt werden soll<br />
|-<br />
|unit||Einheit des Datenpunktes<br />
|}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
| {I|Q|M|Ni|NQ}1..24||Auswahl des binären Datenpunktes*<br />
|}<br />
<br />
Wichtig: NI, NQ ... nur LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|{I|Q|M}1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== Versionshistory ==<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9525S72015-01-24T16:55:30Z<p>Charlie71: /* Digitale readonly Datenpunkte */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
Es lassen sich Lesespeicherblöcke (Readings) und Schreibspeicherblöcke (Writings) konfigurieren.<br />
<br />
'''Lesespeicherblock (SPS --> FHEM):''' <br />
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.<br />
<br />
'''Schreibspeicherblock (FHEM --> SPS):''' <br />
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.<br />
<br />
Aus diesem Konzept ergeben sich folgende Rahmenbedingungen:<br />
Ein Speicherbyte in der SPS kann entweder einem Reading oder einem Writing zugeordnet werden.<br />
Auf jeden Fall soll vermieden werden, dass ein Byte sowohl Reading gelesen als auch Writing überschrieben wird.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|ReadDB-Config||Konfiguration eines DB Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadFlags-Config||Konfiguration eines Merker Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadInputs-Config||Konfiguration eines Eingangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|WriteDB-Config||Konfiguration eines DB Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteFlags-Config||Konfiguration eines Merker Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteInputs-Config||Konfiguration eines Eingangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|}<br />
<br />
Die Attribute ReadDB-Config, ReadFlags-Config, ReadInputs-Config, ReadOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> <INTERVAL> [<DB> <STARTPOSITION> <LENGTH> <INTERVAL>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|-<br />
|<INTERVAL>||Aktualisierungsintervall [s]<br />
|}<br />
<br />
Hinweis: Es lassen sich mehrere Lesespeicherblöcke mit unterschiedlichen Aktualisierungsintervallen konfigurieren. <br />
<br />
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.<br />
<br />
Die Attribute WriteDB-Config, WriteFlags-Config, WriteInputs-Config, WriteOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> [<DB> <STARTPOSITION> <LENGTH>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|}<br />
<br />
Hinweis: Bei jeder Schreiboperation wird IMMER der komplette Speicherblock vom FHEM zur SPS geschrieben.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|-<br />
|precision||Legt fest mit wie vielen Nachkommastellen der Datenpunkt angezeigt werden soll<br />
|-<br />
|unit||Einheit des Datenpunktes<br />
|}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M|NI|NQ}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|{I|Q|M|Ni|NQ}1..24||Auswahl des binären Datenpunktes*<br />
|}<br />
<br />
Wichtig: NI, NQ ... nur LOGO8<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|{I|Q|M}1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== Versionshistory ==<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9524S72015-01-24T16:53:47Z<p>Charlie71: /* Versionshistory */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=x<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
Das Modul ist derzeit inoffziell. Die jeweils aktuelle Modul-Version steht in diesem {{Link2Forum|Topic=26092|Message=191102}} zum Download bereit.<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
Es lassen sich Lesespeicherblöcke (Readings) und Schreibspeicherblöcke (Writings) konfigurieren.<br />
<br />
'''Lesespeicherblock (SPS --> FHEM):''' <br />
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.<br />
<br />
'''Schreibspeicherblock (FHEM --> SPS):''' <br />
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.<br />
<br />
Aus diesem Konzept ergeben sich folgende Rahmenbedingungen:<br />
Ein Speicherbyte in der SPS kann entweder einem Reading oder einem Writing zugeordnet werden.<br />
Auf jeden Fall soll vermieden werden, dass ein Byte sowohl Reading gelesen als auch Writing überschrieben wird.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|ReadDB-Config||Konfiguration eines DB Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadFlags-Config||Konfiguration eines Merker Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadInputs-Config||Konfiguration eines Eingangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|WriteDB-Config||Konfiguration eines DB Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteFlags-Config||Konfiguration eines Merker Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteInputs-Config||Konfiguration eines Eingangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|}<br />
<br />
Die Attribute ReadDB-Config, ReadFlags-Config, ReadInputs-Config, ReadOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> <INTERVAL> [<DB> <STARTPOSITION> <LENGTH> <INTERVAL>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|-<br />
|<INTERVAL>||Aktualisierungsintervall [s]<br />
|}<br />
<br />
Hinweis: Es lassen sich mehrere Lesespeicherblöcke mit unterschiedlichen Aktualisierungsintervallen konfigurieren. <br />
<br />
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.<br />
<br />
Die Attribute WriteDB-Config, WriteFlags-Config, WriteInputs-Config, WriteOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> [<DB> <STARTPOSITION> <LENGTH>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|}<br />
<br />
Hinweis: Bei jeder Schreiboperation wird IMMER der komplette Speicherblock vom FHEM zur SPS geschrieben.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|-<br />
|precision||Legt fest mit wie vielen Nachkommastellen der Datenpunkt angezeigt werden soll<br />
|-<br />
|unit||Einheit des Datenpunktes<br />
|}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|{I|Q|M}1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|{I|Q|M}1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== Versionshistory ==<br />
V2.2<br />
* Fix: for Multi DB configurations<br />
* Fix: FHEM does not chrash if PLC is not available <br />
* New Feature for Logo 8: Now NI and NQ for simply config method is supported<br />
<br />
V2.1 <br />
* Fix: DB > 0 are working<br />
* Fix: AnalogRead und Analog Write<br />
<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=26092}} zum Download, Entwicklung und Support des Moduls<br />
<br />
[[Kategorie:Other Components]]</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9469S72015-01-20T18:39:25Z<p>Charlie71: /* Versionshistory */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=d<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
Es lassen sich Lesespeicherblöcke (Readings) und Schreibspeicherblöcke (Writings) konfigurieren.<br />
<br />
'''Lesespeicherblock (SPS --> FHEM):''' <br />
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.<br />
<br />
'''Schreibspeicherblock (FHEM --> SPS):''' <br />
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.<br />
<br />
Aus diesem Konzept ergeben sich folgende Rahmenbedingungen:<br />
Ein Speicherbyte in der SPS kann entweder einem Reading oder einem Writing zugeordnet werden.<br />
Auf jeden Fall soll vermieden werden, dass ein Byte sowohl Reading gelesen als auch Writing überschrieben wird.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|ReadDB-Config||Konfiguration eines DB Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadFlags-Config||Konfiguration eines Merker Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadInputs-Config||Konfiguration eines Eingangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|WriteDB-Config||Konfiguration eines DB Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteFlags-Config||Konfiguration eines Merker Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteInputs-Config||Konfiguration eines Eingangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|}<br />
<br />
Die Attribute ReadDB-Config, ReadFlags-Config, ReadInputs-Config, ReadOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> <INTERVAL> [<DB> <STARTPOSITION> <LENGTH> <INTERVAL>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|-<br />
|<INTERVAL>||Aktualisierungsintervall [s]<br />
|}<br />
<br />
Hinweis: Es lassen sich mehrere Lesespeicherblöcke mit unterschiedlichen Aktualisierungsintervallen konfigurieren. <br />
<br />
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.<br />
<br />
Die Attribute WriteDB-Config, WriteFlags-Config, WriteInputs-Config, WriteOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> [<DB> <STARTPOSITION> <LENGTH>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|}<br />
<br />
Hinweis: Bei jeder Schreiboperation wird IMMER der komplette Speicherblock vom FHEM zur SPS geschrieben.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|-<br />
|precision||Legt fest mit wie vielen Nachkommastellen der Datenpunkt angezeigt werden soll<br />
|-<br />
|unit||Einheit des Datenpunktes<br />
|}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|{I|Q|M}1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|{I|Q|M}1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== Versionshistory ==<br />
V2.00 <br />
* keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
<br />
'''Achtung:''' die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9468S72015-01-20T18:35:50Z<p>Charlie71: /* Vorbereitung auf der SPS */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=d<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
Es lassen sich Lesespeicherblöcke (Readings) und Schreibspeicherblöcke (Writings) konfigurieren.<br />
<br />
'''Lesespeicherblock (SPS --> FHEM):''' <br />
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.<br />
<br />
'''Schreibspeicherblock (FHEM --> SPS):''' <br />
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.<br />
<br />
Aus diesem Konzept ergeben sich folgende Rahmenbedingungen:<br />
Ein Speicherbyte in der SPS kann entweder einem Reading oder einem Writing zugeordnet werden.<br />
Auf jeden Fall soll vermieden werden, dass ein Byte sowohl Reading gelesen als auch Writing überschrieben wird.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
''Anmerkung'': Bei Verwendung einer '''Siemens Logo''' wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|ReadDB-Config||Konfiguration eines DB Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadFlags-Config||Konfiguration eines Merker Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadInputs-Config||Konfiguration eines Eingangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|WriteDB-Config||Konfiguration eines DB Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteFlags-Config||Konfiguration eines Merker Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteInputs-Config||Konfiguration eines Eingangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|}<br />
<br />
Die Attribute ReadDB-Config, ReadFlags-Config, ReadInputs-Config, ReadOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> <INTERVAL> [<DB> <STARTPOSITION> <LENGTH> <INTERVAL>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|-<br />
|<INTERVAL>||Aktualisierungsintervall [s]<br />
|}<br />
<br />
Hinweis: Es lassen sich mehrere Lesespeicherblöcke mit unterschiedlichen Aktualisierungsintervallen konfigurieren. <br />
<br />
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.<br />
<br />
Die Attribute WriteDB-Config, WriteFlags-Config, WriteInputs-Config, WriteOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> [<DB> <STARTPOSITION> <LENGTH>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|}<br />
<br />
Hinweis: Bei jeder Schreiboperation wird IMMER der komplette Speicherblock vom FHEM zur SPS geschrieben.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|-<br />
|precision||Legt fest mit wie vielen Nachkommastellen der Datenpunkt angezeigt werden soll<br />
|-<br />
|unit||Einheit des Datenpunktes<br />
|}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|{I|Q|M}1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|{I|Q|M}1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== Versionshistory ==<br />
V2.00 keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
Achtung: die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9467S72015-01-20T18:35:07Z<p>Charlie71: /* Vorbereitung auf der SPS */</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=d<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
Es lassen sich Lesespeicherblöcke (Readings) und Schreibspeicherblöcke (Writings) konfigurieren.<br />
<br />
'''Lesespeicherblock (SPS --> FHEM):''' <br />
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.<br />
<br />
'''Schreibspeicherblock (FHEM --> SPS):''' <br />
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.<br />
<br />
Aus diesem Konzept ergeben sich folgende Rahmenbedingungen:<br />
Ein Speicherbyte in der SPS kann entweder einem Reading oder einem Writing zugeordnet werden.<br />
Auf jeden Fall soll vermieden werden, dass ein Byte sowohl Reading gelesen als auch Writing überschrieben wird.<br />
<br />
== Vorbereitung auf der SPS ==<br />
Die SPS muss für die Verbindung mit FHEM vorbereitet werden.<br />
Die SPS benötigt selbstverständlich eine fixe IP Adresse.<br />
<br />
Weiters muss eine Serververbindung auf der SPS eingerichtet werden, diese sollte wie folgt konfiguriert werden:<br />
<br />
* 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.)<br />
* Die Remote TSAP von FHEM beträgt defaultmäßig 01.00<br />
<br />
Die weitere Vorgehensweise hängt nun von der SPS ab:<br />
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:<br />
LocalTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
<br />
Anmerkung: Bei Verwendung einer Siemens Logo wird davon ausgegangen dass eine lokale TSAP von 02.00 konfiguriert wurde (Mit Operatorpanel verbinden)<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|ReadDB-Config||Konfiguration eines DB Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadFlags-Config||Konfiguration eines Merker Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadInputs-Config||Konfiguration eines Eingangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|WriteDB-Config||Konfiguration eines DB Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteFlags-Config||Konfiguration eines Merker Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteInputs-Config||Konfiguration eines Eingangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|}<br />
<br />
Die Attribute ReadDB-Config, ReadFlags-Config, ReadInputs-Config, ReadOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> <INTERVAL> [<DB> <STARTPOSITION> <LENGTH> <INTERVAL>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|-<br />
|<INTERVAL>||Aktualisierungsintervall [s]<br />
|}<br />
<br />
Hinweis: Es lassen sich mehrere Lesespeicherblöcke mit unterschiedlichen Aktualisierungsintervallen konfigurieren. <br />
<br />
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.<br />
<br />
Die Attribute WriteDB-Config, WriteFlags-Config, WriteInputs-Config, WriteOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> [<DB> <STARTPOSITION> <LENGTH>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|}<br />
<br />
Hinweis: Bei jeder Schreiboperation wird IMMER der komplette Speicherblock vom FHEM zur SPS geschrieben.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|-<br />
|precision||Legt fest mit wie vielen Nachkommastellen der Datenpunkt angezeigt werden soll<br />
|-<br />
|unit||Einheit des Datenpunktes<br />
|}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|{I|Q|M}1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|{I|Q|M}1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== Versionshistory ==<br />
V2.00 keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
Achtung: die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9466S72015-01-20T18:22:24Z<p>Charlie71: </p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=d<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
Es lassen sich Lesespeicherblöcke (Readings) und Schreibspeicherblöcke (Writings) konfigurieren.<br />
<br />
'''Lesespeicherblock (SPS --> FHEM):''' <br />
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.<br />
<br />
'''Schreibspeicherblock (FHEM --> SPS):''' <br />
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.<br />
<br />
Aus diesem Konzept ergeben sich folgende Rahmenbedingungen:<br />
Ein Speicherbyte in der SPS kann entweder einem Reading oder einem Writing zugeordnet werden.<br />
Auf jeden Fall soll vermieden werden, dass ein Byte sowohl Reading gelesen als auch Writing überschrieben wird.<br />
<br />
== Vorbereitung auf der SPS ==<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|ReadDB-Config||Konfiguration eines DB Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadFlags-Config||Konfiguration eines Merker Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadInputs-Config||Konfiguration eines Eingangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|WriteDB-Config||Konfiguration eines DB Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteFlags-Config||Konfiguration eines Merker Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteInputs-Config||Konfiguration eines Eingangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|}<br />
<br />
Die Attribute ReadDB-Config, ReadFlags-Config, ReadInputs-Config, ReadOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> <INTERVAL> [<DB> <STARTPOSITION> <LENGTH> <INTERVAL>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|-<br />
|<INTERVAL>||Aktualisierungsintervall [s]<br />
|}<br />
<br />
Hinweis: Es lassen sich mehrere Lesespeicherblöcke mit unterschiedlichen Aktualisierungsintervallen konfigurieren. <br />
<br />
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.<br />
<br />
Die Attribute WriteDB-Config, WriteFlags-Config, WriteInputs-Config, WriteOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> [<DB> <STARTPOSITION> <LENGTH>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|}<br />
<br />
Hinweis: Bei jeder Schreiboperation wird IMMER der komplette Speicherblock vom FHEM zur SPS geschrieben.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|-<br />
|precision||Legt fest mit wie vielen Nachkommastellen der Datenpunkt angezeigt werden soll<br />
|-<br />
|unit||Einheit des Datenpunktes<br />
|}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|{I|Q|M}1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|{I|Q|M}1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== Versionshistory ==<br />
V2.00 keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
Achtung: die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9465S72015-01-20T18:21:23Z<p>Charlie71: </p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=d<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
Es lassen sich Lesespeicherblöcke (Readings) und Schreibspeicherblöcke (Writings) konfigurieren.<br />
<br />
'''Lesespeicherblock (SPS --> FHEM):''' <br />
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.<br />
<br />
'''Schreibspeicherblock (FHEM --> SPS):''' <br />
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.<br />
<br />
Aus diesem Konzept ergeben sich folgende Rahmenbedingungen:<br />
Ein Speicherbyte in der SPS kann entweder einem Reading oder einem Writing zugeordnet werden.<br />
Auf jeden Fall soll vermieden werden, dass ein Byte sowohl Reading gelesen als auch Writing überschrieben wird.<br />
<br />
== Vorbereitung auf der SPS ==<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|ReadDB-Config||Konfiguration eines DB Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadFlags-Config||Konfiguration eines Merker Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadInputs-Config||Konfiguration eines Eingangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|WriteDB-Config||Konfiguration eines DB Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteFlags-Config||Konfiguration eines Merker Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteInputs-Config||Konfiguration eines Eingangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|}<br />
<br />
Die Attribute ReadDB-Config, ReadFlags-Config, ReadInputs-Config, ReadOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> <INTERVAL> [<DB> <STARTPOSITION> <LENGTH> <INTERVAL>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|-<br />
|<INTERVAL>||Aktualisierungsintervall [s]<br />
|}<br />
<br />
Hinweis: Es lassen sich mehrere Lesespeicherblöcke mit unterschiedlichen Aktualisierungsintervallen konfigurieren. <br />
<br />
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.<br />
<br />
Die Attribute WriteDB-Config, WriteFlags-Config, WriteInputs-Config, WriteOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> [<DB> <STARTPOSITION> <LENGTH>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|}<br />
<br />
Hinweis: Bei jeder Schreiboperation wird IMMER der komplette Speicherblock vom FHEM zur SPS geschrieben.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|-<br />
|precision||Legt fest mit wie vielen Nachkommastellen der Datenpunkt angezeigt werden soll<br />
|-<br />
|unit||Einheit des Datenpunktes<br />
|}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff ON|OFF|TRIGGER<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|{I|Q|M}1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|{I|Q|M}1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff ON|OFF|TRIGGER<br />
<br />
ON ... setzt dieses Bit<br />
<br />
OFF ... löscht dieses Bit<br />
<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== Versionshistory ==<br />
V2.00 keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
Achtung: die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9464S72015-01-20T18:19:20Z<p>Charlie71: </p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=d<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
Es lassen sich Lesespeicherblöcke (Readings) und Schreibspeicherblöcke (Writings) konfigurieren.<br />
<br />
'''Lesespeicherblock (SPS --> FHEM):''' <br />
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.<br />
<br />
'''Schreibspeicherblock (FHEM --> SPS):''' <br />
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.<br />
<br />
Aus diesem Konzept ergeben sich folgende Rahmenbedingungen:<br />
Ein Speicherbyte in der SPS kann entweder einem Reading oder einem Writing zugeordnet werden.<br />
Auf jeden Fall soll vermieden werden, dass ein Byte sowohl Reading gelesen als auch Writing überschrieben wird.<br />
<br />
== Vorbereitung auf der SPS ==<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|ReadDB-Config||Konfiguration eines DB Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadFlags-Config||Konfiguration eines Merker Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadInputs-Config||Konfiguration eines Eingangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|WriteDB-Config||Konfiguration eines DB Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteFlags-Config||Konfiguration eines Merker Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteInputs-Config||Konfiguration eines Eingangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|}<br />
<br />
Die Attribute ReadDB-Config, ReadFlags-Config, ReadInputs-Config, ReadOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> <INTERVAL> [<DB> <STARTPOSITION> <LENGTH> <INTERVAL>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|-<br />
|<INTERVAL>||Aktualisierungsintervall [s]<br />
|}<br />
<br />
Hinweis: Es lassen sich mehrere Lesespeicherblöcke mit unterschiedlichen Aktualisierungsintervallen konfigurieren. <br />
<br />
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.<br />
<br />
Die Attribute WriteDB-Config, WriteFlags-Config, WriteInputs-Config, WriteOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> [<DB> <STARTPOSITION> <LENGTH>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|}<br />
<br />
Hinweis: Bei jeder Schreiboperation wird IMMER der komplette Speicherblock vom FHEM zur SPS geschrieben.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
==== Attribute ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|-<br />
|precision||Legt fest mit wie vielen Nachkommastellen der Datenpunkt angezeigt werden soll<br />
|-<br />
|unit||Einheit des Datenpunktes<br />
|}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu schreibenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite db 0 5.7<br />
<br />
Hinweis: Die ausgewählte Adresse muss innerhalb eines konfigurierten Speicherblocks liegen.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff ON|OFF|TRIGGER<br />
<br />
ON ... setzt dieses Bit<br />
OFF ... löscht dieses Bit<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brennersollwert S7_AWrite db 0 601 float<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff mit einer Zahl als Parameter.<br />
|-<br />
|}<br />
<br />
== Defines Siemens LOGO! ==<br />
Für die Konfiguration der Siemens Logo! 7 oder 8 existiert eine Vereinfachte Konfigurationssyntax.<br />
Hier werden alle notwendigen Einstellungen im Hintergrund generiert, diese können bei Bedarf angepasst werden.<br />
<br />
Als ersten Schritt muss auch hier eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul. <br />
<br />
define <name> S7 {LOGO7|LOGO8} <ip_address><br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|LOGO7|LOGO8||SPS Typ<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|}<br />
<br />
Anmerkung: Es wird defaultmäßig jede Sekunde geprüft ob ein Speicherblock zu lesen ist.<br />
<br />
<br />
'''Konfigurationsbeispiel'''<br />
define myLogo S7 LOGO7 10.0.0.243<br />
<br />
==== Attribute ====<br />
Es können die selben Attribute, wie im vorherigen Abschnitt beschrieben, verwendet werden.<br />
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.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {I|Q|M}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|{I|Q|M}1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead I5<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Reader Config für das Basismodul angelegt.<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
define <name> S7_DWrite {I|Q|M}1..24<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|{I|Q|M}1..24||Auswahl des binären Datenpunktes<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Brenner_Ein S7_DWrite M7<br />
<br />
Hinweis: Es wird wenn nötig ein entsprechende Writer Config für das Basismodul angelegt.<br />
<br />
==== Setter ====<br />
{| class="wikitable sortable"<br />
|-<br />
! Befehl !! Beschreibung<br />
|-<br />
|set||schreibender Zugriff ON|OFF|TRIGGER<br />
<br />
ON ... setzt dieses Bit<br />
OFF ... löscht dieses Bit<br />
TRIGGER ... Das Bit wird für 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
|-<br />
|}<br />
<br />
=== Analoge Datenpunkte ===<br />
Analoge Datenpunkte müssen wie im vorherigen Abschnitt beschrieben eingerichtet werden.<br />
<br />
== Versionshistory ==<br />
V2.00 keine LibNoDave Library erforderlich. Sämtliche Kommunikation mit der SPS wird über eine native perl library umgesetzt. <br />
Achtung: die Konfigurationssyntax des Moduls hat sich geändert!!!!<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9463S72015-01-20T17:48:12Z<p>Charlie71: </p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=d<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
== under Construction ==<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
Es lassen sich Lesespeicherblöcke (Readings) und Schreibspeicherblöcke (Writings) konfigurieren.<br />
<br />
'''Lesespeicherblock (SPS --> FHEM):''' <br />
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.<br />
<br />
'''Schreibspeicherblock (FHEM --> SPS):''' <br />
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.<br />
<br />
Aus diesem Konzept ergeben sich folgende Rahmenbedingungen:<br />
Ein Speicherbyte in der SPS kann entweder einem Reading oder einem Writing zugeordnet werden.<br />
Auf jeden Fall soll vermieden werden, dass ein Byte sowohl Reading gelesen als auch Writing überschrieben wird.<br />
<br />
== Vorbereitung auf der SPS ==<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
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.<br />
<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
'''Attribute'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|ReadDB-Config||Konfiguration eines DB Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadFlags-Config||Konfiguration eines Merker Speicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadInputs-Config||Konfiguration eines Eingangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|ReadOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der von der SPS gelesen werden soll (SPS -> FHEM)<br />
|-<br />
|WriteDB-Config||Konfiguration eines DB Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteFlags-Config||Konfiguration eines Merker Speicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteInputs-Config||Konfiguration eines Eingangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|-<br />
|WriteOutputs-Config||Konfiguration eines Ausgangsspeicherblocks der zur SPS geschrieben werden soll (FHEM -> SPS)<br />
|}<br />
<br />
Die Attribute ReadDB-Config, ReadFlags-Config, ReadInputs-Config, ReadOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> <INTERVAL> [<DB> <STARTPOSITION> <LENGTH> <INTERVAL>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|-<br />
|<INTERVAL>||Aktualisierungsintervall [s]<br />
|}<br />
<br />
Hinweis: Es lassen sich mehrere Lesespeicherblöcke mit unterschiedlichen Aktualisierungsintervallen konfigurieren. <br />
<br />
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.<br />
<br />
Die Attribute WriteDB-Config, WriteFlags-Config, WriteInputs-Config, WriteOutputs-Config verwenden folgendes Format:<br />
<br />
<DB> <STARTPOSITION> <LENGTH> [<DB> <STARTPOSITION> <LENGTH>]<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<STARTPOSITION>||Startadresse [Byte]<br />
|-<br />
|<LENGTH>||Länge in Bytes<br />
|}<br />
<br />
Hinweis: Bei jeder Schreiboperation wird IMMER der komplette Speicherblock vom FHEM zur SPS geschrieben.<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <byteaddress>.<bitaddress><br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<byteadresse>.<bitadress>||Adresse des zu lesenden Bits<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Lampe S7_DRead db 0 95.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des digitalen Datenpunktes<br />
|-<br />
|inputs|outputs|flags|db||wählt den Bausteintyp auf der SPS aus<br />
|-<br />
|<DB>||Nummer des Datenbausteins<br />
|-<br />
|<start>||Adresse des ersten Bytes<br />
|-<br />
|u8|s8|u16|s16|u32|s32|float||Datentyp des Datenpunkts:<br />
u8 = unsigned char , 1 Byte , 0 to 255<br />
<br />
s8 = signed char , 1 Byte , -128 to 127<br />
<br />
u16 = unsigned int , 2 Byte , 0 to 65,535<br />
<br />
s16 = signed int , 2 Byte , -32,768 to 32,767<br />
<br />
u32 = unsigned long , 4 Byte , 0 to 4,294,967,295<br />
<br />
s32 = signed long , 4 Byte , -2,147,483,648 to 2,147,483,647<br />
<br />
float = float , 4 Byte , 1.2E-38 to 3.4E+38<br />
|}<br />
<br />
'''Konfigurationsbeispiel'''<br />
define Innentemperatur S7_ARead db 0 44 float<br />
<br />
'''Attribute'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! Beschreibung<br />
|-<br />
|multiplicator||Dient zur Berechnung des angezeigten Wertes:<br />
<br />
<Angezeigter Wert> = <Wert von SPS> * multiplicator + offset<br />
|-<br />
|offset||Dient zur Berechnung des angezeigten Wertes.<br />
|-<br />
|precision||Legt fest mit wie vielen Nachkommastellen der Datenpunkt angezeigt werden soll<br />
|-<br />
|unit||Einheit des Datenpunktes<br />
|}<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
S7_DWrite<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
Code: [Auswählen]<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <address><br />
<br />
inputs|outputs|flags|db … defines where to write.<br />
DB … Number of the DB<br />
address … Speicheradresse die geschrieben werden soll. Beispiel: 945.8<br />
<br />
Note: the required memory area need to be within the configured PLC writing of the physical modul.<br />
<br />
Zum Setzen/löschen eines Bits kann man wie folgt vorgehen:<br />
Code: [Auswählen]<br />
set <name> S7_AWrite {ON|OFF|TRIGGER}<br />
<br />
Anmerkung: Mit dem TRIGGER wird das Bit 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
S7_AWrite<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
Code: [Auswählen]<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
inputs|outputs|flags|db … defines where to write. <br />
DB … Number of the DB<br />
start … start byte of the writing<br />
{u8|s8|u16|s16|u32|s32} … defines the datatype: <br />
u8 …. unsigned 8 Bit integer<br />
s8 …. signed 8 Bit integer<br />
u16 …. unsigned 16 Bit integer<br />
s16 …. signed 16 Bit integer<br />
u32 …. unsigned 32 Bit integer<br />
s32 …. signed 32 Bit integer<br />
float …. float (4 Bytes)<br />
<br />
Zum Setzen eines Analog Wertes kann man wie folgt vorgehen:<br />
Code: [Auswählen]<br />
set <name> S7_AWrite <value><br />
<br />
value … an numeric value<br />
Beispiel:<br />
Code: [Auswählen]<br />
set temperatursollwert 334<br />
<br />
<br />
== Defines Siemens LOGO! ==<br />
== Configurationsbeispiele ==<br />
<br />
== Versionshistory ==<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9458S72015-01-20T12:47:27Z<p>Charlie71: </p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=d<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
== under Construction ==<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
== Installationsanleitung ==<br />
Alle vorher aufgelisteten Files in FHEM Unterverzeichnis kopieren.<br />
<br />
== Funktionsprinzip ==<br />
(nur wichtig fürs Basisverständnis)<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
Es lassen sich Lesespeicherblöcke (Readings) und Schreibspeicherblöcke (Writings) konfigurieren.<br />
<br />
'''Lesespeicherblock (SPS --> FHEM):''' <br />
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.<br />
<br />
'''Schreibspeicherblock (FHEM --> SPS):''' <br />
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.<br />
<br />
Aus diesem Konzept ergeben sich folgende Rahmenbedingungen:<br />
Ein Speicherbyte in der SPS kann entweder einem Reading oder einem Writing zugeordnet werden.<br />
Auf jeden Fall soll vermieden werden, dass ein Byte sowohl Reading gelesen als auch Writing überschrieben wird.<br />
<br />
== Vorbereitung auf der SPS ==<br />
<br />
== Defines (Config) ==<br />
Eine Konfigurationsanleitung für die Siemens Logo findest du weiter unten.<br />
<br />
=== Define für das Modul S7 ===<br />
Als ersten Schritt muss eine Verbindung mit der SPS eingerichtet werden. Dazu verwendet man das '''S7''' Modul.<br />
define <name> S7 <ip_address> <rack> <slot> [<Intervall>]<br />
<br />
<br />
'''Parameter:'''<br />
{| class="wikitable sortable"<br />
|-<br />
! Parameter !! class="unsortable" | Beschreibung <br />
|-<br />
|<name>||FHEM Name des Devices<br />
|-<br />
|<ip_address>||IP Adresse der SPS<br />
|-<br />
|<rack>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<slot>||hängt von den Einstellungen der SPS ab<br />
|-<br />
|<Intervall>||Intervall in s, in dem geprüft wird ob ein Speicherblock von der SPS gelesen werden soll (Default 1s)<br />
|}<br />
<br />
Aus dem rack und dem slot Parameter wird berechnet das Modul die Remote TSAP:<br />
$RemoteTSAP = 0x0100+( $rack * 0x20) + $slot;<br />
Die LocalTSAP ist fix mit 0x0100 vorgegeben.<br />
<br />
'''Konfigurationsbeispiel'''<br />
define mySPS S7 10.0.0.241 0 0<br />
<br />
'''Attribute'''<br />
<br />
<br />
<br />
2) im zweiten Schritt können dann die Speicherblöcke definiert werden die von der SPS gelesen werden sollen.<br />
Hierzu sind die folgen Attribute zu setzten (natürlich nur die die man auch benötigt):<br />
<br />
ReadDB-Config … used for reading out of DB<br />
ReadFlags-Config … used for reading of flag (Merker)<br />
ReadInputs-Config … used to read the inputs<br />
ReadOutputs-Config … used to read the outputs<br />
<br />
Code: [Auswählen]<br />
set <name> ReadDB-Config <DB> <STARTPOSITION> <LENGTH> <INTERVAL> [<DB> <STARTPOSITION> <LENGTH> <INTERVAL>]<br />
<br />
DB … Number of the DB<br />
STARTPOSITION … start byte of the reading<br />
LENGTH … number of bytes to be read<br />
INTERVAL ... wie oft der Speicherblock von der SPS geholt werden soll (in s)<br />
<br />
Anmerkung: Die Speicherblöcke werden alle INTERVAL s von der SPS gelesen und in den interen Buffer geschrieben. <br />
<br />
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.<br />
<br />
<br />
3) im dritten Schritt kann dann ein Schreibspeicherblock über das Attribut WriteDB-Config definiert werden (FHEM → SPS).<br />
<br />
Code: [Auswählen]<br />
set <name> WriteDB-Config <DB> <STARTPOSITION> <LENGTH> [<DB> <STARTPOSITION> <LENGTH>]<br />
DB … Number of the DB<br />
STARTPOSITION … start byte of the writing<br />
LENGH … number of bytes to be write<br />
<br />
Das Modul erzeugt intern einen Speicherblock in diesem speicher werden alle Writeoperationen durchgeführt. Anschliessend wird immer der gesamte Speicherblock zur SPS geschoben.<br />
<br />
nun ist das physikalische Modul fertig. Un nun kann man die logischen Module einrichten:<br />
<br />
=== Digitale readonly Datenpunkte ===<br />
S7_DRead<br />
Mit diesem Modul kann man ein Bit aus der S7 auslesen.<br />
<br />
Code: [Auswählen]<br />
define <name> S7_DRead {inputs|outputs|flags|db} <DB> <address><br />
<br />
inputs|outputs|flags|db … defines where to read.<br />
DB … Number of the DB<br />
address … Speicheradresse die gelesen werden soll. Beispiel: 942.3<br />
<br />
=== Analoge readonly Datenpunkte ===<br />
S7_ARead<br />
Mit diesem Mudul kann man integer/float Werte von der SPS lesen:<br />
Code: [Auswählen]<br />
define <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
<br />
inputs|outputs|flags|db … defines where to read.<br />
DB … Number of the DB<br />
start … start byte of the reading<br />
{u8|s8|u16|s16|u32|s32} … defines the datatype: <br />
u8 …. unsigned 8 Bit integer<br />
s8 …. signed 8 Bit integer<br />
u16 …. unsigned 16 Bit integer<br />
s16 …. signed 16 Bit integer<br />
u32 …. unsigned 32 Bit integer<br />
s32 …. signed 32 Bit integer<br />
float …. float (4Byte)<br />
<br />
=== Digitale Datenpunkte zum Schreiben===<br />
S7_DWrite<br />
Mit diesem logischen Modul kann man ein bit in einem DB setzen.<br />
<br />
Code: [Auswählen]<br />
define <name> S7_DWrite {inputs|outputs|flags|db} <DB> <address><br />
<br />
inputs|outputs|flags|db … defines where to write.<br />
DB … Number of the DB<br />
address … Speicheradresse die geschrieben werden soll. Beispiel: 945.8<br />
<br />
Note: the required memory area need to be within the configured PLC writing of the physical modul.<br />
<br />
Zum Setzen/löschen eines Bits kann man wie folgt vorgehen:<br />
Code: [Auswählen]<br />
set <name> S7_AWrite {ON|OFF|TRIGGER}<br />
<br />
Anmerkung: Mit dem TRIGGER wird das Bit 1s auf ON (HIGH) gesetzt und dann wieder auf OFF (LOW).<br />
<br />
=== Analoge Datenpunkte zum Schreiben===<br />
S7_AWrite<br />
Mit diesem Modul kann man integer Werte zur SPS übertragen.<br />
Anmerkung: aktuell müssen es unsigned Integer im bereich von 0 – 32767 sein.<br />
<br />
Code: [Auswählen]<br />
define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float}<br />
<br />
inputs|outputs|flags|db … defines where to write. <br />
DB … Number of the DB<br />
start … start byte of the writing<br />
{u8|s8|u16|s16|u32|s32} … defines the datatype: <br />
u8 …. unsigned 8 Bit integer<br />
s8 …. signed 8 Bit integer<br />
u16 …. unsigned 16 Bit integer<br />
s16 …. signed 16 Bit integer<br />
u32 …. unsigned 32 Bit integer<br />
s32 …. signed 32 Bit integer<br />
float …. float (4 Bytes)<br />
<br />
Zum Setzen eines Analog Wertes kann man wie folgt vorgehen:<br />
Code: [Auswählen]<br />
set <name> S7_AWrite <value><br />
<br />
value … an numeric value<br />
Beispiel:<br />
Code: [Auswählen]<br />
set temperatursollwert 334<br />
<br />
<br />
== Defines Siemens LOGO! ==<br />
== Configurationsbeispiele ==<br />
<br />
== Versionshistory ==<br />
V1.15<br />
* PDU size of the connection instead of the initial PDU Size (Parameter) is used for length checks<br />
New Feature<br />
* New Parameter for Analog Reads and Analog Writes: unit: This can be used to show a unit after the analog value<br />
* New Parameter for Analog Reads and Analog Writes: precision: defines how many X places after the comma the value should be shown<br />
* fix für simple config LOGO8 <br />
* cleanup logging info<br />
<br />
V1.14<br />
* Fehler in recreation behoben. (IMPORTANT FIX!!!!)<br />
* PLC reconnection function improved<br />
* Minor Fix for Logo addressing<br />
* Installation files updated (X86 files included, ARM libs updated, autosplit inkludiert) --> ARM Nodave.so tauschen<br />
<br />
V1.13<br />
* Fix für multiple Writings<br />
* Für Logo7 und Logo8 können nun sehr einfach Ein und Ausgänge konfiguriert werden<br />
(Dies ist ein Zusatzfeature: die alte Config Syntax wird weiterhin unterstützt)<br />
<br />
define Q1_Logo2 S7_DRead Q1<br />
define Q2_Logo2 S7_DWrite Q2<br />
<br />
alle internen Settings werden automatisch generiert. Diese können bei Bedarf selbstverständlich angepasst werden.<br />
<br />
V1.12<br />
* Interner Umbau: Kapselung aller lese und Schreiboperationen in eigene Funktionen<br />
* Fix für die Adressierung im Byte.Bit Format. Bit beginnt jetzt mit 0 und nicht mit 1 --> Config prüfen!!!!<br />
<br />
New Features:<br />
* Logo7 und Logo8 können nun sehr nur durch Angabe der IP Adresse angelegt werden. Beispiel:<br />
<br />
define logo2 S7 LOGO7 10.0.0.242<br />
define logo3 S7 LOGO8 10.0.0.243<br />
alle internen Settings werden dann automatisch generiert.<br />
V1.11<br />
* libnodave timeout is set now to 500ms<br />
* the bocklength is now checked against the maxPDUlength<br />
<br />
V1.10<br />
* now also float data can be read and written<br />
* I have changed the addressing of the bit readings:<br />
Old: you have to calculate the pit position manually. example for 602.2 reading bit position = 4817.<br />
NEW you can address it directly. Example<br />
Code: [Auswählen]<br />
define Logo7_Q1 S7_DRead db 0 942.1<br />
<br />
Note: The module detects if you are using the old syntax. Therfore no config changes are required.<br />
<br />
V1.9 <br />
* now support multiple writing config<br />
<br />
V1.8<br />
* changed bufferhandling (this should fix the timeout error)<br />
* now supports u8, u32, s8, s16, s32 writing<br />
<br />
V1.7<br />
* Support for more then one PLC activated<br />
<br />
V1.6 <br />
* New Feature "connections to one than one PLC" deactivated <br />
<br />
V1.5<br />
New Feature<br />
* Now connection to more than one S7 is supported (IODev) (many thanks to thmarx)<br />
<br />
Fixes<br />
* fix for recoonection includes (many thanks to thmarx)<br />
* doku more FHEM conform (many thanks to Cnetrwal)<br />
* some minor fixes<br />
<br />
V1.4 Fix für multiple reading<br />
<br />
V1.3 Fix für multiple reading<br />
<br />
V1.2<br />
* Fixes von "Cnetrwal" merged (many thanks) <br />
* Automatisches Reconnect wenn ein reading fehlschlägt<br />
<br />
V1.1<br />
* support multiple reading (the basic idea is to split slow data for data logging from fast data for swithing info)<br />
* supports reading fram addresses > 1024 (requirement for 0BA8)<br />
* Take care Configuration Change is needed if upgrading from V1.0:<br />
a) you have to add a reading interval in the modul S7 modul definition after the portNo example:<br />
oldConfig: S7 2 0 10.0.0.241 0 0 102 960<br />
newConfig: S7 2 0 10.0.0.241 0 0 102 2 960<br />
2 ... means that every 2 seconds the requirement for a PLC reading is checked<br />
b) you have to add at reading attribute of the S7 modul the reading intervall:<br />
oldConfig: attr logo ReadDB-Config 0 0 8 <br />
newConfig: attr logo ReadDB-Config 0 0 8 300 <br />
300 ... means that all 5min the modul reads the data from the PLC<br />
<br />
(modul S7 interval in define as well as reading attribute for S7 modul)<br />
<br />
V1.0 Erstversion</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9455S72015-01-20T11:59:49Z<p>Charlie71: </p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=d<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
== under Construction ==<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des Lesespeicherblöcke von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)<br />
<br />
== Funktionsbeschreibung ==<br />
Hier wird die grundsätzliche Funktionsweise des Moduls erklärt:<br />
Es lassen sich Lesespeicherblöcke (Readings) und Schreibspeicherblöcke (Writings) konfigurieren.<br />
<br />
'''Lesespeicherblock (SPS --> FHEM):''' <br />
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.<br />
<br />
'''Schreibspeicherblock (FHEM --> SPS):''' <br />
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.<br />
<br />
Aus diesem Konzept ergeben sich folgende Rahmenbedingungen:<br />
Ein Speicherbyte in der SPS kann entweder einem Reading oder einem Writing zugeordnet werden.<br />
Auf jeden Fall soll vermieden werden, dass ein Byte sowohl Reading gelesen als auch Writing überschrieben wird.</div>Charlie71http://wiki.fhem.de/w/index.php?title=S7&diff=9454S72015-01-20T10:48:30Z<p>Charlie71: S7 Modul für Simatic und Logo</p>
<hr />
<div><br />
{{Infobox Modul<br />
|ModPurpose=Dieses Modul dient zur Integration von Simatic/S7/Logo! Steuerungen in die FHEM<br />
|ModType=d<br />
|ModCmdRef=S7<br />
|ModForumArea=Sonstige Systeme<br />
|ModTechName=44_S7.pm<br />
|ModOwner=Charlie71 ([http://forum.fhem.de/index.php?action=profile;u=8887 Forum] / [[Benutzer Diskussion:Charlie71|Wiki]])}}<br />
<br />
== under Construction ==<br />
<br />
Die Simatic Steuerungsfamilie incl Logo! von Siemens ist eine Speicherprogrammierbare Steuerung.<br />
Dieses Modul unterstützt folgende Siemens Steuerungen sofern sie eine Ethernet Schnittstelle verfügen.<br />
<br />
* S7 300/400/WinAC CPU<br />
* S7 1200/1500 CPU<br />
* S7 200/LOGO 0BA7<br />
<br />
<br />
== Unterstützte Plattformen ==<br />
Ab der Version V2.0 werden nun alle Plattformen auf denen FHEM läuft unterstützt.<br />
<br />
Auf folgenden Plattformen wurde das Modul bereits erfolgreich getestet:<br />
<br />
'''Plattfromtestergebnisse:'''<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Plattform !! class="unsortable" | Teststatus !! class="unsortable" | Bemerkung<br />
|-<br />
|ARMv6||passed||raspberry pi<br />
|-<br />
|AMD64||passed||Mintlinux<br />
|-<br />
|MIPS||passed||Fritzbox 7390<br />
|}<br />
<br />
== FHEM Modul ==<br />
Das FHEM Modul besteht aus folgenden Dateien:<br />
* 44_S7.pm ... das zentrale Modul stellt die Kommunikation zur SPS her und koordiniert das regelmäßige Abholen des aktuellen Zustandsbilds von der SPS.<br />
* 44_S7_ARead.pm ... hiermit lässt sich ein readonly analoger Datenpunkt erstellen <br />
* 44_S7_AWrite.pm ... hiermit lässt sich ein analoger Datenpunkt zum Schreiben an die SPS erstellen <br />
* 44_S7_DRead.pm ... hiermit lässt sich ein digitaler/binary readonly Datenpunkt erstellen <br />
* 44_S7_DWrite.pm ... hiermit lässt sich ein digitaler/binary Datenpunkt zum Schreiben erstellen <br />
* 44_S7_Client.pm ... dieses Modul beinhaltet die S7 Protokoll (Es basiert auf Snap7 - Settimino)</div>Charlie71