4.1

Algunos casos interesantes
de control programado

 

En este tema nos referiremos a cuatro casos particulares que merece la pena tener en cuenta cuando se realizan programas de control:

Esto conlleva una utilización de los recursos de programación ligeramente más avanzada de lo que hemos venido haciendo hasta el momento.

 

1. Programación de un bucle DESDE...HASTA. Contadores

En el tema 3.4 hemos visto la programación de bucles elementales para el control de procesos repetitivos. Estudiaremos ahora un tipo de bucle más elaborado. Supongamos que deseamos ejecutar un proceso (por ejemplo, un subprograma, Sub 1) 10 veces seguidas. Desde luego, no queremos programar esto arrastrando 10 veces seguidas el bloque de proceso y unir los 10 bloques resultantes mediante líneas. Una solución más inteligente sería habilitar una variable como contador de repeticiones, por ejemplo, la x, asignarle 0 como valor inicial e incrementarla cada vez en una unidad comprobando con un bloque "Decisión" cuándo alcanza el valor 10:

Cada vez que se ejecuta la asignación x=x+1 el valor de la variable x se incrementa en una unidad. Así, este fragmento de programa llama al subprograma Sub 1 mientras que la variable x es menor de 10 y, como su valor inicial es 0, conseguimos repetir la llamada 10 veces.

En muchos lenguajes de programación (como BASIC o C) a un proceso repetitivo de este tipo se le denomina bucle FOR (se repite DESDE que la variable contador toma un valor inicial HASTA que toma otro final).

 

2. Paso de valores entre programas y subprogramas

En Flowol los subprogramas no admiten parámetros, es decir, posibles valores o argumentos que se puedan pasan desde el programa o subprograma que los invoca, ni que devuelvan ningún valor a dicho programa. Sin embargo, se pueden pasar valores entre el programa principal y los subprogramas utilizando variables.

Supóngase que en un programa se desea realizar dos veces el bucle DESDE...HASTA mencionado en el apartado precedente: la primera con 10 repeticiones y la segunda con 20 repeticiones. La manera inmediata de hacerlo sería repetir dos veces el diagrama representado antes: en la primera se debería mantener el bloque decisión con la condición ¿Es x < 10?, y en la segunda se debería establecer el bloque decisión con la condición  ¿Es x < 20?. Evidentemente, es una solución sencilla pero no resulta estructurada, compacta y elegante.

En su lugar, sería bueno definir un subprograma (Sub 2) que incluyese el código del bucle, y llamar dos veces al subprograma desde el programa principal. Esto plantea el problema de que el número de repeticiones que hace el bucle es fijo (10). ¿Cómo se podría cambiar el nº de repeticiones en el subprograma de forma que se pudiese llamar desde el programa principal ordenándole que realizase cada vez el nº de repeticiones que fuese necesario?. Una solución se puede observar en el siguiente diagrama:

Fijemos la atención en el subprograma Sub 2. En el bloque decisión se ha escrito la condición ¿Es x < y?, es decir, se ha utilizado una nueva variable: la y. Si en el programa principal se fija un valor para la variable y antes de llamar al subprograma Sub 2, se consigue que se realice un nº de repeticiones igual al valor de dicha variable y. Por tanto, y es una variable que permite pasar un valor desde el programa principal hasta el subprograma Sub 2.
Así, el resultado del programa del diagrama anterior es el que se pretendía: realizar en primer lugar 10 repeticiones y después otras 20 más.

De la misma manera, se podría utilizar una variable para pasar un valor desde el subprograma hasta el programa principal. De hecho, siguiendo con el ejemplo anterior, el valor de la variable contador x propia del subprograma se podría "ver" y utilizar sin mayor problema desde el programa principal.

 

3. Regulación variable de velocidad

En el tema 3.3 estudiamos cómo se podía programar directamente la regulación de la velocidad de un motor. Sin embargo, también se puede llevar a cabo también en función del valor de una variable. Es decir, se puede dar un valor entre 0 y 100 a una variable (por ejemplo, la x) y luego utilizarla para establecer la velocidad de giro:

Esto se hace sin más que usar los botones de variable en lugar de los botones numéricos en el cuadro Editar salida:

Nota: en la versión 2.92 de Flowol esta función no se halla disponible directamente para las interfaces FlowGo e intelligent interface, debido a lo que parece ser un "olvido" en la programación interna de Flowol. Sin embargo, es posible utilizar esta función seleccionando antes de comenzar el programa una interfaz distinta, como la Contact Controller Plus, editando después el bloque Salida y  escogiendo la variable deseada y, finalmente, cambiando de nuevo la interfaz FlowGo o intelligent interface.

Esta forma de regulación abre la puerta al diseño de un subprograma en el que se pueda dejar como parámetro modificable la velocidad a la que gira un determinado motor, de modo que dicha velocidad pueda ser fijada a diferentes valores desde el programa principal sin más que asignar distintos valores enteros a una variable.

 

4. Detección de flancos

Hemos visto ya que el bloque decisión permite comprobar el estado de las entradas de una interfaz (digitales y/o analógicas). Merece la pena ahora mencionar algunos casos frecuentes en los que se puede utilizar este bloque.

Supongamos, por ejemplo, que se realiza un montaje en el que se acopla un micropulsador al eje de un motor de c.c, o a un mecanismo reductor intermedio, de forma que una rueda dentada (o una leva) golpee al micropulsador periódicamente. Este sistema se puede utilizar como un sencillo contador de revoluciones del motor (contador de pasos o de impulsos). En definitiva, el conjunto motor, reductor y micropulsador constituyen un simulacro de un "motor paso a paso" (en la figura no se ha representado el sistema reductor, por simplicidad). En muchas ocasiones, es preciso conocer el nº de vueltas que ha realizado el motor. Para ello, se necesita detectar el nº de veces que la leva ha golpeado al pulsador en un determinado intervalo de tiempo. En definitiva, se necesita saber cuándo el micropulsador ha conmutado de estado inactivo a activo, o viceversa; o, lo que es lo mismo: detectar un flanco de subida (o de bajada) de la señal de entrada a la que se halla conectado el pulsador.

La siguiente figura muestra cómo detectar los flancos de una señal. La idea es muy sencilla; para detectar un flanco de subida no hay más que esperar, en primer lugar, a que la señal se halle inactiva para, posteriormente, esperar a que se active (el orden es el opuesto en el caso de un flanco de bajada):

                (1)
Detección de flanco de subida   Detección de flanco de bajada    

De igual manera se podría pensar en detectar un flanco de cualquier clase (subida o bajada) de una señal :

            (2)

es decir, si la señal está inactiva espera a que se active; si, por el contrario, está activa, espera a que se desactive.

Contar las revoluciones del motor equivale entonces a contar los pasos, impulsos o flancos que ha sufrido la señal de entrada en la que se ha conectado el pulsador. Para llevar a cabo el recuento no hay más que utilizar el código de la figura (1) junto con un bucle DESDE...HASTA:

En el código anterior se ha utilizado la variable a como contador de pasos y la variable x como nº total de pasos. Cuando el contador a alcanza el valor x, el código termina con la seguridad de que el sistema ha realizado x pasos.

¿Cuál es la diferencia entre usar los códigos (1) o (2) para contar pasos o flancos?. Si se usa (2) se logrará el doble de precisión, ya que es capaz de detectar tanto los flancos de subida como los de bajada del contador de pasos del motor, mientras que (1) sólo detecta uno u otro.

(2) detecta el doble de flancos que (1) en el mismo intervalo de tiempo y,
 por tanto, permite el doble de precisión en el posicionado de un motor

Por contra, el código (2) resulta más costoso en tiempo de ejecución que el (1), de modo que si se realiza un programa que mueva varios motores simultáneamente contando a un tiempo los pasos de todos (caso del movimiento de las articulaciones de un robot de varios grados de libertad) puede que a Flowol no le dé tiempo a detectar los flancos de todas las señales, con el consiguiente desfase entre la posición real que se obtiene y la que se deseaba conseguir.

Si el programa es suficientemente complejo, lo anterior puede suceder también con el código (1), de modo que es aconsejable establecer el modo más Rápido en la ejecución de Flowol, así como la no representación de Líneas ni Símbolos del flujo del programa a tiempo real (menú Control/Velocidad...):

Fuentes
 

Control y Robótica. Tema: El lenguaje de control Flowol. Curso provincial. Víctor R. González, Asesoría de Tecnología y FP, CFIE Valladolid II.

volver a Inicio