Instrumentación Virtual con LabVIEW ESTRUCTURAS WHILE FOR.. CASE SEQUENCE Opciones de selección de CASE Controles Visibles Variables Locales Do While Loop Terminal de Iteración Do While condición is true Execute Sub diagram Loop Terminal Condicionante Ejecuta una rutina hasta que la condición terminal se cumple. •While Loop revisa la condición al final del ciclo. •El ciclo se ejecuta al menos una vez. •El terminal de iteración contiene el número de veces que el ciclo se ha ejecutado. Do While Loop La primera iteración inicia en cero Con Click derecho derecho podemos cambiar la condición For Loop Contador de Ciclos: indica cuantas veces se repite el subdiagrama Si N es cero o negativo el ciclo no se ejecuta For I=0 to N-1 Ejecuta Código Next I Dos atributos: N – Terminal de conteo i - Terminal de Iteración Terminal de iteración Contiene el número de iteraciones completas A partir de LabVIEW7, haciendo click sobre “WHILE loop” en el diagrama de bloques puede cambiarse por “FOR loop” EJECUTA UN SUBDIAGRAMA UN DETERMINADO NÚMERO DE VECES NOTA: El CERO es indexado y aparece en la primera iteración Se obtiene el último resultado Se almacenan en cada celda de la matriz los resultados parciales Shift Register • “Shift registers” se utiliza tanto en los WHILE LOOP como en FOR LOOP. • Se usan para transferir datos desde una iteración a la siguiente. • Son similares a las variables estáticas en los lenguajes de programación basados en texto. • Un “Shift register” se crea haciendo click sobre el borde derecho o izquierdo del loop y seleccionando “Add Shift registers” desde el menú emergente. • Los datos a cablear en los terminales de cada SR deben ser del mismo tipo. Ejercicio: Obtener el penúltimo y último resultado del cuadrado de los primeros cinco números naturales “Shift Registers” Para crear un Shift Register se hace clic derecho en cualquiera de los bordes verticales y se abre el menú contextual que se ve a continuación y elegimos Add Shift Register y se crea un par entrada - salida Los valores previos están disponibles en los terminales de la izquierda Shift Register 1 Contiene i – 1 Contiene i – 2 Contiene i – 3 Shift Register 2 El último valor pasa al terminal de la derecha Contiene i Para agregar mas elementos se hace clic derecho en el borde izquierdo o derecho, según donde se quiera agregar el elemento, desde el mismo menú contextual Sentencias de Selección: Case Structures Esta estructura es equivalente a IF/ THEN/ ELSE If condition=TRUE THEN Execute code ELSE Execute Code End If CASE SELECT structures CASE SELECT var var=1, do code1 var=2, do code2 var=3, do code3 otherwise, do code Case Structures Botones para pasar de un diagrama a otro Selector Identificador del Subdiagrama La estructura CASE tiene al menos dos subdiagramas, uno para TRUE y otro para FALSE Acá podemos ver todas las posibilidades de variables de control para la estructura case Vamos a ver un ejemplo de uso de cada uno de ellos, aplicándolos sobre la misma estructura CASE de solo dos subestructuras con el fin de poder comparar, teniendo en cuenta que la limitación la impone el control booleano, que tiene sólo dos valores posibles: TRUE y FALSE Usando un control numérico: el valor del indicador Numeric 2 cambiara sólo para los valores posibles, 0 y 1, para cualquier otro valor no Su valor va de acuerdo al tipo de control que se usa Usando un control Booleano: el valor del indicador Boolean cambiara sólo para los valores posibles, True y False Su valor va de acuerdo al tipo de control que se usa Usando un control Ring: 0 y 1 Previo a eso vamos a ver como trabaja el control Ring El control ring lo que hace es establecer una correspondencia entre un valor tipo string y un número, asignando valores consecutivos desde 0 en adelante. Se encuentra en la paleta Controls en el Panel Frontal En la figura lo vemos recuadrado en celeste Su apariencia en el Panel Frontal es la siguiente: Como vemos, similar a cualquier control Con clic derecho abrimos el menú contextual y vamos propiedades: Al abrir propiedades nos aparece la siguiente pantalla y vamos a ir a la pestaña Edit Items: Hacemos clic en Insert y colocamos el texto que corresponde al valor numérico 0 (Item A en nuestro ejemplo) Hacemos nuevamente clic en Insert y colocamos el texto que corresponde al valor numérico 1 (Item B en nuestro ejemplo) Como vemos el valor 0 siempre corresponde al último ítem colocado, pero podemos cambiar el orden de ser necesario con el uso de los botones Move Up y Move Down : Retomemos nuestro ejemplo con la configuración del cuadro original: A el valor “A” le corresponde “1” Usando un Tab control: Se encuentra en el Panel Frontal, en la subpaleta Containers y aparece recuadrado en celeste En el Panel Frontal nos aparecerá: En cada pestaña podemos poner elementos distintos Vamos a hacer una pequeña modificación al programa para ver el uso del Tab Control: Vamos a agregar un Indicador para el Producto y otro para la Suma Producto Vamos a hacer una pequeña modificación al programa para ver el uso del Tab Control: Vamos a agregar un Indicador para el Producto y otro para la Suma Suma Vamos a usar con control rotativo (Knob) para hacer con un CASE las cuatro operaciones aritméticas. El Panel Frontal sería: CASE: 0, Default Se ha colocado una constante para forzar un 0 en el resultado CASE: 1 CASE: 2 CASE: 3 CASE: 4 Haciendo invisibles controles e indicadores Vamos a ver como hacemos para mostrar u ocultar un control o indicador Para nuestro ejemplo vamos a usar un indicador tipo termómetro Panel Frontal Diagrama de Bloques Hacemos clic derecho en el ícono del Diagrama de Bloques o en el Panel Frontal y se despliega el menú contextual, allí elegimos: CreateProperty NodeVisible En el Diagrama de Bloques nos aparece este instrumento: Por defecto la variable lógica “Visible” está como salida (control), con clic derecho sobre este ícono lo cambiamos por un indicador (Change to Write) Ahora el ícono queda: Agregamos una variable lógica en el panel de control y la conectamos a la entrada “Visible”. Al accionar el switch tenemos: Sentencias de secuenciación En lenguajes tradicionales basados en texto, el orden de ejecución lo impone el orden en que las instrucciones están escritas. En LabVIEW sigue el modelo de Flujo de Datos, (un nodo necesita tener disponibles todos los datos de sus entradas para ejecutarse), por lo tanto no se puede determinar cual es el orden de las tareas a ejecutar. Puede presentarse el caso de nodos independientes, en situación de ejecutarse simultáneamente, pero por manejo de los datos, es necesario fijar el orden de los mismos, es decir establecer una secuencia de ejecución. Sentencias de secuenciación • Se trata de un tipo de sentencia que garantiza la ejecución secuencial (uno detrás de otro) de varios módulos de código. • Cuando en el diagrama de LabVIEW son definidos varios módulos de código, en realidad no se sabe en qué orden van a ser ejecutados, es decir, no se sabe cuál de ellos se ejecutará en primer lugar y cuál en el último lugar. Hay aplicaciones en las que este orden de ejecución no es importante, pero en otras es de vital importancia. Por ello, en las aplicaciones donde el orden de ejecución de los distintos módulos es crítico, resulta imprescindible utilizar las sentencias de secuenciación para garantizar esa secuencia de ejecución de los módulos. Sentencias de secuenciación La herramienta de desarrollo de aplicaciones LabVIEW ofrece dos sentencias de secuenciación. La primera es la Flat Sequence Structure y se encuentra en Functions/Programming/Structures. Cuando es insertada en el diagrama de nuestra aplicación, aparece con una única ventana o Frame: es la unidad o elemento donde irá un módulo dado del código de nuestra aplicación. Para añadir más ventanas, se pulsa sobre la ventana con el botón derecho del ratón y se ejecuta Add Frame Before o Add Frame After, para añadir la ventana antes o después de la actual, respectivamente. En este ejemplo vemos un instrumento que primero simula el llenado de un tanque y luego el aumento de temperatura. Sentencias de secuenciación Se pueden anidar estas estructuras sin problema ni límites de niveles Sequence 3 Sequence 1 Sequence 2 Sequence 4 Ejemplo Flat Sequence Ejemplo: hacer un instrumento que prenda en secuencia 5 leds en forma cíclica de izquierda a derecha Sentencias de secuenciación Cuando son necesarias muchas ventanas, porque así lo requiere la aplicación, aparece el problema del espacio en el diagrama, de tener que desplazar varias pantallas desde el inicio de la secuencia hasta su final. Entonces, lo lógico es sustituir la sentencia Flat Sequence Structure por la sentencia Stacked Sequence Structure, la cual funciona exactamente igual que la anterior, solo que apila las ventanas una encima de otra. Aunque a simple vista no sea posible ver la secuencia, resulta muy práctico su uso cuando el espacio disponible es pequeño. Sentencias de secuenciación Vamos a repetir el ejemplo del tanque y el termómetro con la estructura secuencial apilada. Nos quedaría algo así: Panel Frontal Cuadro 0 Cuadro 1 Trabajando con Variables Variable Local Variable Global Variable Compartida Trabajando con Variables Muchas veces dentro de la programación es necesario almacenar el valor de una variable para poder usarla posteriormente. En LabVIEW también puede realizarse estas sentencias, almacenando una variable para luego usarla dentro de otro bloque del VI o bien en otro VI. LabVIEW dispone de dos tipos de variables locales y globales y a partir de la versión 8.0 las compartidas. Creación de una Variable Local Construimos el siguiente VI, utilizando una Flat Sequence Structure Creación de una Variable Local A continuación le agregamos un cuadro a la secuencia, que consistirá en una variable local que almacenará el último número generado y lo presentará en el PF. La variable local la seleccionamos dentro de Data comunications y es la que esta recuadrada en celeste: Creación de una Variable Local A continuación hay dos pasos fundamentales a realizar: Primero: determinar a que objeto del programa va a estar enlazado Segundo: elegir si va a ser de lectura (read) o escritura (wirte). Para el caso del ejemplo hacer click derecho sobre la variable local y seleccionar Select Item/Numeric y luego Change to Read De esta forma queda definido para guardar el contenido de Numeric y pasarlo a la siguiente etapa Creación de una Variable Local Finalmente le agregamos un indicador a la variable y ejecutamos el programa, comprobando que este termina con dos indicadores con valores idénticos, es decir el último número registrado: Como podemos ver, después de la ejecución los dos indicadores quedan con el mismo valo, tal como era de esperarse