Cómo copiar datos de forma dinámica en Step 7

Vamos a ver cómo copiar datos de forma dinámica en Step 7 para que si tienes diferentes bloques de información homogéneos en su estructura (pero no en sus datos) y los quieres copiar  a un boque final en función de un parámetro cualquiera.

Por ejemplo, tenemos diferentes DB con información de ciertos productos que en función del producto, lo tenemos que copiar a un DB.

Podrías decir, bueno, en función del producto, hago una copia del DB del producto al DB final y ya está…

Hombre, pues sí, pero digamos, que es mucho trabajo y poco elegante. Porque si en vez de ser 10, ¿son 100?

Cómo copiar datos de forma dinámica en Step 7

Pues resulta que la solución es realmente fácil usando direccionamiento indirecto en Step 7.

Imaginemos que los DB donde tenemos la información son del estilo DB100 + Número de producto, es decir:

  • DB101 para el producto 1
  • DB102 para el producto 2
  • DB103 para el producto 3 …

Y así con todos.

Imaginemos, a su vez, que el DB destino es el DB1 (por poner un ejemplo) y que queremos copiar 50 bytes.

Bien.. ¿cómo copiar datos de forma dinámica? Pues realmente de una forma muy sencilla.

Lo primero que debemos tener en cuenta que para realizar este tipo de ejercicios podemos usar la apertura de los db de dos formas:

  • AUF DB
  • AUD DI

Sí, porque de esta manera, la solución es realmente sencilla.

Una vez sepamos el número de producto a copiar, tan solo deberemos usar la función SFC20 (Block Move)  para solucionar nuestro problema.

L #NumeroProducto //Leemos nuestro número de producto que indica el DB que almacena la información

L 100

+ I

T #NumeroDB // Sumamos el número de producto 100 unidades para obtener el número de DB a usar

AUF DI[#NumeroDB] //Abrimos el DB

CALL “BLKMOV”
SRCBLK :=P#DIX 0.0 BYTE 50
RET_VAL:=MW0
DSTBLK :=P#DB1.DBX 0.0 BYTE 50

¡Y ya está!

Como ves, en la solución, manejamos 2 conceptos:

  • Apertura de los bloques con AUF DI para abrir el bloque origen, y luego el puntero lo hacemos relativo a esa apertura simplemente leyendo 50 bytes del bloque abierto con AUF DI
  • Puntero absoluto de 50 bytes al DB1 destino

¿El destino podría ser dinámico a su vez?

Claaaaro. Si en vez de haber usado, el DB1, quisieramos usar un #DBDestino, podríamos hacer análogamente:

L #NumeroProducto //Leemos nuestro número de producto que indica el DB que almacena la información

L 100

+ I

T #NumeroDB // Sumamos el número de producto 100 unidades para obtener el número de DB a usar

AUF DI[#NumeroDB] //Abrimos el DB origen

AUF DB[#DBDestino] // Abrimos el DB destino

CALL “BLKMOV”
SRCBLK :=P#DIX 0.0 BYTE 50
RET_VAL:=MW0
DSTBLK :=P#DBX 0.0 BYTE 50

Como ves, esto de cómo copiar datos de forma dinámica en Step 7 es muy útil si quieres pasar información entre bloques.

¿Qué te ha parecido? ¿Te parece útil?

 

Acerca de Iñigo Gútiez

Ingeniero industrial por la Escuela de Ingenieros Superiores de Bilbao. Trabajo como ingeniero de proyectos y automatización en Guardian Industries

Te puede interesar

Entrevista a Juan Carlos Martín (REEA)

En esta ocasión traigo al blog algo muy especial. Más bien a alguien especial. La …

4 Comentarios

  1. Supongo que el SFC20 tendrá sus limitaciones en el ancho de memoria que va a mover!

  2. Funcionará con DBs optimizados? No me adapto a estos nuevos DBs!

    • A ver, es AWL, y los 300/400 no admiten bloques optimizados. El 1500 sí, y la ayuda de Siemens dice esto:
      Descripción

      La instrucción “Copiar área” permite copiar los contenidos de un área de memoria (área de origen) en un área de memoria diferente (área de destino). La operación de copia se realiza por orden ascendente de direcciones. Las áreas de origen y destino se definen mediante VARIANT.

      Nota
      Las variables de la instrucción solo se pueden usar en los bloques de datos en los que no está ajustado el atributo “Acceso optimizado al bloque”. Si la variable se ha declarado con el ajuste de remanencia “Ajustar en IDB”, la variable también se puede usar “con acceso optimizado”.