TIA python-snap7

Fabster

Level-2
Beiträge
26
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin miteinander,

Ich versuche aktuell eine Verbindung zwischen PC und SPS herzustellen, bzw. zwischen Python und SPS (ET200SP), dies würde ich gerne mit snap7 machen (sofern es nicht noch besseres gibt?).
Ich würde gerne Inputs und Outputs auslesen und schreiben.

Ich kann eine Verbindung herstellen, allerdings bekomme ich in Python immer:
b'CLI : function refused by CPU (Unknown error)'
Error reading inputs: b'CLI : function refused by CPU (Unknown error)'

Und mit Wireshark beobachtet konnte ich folgenden Fehlercode herausfinden:
Error class: Application relationship (0x81)
Error code: 0x04

Ich weiß das optimierte Datenbausteine nicht ausgelesen werden können aber auch IOs nicht?

Danke schonmal!
Fabi
 
Zuletzt bearbeitet:
Du mußt die Put-Get-Kommunikationin der SPS freischalten.
Das machst du in den Einstellungen der CPU.
E und A habe ich noch nicht geschrieben, ich bin nicht sicher, ob das überhaupt sinnvoll geht. Auf Datenbausteine (nicht optimiert!) kannst du problemlos zugreifen, das Ganze ist bei meiner 1500-er sogar recht schnell.

Bildschirmfoto 2024-10-16 um 09.16.24.jpg
 
Wir haben so etwas ähnliches unter Beckhoff mit der Ads Kommunikation am laufen, wo eine Javascript Applikation übers Ads auf IO lesend und schreibend zugreift, ich bin tatsächlich kein so großer Fan davon.. dann doch lieber klassisch über Datenbausteine
 
Moin miteinander,

Danke für die vielen Antworten.
Ja PUT/GET ist aktiviert:
1729064432209.png

Ich habe auch Vollzugriff auf die SPS an (ohne Passwort etc.).
Die IOs sollten ja in den Areas sein wenn ich das recht aus der Doku lese:
1729064639587.png

Aber leider funktioniert es weder mit Area noch mit Areas.
 
Das hängt leider mit der Python-Version und vor Allem mit der installierten Version von Snap7 zusammen.
Leider haben die Entwickler zwischendurch etwas an der Syntax geändert. Hat man die falsche Version geht es nicht oder man muß eine andere Sytax verwenden. Hier mal mein Teil des Codes:

Code:
class DBObject(object):
    pass
 
offsets = {
    "Bool"  : 2,
    "Int"   : 2,
    "Real"  : 4,
    "DWord" : 4,
    "String": 256
    }
db=\
"""
Count\tDWord\t0.0
Temperature\tReal\t4.0
DistanceOverAll\tReal\t8.0
CyclesOverAll\tDWord\t12.0
MotorCurrent\tReal\t16.0
DB_String\tString\t20.0
"""
def DBRead(plc,db_num,length,dbitems):
    data = plc.read_area(Areas.DB,db_num,0,length)
    obj = DBObject()
    for item in dbitems:
        value = None
        offset = int(item['bytebit'].split('.')[0])
        if item['datatype']=='Real':
            value = get_real(data,offset)
        if item['datatype']=='Bool':
            bit =int(item['bytebit'].split('.')[1])
            value = get_bool(data,offset,bit)
        if item['datatype']=='DWord':
            value = get_dword(data, offset)
        if item['datatype']=='String':
            value = get_string(data, offset)
  
        obj.__setattr__(item['name'], value)
 
    return obj

Je nach Version könnte es

Areas.DB oder
Areas['DB']

heißen. Zumindest ab meiner Sanap7-Version 1.4.1 ist es
Areas['DB'].

Die Definition in Snap7 ist bei der neueren Version:

Code:
# Area ID
class Areas(Enum):
    PE = 0x81
    PA = 0x82
    MK = 0x83
    DB = 0x84
    CT = 0x1C
    TM = 0x1D

# Leave it for now
S7AreaPE = 0x81
S7AreaPA = 0x82
S7AreaMK = 0x83
S7AreaDB = 0x84
S7AreaCT = 0x1C
S7AreaTM = 0x1D

areas = {
    "PE": S7AreaPE,
    "PA": S7AreaPA,
    "MK": S7AreaMK,
    "DB": S7AreaDB,
    "CT": S7AreaCT,
    "TM": S7AreaTM,
}
 
Zuletzt bearbeitet:
Der Vollständigkeit halber: Genau welche ET200SP SPS hast du?
Das ist die Vollständige Bezeichnung ist CPU 1514SP-2 PN.

Das hängt leider mit der Python-Version und vor Allem mit der installierten Version von Snap7 zusammen.
Leider haben die Entwickler zwischendurch etwas an der Syntax geändert. Hat man die falsche Version geht es nicht oder man muß eine andere Sytax verwenden. Hier mal mein Teil des Codes:

Code:
class DBObject(object):
    pass
 
offsets = {
    "Bool"  : 2,
    "Int"   : 2,
    "Real"  : 4,
    "DWord" : 4,
    "String": 256
    }
db=\
"""
Count\tDWord\t0.0
Temperature\tReal\t4.0
DistanceOverAll\tReal\t8.0
CyclesOverAll\tDWord\t12.0
MotorCurrent\tReal\t16.0
DB_String\tString\t20.0
"""
def DBRead(plc,db_num,length,dbitems):
    data = plc.read_area(Areas.DB,db_num,0,length)
    obj = DBObject()
    for item in dbitems:
        value = None
        offset = int(item['bytebit'].split('.')[0])
        if item['datatype']=='Real':
            value = get_real(data,offset)
        if item['datatype']=='Bool':
            bit =int(item['bytebit'].split('.')[1])
            value = get_bool(data,offset,bit)
        if item['datatype']=='DWord':
            value = get_dword(data, offset)
        if item['datatype']=='String':
            value = get_string(data, offset)
 
        obj.__setattr__(item['name'], value)
 
    return obj

Je nach Version könnte es

Areas.DB oder
Areas['DB']

heißen. Zumindest ab meiner Sanap7-Version 1.4.1 ist es
Areas['DB'].

Die Definition in Snap7 ist bei der neueren Version:

Code:
# Area ID
class Areas(Enum):
    PE = 0x81
    PA = 0x82
    MK = 0x83
    DB = 0x84
    CT = 0x1C
    TM = 0x1D

# Leave it for now
S7AreaPE = 0x81
S7AreaPA = 0x82
S7AreaMK = 0x83
S7AreaDB = 0x84
S7AreaCT = 0x1C
S7AreaTM = 0x1D

areas = {
    "PE": S7AreaPE,
    "PA": S7AreaPA,
    "MK": S7AreaMK,
    "DB": S7AreaDB,
    "CT": S7AreaCT,
    "TM": S7AreaTM,
}
Ich habe die aktuellste also die 2.0.0 in Kombination mit Python 3.12.3 also eigentlich beides up to date und auch der Support für 3.12 ist laut Doku bzw. PyPi gegeben ich habe es mit den 0x81 und 0x82 Variante probiert bekomme aber immer folgendes:

Code:
 b'CLI : function refused by CPU (Unknown error)'
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dann die Frage, die du mir bitte nciht übel nimmst :sneaky:, hast du die Hardware in die SPS übertragen?
Welche TIA-Version nutzt du? Ich hab die V17. Wenn ich das richtig mitbekommen habe, ist bei V19 evtl. wieder irgendein Klimmzug notwenig, um tatsächlich die Put/Get-Kommunikation frei zu bekommen.
 
Dann die Frage, die du mir bitte nciht übel nimmst :sneaky:, hast du die Hardware in die SPS übertragen?
Welche TIA-Version nutzt du? Ich hab die V17. Wenn ich das richtig mitbekommen habe, ist bei V19 evtl. wieder irgendein Klimmzug notwenig, um tatsächlich die Put/Get-Kommunikation frei zu bekommen.
Nein, nein, nehme ich dir nicht übel 😁 Ja Hardware ist übertragen.
Ich nutze TIA V18. PUT/GET ist freigeschalten und die
Die Uhr der SPS ist gestellt?
Uhr ist auch eingestellt.

Ich habe garnicht die Möglichkeit die Legacy Variante zu wählen...
1729071185907.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Faq bezieht sich ja auch auf eine 1500 mit Firmware 3.1

Die Artikelnummer und Firmwareversion deiner Steuerung hast du uns noch nicht verraten.

Dein Tia Portal ist mit den aktuellen Updates versorgt? Wenn nicht, würde ich das mal machen
Sorry, das habe ich vergessen bisher...
Artikel-Nr.: 6ES7 514-2DN03-0AB0
Firmware-Version: V3.0

Ich update TIA gerade auf upd5
 
Hier findest du die aktuellen Firmwares für deine Steuerung

Wenn du schon dein Tia Portal updatest, könntest du auch noch die Hardware Support Packages nachziehen, evtl kannst du damit auch eine höhere Firmware deiner Steuerung projektieren

Welche Firmwares unterstützt denn dein V18 für diese Steuerung? Kannst ja ggf dann noch ein Firmware Update nachziehen.
 
Ich frag nochmal nach: Der DB muß "nicht optimiert" sein!

Nachtrag: Dann kommt aber als Fehler: "RuntimeError: b'CPU : Address out of range'"
 
Von mir aus nicht, aber das muss ich abklären.


Ich weiß, meine DBs sind leider optimiert, aber ich brauche auch eigentlich die IOs.
Aber warum willst du dann Areas.DB nutzen? Das geht sicher nur bei nicht optimierten Bausteinen und es wäre mal einen Versuch wert, einen nicht optimierten Baustein zu testen.

PS: zu Areas hab ich bei mir noch gesehen, dass ich folgende Import-Klausel nutze, damit es erkannt wird:

import snap7
import snap7.client
from snap7.types import *
from snap7.util import *

Ohne "from snap7.types import *" wird bei mir gemeckert.
 
Zurück
Oben