No se puede recuperar data del PLC simatic 1200 al programa de python utilizando Snap.
Soy principiante en programación PLC y Python. Mi requisito es leer el Global Data Block utilizando programación Python. He utilizado el siguiente fragmento de código.
import snap7 #importar la biblioteca snap7
from snap7.util import*
from snap7.types import*
import time #importar la biblioteca time
def ReadMemory(plc,byte,bit,datatype): #definir la función de lectura de memoria
result = plc.read_area(areas['MK'],0,byte,datatype)
if datatype==S7WLBit:
return get_bool(result,0,1)
elif datatype==S7WLByte or datatype==S7WLWord:
return get_int(result,0)
elif datatype==S7WLReal:
return get_real(result,0)
elif datatype==S7WLDWord:
return get_dword(result,0)
else:
return None
IP = '192.168.x.xx' #IP plc
RACK = 0 #RACK PLC
SLOT = 1 #SLOT PLC
plc = snap7.client.Client() #llamar a la función del cliente snap7
plc.connect(IP,RACK,SLOT) #conectarse al PLC
state = plc.get_cpu_state() #leer el estado del PLC: run/stop/error
print(f'State:{state}') #imprimir estado del PLC
while True:
#leer memoria
readbit = ReadMemory(plc,0,0,S7WLBit)
Detalles del Bloque de Datos del PLC:
Dirección asociada con las etiquetas:
Errores del programa:
Traceback (most recent call last):
File "C:\Users\Dinesh-AMS\PycharmProjects\Python Plc Siemens\snap7com\python_program\venv\Python.py", line 45, in <module>
readbit = ReadMemory(plc,0,0,S7WLBit) #leer m0.0
File "C:\Users\Dinesh-AMS\PycharmProjects\Python Plc Siemens\snap7com\python_program\venv\Python.py", line 6, in ReadMemory
result = plc.read_area(areas['PE'],0,byte,datatype)
File "C:\python\lib\site-packages\snap7\client.py", line 392, in read_area
if area not in Areas:
File "C:\python\lib\enum.py", line 373, in __contains__
raise TypeError(
TypeError: unsupported operand type(s) for 'in': 'int' and 'EnumMeta'
State:S7CpuStatusRun
¿Podría alguien decirme por qué mi programa genera este error y ayudarme a resolver este problema?
davy.ai
El error es causado por la línea
result = plc.read_area(areas['PE'],0,byte,datatype)
en la funciónReadMemory
. Según la documentación, la funciónread_area
requiere que el primer argumento sea un identificador de área de la enumeraciónsnap7.types.Areas
. Sin embargo, el código está pasando un valor entero de0
, lo cual causa elTypeError
que se está lanzando.Para leer el Bloque de Datos Global, la función debe ser modificada de la siguiente manera:
Aquí, se utiliza
snap7.types.Areas.DB
para especificar que se debe leer el bloque de datos. El segundo parámetro1
especifica el número del bloque de datos que se va a leer (en este caso, esDB1
), y los parámetros restantes son los mismos que antes.Con esta modificación, la función debería poder leer el Bloque de Datos Global según el requisito.