LabVIEW: Entorno gráfico de programación

- -
- 100%
- +

Figura 1-31. Explorador de librerías.
Además del uso de los ficheros LLB, también se podrán utilizar librerías de proyecto empaquetadas. Estas nuevas librerías sólo se pueden crear dentro del ámbito de un proyecto, que se estudiará en la siguiente sección.
Otra alternativa a la hora de guardar VI es hacerlo en forma de plantillas (templates). Estos ficheros tienen por extensión *.VIT (o *.CTT para controles). Sirven para guardar en ellos códigos o componentes muy habituales. Son exactamente igual que los VI excepto que en lugar de abrirse el fichero de la plantilla, LabVIEW abrirá una copia como un VI.
Finalmente, resta comentar la posibilidad de crear VI Express mediante Tools > Advanced > Create or Edit Express VI...
1.5.2. Polimorfismo
Al igual que en otros lenguajes, LabVIEW también admite el polimorfismo o sobrecarga de funciones, lo que significa que puede haber funciones distintas bajo el mismo nombre. En principio, todos los VI que componen un VI polimórfico pueden tener distinto tipo de datos en las entradas; la función concreta a usar se puede adaptar a las entradas o seleccionarse de forma manual mediante un pequeño menú bajo el icono del VI. Muchas de las funciones y VI disponibles en la paleta de funciones son polimórficos.
Para crear un VI polimórfico debe partirse de los VI que lo compongan por separado; cada una de las instancias del VI polimórfico debe tener la misma interfaz (la misma estructura en el conector), aunque el tipo de datos obviamente puede ser diferente. En la figura 1-32 se muestra el código fuente de tres VI con los que se creará un VI polimórfico.

Figura 1-32. Código fuente de tres VI con los que crear un VI polimórfico.
Una vez creados los VI con sus respectivos conectores, se debe ir a File > New…> Polymorphic VI. En esta ventana se pueden unir todos los VI en un único fichero como se ve en la figura 1-33.

Figura 1-33. Creación de VI polimórfico.
En la figura 1-34 está el resultado. En la parte izquierda se selecciona automáticamente la instancia concreta del VI a usar de acuerdo al tipo de datos que se conecta, y en la derecha se muestra un VI que en su parte inferior tiene un selector para elegir de forma manual la instancia.

Figura 1-34. Utilización del VI polimórfico.
1.6. Proyectos
Antes de LabVIEW 8.x la organización de proyectos de tamaño medio o grande era complicada, siendo exclusivamente responsabilidad del programador que debía ordenar los VI en directorios en el disco (algo que en la práctica no solía ocurrir) e incluir la documentación y el resto de ficheros necesarios.
La versión 8.0 de LabVIEW introdujo la opción de agrupar todos los ficheros en un proyecto. El proyecto consiste en un fichero en formato XML, con extensión *.LVPROJ que indica qué ficheros componen el proyecto y cómo se ordenan. Los ficheros que componen el proyecto pueden ser VI, controles, ficheros de configuración (por ejemplo para crear un ejecutable), documentación o cualquier otro fichero.
La ventana desde la que se gestiona el proyecto se llama Project Explorer, y muestra el aspecto de la figura 1-35.

Figura 1-35. Explorador del proyecto.
Los ficheros se pueden agrupar en directorios. Para organizar el código también puede ser útil emplear librerías. En el contexto de un proyecto estas librerías no deben confundirse con ficheros LLB, ya que simplemente es otro fichero XML con referencias a los ficheros contenidos y la descripción de sus propiedades. Dentro de las librerías los elementos pueden ser públicos (accesibles desde otras partes del proyecto), privados (accesibles sólo desde otros VI de la misma librería) o community (accesibles desde VI de la misma librería o desde VI de otras librerías marcadas como ‘amigos’ en sus propiedades), lo que es útil para distribuir código entre varios programadores. Para definir los elementos públicos o privados hay que acceder a las propiedades de la librería desplegando su menú contextual > Properties > Item Settings/Friends.
La ventana del proyecto se divide inicialmente en tres ítems:
• My Computer: es el target. En él se muestran los ficheros que componen el proyecto y sus propiedades. De cada target descienden Dependencies y Build Specifications. Al programar sobre otras plataformas también aparecerán otros targets, como una PDA o una FPGA.
• Dependencies: muestra las dependencias del proyecto, por ejemplo librerías compartidas (*.dll).
• Build Specifications: guarda la configuración para las distribuciones del proyecto como archivos comprimidos, ejecutables, librerías, instaladores, librerías empaquetadas, servicios web, etc.
La creación de ejecutables y dll se verá en la sección 12.3, mientras que los servicios web en la sección 9.4. Ahora veremos las librerías empaquetadas. Para crear una debemos acceder al menú contextual de la opción Build Specifications del proyecto. En ese momento aparecerá un asistente en el que, a través del menú de categorías, hay que configurar el nombre de la librería, los ficheros que la componen (los VI visibles se marcarán como top level y deben estar en un lvlib), dónde se guardará, etc. El resultado es un único fichero con extensión *.lvlibp que contiene los VI ya compilados.
1.7. Depuración de código
Cuando se hace un programa es normal cometer errores. Depurar es el proceso de encontrar y corregir los fallos del programa. LabVIEW dispone de varias herramientas para ayudar al programador en esta tarea.
La detección de errores de lo que se podría llamar la sintaxis del lenguaje es automática y simplemente consiste en impedir que se ejecute el VI que contiene un error. Para ello, el botón RUN se sustituye por List Errors y se cambia el icono de la barra de herramientas por uno que simboliza una flecha rota

Al presionar este botón aparece una lista de los errores y warnings del programa. Al seleccionar un error aparece una descripción en la parte inferior, y haciendo doble clic o presionando el botón Show Error se traslada el foco del programa a la parte donde se ha producido el fallo.
En la figura 1-36 se indica que hay tres errores en el código:
• Una estructura CASE cuyo selector no tiene nada cableado.
• Una función de suma que presenta errores en sus terminales.
• Un cable ‘roto’, más concretamente que no tiene final.

Figura 1-36. Lista de errores de un VI.
Aparte de los errores sintácticos, puede haber otros debido a innumerables motivos. Una herramienta muy usada en este caso es la Highlight Execution, representada por un icono con forma de bombilla de luz en la barra de herramientas. Cuando esta opción está activada, la ejecución se ralentiza y se puede ver el fluir de los datos por el Diagrama de Bloques. Ésta es una de las herramientas más utilizadas en LabVIEW y muy útil para entender el funcionamiento de otros VI.
A veces, en un programa grande puede ser inviable esperar a que el flujo de ejecución llegue a la parte deseada con la Highlight Execution. Para ello se pueden usar los breakpoints o puntos de ruptura. Éstos se seleccionan en la paleta de herramientas y después se presionan sobre el objeto en el que se desea establecer el punto de ruptura. El objeto puede ser un cable o una estructura o una función (Figura 1-37). Al crear un breakpoint aparece una marca roja indicando su situación. En la siguiente imagen se pueden apreciar tres puntos de ruptura: en el interior de la estructura WHILE, en el cable entre el control de x y la función suma y en la propia función.

Figura 1-37. Utilización de puntos de ruptura para depuración de código.
Una vez seleccionados los puntos de ruptura, se puede ejecutar el programa de forma normal y al llegar la ejecución a uno de ellos, ésta se detendrá automáticamente, igual que si se hubiera pulsado el botón Pause de la barra de herramientas (el cual pasa a tener fondo rojo y se transforma en Continue). Cuando se detiene la ejecución, se puede volver a reanudar con la opción Highlight Execution activada.
Desde la versión 8.6 se dispone de un manejador de breakpoints al que se puede acceder desde View > Breakpoint Manager. En este programa se podrán habilitar, deshabilitar y borrar los breakpoints colocados en el programa.
Si lo que se desea es obtener el valor de un dato cualquiera sin detener ni ralentizar la ejecución, se puede usar la herramienta Probe (Figura 1-38). Se puede activar sobre un control, indicador o cable usando la paleta de herramientas o el menú contextual del cable; cuando se coloque aparecerá una ventana flotante llamada Probe Watch Window en la que puede verse el valor del dato seleccionado en tiempo real de cada uno de los probe del programa. Incluso en determinados tipos de datos se puede disponer de una visualización en gráficos o tablas.
Otra utilidad de los probe es crear un Custom Probe con una condición. En ese caso, cuando se cumpla la condición, el VI se detendrá igual que si hubiera un breakpoint. En este caso aparecerá en Probe Watch Window una nueva pestaña en la que definir las condiciones en las cuales parará la ejecución del programa. Por ejemplo, una condición puede ser que el contenido de un indicador sea un determinado valor. Cuando se coloca un probe sobre un cluster de error, esta opción aparece como una nueva pestaña.
También se puede dotar a un probe de características avanzadas programándolas. A esta opción se puede acceder desde el menú contextual de los cables Custom Probe > New… Al crear un Custom Probe aparece un asistente que guía en su creación. Finalmente, se guarda el VI que implementa el Custom Probe. El Custom Probe permite crear un nuevo programa dentro del propio probe que, por ejemplo, puede guardar los valores en un fichero, parar el programa con una condición que no puede ser especificada mediante el método anterior o enviar una alarma por email. El VI creado como Custom Probe dispone de un indicador con el valor del cable y otro control booleano para indicar si se debe detener la ejecución.
Otro método más para detectar errores es revisar el valor de ciertos datos, como los clusters de error que tienen muchas funciones a la entrada y salida; para esto, hay VI especializados en la paleta Programming > Dialog & User Interface.
Los cluster de error son un dato especial. Se componen de tres parámetros:
• Un booleano que indica si hay error o no.
• Un número identificativo del error.
• Un string que contiene una descripción del error.

Figura 1-38. Creación de tres probes y ventana Watch.
Existe una herramienta que amplía la información sobre el error. Puede accederse directamente a ella desde el indicador del cluster presionando con el botón derecho sobre él y eligiendo Explain Error. También se puede ir a Help > Explain Error. En la sección 11.2 se ampliará la información sobre el control de errores en tiempo de ejecución.

Figura 1-39. Información del error detectado.
1.8. Otras herramientas
1.8.1. Snippet
Desde la versión 2009 se pueden hacer capturas de pantalla de tipo snippet. Para hacer una hay que seleccionar una porción de código e ir a Edit > Create VI Snippet from Selection.
Esta herramienta generará una imagen en formato PNG del código seleccionado, pero además es capaz de embeber el propio código en el fichero de la imagen, de tal forma que, al arrastrarse esa imagen al Diagrama de Bloques de un VI, lo que se copiará no será una imagen, sino el propio código.
Esta herramienta es especialmente útil para intercambiar código en foros a través de internet, pero también puede utilizarse para generar una colección particular de trozos de código que sean muy frecuentes.
1.8.2. Opciones
Se puede acceder a las opciones de configuración de LabVIEW a través de Tools > Options. Esta ventana permite modificar muchos parámetros del programa, como:
• Front Panel: varias opciones relacionadas con el Panel Frontal y los controles.
• Block Diagram: manejo automático de errores y otras ayudas al programador.
• Controls/Functions Palettes: formas de presentar las paletas de controles y funciones.
• Environment: opciones de configuración misceláneas.
• Search: habilitar y priorizar lugares donde realizar búsquedas.
• Paths: las rutas del directorio de instalación de LabVIEW, el directorio temporal, librerías, etc.
• Printing: opciones a la hora de imprimir.
• Source Control: selección del servidor de versiones y configuración.
• Menu Shortcuts: modifica y crea atajos de teclado para las opciones de los menús.
• Revision History: permite guardar información cada vez que se guarda un VI.
• Security: permite restringir el acceso a LabVIEW.
• Shared Variable Engine: ordenadores que ofrecen servicios para manejar variables compartidas.
• VI Server: configuración del acceso a VI Server.
• Web Server: configuración del servidor web que incorpora LabVIEW.

Figura 1-40. Ventana de opciones que presenta LabVIEW 2010.
Además de estas opciones, también pueden realizarse más cambios, algunos de ellos no documentados, en el fichero LabVIEW.ini del directorio de instalación de LabVIEW o en el fichero *.ini asociado a los ejecutables creados con LabVIEW (en Linux es el fichero .labviewrc).
1.8.3. Jerarquía
Cuando se usan unos VI dentro de otros, se va creando una jerarquía de VI. En View > VI Hierarchy se puede abrir una herramienta para ver la estructura jerárquica de un programa (ver el ejemplo de la Figura 1-41).
Además de ver la estructura de un proyecto de forma gráfica, también puede ser de utilidad en grandes proyectos para buscar VI.
Una buena jerarquía es la que está organizada por niveles bien definidos: los VI de un nivel se apoyan en los del nivel inmediatamente inferior y no hay ‘saltos de niveles’.

Figura 1-41. Jerarquía de un VI.
Además de la ventana de jerarquía, también se puede acceder a los VI relacionados (por ejemplo, VI padres o subVI) con el que está activo en View > Browse Relationship.
1.8.4. Ventana de navegación
La ventana de navegación es otra ventana flotante que permite ver toda la ventana activa de LabVIEW mediante un zoom automático. Se puede acceder a ella desde View > Navigation Window y puede ser útil cuando el Diagrama de Bloques tiene un tamaño superior a la pantalla (aunque esto es algo que se debe evitar haciendo el programa más modular mediante el empleo de subVI).
1.8.5. Compilación masiva
La compilación masiva es un método que se usa al actualizar la versión de LabVIEW o para recompilar un proyecto con una nueva versión de LabVIEW.
Su función básicamente es abrir todos los VI de un directorio, relinkar y recompilar todos los VI y subVI que contiene. Se puede acceder a esta herramienta en Tools > Advanced > Mass Compile.
1.8.6. Búsqueda y comparación
En el menú Edit > Find and Replace (CTRL+F) se encuentra una herramienta que permite buscar tanto texto como objetos en los VI cargados en memoria. Los objetos a buscar pueden ser VI, funciones, breakpoints, terminales, etc. En la ventana de resultados se pueden sustituir todas las instancias del objeto buscado por otra función.

Figura 1-42. Utilidad de búsqueda y reemplazo.
LabVIEW también dispone de otra utilidad en el menú Tools > Compare destinada a mostrar las diferencias entre dos VI, tanto en su código, su aspecto, jerarquía u otras propiedades. Con estas herramientas simplemente hay que elegir dos VI y su resultado será una ventana en la que se muestran las diferencias, al hacer doble clic sobre una se mostrarán los VI con una marca en la diferencia.
1.8.7. Seguridad
Las opciones de seguridad en Tools > Security permiten controlar el acceso y permisos a algunos recursos, como a VI Server (Tools > Options > VI Server: Browser Access o Proyecto > My Computer > Properties > VI Server: User Access). El sistema es parecido al de cuentas de usuario, grupos y dominios de los sistemas Windows.
Para que un usuario se registre como tal, debe dirigirse a Tools > Security > Login; además, se puede activar la opción Tools > Options > Security > Show the login prompt at LabVIEW startup time para hacer que se pida un usuario cada vez que se inicie LabVIEW.
Algunos módulos de LabVIEW pueden extender las funciones de seguridad a elementos como variables compartidas o librerías de proyectos.
1.8.8. Ejemplos
Una de las cosas más apreciadas de National Instruments es su soporte, tanto en línea como en sus programas. Dentro de la ayuda de LabVIEW ya se ha visto antes la ventana de ayuda contextual. También dispone de muchos documentos que explican detalladamente cada aspecto del programa. Se puede acceder a la colección de ejemplos desde Help > Find Examples.
Puede modificarse la ventana que muestra los ejemplos en Tools > Prepare Example VI for NI Example Finder.
Finalmente, también hay que comentar que desde la página web de National Instruments se pueden descargar numerosos ejemplos, hacer consultas en los foros o solicitar soporte de los ingenieros de NI.
1.9. Ejercicios
1. Buscar los cinco errores que impiden la ejecución en la siguiente figura:

Figura 1-43. Ejercicio 1.
2. Obtener, mediante las funciones del menú Programming > Numeric, el número áureo y su inverso:

3. Usar el programa del ejercicio anterior como un subVI de uno nuevo para verificar si

4. Depura el siguiente programa para encontrar y solucionar el motivo por el que no funciona correctamente.

Figura 1-44. Ejercicio 4.
1.10. Bibliografía
National Instruments, AN 159: LabVIEW Custom Controls, Indicators, and Type Definitions, 2004.
National Instruments, AN 168: LabVIEW Performance and Memory Management, 2004.
National Instruments, LabVIEW Basics I Course Manual, 2000.
National Instruments, LabVIEW User Manual, 2001.
National Instruments, LabVIEW Upgrade Notes Version 8.0, 2005.
National Instruments, LabVIEW Upgrade Notes Version 8.2, 2006.
National Instruments, LabVIEW Upgrade Notes Version 2009, 2009.
Rick Bitter et alt. LabVIEW Advanced Programming Techniques, CRC Press LLC, 2001.
Capítulo 2
Estructuras
Las instrucciones de control son una de las herramientas básicas de todo lenguaje de programación y permiten a un programa ejecutar un código de forma condicional o repetirlo cierto número de veces.
En LabVIEW estas instrucciones son estructuras que encierran en su interior el código al que afectan. Se encuentran en el menú Programming > Structures.

Figura 2-1. Estructuras.
A continuación se va a tratar cada una de las estructuras que aparecen en la figura 2-1.
2.1. SEQUENCE
En los lenguajes tradicionales basados en texto, el orden de ejecución se corresponde con el orden en que las instrucciones están escritas. Ya se ha visto que el sistema de ejecución de LabVIEW sigue el modelo de flujo de datos (dataflow): un nodo necesita tener disponibles los datos en todas sus entradas para ejecutarse. Pero si hay dos nodos en condición de ejecutarse, no se podrá determinar, en principio, el orden de ejecución; esto en la mayoría de casos no será un problema, es más, será incluso beneficioso. No obstante, puede haber ocasiones en las que haya nodos independientes, ambos en situación de ejecutarse, pero se necesita fijar el orden de ejecución de los mismos.
Las estructuras de tipo SEQUENCE sirven precisamente para esto: establecen el orden de ejecución del código que está en su interior.
Su diseño recuerda a los fotogramas de una película. En una película los fotogramas colocados al principio se visualizarán antes que los siguientes, con un orden secuencial. Las estructuras SEQUENCE también tienen fotogramas o frames ordenados, en el interior de cada frame se situará una sección de código. La ejecución comenzará por el primer frame y, cuando acabe, se pasará a ejecutar el siguiente, y así sucesivamente.
Hay dos tipos de SEQUENCE: STACKED SEQUENCE y FLAT SEQUENCE.
La primera era la única disponible en versiones más antiguas de LabVIEW. Tiene un menú en la parte superior donde se indica la numeración del frame que se muestra, el número total de frames que contiene y además da la opción de situarse en otro. En la figura 2-2 se muestran superpuestos los dos frames de la misma estructura.


