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.[divider]
¿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.
Enseño a programar PLC de Siemens a través de mis cursos.
Más información sobre mi aquí
Puedes seguirme en cualquiera de las siguientes redes sociales.
Deja un comentario