# Datenbaustein einer S7 315-2 PN/DP CPU mit Snap7 & Python auslesen



## Kevin214 (4 April 2019)

Grüßt euch,

Ich möchte einen Datenbaustein in einer S7 315-2 PN/DP mit dem RaspberryPi auslesen und verschiedene Werte auf einem Bildschirm anzeigen lassen. Dafür benutze ich Snap7 und Python. 
Leider werde ich aus den zahlreichen Informationen in Google und Videos aus Youtube nicht schlauer. 
Ich muss auch dazu sagen dass ich noch jungfräulich bin was das Thema snap7 und Python angeht...

Nun zu meiner Frage:

Wie kann ich Integer und Doppelinteger in Python so umwandeln, dass mir die Werte die im Datenbaustein stehen, angezeigt werden?


Schonmal Danke im Voraus


----------



## Thomas_v2.1 (4 April 2019)

Du kannst dir ja mal auf der github-Projektseite die Dateien im Ordner tests ansehen, da gibt es mehrere Möglichkeiten.

Eine ganz einfach Variante ohne weitere Fehlerbehandlung wäre:

```
import snap7
from snap7 import util

plc = snap7.client.Client()
plc.connect("192.168.1.40", 0, 2)
data = plc.db_read(db_number=1, start=0, size=10)
print("DBD0  als Real = ", util.get_real(data, 0))
print("DBD4  als DInt = ", util.get_dword(data, 4))
print("DBW8  als Int  = ", util.get_int(data, 8))
plc.disconnect()
plc.destroy()
```

Es werden von der SPS aus DB1, beginnend bei Adresse 0, 10 Bytes ausgelesen. Die Daten landen in der Variable "data" welches ein Bytearray ist.
Über die Funktionen aus snap7.util wie get_real lassen sich ab einem bestimmten Offset in diesem Bytearray Daten als Real, DWord (Dint) oder Int interpretieren.
In dem Beispiel ist an DB1.DBD0 eine Variable vom Typ Real, an DB1.DBD4 eine vom Typ DInt und an DB1.DBW8 eine vom Typ Int.


----------



## Kevin214 (5 April 2019)

Hay, 

Vielen Dank fuer deine schnelle Hilfe. Funktioniert perfekt 

Haettest du villeicht eine Idee wie ich die Werte in eine GUI bekomme?
Und was meinst du mit "ohne weitere Fehlerbehandlung"? Was waere denn ein moeglicher Fehler?


----------



## Sarah1982 (16 April 2019)

Hallo,

ich habe mich seit kurzen mit Siemens S7 SPS und Python beschäftig.
Durch die obere Erklärung konnte ich schon einiges Umsetzen.

Ich Bräuchte nun etwas Hilfe wie ich mit Python und die Impulse zähle und als länge ausgeben kann.

Hat jemand evtl. ein Beispiel Code dafür?


----------



## Thomas_v2.1 (16 April 2019)

Wie möchtest du denn etwas zählen und als Länge ausgeben? Kannst du Geldstücke im Portemonnaie zählen und die Anzahl in Meter ausgeben?

Impulse zu erfassen kann problematisch sein, weil zu kurze Impulse (kürzer als dein Abfrageintervall) evtl. nicht oder nur sehr ungenau erfasst werden können. Besser ist es so etwas in der SPS zu erfassen und vorzuverarbeiten, z.B. in Form eines Zählwertes als Ganzzahl, oder einer Zeitdauer in Millisekunden oder Sekunden.


----------



## Sarah1982 (16 April 2019)

also ich hab es über einen Zähler in der SPS hinbekommen. den Wert lese ich aus und setze ihn als 0 Punkt... dann nehme ich in bestimmten intervallen wieder den Wert und rechne die Differenz aus geteilt durch die Impulse die ich für eine bestimmte Länge brauch. so habe ich dann die Länge....

Problem ist nur das der Zähler in der SPS irgenwann wieder bei 0 beginnt weis noch nicht bei welchen wert und dann stimmt halt die aktuelle länge nicht mehr.

wie kann könnte ich das überbrücken


----------



## Thomas_v2.1 (16 April 2019)

Dann musst du den Überlaufwert irgendwie in Erfahrung bringen, ohne diese Information geht es nicht, bzw. bekommst du es nicht genau.
Meistens ist der Überlaufwert eine Zweierpotenz, z.B. 2 hoch 14 oder 2 hoch 15, das sollte sich aus deinen Aufzeichnungen ergeben wann das zumindest sein könnte.


----------



## volker (18 April 2019)

warum setzt du den startzähler nicht einfach wieder auf 0 wenn du die differenz ermittelt hast?
dann wirst du nicht in den überlauf kommen


----------



## Sarah1982 (18 April 2019)

Also den Zähler der SPS kann ich nicht auf 0 setzen da ich diese in einem Gerät Verbaut ist auf den ich keinen Einfluss habe. Nutze nur aus dieser Werte für ein anderes Projekt.

Das mit dem Überlauf werde ich versuchen raus zu bekommen, wird nur schwierig da erst nach ca. einem Tag dieser erreicht ist. Er müsste irgendwo bei 1.000.000.000 sein

Wie ich die Sachen dann an also Programmiertechnisch 

wie gesagt ich nutze Python und bin noch Quereinsteiger


----------



## StephanKuhlmann (8 Mai 2019)

Hallo Thomas, erst mal Danke für dein Beispiel. Ich beschäftige mich ebenfalls mit Snap7 und Python, allerdings mit dem Schreiben von Daten in einen DB. Wie bereite ich die Daten auf, so das sie in einem Rutsch in den DB geschrieben werden können.
Hast du da auch ein so kompaktes Beispiel parat? Schon mal Danke im Voraus.


----------



## Thomas_v2.1 (8 Mai 2019)

In Anlehnung an mein Beispiel oben könnten die Werte so geschrieben werden:

```
wdata = bytearray(10)

util.set_real(wdata, 0, 9.876)
util.set_dword(wdata, 4, 87654321)
util.set_int(wdata, 8, 4321)

plc.db_write(db_number=11, start=0, data=wdata)
```
wdata wird als Bytearray mit 10 Bytes angelegt.
Mit den set_xxx Funktionen wird in dieses Array ab dem angegebenen Startoffset ein Wert bestimmten Datentype passend im Siemens Format eingetragen.
Mit db_write wird dieses gesamte Array von 10 Bytes ab dem angegebenen Offset 0 in den Datenbaustein (hier: DB11.DBB0) geschrieben.

Es gibt bei Snap7 noch weitere Möglichkeiten.


----------



## E.S (3 Januar 2022)

Hallo, 

ich möchte mich hier einhängen.

Habe python snap7 nun auf meinem raspberry4 installiert, nur scheint er die Lib nicht zu finden.
Muss ich da die Bibliotheken noch irgendwie extra installieren?
Bitte, siehe screenshots.

danke, mfg E.S


----------



## Thomas_v2.1 (3 Januar 2022)

Du hast mit pip das Modul für Python 2.7 installiert, dein Programm ruft aber explizit die Python 3.7 auf.
Du musst dich für eine Python Version entscheiden. Wenn nichts zwingend dagegen spricht wie irgendwelche Legacy Module die nicht mehr aktualisiert werden, würde ich die 3er Version verwenden.


----------



## E.S (6 Januar 2022)

Thomas_v2.1 schrieb:


> Du hast mit pip das Modul für Python 2.7 installiert, dein Programm ruft aber explizit die Python 3.7 auf.
> Du musst dich für eine Python Version entscheiden. Wenn nichts zwingend dagegen spricht wie irgendwelche Legacy Module die nicht mehr aktualisiert werden, würde ich die 3er Version verwenden.


danke, 

mein script wir nun in python 3 ausgeführt.
die snap7 bibliotkek findet er aber immer noch nicht.
wo sucht python diese bibliothek, oder muss ich diese bibliotek in den ordner kopieren wo auch das script gespeichertr ist?

Danke, E.S


----------



## Ralle (6 Januar 2022)

Hast du mal ldconfig aufgerufen?


----------



## E.S (6 Januar 2022)

Ralle schrieb:


> Hast du mal ldconfig aufgerufen?


ja hab ich, 

unter meinem "standartuser" darf ich nicht, unter root tut er was ändert aber nix beim ausführen des scripts.
hab ich etwa ein berechtigungsproblem?


----------

