Zum Hauptinhalt springen

Kommunikation · S7-Zugriff

Snap7 und die S7-1500: Warum der Zugriff scheitert

Optimierter Bausteinzugriff, PUT/GET-Freigabe, Zugriffsstufe: Drei Hürden trennen ein Python-Skript von den Daten der S7-1500 — und das Abwählen kostet.

Stand:

Die Aufgabe klingt einfach: Ein Python-Skript soll ein paar Werte aus einer S7-1500 lesen — Stückzahlen, Temperaturen, Zustände. Ein Nachmittag Arbeit.

In der Praxis stehen drei Hürden im Weg, und keine davon liegt im Skript. Sie liegen in der Steuerung, sie haben mit Sicherheit und mit Speicherarchitektur zu tun, und mindestens eine davon hat einen Preis, den kaum jemand nennt, bevor sie genommen wird.

BetrifftS7-1500S7-1200Snap7 · python-snap7PUT/GETOptimierter Bausteinzugriff

Dieser Artikel erklärt, warum der Zugriff scheitert, was das Umgehen kostet und wann der andere Weg der bessere ist — mit dem Programmcode auf beiden Seiten. Wenn ohnehin Altsteuerungen im Bestand stehen, lohnt es, diese Frage gleich mitzuentscheiden.

ÜberblickDrei Türen zwischen Skript und Datenbaustein.Keine davon lässt sich im Skript öffnen. Alle drei sitzen in der Steuerung.
PYTHON-SKRIPTSnap7 · S7-KommunikationHÜRDE 1Adressierung1Optimierte Bausteine habenkeine feste AdresseHÜRDE 2Freigaben2PUT/GET-Häkchen UNDZugriffsstufe der CPUHÜRDE 3Konsistenz3Werte aus zwei Zyklenin einem LesevorgangSIMATIC S7-1500DB · optimiertnicht erreichbarDB · nicht optimiertabsolut adressierbar
  • Hürde in der Steuerung
  • Absolut adressierbar
  • Für die klassische Kommunikation unsichtbar

Eigene Darstellung nach Siemens-Systemhandbuch „S7-1500 Kommunikation“ und STEP-7-Onlinehilfe.

Hürde 1: Der Baustein hat keine Adresse

Werkzeuge wie Snap7 sprechen die klassische S7-Kommunikation. Die adressiert absolut — Datenbaustein, Byte-Offset, Länge. Und genau das geht bei einem optimierten Datenbaustein nicht.

Siemens formuliert es unmissverständlich: Bei Verwendung der Anweisungen für diese Kommunikationsart dürfen nur Datenbausteine mit absoluter Adressierung eingesetzt werden; symbolische Adressierung ist nicht möglich.

Was das Abwählen kostet

Die häufigste Antwort in Foren lautet: Häkchen raus. Das funktioniert — hat aber Folgen, die selten dabeistehen.

Der Preis des Häkchens

Was sich am Baustein ändert.

Abgewählt

Nicht optimierter Baustein

Feste Byte-Offsets wie bei der S7-300.

  • Absolut adressierbar — die Voraussetzung für jeden klassischen Zugriff
  • Auf 64 kB begrenzt statt auf ein Vielfaches davon
  • Laden ohne Reinitialisierung entfällt: Jede Änderung setzt im Betrieb die Aktualwerte zurück
  • Langsamer, weil jeder Zugriff in die Ablage der Vorgängergeneration umgerechnet wird

Von außen lesbar

Voreinstellung

Optimierter Baustein

Die Steuerung ordnet die Variablen selbst an.

  • Kein garantiertes Speicherlayout, also keine absolute Adresse
  • Deutlich größer, schneller im Zugriff aus dem Anwenderprogramm
  • Laden ohne Reinitialisierung bleibt möglich
  • Für die klassische S7-Kommunikation unsichtbar

Nur symbolisch erreichbar

Die Entscheidung gehört deshalb an den Baustein, nicht an das Skript: Ein kleiner, eigens angelegter Schnittstellen-Baustein ohne Optimierung ist fast immer besser, als die Optimierung an einem gewachsenen Datenbaustein abzuwählen.

Der teure Punkt ist das mittlere: Laden ohne Reinitialisierung. Bei einem Rezept- oder Parameterbaustein im laufenden Betrieb ist sein Wegfall keine Kleinigkeit, sondern ein Grund, jede künftige Änderung auf den nächsten Stillstand zu verschieben.

Hürde 2: Zwei Freigaben, nicht eine

Zwei getrennte Schalter

Beide stehen ab Werk auf zu — an verschiedenen Stellen.

Schalter 1

Zugriff über PUT/GET erlauben

Steht bei den Verbindungsmechanismen der CPU und ist ab Werk deaktiviert. Die Begründung dafür ist die eigentliche Information: In diesem Modus ist lesender und schreibender Zugriff möglich, ohne dass in der CPU eine Verbindung projektiert sein muss.

Wer das Häkchen setzt, öffnet also nicht einen Kanal für sein Skript, sondern einen für jeden, der die Adresse kennt.

Verbindungsmechanismen

Schalter 2

Zugriffsstufe der CPU

Weniger bekannt und ab Werk auf komplettem Schutz. In dieser Stufe ist die Serverfunktion für diese Kommunikation deaktiviert — und nicht änderbar.

Schutz

Folge

Beide Einstellungen müssen zusammenpassen

Sie liegen in verschiedenen Zweigen der Geräteeigenschaften und werden oft von verschiedenen Personen gesetzt. Das ist der Grund, warum ein Zugriff „ohne Fehlermeldung einfach nichts liefert“: Die Verbindung kommt zustande, die Antwort bleibt leer.

Wer nur das eine Häkchen setzt und nichts bekommt, sucht den Fehler meist im Skript.

Zwei weitere Punkte gehören in dieselbe Betrachtung:

Sichere Kommunikation schaltet die Altwelt ab. Seit Firmware V2.9 lässt sich einstellen, dass die Kommunikation mit Programmiergerät und HMI ausschließlich gesichert läuft. Wer das im Rahmen eines Sicherheitsaudits umstellt, legt damit sämtliche klassischen Clients still — Snap7 und Verwandte eingeschlossen. Der Zusammenhang wird selten hergestellt, weil die Umstellung an anderer Stelle beschlossen wird als die Datenanbindung.

Der alte Port bleibt offen. Während Webserver, OPC UA und andere Dienste ab Werk deaktiviert sind, ist der Port der klassischen S7-Kommunikation voreingestellt aktiv und lässt sich nicht abschalten. Die Angriffsfläche der Steuerung ist also asymmetrisch: Alles Moderne ist zu, ausgerechnet der alte Kanal ist offen. Für eine Bestandsaufnahme im Produktionsnetz ist das ein Punkt, der auf jede Liste gehört.

Hürde 3: Was still schiefgeht

Zwei Eigenschaften, die keine Fehlermeldung erzeugen und trotzdem Projekte kosten.

Die Daten sind nicht zykluskonsistent. Siemens hält fest, dass die ausgetauschten Daten während der Laufzeit des Anwenderprogramms aktualisiert werden und es keinen Zeitpunkt gibt, an dem sie konsistent sind. Praktisch: Ein Lesezugriff kann eine halb aktualisierte Struktur erwischen — Stückzahl aus dem neuen Zyklus, Zeitstempel aus dem alten. Das ist die Ursache der Fehlerklasse „das Skript liest manchmal Mist“, die dann meist dem Netzwerk angelastet wird.

Jede Verbindung belegt eine Ressource. Eine S7-1500 hält eine feste, kleine Zahl von Verbindungsressourcen für Programmiergerät und HMI vor. Bibliotheken melden sich voreingestellt als Programmiergerät an — bei python-snap7 steht das so im Quelltext. Mehrere parallel laufende Skripte belegen damit nacheinander genau die Ressourcen, die man braucht, wenn etwas kaputt ist. Am Ende kommt das TIA Portal nicht mehr online, und niemand bringt das mit dem Auswerteskript in Verbindung, das seit Wochen läuft.

Ein tragfähiger Zugriff in vier Schritten

Wenn nach alledem die klassische Kommunikation der richtige Weg bleibt — weil ein Bestandssystem sie verlangt oder Altsteuerungen im Spiel sind — dann so:

Anleitung

Vom Wunsch zum belastbaren Zugriff.

Der Aufwand liegt in der Steuerung, nicht im Skript. Wer die Reihenfolge umdreht, sucht Fehler an der falschen Stelle.

  1. Einen eigenen Schnittstellen-Baustein anlegen

    TIA Portal

    Nicht die Optimierung am gewachsenen Datenbaustein abwählen, sondern einen kleinen, neuen Baustein ohne Optimierung anlegen, der nur die Werte enthält, die nach außen gehen. Der Rest des Programms bleibt unangetastet — und die 64-kB-Grenze ist bei einer Handvoll Werte kein Thema.

    Die Zykluskonsistenz, die das Protokoll nicht zusichert, stellt das Anwenderprogramm selbst her: Ein Zähler wird vor und nach dem Kopieren erhöht. Ungerade heißt „wird gerade beschrieben“.

    Zusammengehörige Werte in einem Zug kopieren und als gültig kennzeichnen.
    FC_Schnittstelle · Netzwerk 1SCL
    // Schnittstellen-DB "IF_Auswertung" — bewusst OHNE optimierten Bausteinzugriff.
    // Er enthält nur die Werte, die nach außen gehen. Der gewachsene Rezept-DB
    // bleibt optimiert und unangetastet.
    //
    // Reihenfolge ist hier keine Kosmetik: Der Zähler klammert das Kopieren ein.
    
    "IF_Auswertung".Zaehler := "IF_Auswertung".Zaehler + 1;   // ungerade: in Arbeit
    
    "IF_Auswertung".Stueckzahl := #stueckzahl;
    "IF_Auswertung".Temperatur := #temperatur;
    "IF_Auswertung".Zustand    := #zustand;
    
    "IF_Auswertung".Zaehler := "IF_Auswertung".Zaehler + 1;   // gerade: gültig

    Der Zähler ist zugleich das Lebenszeichen: Steht er, steht die Steuerung — und das übergeordnete System merkt einen CPU-Stopp, statt eingefrorene Werte weiterzuverarbeiten.

  2. Die Freigabe so eng wie möglich halten

    CPU-Eigenschaften

    Beide Schalter aus Hürde 2 sind nötig, aber sie sind nicht die einzige Stellschraube. Was zusätzlich geht und selten gemacht wird:

    • Die Steuerung in ein eigenes Netzsegment legen, statt die Freigabe im ganzen Werksnetz wirken zu lassen.
    • Den Lesezugriff auf genau den einen Schnittstellen-Baustein beschränken, indem sonst nichts absolut adressierbar ist.
    • Die Freigabe dokumentieren — mit Datum, Grund und dem Namen des Systems, das sie braucht. Sonst steht sie in fünf Jahren noch da, und niemand weiß, wofür.
  3. Den Lesevorgang absichern

    Python

    Ein Lesevorgang ohne Konsistenzprüfung liefert irgendwann falsche Werte, ohne das zu melden. Die Prüfung kostet einen zweiten, sehr kurzen Lesezugriff.

    Den Zähler vor und nach den Daten lesen — und angerissene Sätze verwerfen.
    lese_satz.pyPython
    """Werte aus einem Schnittstellen-DB der S7-1500 lesen — mit Konsistenzprüfung.
    
    Seit Version 3.0 ist python-snap7 reines Python: Es gibt keine Snap7-Bibliothek
    mehr, die irgendwo liegen müsste. Jede Anleitung, die das Kopieren einer
    Binärdatei in den Suchpfad beschreibt, ist überholt.
    """
    
    import struct
    
    import snap7
    
    DB_NUMMER = 100
    SATZ = ">hifh"                  # Zaehler(INT) Stueckzahl(DINT) Temperatur(REAL) Zustand(INT)
    LAENGE = struct.calcsize(SATZ)  # 12 Byte; nicht optimierte DBs liegen big-endian
    
    
    def lese_satz(client: snap7.Client, versuche: int = 3) -> dict[str, float]:
        """Liefert einen in sich stimmigen Datensatz oder wirft eine Ausnahme.
    
        Die Steuerung erhöht den Zähler vor und nach dem Kopieren. Ungerade heißt
        "wird gerade beschrieben"; ein zweimal gleicher gerader Wert heißt "die
        Werte gehören zusammen".
        """
        for _ in range(versuche):
            roh = client.db_read(DB_NUMMER, 0, LAENGE)
            zaehler, stueckzahl, temperatur, zustand = struct.unpack(SATZ, roh)
    
            if zaehler % 2:                                   # Steuerung schreibt gerade
                continue
    
            nachher = struct.unpack(">h", client.db_read(DB_NUMMER, 0, 2))[0]
            if nachher != zaehler:                            # dazwischen ein neuer Zyklus
                continue
    
            return {"stueckzahl": stueckzahl, "temperatur": temperatur, "zustand": zustand}
    
        raise RuntimeError("Kein stimmiger Satz — Leserate oder Zykluszeit prüfen")
    
    
    client = snap7.Client()
    client.connection_type = 3      # 1 = Programmiergerät (Voreinstellung), 2 = HMI, 3 = sonstiger
    client.connect("192.168.0.10", rack=0, slot=1)
    
    try:
        print(lese_satz(client))
    finally:
        client.disconnect()         # Verbindungsressource der CPU wieder freigeben

    Geprüft gegen python-snap7 3.1.2 vom 10.08.2026. Der Verbindungstyp folgt der Kodierung im TSAP; die Voreinstellung 1 steht im Quelltext ausdrücklich für „PG“ — also für eine der wenigen Programmiergeräte-Ressourcen der CPU.

  4. Den Dauerbetrieb einplanen

    Betrieb

    Ein Auswerteskript läuft Jahre, nicht Stunden. Was dafür geklärt sein muss:

    • Verbindung schließen. Ein abgestürztes Skript, das die Verbindung nicht abbaut, blockiert die Ressource bis zum Zeitablauf in der CPU.
    • Leserate begrenzen. Die Steuerung bearbeitet den Zugriff mit demselben Prozessor, der das Anwenderprogramm rechnet.
    • Ausfall sichtbar machen. Wenn das Skript stirbt, muss das jemand merken — sonst fehlen im Nachweis Wochen, und niemand kann sagen, ab wann.

Der Stand der Werkzeuge

Wer auf dieser Grundlage plant, sollte wissen, wie viel Bewegung gerade in den Werkzeugen ist — und an welcher Stelle nichts mehr passiert.

Werkzeugstand

Was sich geändert hat und was eingefroren ist.

  1. 2017

    Snap7: letzter Stand der C-Bibliothek

    C/C++

    Das heißt nicht, dass sie schlecht ist — die klassische S7-Kommunikation hat sich nicht geändert. Es heißt, dass keine Anpassung an neuere Firmware-Stände, Sicherheitsmechanismen oder Protokollerweiterungen zu erwarten ist.

  2. bis 02/2026

    python-snap7 2.x: Aufsatz auf die C-Bibliothek

    2.1.0

    Der Stand, den praktisch jede deutschsprachige Anleitung im Netz beschreibt — samt der Fehlersuche, wo die Bibliotheksdatei liegen muss.

  3. 18.03.2026

    python-snap7 3.0: eigene Implementierung des Protokolls

    Bruch

    Keine plattformabhängigen Binärdateien mehr. Der Parameter für den Bibliothekspfad ist zwar noch da, wird aber laut Quelltext ignoriert — er steht nur noch für die Rückwärtskompatibilität.

  4. 10.08.2026

    python-snap7 3.1.2: aktueller Stand

    geprüft

    Reines Python, ohne Binärdateien im Paket. Alles in diesem Artikel Gezeigte ist gegen diesen Stand geprüft.

  5. offen

    S7CommPlus: im Entwicklungszweig, nicht veröffentlicht

    unfertig

    Dort liegt eine Implementierung des neueren Protokolls, mit dem symbolisch auf optimierte Bausteine zugegriffen wird. Im veröffentlichten Paket ist davon nichts enthalten. Wer heute plant, sollte nicht damit rechnen — aber die Entwicklung im Blick behalten.

Versionsstände und Daten aus den Paket-Metadaten und dem Quelltext des veröffentlichten Pakets, geprüft am 26.08.2026.

Wann welcher Weg

Von außen hineingreifen oder von innen anbieten?

Die Reihenfolge zählt: Der erste Fall, der zutrifft, ist die Antwort.

  • Wenn

    Neue Anbindung, S7-1500, Firmware aktuell

    Dann

    OPC UA

    Symbolisch, authentifizierbar, verträgt optimierte Bausteine — ohne Freigabe, die für jeden gilt.

  • Wenn

    Nur Daten heraus, hohe Frequenz nicht nötig

    Dann

    Von der Steuerung veröffentlichen lassen

    Die Steuerung schickt selbst, statt sich abfragen zu lassen. Keine offene Tür, kein Verbindungsplatz.

  • Wenn

    Altsteuerung S7-300 oder S7-400 im Bestand

    Dann

    Klassische S7-Kommunikation

    Dort ist sie der vorgesehene Weg, und die Frage nach dem optimierten Bausteinzugriff stellt sich gar nicht.

  • Wenn

    Ein Bestandssystem verlangt die klassische Kommunikation

    Dann

    Eigener Schnittstellen-Baustein

    Minimal gehalten, nur mit den Werten, die nach außen gehen — wie oben gezeigt.

Die Grundregel dahinter: Von außen in eine Steuerung hineinzugreifen ist der aufwendigere Weg. Er verlangt Freigaben, die die Angriffsfläche vergrößern, und er erzwingt Kompromisse an der Datenstruktur. Wo es die Aufgabe zulässt, ist der Weg über eine Schnittstelle, die die Steuerung selbst anbietet, technisch und sicherheitstechnisch der sauberere — mit eigenen Grenzen, die hier zusammengestellt sind.

Fahrplan

Bevor ein Fremdzugriff auf die Steuerung geplant wird

Vier Punkte, die über Machbarkeit und Folgekosten entscheiden — in dieser Reihenfolge zu klären.

  1. Firmware-Stand der CPU feststellen

    Ab Firmware V3.1 ersetzen Benutzerrollen die bisherigen Zugriffsstufen. Anleitungen, die von Zugriffsstufen sprechen, passen dann nicht mehr auf das Projekt.

  2. Prüfen, ob die Daten überhaupt absolut adressierbar sind

    Klassische S7-Kommunikation erreicht nur Datenbausteine ohne optimierten Bausteinzugriff. Ob das Abwählen vertretbar ist, entscheidet sich am Baustein, nicht am Skript.

  3. Die beiden Freigaben unterscheiden

    Die PUT/GET-Freigabe und die Zugriffsstufe der CPU sind zwei getrennte Einstellungen. Beide müssen passen, sonst bleibt die Verbindung ohne erkennbaren Grund leer.

  4. Konsistenz und Verbindungsressourcen klären

    Klassische Lesezugriffe sind nicht zykluskonsistent, und jede offene Verbindung belegt eine Ressource der CPU. Beides gehört in die Auslegung, nicht in die Fehlersuche.

FAQ

Häufige Fragen.

Warum findet unser Skript den Datenbaustein nicht?

Weil er wahrscheinlich mit optimiertem Bausteinzugriff angelegt ist. Optimierte Bausteine haben kein garantiertes Speicherlayout und lassen sich deshalb nicht absolut adressieren — die klassische S7-Kommunikation kann sie nicht lesen.

Was kostet es, den optimierten Bausteinzugriff abzuwählen?

Mehr als Geschwindigkeit. Der Baustein ist dann auf 64 kB begrenzt statt auf mehrere Megabyte, und das Laden ohne Reinitialisierung entfällt: Jede Änderung an diesem Baustein setzt im Betrieb die aktuellen Werte zurück.

Reicht es, die PUT/GET-Kommunikation freizugeben?

Nicht immer. Daneben steht die Zugriffsstufe der CPU, die ab Werk auf komplettem Schutz steht — in dieser Stufe ist die Serverfunktion deaktiviert und nicht änderbar. Beide Einstellungen müssen zusammenpassen.

Sind die gelesenen Daten in sich konsistent?

Nein. Die Daten werden während der Laufzeit des Anwenderprogramms aktualisiert; einen Zeitpunkt, zu dem sie garantiert konsistent sind, gibt es nicht. Wer zusammengehörige Werte braucht, muss die Konsistenz im Programm herstellen.

Welche Alternative ist die richtige?

Für neue Anbindungen in der Regel OPC UA: Es arbeitet symbolisch, verträgt sich mit optimierten Bausteinen und ist authentifizierbar. Die klassische S7-Kommunikation bleibt sinnvoll, wo Altsteuerungen im Spiel sind oder ein Bestandssystem sie voraussetzt.

Weiterlesen

Alle Beiträge im Überblick

Kontakt

Stellen Sie Ihr Vorhaben vor.

Eine erste Einschätzung zu Ihrem Vorhaben ist kostenfrei und unverbindlich.

Zum Kontaktformular

Antwort innerhalb von zwei Werktagen