El ciclo While es similar al ciclo Do o al ciclo Repeat-Until en lenguajes de programación basados en texto, un ciclo While, como el mostrado en la figura 3.2, ejecuta el código contenido dentro de este hasta que una cierta condición sea cumplida, es decir, el ciclo While ejecuta el código de manera repetida hasta que la terminal del control del condicional, recibe un valor booleano específico.
El comportamiento y la apariencia de la terminal de control condicional de iteraciones puede ser Continue if True (continúe si es verdadero), que es el valor por default, o Stop if True (deténgase si es verdadero). Cuando el control condicional de iteraciones es Continue if True, el ciclo While ejecuta repetidamente su sub-diagrama hasta que la terminal recibe un valor falso. Cuando el control condicional de iteraciones es Stop if True, el ciclo While ejecuta repetidamente su sub-diagrama hasta que la terminal recibe un valor verdadero.
La terminal del contador de iteraciones i, mostrada en la esquina inferior izquierda del ciclo, contiene el número de iteraciones completas que se han realizado. El contador de iteraciones siempre empieza en 0 durante la primera iteración.
Fig. 3.2. Estructura de ciclo While. Túnel
Contador de Iteraciones
Control del Condicional de Iteraciones
Cuando un valor entra o sale de la estructura de ciclo, se genera automáticamente en el recuadro de la estructura una terminal llamada túnel, cuando se trata de un túnel de entrada esta terminal almacena el valor externo para que esté disponible en cada iteración del ciclo, como este almacenamiento se hace antes de entrar al ciclo, una vez adentro el programa no puede leer el valor externo.
NOTA IMPORTANTE: Nunca conecte el control del condicional del ciclo de manera
externa pues el programa se quedaría ciclado
Para colocar ciclos While en el diagrama se selecciona While Loop de la sub-paleta Structures en el diagrama de bloque como se muestra en la figura 3.3.
Fig. 3.3. Acceso a la estructura de ciclo While en la sub-paleta de estructuras.
Una vez que se ha seleccionado esta estructura el cursor del ratón se convierte en un puntero especial que se utiliza para encerrar la sección del código que se desea repetir. Dando un primer click al botón del ratón se define la esquina superior-izquierda de lo que será el área del ciclo, dando un segundo click al botón del ratón se define lo que será la esquina inferior izquierda, de esta manera se coloca la frontera del ciclo While alrededor del código seleccionado. También es posible agregar nodos adicionales arrastrándolos dentro del ciclo While si es necesario.
3.2 CICLO FOR
Un ciclo For, como el mostrado en la figura 3.4, ejecuta el código contenido dentro de él una cierta cantidad de veces determinada por el valor numérico conectado en la terminal del control de iteraciones N.
La terminal del contador de iteraciones i, mostrada en la esquina inferior izquierda, contiene el número de iteraciones completas que se han realizado. Al igual que en el ciclo While el contador de iteraciones siempre empieza en 0 durante la primera iteración.
Como el ciclo ejecuta la cantidad de iteraciones conectadas a la terminal N y el contador i siempre empieza con un valor de 0, entonces el valor final del contador de iteraciones siempre será igual a N-1.
Considere para los ciclos For el mismo comportamiento de generación de túneles para la conexión de valores externos que el definido para los ciclos While.
Fig. 3.4 Estructura de ciclo For.
Coloque ciclos For en su diagrama seleccionando For Loop de la sub-paleta
Structures en el diagrama de bloque como se muestra en la figura 3.5.
Fig. 3.5. Acceso a la estructura de ciclo For en la sub-paleta de estructuras.
Una vez que se ha seleccionado esta estructura el cursor del ratón se convierte en un puntero especial que se utiliza para encerrar la sección del código que se incluir dentro del
click Contador de Iteraciones Control de Iteraciones
ciclo. Dando un primer click al botón del ratón se define la esquina superior-izquierda de lo que será el área del ciclo, dando un segundo click al botón del ratón se define lo que será la esquina inferior izquierda. También es posible agregar nodos adicionales arrastrándolos dentro del ciclo si es necesario.
3.3. REGISTROS DE CORRIMIENTO
Los registros de corrimiento son terminales que se pueden activar en las estructuras de los ciclos While y For para almacenar temporalmente los valores generados en variables determinadas durante la iteración actual para ser utilizados en iteraciones posteriores
Para agregar un registro de corrimiento en una estructura de ciclo, haga click derecho sobre el contorno de la estructura y seleccione Add Shift Register del menú emergente como se muestra en la figura 3.6.
Por omisión (default) los registros de corrimiento permiten almacenar solo el valor la iteración anterior, cuando necesitamos aumentar esta capacidad de almacenamiento para más iteraciones, simplemente agregamos elementos de almacenamiento al mismo registro de corrimiento haciendo un click derecho en la terminal del registro y seleccionando Add Element del menú emergente, tal como se muestra en la figura 3.7. Se pueden adicionar tantos elementos de memoria como sean necesarios
Fig. 3.7. Agregando elementos de memoria a un registro de corrimiento
La operación de los registros de corrimiento es muy sencilla. Antes de iniciar las iteraciones del ciclo, los elementos de memoria son inicializados con los valores conectados por fuera del ciclo, este paso es importante debido a que si no se inicializan con un valor conocido, los elementos de memoria podrían contener “basura” que podría afectar el desempeño del código.
En la primer iteración del ciclo, i=0, los elementos de memoria transfieren se contenido hacia el interior del ciclo y se efectúa el código programado, en este paso también se asigna en la terminal correspondiente el nuevo valor que será almacenado en el registro.
Antes de ejecutar la siguiente iteración, i=1, el valor almacenado en la iteración anterior es transferido al primer elemento de memoria, el valor contenido en este se transfiere al segundo y así sucesivamente efectuando un corrimiento de los valores almacenados en el registro, el valor en el último elemento de memoria se elimina y un nuevo valor es almacenado en la terminal correspondiente para ser transferido en la siguiente iteración, este comportamiento se repite para el resto de las iteraciones del ciclo.
La figura 3.8 muestra de manera gráfica la operación de un registro de corrimiento con cuatro terminales de memoria.
Fig. 3.8. Operación del registro de corrimiento a) antes de ejecutar i=0, b) i=0, c) antes de ejecutar i=1,2,3…N-1, d) i=1,2,3…N-1
Los registros de corrimiento pueden almacenar cualquier tipo de variable y también se pueden activar en los ciclos While.
3.4. NODOS DE RETROALIMENTACIÓN
Los nodos de retroalimentación son una estructura que nos permite retroalimentar un valor de salida en la iteración de un ciclo para utilizarlo como entrada en la siguiente iteración, su función es similar a la de un registro de corrimiento con solo un elemento de memoria.
Al igual que en caso de los registros de corrimiento, es conveniente siempre inicializar los nodos de retroalimentación en la terminal respectiva.
Fig. 3.9. Nodo de retroalimentación en un ciclo For.
Coloque nodos de retroalimentación en su diagrama seleccionando Feedback Node de la sub-paleta Structures en el diagrama de bloque como se muestra en la figura 3.10.
Fig. 3.10. Acceso a los Nodos de Retroalimentación click
Los nodos de retroalimentación, al igual que los registros de corrimiento, también aceptan cualquier tipo de variable para su almacenamiento.
3.5. CASE
Las estructuras Case (de caso) nos permiten ejecutar un código específico dependiendo del valor de una variable de entrada en una terminal de selector. Solo se puede ver un cuadro de caso a la vez, así que para cambiar de un cuadro de caso a otro se hace un click en las flechas correspondientes en el encabezado del cuadro. Cuando un valor exterior entra a un cuadro de caso se genera un túnel que pone el mismo valor de entrada disponible para todos los cuadros de caso. Cuando un valor debe salir de un cuadro de caso, el túnel de salida que se genera debe tener algún valor asignado para todos los casos o se mostrara en color blanco (vacío) y generará un error de sintaxis.
Dependiendo del tipo de variable de entrada las estructuras Case pueden ser: booleano, string o numérico.
a) b) c)
Coloque estructuras Case en su diagrama seleccionando Case Structure de la sub- paleta Structures en el diagrama de bloque como se muestra en la figura 3.12
Fig. 3.12. Acceso a la estructura Case en la paleta de funciones
3.5.1. Case Booleano
Para una entrada Booleana la estructura Case se comporta de manera similar a los enunciados if-then-else (si-entonces-de otro modo) comunes en otros lenguajes de programación basados en texto. Si el valor booleano de la entrada es verdadero (true), se ejecuta el código dentro del cuadro del caso verdadero; de otra manera se ejecutara el código dentro del cuadro del caso falso (false)
3.5.2. Case String
Para una entrada de cadena de caracteres (string), se ejecuta solamente el código contenido en el cuadro del caso que corresponda exactamente con la cadena en la entrada de selector, si el valor no coincide con ninguno de los casos, entonces se ejecuta el caso que este marcado como caso por omisión (default).
Por omisión (default) todas las estructuras case aparecen como Case Booleano, para convertir a Case String simplemente conecte una variable tipo string en la terminal de selector y la estructura Case se convertirá automáticamente. Con la herramienta de texto cambie las cadenas “True” y “False” que aparecen por default tecleando la cadena que quiere asignar en cada caso especifico. Para agregar más cuadros de caso haga click derecho tocando el cuadro de la estructura Case y seleccione Add Case After del menú emergente. Es posible agregar tantos cuadros de caso diferentes como sea necesario
3.5.3. Case Numérico
Para una entrada de valor numérico conectada en la entrada del selector de la estructura Case se ejecuta solamente el código contenido en el cuadro del caso que corresponda exactamente con el valor numérico en la entrada de selector. Si el valor de entrada esta fuera de rango de los casos definidos, al igual que en los Case String, LabVIEW escogerá el caso designado por omisión (default).
3.6. ESTRUCTURAS DE SECUENCIA
En un lenguaje basado en texto, las declaraciones del programa generalmente se ejecutan en el orden en que aparecen.
Por otro lado, en un lenguaje basado en flujo de datos como LabVIEW, un nodo se ejecuta cuando los datos están disponibles en todas sus terminales de entrada por lo cual algunas veces es difícil determinar el orden exacto de ejecución de las funciones.
Cuando se necesita controlar de manera estricta el orden de la ejecución del código en el diagrama de bloques, se hace necesario utilizar una estructura de secuencia (Sequence Structure).
Las estructuras de secuencia lucen como un pedazo de rollo de película. Como se muestra en la figura 3.13 existen dos tipos diferentes para esta estructura: la estructura de secuencia apilada y la estructura de secuencia extendida.
a) b)
Coloque estructuras de secuencia en su diagrama seleccionando Stacked Secuence o Flat Secuence de la sub-paleta Structures en el diagrama de bloque como se muestra en la figura 3.14.
Fig. 3.14. Acceso a la estructura de secuencia en la paleta de funciones
3.6.1. Secuencias Apiladas
Las estructuras de secuencia apiladas solo muestran un cuadro de secuencia a la vez, de manera similar a las estructuras de caso, solo que a diferencia de estas, todos los cuadros ejecutan de manera secuencial el código contenido en ellos.
Para agregar cuadros a una secuencia se hace un click derecho sobre la estructura y se selecciona Add Frame After o Add Frame Before del menú emergente, tal como se muestra en la figura 3.15.
Fig. 3.15. Agregando cuadros a una secuencia.
Cuando se requiere transferir valores entre diferentes cuadros de una estructura de secuencia apilada, se debe activar las terminales de almacenamiento local haciendo un click derecho sobre la estructura y seleccionando Add Local Secuence, tal como se muestra en la figura 3.16. Este tipo de terminal almacena un valor generado en un cuadro de secuencia para que pueda ser utilizado en los cuadros siguientes.
Fig. 3.16. Agregando terminal de almacenamiento local a una estructura de secuencia.
3.6.2. Secuencias Extendidas
Las estructuras de secuencia extendida realizan exactamente la misma función que las estructuras de secuencia apiladas descritas anteriormente, la única diferencia es que las secuencias extendidas muestran simultáneamente todos los cuadros de secuencia de manera que se puede visualizar simultáneamente el código contenido en toda la estructura.
La transferencia de valores entre distintos cuadros de una secuencia extendida se realiza a través de túneles simples como los empleados en otras estructuras.
Para convertir una secuencia apilada en secuencia extendida y viceversa se hace click sobre la estructura y se selecciona Replace / Replace with Flat Secuence o Replace with Stacked Secuence según sea el caso, tal como se muestra en la figura 3.17.
Fig. 3.17. Acceso a la estructura de secuencia en la paleta de funciones
3.7. NODOS DE FÓRMULA
Algunas veces es preferible programar expresiones matemáticas con funciones basadas en texto, en lugar de hacerlo con iconos (los que pueden tomar mucho espacio en el diagrama). Los nodos de fórmula nos permiten implementar ecuaciones complicadas usando instrucciones basadas en texto.
Compare los ejemplos mostrados en la figura 3.18 de una misma expresión matemática evaluada en forma de diagrama y con un nodo de fórmula.
a) b)
Fig. 3.18. Expresión matemática evaluada a) en diagrama, b) en nodo de fórmula
Coloque nodos de fórmula en su diagrama seleccionando Formula Node de la sub- paleta Structures en el diagrama de bloque como se muestra en la figura 3.19.
Fig. 3.19. Acceso a los nodos de fórmula en la paleta de funciones
La cajas de este nodo pueden cambiar de tamaño para introducir formulas algebraicas directamente a los diagramas de bloque. Para agregar variables, se hace un click derecho sobre la estructura y se selecciona la opción de agregar entrada (Add Input) o agregar salida
(Add Output), tal como se muestra en la figura 3.20
Fig. 3.20. Agregando terminales de entrada y de salida a un nodo de fórmula
Hay que nombrar las variables de la misma manera en que serán usadas dentro del nodo de formula (los nombres son sensibles a las mayúsculas).
Todas las declaraciones independientes entre sí deben terminar siempre con un punto y coma (;).
Al usar varias fórmulas en un solo nodo de fórmula, cada variable asignada (las que aparecen en la parte izquierda de cada fórmula) deben de tener una terminal de salida en el nodo de fórmula. Sin embargo, estas terminales de salida no necesitan estar cableadas si no se requiere su valor de salida
En los nodos de fórmula es posible utilizar funciones estándar como: abs, acos, acosh,
asin, asinh, atan, atan2, atanh, ceil, cos, cosh, cot, csc, exp, expm1, floor, getexp, getman, int, intrz, In, Inp1, log, log2, max, min, mod, pow, rand, rem, sec, sign, sin, sinc, sinh, sqrt, tan, tanh.
También se puede utilizar estructuras de programación como If –then, for, case, entre muchas otras, utilizando la sintaxis del lenguaje C (específicamente ANSI C).