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 subprogramasEn 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 En su lugar, sería bueno definir un subprograma (
Fijemos la atención en el subprograma 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
3. Regulación variable de velocidadEn 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:
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 flancosHemos 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 inter 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):
De igual manera se podría pensar en detectar un flanco de cualquier clase (subida o bajada) de una señal :
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 ¿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 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
|