Saltos SPL en Step 7. El Select Case en AWL

SPL en Step 7Esta semana vamos a ver el salto SPL en step 7. Se trata de un salto de metas estilo Select Case que podríamos encontrar en lenguajes de programación de alto nivel.

Junto con los ejemplos vistos de cómo hacer los IF/THEN/ELSE y el FOR-NEXT, tendríamos elementos suficientes para realizar programas bastante sofisticados ya que estas tres operaciones son básicas en un lenguaje de alto nivel, pero que permiten realizar operaciones complejas.

¿En qué consiste el SPL en Step 7?

Básicamente lo que vamos a realizar es un salto a una meta en función del valor numérico de una variable que hemos volcado en el ACU1 antes de realizar la llamada a la instrucción SPL.

La estructura sería como sigue:

L MB0 //Cargar el número de la meta del salto en el ACU1-L-L.
SPL ELSE //Meta del salto si el ACU1-L-L es > 3.
SPA SEG0 //Meta del salto si ACU1-L-L = 0.
SPA SEG1 //Meta del salto si ACU1-L-L = 1.
SPA SEG2 //Meta del salto si ACU1-L-L  = 2.
SPA SEG3 //Meta del salto si ACU1-L-L = 3.
ELSE: SPA END0
SEG0: * //Instrucción permitida.
*
SPA END0
SEG1: * //Instrucción permitida.
*
SPA END0
SEG2: * //Instrucción permitida.
*
SPA END0
SEG3: * //Instrucción permitida.
*
SPA END0
END0: NOP 0

Me vas a permitir que te lo cuente un poco más en cristiano. La idea es que cargas un valor numérico entero en el MB0 en este caso en cualquier parte del programa y cuando quieras evaluarlo lo cargas en el ACU1 (haces un L MB0).

Bien. En función de ese valor, con el SPL en step 7 saltaremos a un meta diferente que están ordenados en orden creciente para valores 0,1,2,3… etc.

La primera instrucción curiosamente es definir la condición de CASE ELSE, es decir, qué hacer si no hay un meta definido para el valor en concreto (en nuestro caso si MB0 vale más de 3). En este caso, simplemente estamos haciendo que salte incondicionalmente a la salida del bucle, pero podríamos realizar algún tipo de instrucción antes de salirnos.

Como observarás todos tienen al final del meta un SPA  ENDO. La razón es sencilla: una vez ejecutado el código que corresponde a imaginemos MB=1, no queremos que ejecute lo correspondiente a otros valores de MB, y no podemos depender del valor del RLO, por lo que realizamos un salto incondicional a la salida.

Lógicamente es aplicable a todos los metas. Yo incluso se lo suelo poner al último aunque estrictamente no es necesario ya que hacer un:

SPA END0

END0: NOP 0

O quitar el SPA END0, viene haciendo lo mismo. La ventaja es que si añado en un futuro valores para MB=4 por ejemplo, no corro riesgo de dejarme el salto, que entonces si sería necesario para este meta al haber uno nuevo bajo el.

El vídeo y más información

Este tema ya lo hemos visto con anterioridad y básicamente he repetido lo mismo, más o menos . Te animo de todas formas a que lo leas ya que se indican un par de usos habituales.

En esa entrada también ya te mostraba un ejemplo en el cual se explicaba esto mismo. Creo que es bastante ilustrativo por lo que adjunto aquí también ese vídeo. Si se me ocurre algún ejemplo práctico

¿Qué te ha parecido?

Como todas las semanas te insto a que des tu opinión sobre el tema, si has usado este tipo de saltos y si les ves utilidad.

Y cómo no recordarte que si quieres colaborar con el mantenimiento del blog, te pido que valores colaborar con él accediendo a través de cualquiera de los links del blog a la tienda www.masvoltaje.com donde podrás encontrar material eléctrico a buen precio.

Recordarte también que los comentarios que se viertan deben estar relacionados con el tema en cuestión. Si tienes cualquier duda de otro tipo por favor ,hacedlo a través del foro.

 

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

curso en pdf de Step 7

El curso en pdf de Step 7 V5.x se vuelve una Rolling Release

Muchos de los lectores han comprado el curso en pdf de Step 7 “Cómo programar en …

4 Comentarios

  1. Excelente!!!

    Problema de tipeado SEG2!!! increible que esto antes me parecia escritura china. y me negaba a cambiar la programacion ladder, el AWL ayuda bastante a saber bien que se esta haciendo.

    Felicitaciones Iñigo!!!!!

  2. Jeje. Corregido.

    AWL quieras o no hay que conocerlo y usarlo a conveniencia… no es ni un ángel ni un diablo.

    Saludos!

  3. Hola, me está enganchando este blog últimamente. Me está sirviendo para mejorar bastante. La cuestión es que lo ejecuto cargando 1(L1) y me funciona. Lo ejecuto cargando L DIW0 y se me cae el simulador. No se si es normal. También he probado con L DIB0 y con L DBX0.0 y no arranca el dichoso FB a pesar de tener un valor inicial 1 en la variable estatica “Contador” . A ver si alguien me comenta si le ha pasado. ¡Gracias y salud!
    ELSE: NOP 0
    L 1
    T #NumeroDB
    L ‘ ‘
    T #Espacio
    AUF DI [#NumeroDB]
    CALL “FILL”
    BVAL :=#Espacio
    RET_VAL:=#Temp
    BLK :=P#DIX 2.0 BYTE 10

  4. Hola, buen tutoríal.

    Te recomiendo que además incluyas el como afecta esta instrucción al estado lógico. (vke o rlo) .

    Un saludo y felicitaciones por la explicación.
    Miguel Madrid.