LOOP en Step 7 (Saltos II) – Bucle For – Next y ejemplo de filtrado analogico

Loop en Step 7

En la última entrada vimos los saltos en Step 7 más comunes. Hoy te voy a mostrar un nuevo tipo de salto, que si provienes de la programación en otros lenguajes, te va a sonar. Se trata de hacer bucles tipo FOR-NEXT mediante la instrucción LOOP en Step 7.

Realmente la instrucción es muy sencilla: LOOP Etiqueta. Para explicarlo bien, vamos a desgranar el siguiente código:

(Código)

L 10 –> Lo primero que hacemos es cargar en el acumulador el número de ciclos del bucle.

NEXT: T MW10 -> Transferimos el valor del ACU-1 a nuestra marca de contador de ciclos

(Código) –> Implementamos el código que queramos

L MW10  –> Cargamos el valor del contador de ciclos en el ACU-1
LOOP NEXT  –> Ejecutamos el loop y saltamos a la etiqueta deseada (Llamada NEXT en este caso pero podríamos llamarla pepe)

(Código) –> Continuamos con el código que queramos.

Vayamos con la explicación del LOOP.

¿Qué hace el LOOP en Step 7?

La instrucción LOOP hace lo siguiente:

  • Toma el valor del ACU-1 y  le resta una unidad.
  • Evalua el resultado de restar la unidad. Si el resultado no es cero, salta a la etiqueta. Si es cero (ya ha terminado), continua en la línea siguiente (no ejecuta el salto).

Hay que tener en cuenta que es necesario una variable (en nuestro ejemplo MW10) de 16bits que sea entera no negativa. El salto puede ser hacia delante o hacia atrás, pero la forma de hacer un FOR-NEXT tradicional es como se muestra.

Por tanto, hemos hecho lo siguiente:

Cargar el número de iteraciones en el acumulador 1. Por ejemplo 10.

L 10

Tras ello, generamos cual va a ser nuestra meta de salto (Llamarla NEXT creo que es bastante adecuada por su significado) y transferimos el valor del ACU-1 al contador de ciclos.

NEXT: T MW10

Por tanto, en el primer ciclo, MW10 valdrá 10.

Como nota podrás pensar… en el post sobre los saltos dijiste que lo mejor es poner la Meta seguido de NOP 0 y ahora estás usando la instrucción directamente. Correcto. Es cierto que lo escribí y lo mantengo. De hecho aquí podría hacer lo mismo y poner un

NEXT: NOP 0

T MW 10

… pero sin que sirva de precedente creo que es más intuitivo y fácil de entender que el NEXT va asociado intrínsecamente al contador de ciclos por lo que evitamos el poner a instrucción nula ya que siempre, siempre, siempre, ha de ponerse la transferencia del contador de ciclos tras la meta, por tanto, seguido es más adecuado en este caso ¿no crees?

Bien, sigamos. Una vez transferido el valor a MW10 (recordemos que vale 10), ejecutaremos el código que queramos. Ojo, sin usar MW10 salvo de lectura, no carguéis sobre él valores ya que desvirtuaría el valor del contador.

Una vez terminado el código ejecutamos

L MW10

LOOP NEXT

Lo que hacemos es cargar el valor del contador (10 en la primera iteración) y ejecutar LOOP. Como vale 10 >0, le resta una unidad (9) y salta a NEXT.

Es decir, saltará a NEXT: T MW10 y por tanto ahora el contador de ciclos valdrá 9 ya que es lo que tenemos en el acumulador 1!!

Luego volverá a ejecutar el código que queramos, cargará nuevamente este valor 9, le restará la unidad y devolverá un 8 para que se lo transfiramos al contador de ciclos.

¿Fácil verdad? Espero que no os haya parecido una explicación para niños de párvulos  pero es que hay veces que con el tema de los acumuladores, mucha gente se lía un poco.

Finalmente os he preparado un ejemplo que creo que os va a gustar. Se trata de realizar un filtrado de una señal analógica de esta forma:

  • Tomaremos la señal cada 100 ms.
  • Pasaremos como entrada el valor analógico en tipo entero
  • Realizaremos un filtrado de los “n” últimos ciclos donde “n” puede ser como mucho 200.
  • Nos devolverá la media de los “n” últimos ciclos como valor real
  • Nos devolverá la medida de los 200 últimos ciclos si hemos puesto n>20 y una señal booleana de alarma indicando que el número de ciclos es demasiado grande y que por tanto devolvemos solamente la media del máximo número de ciclos.

 

 

 

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

programación en ladder

Programación en ladder: cómo crear la estructura de un programa

La programación en ladder es sin duda la programación de autómatas programables más extendida, incluidos …