# Python OPCUA Parameter für S7-1500 CPU



## Fluffi (22 Mai 2021)

Im Rahmen eines speziellen Projekts muss ich mit Python auf die Daten einer S7-1500 PCU zugreifen.
Ich nutze dazu die FreeOpcUa Library für Python. 
Ich kann sowohl per zyklischen Read oder Subscription Daten der CPU lesen. Soweit funktioniert das Ganze.
Allerdings ist Lesegeschwindigkeit sehr langsam und ich erhalte ständig Meldungen über "fehlerhafte" Pakete wie z.b. diese hier:
opcua.uaprotocol:received header: Header(type:b'ACK', chunk_type:b'F'...
Der Grund dafür sind nicht korrekte Einstellungen der MessageSize, Chunkcount, etc.
Ich habe schon alle möglichen Einstellungen für diese Parameter durchprobiert, aber leider ändert das nichts am Verhalten.
Wenn ich mich mit Clients wie UaExpert oder anderen mit der CPU verbinde, hab ich die Probleme nicht und der Zugriff erfolgt sehr schnell und ohne Probleme. Wie ist das mit FreeOpcUa zu schaffen?


----------



## DeltaMikeAir (22 Mai 2021)

Mal die erste Frage, welche Firmware ist auf deiner CPU?
Bei den aktuellen FW Versionen hat sich was getan bezüglich Geschwindigkeit.

Mit deiner Free-Software kenne ich mich leider nicht aus.


----------



## Ralle (23 Mai 2021)

Leider kann ich dir zu FreeOpcUa auch niht helfen.
Solltest du es damit aber nicht zur Zufriedenheit hinbekommen, schau dir mal Snap7 für Python an, damit kann man auch recht gut Daten von einer 1500-er lesen und schreiben.


----------



## Fluffi (23 Mai 2021)

Auf der CPU läuft die aktuellste FW, allerdings ist meine TIA Version V15.1 und nicht V16. Keine Ahnung ob der OPC Server dann nicht in der neuesten Version auf der CPU läuft, wobei das aber unwahrscheinlich wäre, schließlich ist die FW ja auf der CPU, was sollte sonst laufen. Die Programmier-IDE sollte hier ja keinen Einfluss haben, oder?
Snap7 ist eine gute Idee und hab ich auch schon in Angriff genommen. Zudem kann ich damit leben einen Transfer-DB auf "nicht optimiert" zu stellen. Leider bekomm ich Snap7 nicht installiert. Mein System ist ein Linux für ARM. Der Python Wrapper für Snap7 lässt sich noch installieren, der Snap7 Kern selber leider nicht, auch nicht wenn ich ihn selbst kompiliere.


----------



## Ralle (24 Mai 2021)

Ok, ich hab das auf dem Mac und Snap7 über Anaconda installiert. Linux hab ich zu dem Thema noch nicht probiert, würde mich aber wirklich wundern, wenn das nicht geht.


----------



## SpektrEngi (12 Juni 2021)

Hi @Fluffi,
ich bin gerade per Google Suche auf diesen Beitrag hier gestoßen und habe mich deswegen auch bei dem Forum hier registriert  
Ich hoffe du konntest dein Problem schon lösen, wenn nicht, dann hilft dir vll. meine Antwort.
Da ich mich stark mit Open Source Software und besonders Python im Umfeld von Industrie 4.0 und Automatisierungstechnik beschäftige habe ich zu Simatic S7-1200/1500 und Python schon einige Beiträge geschrieben sowie die von dir beschriebene Python Bibliothek (freeopcua) schon öfters im Projekt verwendet... Hier erstmal die Links zu meinem Blog, die dir hoffentlich weiterhelfen können:

- TIA Portal Prof. V15.1, SIMATIC S7-1511, Firmware 2.51 (wenn ich mich richtig erinnere)
-- unverschlüsseltes OPC UA mit Python
-- verschlüsseltes OPC UA mit Python
(beide Beiträge in Englisch)

Dann habe ich das Thema kürzlich nochmals behandelt, da sich bei der Konfiguration zwischen TIA V15.1 und TIA V16 ein Paar Änderungen ergeben haben und man mit TIA V16 nun auch OPC UA (Server) auf der S7-1200 nutzen kann, Link zu meinem anderen Blog:
- TIA Portal Prof. V16, SIMATIC S7-1511, Firmware 2.51 und SIMATIC S7-1200 Firmware 4.1.1
-- verschlüsseltes OPC UA mit S7-1500 und S7-1200

Kannst Du ein Teil deines Python Codes posten... Die Read/Write Performance bei python freeopcua kommt darauf an, mit welcher Methode du die Daten ausliest. Wenn du klassische polling der Lib nutzt mit z.B. get_node und get_value kann die Abfrage schon mal ein paar Sekunden dauern.

Ich habe in meinen Projekten zwischen der S7-1200/S7-1500 und Python OPC UA Kommunikationszeiten von ca. 50...200 ms gemessen, jeweils read/write, die Daten habe ich aber aus der S7 ausgelesen indem ich in meiner Python Anwendung die Variablen "subscribed" habe... Hier ein Beispiel dazu auf github-pythonopcua. (das file heißt zwar client_to_kepware.py, aber kannste direkt auf die S7 übertragen)


----------



## Dr. OPC (8 September 2021)

Hallo,

wenn es mit dem UaExpert "schnell" geht und mit dem "FreeOpcUa Library für Python" nicht, dann liegt es insbesondere und ganz bestimmt NICHT an der "Firmware der Simatic", sondern offensichtlich einfach nur an der schlechten Implementierung oder an der schlechten/falschen Verwendung der API in Python.

Zur Info: beim "subscriben" wird die Geschwindigkeit vom Client "gewünscht" und vom Server "festgelegt". Bei UARead geht es (je nach eingestelltem MaxAge parameter) direkt durch bis auf die Datenquelle, und damit typischerweise auch "schneller" als beim subscriben, allerdings auch zu Lasten der CPU. Daher sollte man immer subscriben, anstelle zu Lesen (oder gar in einer Schleife zu lesen/pollen).

Zum Test: der UaExpert enthält eine "Performance Messung", damit kannst du messen was wirklich geht bei z.B. UARead mit Vollgas in einer Schleife, und dabei kannst du auch messen welchen Unterschied es macht wenn du 100x Read auf eine Variable machtst, oder 1x Read auf 100 Variablen. 

Zur Optimierung: Mit UaExpert (Performance View) kannst du messen welchen Unterschied es macht wenn Du einen Read auf eine String-NodeID machst oder wie unglaublich viel schneller es geht wenn du die Node erst am Server registriest und dann nur noch über den "RegisteredRead" zugreifst (quasi der Speed wie bei einer Numeric-NodeID).


----------

