es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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:

Data Block

Dirección asociada con las etiquetas:

Address Tags

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?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El error es causado por la línea result = plc.read_area(areas['PE'],0,byte,datatype) en la función ReadMemory. Según la documentación, la función read_area requiere que el primer argumento sea un identificador de área de la enumeración snap7.types.Areas. Sin embargo, el código está pasando un valor entero de 0, lo cual causa el TypeError que se está lanzando.

    Para leer el Bloque de Datos Global, la función debe ser modificada de la siguiente manera:

    def ReadMemory(plc,byte,bit,datatype):
        result = plc.read_area(snap7.types.Areas.DB, 1, byte, datatype)
        ...
    

    Aquí, se utiliza snap7.types.Areas.DB para especificar que se debe leer el bloque de datos. El segundo parámetro 1 especifica el número del bloque de datos que se va a leer (en este caso, es DB1), 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.

Comments are closed.