Control de flujo

 

 

Introducción

En Flowol los bloques se ejecutan sucesivamente uno tras otro (secuencialmente). Esto define un camino o dirección (flujo) según la cual se va desarrollado el programa. Sin embargo, habrá  momentos en que el programa deba ejecutar determinadas partes dependiendo del estado en el que se halle el propio programa, las variables o las entradas de control. Esto permitir modificar el orden de la ejecución para adaptarse al estado del programa, y bifurcar hacia nuevas secciones del mimo o hacia subprogramas cuando se cumplan ciertas condiciones, que el programador fija de antemano. En Flowol el mecanismo que permiten llevar esto a cabo es:

Con él, se pueden detectar los diferentes estados de las entradas de control y/o realizar distintas clases de bucles.

Volver al principio de página

 

El bloque "Decisión"

Este bloque realiza la operación lógica: "Si se cumple una condición, entonces dirígete a...." (equivale a la instrucción IF de otros lenguajes textuales, como BASIC o C).

Se trata de un bloque con una entrada y dos salidas. Permite bifurcar el flujo del programa entrante entre dos vías de salida alternativas (o una o la otra, pero no ambas). La elección de una u otra depende de si la evaluación de la condición especificada resulta en un valor verdadero o falso.

Para insertar este bloque en un punto del programa, no hay más que pulsar sobre el "rombo" de la barra de herramientas, arrastrarlo y hacer click en el punto seleccionado. En este momento se abre el cuadro de diálogo Editar decisión que permite introducir la condición que dará lugar a la bifurcación.

Para editar la condición se pulsará en el botón Es del cuadro anterior, de modo que se obtiene:

Con éste cuadro se puede construir la condición en función del valor que toman:

Por ejemplo, para comprobar si el 2º sensor digital está en activo habría que seguir la secuencia:

    pulsar el botón Entrada

    pulsar el botón 2

    pulsar el botón activa

con lo que se tiene:

y al pulsar Aceptar se obtiene:

En el caso de sensores analógicos se actúa de forma similar pero pulsando el botón Val:

y una vez seleccionado el nº de sensor, 

construir la condición utilizando los operadores relacionales:

para llegar a un resultado del tipo:

Análogamente, para construir condiciones dependientes del valor de las variables habría que pulsar los botones a, b, ..., x, y, z:

para obtener condiciones del tipo:

La bifurcación del flujo entrante en función del valor de la condición se lleva a cabo añadiendo dos líneas de salida al bloque "Decisión". Una línea sigue el flujo del programa en caso de que la respuesta a la condición sea verdadera y otra línea en caso de que sea falsa. En Flowol la primera línea se denomina línea SÍ y la segunda línea NO.

Para incluir una línea SÍ no hay más que pulsar el botón SI de la barra de herramientas y hacer clic primero en el bloque "Decision" y segundo en el bloque que se desea ejecutar inmediatamente después de evaluar la condición verdadera.

Análogamente, para trazar la línea NO no hay más que pulsar el botón NO y unir el bloque "Decisión" con el bloque destino en caso de condición falsa:

Volver al principio de página

 

Los bucles

Un bucle es un conjunto de instrucciones que se ejecutan repetidamente hasta que se alcanza una condición de fin de bucle, o condición de salida.

Flowol no proporciona ningún bloque específico para realizar bucles pero estos se pueden llevar a cabo utilizando el bloque "Decisión" de forma adecuada y también  usando alguna de las variables como contador.

Supongamos que queremos ejecutar un proceso (por ejemplo, el subprograma Sub 1) mientras que uno de los sensores digitales (por ejemplo, la entrada digital 1) esté activo. Para lograrlo, no tenemos más que insertar un bloque "Decisión" que compruebe el valor del sensor y, si está activo (condición SI), llame al subprograma, realimentando de nuevo la entrada del bloque "Decisión" con la salida del subprograma; por el contrario, si el sensor se ha desactivado (condición NO), debe seguir el flujo principal del programa:

En otros lenguajes de programación, a un proceso repetitivo de este tipo se le denomina bucle WHILE (se repite MIENTRAS que se cumpla una determinada condición).

 

Supongamos que deseamos ejecutar un proceso (por ejemplo, el subprograma Sub 1) 10 veces seguidas y, 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, por ejemplo, la x, asignarle 0 como valor inicial e incrementarla en una unidad comprobando con un bloque "Decisión" cuándo alcanza el valor 10:

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 otros lenguajes de programación a un proceso repetitivo de este tipo se le denomina bucle FOR (se repite DESDE que la variable contador  toma un valor HASTA que toma otro).

Volver al principio de página

 

Detección del estado de las entradas: algunos casos de interés

Hemos visto anteriormente que el bloque decisión permite interrogar acerca del 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 un tope golpee al micropulsador periódicamente. Este sistema se puede utilizar como un sencillo de contador de revoluciones del motor (contador de pasos o de impulsos). En definitiva, el conjunto motor, reductor y micropulsador constituyen un simulacro de "motor paso a paso". En muchas ocasiones, es necesario conocer el nº de vueltas que ha realizado el motor. Para ello, se necesita detectar el nº de veces que el tope 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 (en 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 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 FOR:

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, puesto que es capaz de detectar tanto los flancos de subida como los de bajada del contador de pasos del motor, mientras que con (1) sólo detectamos uno u otro.

(2) detecta el doble de flancos que (1) en el mismo intervalo de tiempo y,
 por tanto, permite más 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 al 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 consigue y la que se deseaba obtener.

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...):

Volver al principio de página

Ir al índice de "El lenguaje de control Flowol"

2004 Víctor R. González

volver a Inicio