Kitabı oku: «Programación gráfica para ingenieros»

Yazı tipi:


Programación gráfica para ingenieros

Primera edición, junio 2010

© 2010 José Miguel Molina Martínez

© 2010 Manuel Jiménez Buendía

© 2010 MARCOMBO, S.A.

Gran Via de les Corts Catalanes, 594

08007 Barcelona

www.marcombo.com

Diseño de la cubierta: NDENU DISSENY

«Cualquier forma de reproducción, distribución, comunicación pública o transformación de esta obra sólo puede ser realizada con la autorización de sus titulares, salvo excepción prevista por la ley. Diríjase a CEDRO (Centro Español de Derechos Reprográficos, www.cedro.org) si necesita fotocopiar o escanear algún fragmento de esta obra».

ISBN-13: 978-84-267-2066-5

ÍNDICE

Bloque I

LabVIEW. Lenguaje de Programación Gráfico

1. Entorno de Programación LabVIEW

1.1 INTRODUCCIÓN

1.2 PROGRAMACIÓN GRÁFICA

1.3 INSTRUMENTOS VIRTUALES

1.4 MENÚS DE LABVIEW

1.5 BARRA DE HERRAMIENTAS (TOOLBAR)

1.6 PALETAS DE CONTROLES, FUNCIONES Y HERRAMIENTAS

2. Diseño y creación de una aplicación. Instrumento Virtual

2.1 INTRODUCCIÓN

2.2 CREACIÓN DE UN VI

2.3 FLUJO DE DATOS (DATAFLOW)

2.4 SUBVIS

2.5 PROYECTOS

3. Programación Estructurada y Tipos de Datos

3.1 INTRODUCCIÓN

3.2 ESTRUCTURAS EN LABVIEW

3.2.1 Estructuras iterativas

3.2.2 Estructuras de casos y eventos

3.2.3 Estructuras de secuencia (Flat Sequence y Stacked Sequence)

3.2.4 Estructuras temporizadas. Timed Loop y Timed Sequence

3.2.5 Nodos de Fórmula (Formula Node) y Scripts

3.2.6 Variables locales, globales y compartidas

3.3 TIPOS DE DATOS

3.3.1 Tipos Primitivos: Boolean, Numeric y String

3.3.2 Arrays y Clusters

4. Análisis y Visualización de Datos

4.1 INTRODUCCIÓN

4.2 INDICADORES DE TIPO CHART

4.2.1 Waveform Chart

4.2.2 Intensity Chart

4.3 INDICADORES DE TIPO GRAPH

4.3.1 Waveform Graph

4.3.2 XY Graph

4.3.3 Intensity Graph

4.3.4 Digital Waveform Graph y Mixed Signal Graph

4.3.5 Cursores en los gráficos

4.3.6 Gráficos 3D

4.4 OTROS INDICADORES GRÁFICOS

5. Programación Avanzada

5.1 INTRODUCCIÓN

5.2 ARQUITECTURAS BÁSICAS DE PROGRAMACIÓN

5.2.1 Arquitectura de Simple

5.2.2 Arquitectura de un VI General

5.2.3 Arquitectura de Máquina de Estado

5.2.4 Manejo de Errores.

5.3 NODOS DE PROPIEDAD Y MÉTODOS

5.4 MANIPULACIÓN DE DATOS

5.4.1 Type Cast

5.4.2 Manipulación de Bytes y Bits

5.4.3 Otras Transformaciones.

5.5 MANEJO DE FICHEROS

5.5.1 Abrir y Cerrar Ficheros

5.5.2 Ficheros de Texto

5.5.3 Ficheros Binarios

5.5.4 Ficheros de Hoja de Cálculo (Spreadsheet)

5.5.5 Format Into File y Scan From File

5.5.6 Path

5.5.7 Measurement File (VIs Express)

5.5.8 Ficheros ZIP

5.5.9 VIs Avanzados

5.5.10 Ficheros de Configuración

5.5.11 Ficheros XML

5.5.12 Ficheros de Imagen y Sonido

5.5.13 Informes (Reports)

5.5.14 Almacenamiento (Storage)

5.5.15 Datalog

5.5.16 Waveform.

5.6 ACCESO REMOTO Y ENLACES DE DATOS

5.6.1 Publicación Web y Acceso Remoto

5.6.2 Enlaces de Datos

5.6.3 VI Server

5.7 CREACIÓN DE LIBRERÍAS Y EJECUTABLES

5.8 INTERFAZ DE USUARIO

5.8.1 Personalización de la apariencia del VI

5.8.2 Subpaneles, Splitters y Pestañas

5.8.3 Personalización de Menús

5.8.4 Teclado

5.8.5 Consejos para el Diseño de la Interfaz de usuario

Bloque II

Sistemas de Control y Adquisición de Datos

6. Sistemas de Instrumentación y Control basados en ordenador

6.1 INTRODUCCIÓN

6.2 ESTRUCTURA DE UNA APLICACIÓN DE INSTRUMENTACIÓN Y CONTROL POR ORDENADOR

6.3 SENSORES TRANSDUCTORES

6.4 TIPOS DE SEñALES.

6.5 ACONDICIONAMIENTO DE SEñAL

6.5.1 Amplificación

6.5.2 Linealización.

6.5.3 Excitación de Transductores.

6.5.4 Aislamiento

6.5.5 Filtrado.

6.6 ELECTRÓNICA DE ADQUISICIÓN DE DATOS

6.7 ELECTRÓNICA DE ANÁLISIS

6.8 COMPUTADOR Y SOFTWARE.

6.9 INSTRUMENTACIÓN VIRTUAL

7. Tarjetas de Adquisición de Datos y Controladores Compactos

7.1 INTRODUCCIÓN

7.2 CARACTERÍSTICAS DE LOS EQUIPOS DE ADQUISICIÓN DE DATOS Y CONTROL

7.2.1 Entradas y salidas analógicas

7.2.2 Conversión a digital

7.2.3 Puertos digitales y contadores

7.3 TARJETAS DE ADQUISICIÓN DE DATOS

7.3.1 Tarjeta de adquisición NI USB-6008

7.4 CONTROLADORES COMPACTOS

7.4.1 Compact FieldPoint

7.4.2 CompactRIO.

8. LabVIEW para la adquisición de datos y el manejo de dispositivos electrónicos

8.1 INTRODUCCIÓN

8.2 MEASUREMENT & AUTOMATION EXPLORER (MAX)

8.3 PROGRAMACIÓN DE TARJETAS DE ADQUISICIÓN (DAQ) EN LABVIEW

8.3.1 DAQmx

8.3.2 DAQ Assistant.

8.4 PROGRAMACIÓN DE CONTROLADORES COMPACTOS COMPACT FIELDPOINT

8.4.1 Requisitos para la programación.

8.4.2 Conexionado y alimentación.

8.4.3 Configuración con MAX

8.4.4 Creación de un VI y ejecución en FieldPoint

8.5 PROGRAMACIÓN DEL CONTROLADOR COMPACTO COMPACTRIO.

8.5.1 Componentes de una aplicación de tiempo real en CompactRIO

8.5.2 Requisitos para la programación.

8.5.3 Conexionado y alimentación.

8.5.4 Configuración con MAX

8.5.5 Creación de un VI y ejecución en CompactRIO.

Bloque III

SCADA

9. Introducción a los sistemas SCADA

9.1 INTRODUCCIÓN

9.2 DEFINICIÓN DE SISTEMAS SCADA

9.3 PRINCIPALES FUNCIONES DE UN SISTEMA SCADA

9.4 NIVELES CIM EN SISTEMAS DE CONTROL INDUSTRIALES.

9.5 COMPONENTES HARDWARE DE LOS SISTEMAS SCADA.

9.6 COMPONENTES SOFTWARE DE UN SISTEMA SCADA

9.6.1 OPC (OLE for Process Control).

9.6.2 OBDC (Open Data Base Connectivity)

9.6.3 Almacenamiento de datos. Bases de datos industriales

9.6.4 Módulos de un sistema SCADA.

9.6.5 Paquetes SCADA y fabricantes

10. Desarrollo de SCADAs con LabVIEW

10.1 INTRODUCCIÓN

10.2 LABVIEW Y LOS SISTEMAS SCADA

10.2.1 Comunicación con los Controladores Industriales.

10.2.2 Utilizar OPC en LabVIEW. OPC estÁ en mÓdulo DSC

10.2.3 Generación de históricos.

10.2.4 Generación de informes (Reports).

10.2.5 Monitorización Remota

10.2.6 Comunicación con los Controladores Industriales.

10.2.7 Servidores OPC

10.2.8 Ejemplos de utilización de LabVIEW para la Supervisión y Control en Aplicaciones de Riesgo.

10.3 MÓDULO DSC DE LABVIEW

10.3.1 Introducción al DSC.

10.3.2 Creación de una aplicación con el módulo DSC.

Bibliografía

Bloque I

1. Entorno de Programación LabVIEW
1.1 Introducción

LabVIEW es un lenguaje de programación de alto nivel, de tipo gráfico, inicialmente enfocado a la realización de aplicaciones para el control de instrumentación. Desde su aparición, LabVIEW se ha convertido en un auténtico lenguaje y entorno integrado de programación, ya que cuenta con todos los recursos necesarios para elaborar cualquier tipo de algoritmo en aplicaciones muy variadas. Los programas desarrollados con LabVIEW se llaman Instrumentos Virtuales, o VIs, lo que da una idea de su uso en origen: el control de instrumentos. El lema de LabVIEW es: “La potencia está en el Software”. Entre sus objetivos están la reducción del tiempo de desarrollo de aplicaciones y facilitar el desarrollo de aplicaciones a programadores no expertos en informática. Pero una de sus mayores cualidades es la existencia de numerosos paquetes que permiten combinar este software con todo tipo de hardware, como tarjetas de adquisición de datos, controladores, autómatas programables, sistemas de visión, FPGAs, etc.

En este capítulo y en los sucesivos, se intentarán establecer las bases necesarias para que lectores puedan desarrollar aplicaciones enfocadas al campo de la adquisición de datos, supervisión y control y, más concretamente, para la automatización de sistemas de riego. A continuación, comenzaremos proporcionando una visión general sobre el entorno LabVIEW.

1.2 Programación Gráfica

LabVIEW (Laboratory Virtual Instrument Engineering Workbech) fue creado por la empresa National Instruments (fundada en 1976 en Austin, Texas) para funcionar sobre máquinas MAC, salió al mercado por primera vez en 1986. En la actualidad se encuentra disponible para las plataformas Windows, UNIX, Mac y Linux. La última versión (8.6), liberada en Agosto de 2008, cuenta con soporte para el sistema operativo Windows Vista. En la Tabla 1.1 se puede observar la evolución de este entorno y las principales características aportadas con cada una de las versiones.

La programación G constituye el corazón de LabVIEW, y difiere de otros lenguajes de programación como C ó Basic, en que éstos están basados en texto, mientras que en G se utiliza programación gráfica. Los programas en G, o VIs (acrónimo de Virtual Instrument) constan de una interfaz interactiva de usuario y un diagrama de flujo de datos que hace las funciones de código fuente.


Año Versión
1986 LabVIEW 1.0, primera versión en Mac OS
1990 LabVIEW 2.0, máximo aprovechamiento de los resultados
1992 LabVIEW 2.5, primera versión en Windows 3.1 y Solaris
1993 LabVIEW 3.0
1994 LabVIEW 3.0.1, primera versión en Windows NT
1994 LabVIEW 3.1
1995 LabVIEW 3.1.1, integración del Application Builder (creación de archivos ejecutables)
1996 LabVIEW 4.0
1997 LabVIEW 4.1
1998 LabVIEW 5.0, multitarea, contenedores ActiveX, asistente para la adquisición de dato (tarjetas de adquisición DAQ) e asistente para el control de instrumentos
1999 LabVIEW 5.1, primera versión para Linux, primera versión de LabVIEW RT (Real Time)
2000 LabVIEW 6.0, controles gráficos en 3D, referencias de controles
2001 LabVIEW 6.1, mejoramiento y correcciones, primera versión en Palm OS
2003 LabVIEW 7.0, VI Express, primera versión en Windows Mobile 2003
2004 LabVIEW 7.1, traducción en francés, alemán y japonés
2005 LabVIEW 8.0, Project Explorer, XControls, shared variables
2005 LabVIEW 8.1, mejoras y correcciones
2006 LabVIEW 8.20, Programación orientada a objetos
2007 LabVIEW 8.5, primera versión del toolkit FPGA y del toolkit Statechart
2008 LabVIEW 8.6, limpieza automática de los diagramas

Tabla 1.1. Diferentes versiones de LabVIEW aparecidas en el mercado.

De forma más específica, el entorno de programación gráfico LabVIEW se estructura siguiendo la analogía con los instrumentos de laboratorio a los que trataba de emular en sus primeras versiones. Así, un instrumento virtual consta de:

• Panel Frontal. Es la interfaz interactiva de usuario de un VI, debido a que simula el panel de un instrumento físico. El panel frontal puede contener botones, interruptores, pulsadores, gráficas y otros controles e indicadores. Los datos se introducen utilizando el ratón y el teclado, y los resultados se muestran en la pantalla del ordenador.

• Diagrama de Bloques. Se construye en G y constituye el código fuente del programa o VI. Supone una solución gráfica a un determinado problema de programación.

Los VIs son jerárquicos y modulares. Pueden utilizarse como programas de alto nivel o como subprogramas de otros programas o subprogramas. Cuando un VI se usa dentro de otro VI, se denomina subVI. El icono y los conectores de un VI funcionan como una lista de parámetros gráficos de forma que otros VIs puedan pasar datos a un determinado subVI.

1.3 Instrumentos Virtuales

Los programas de LabVIEW se denominan instrumentos virtuales o VI, debido a que su apariencia y operación imita a los instrumentos físicos, tales como osciloscopios y multímetros. LabVIEW contiene un amplio abanico de herramientas para adquisición, análisis, despliegue y almacenamiento de datos, así como herramientas que ayudan a especificar su código de ejecución.

En LabVIEW, se construye una interfaz de usuario, o panel frontal (véase la Figura 1.1), con controles e indicadores. Los controles son texto, botones de acción, interruptores y otros dispositivos de entrada. Los indicadores son gráficos, LED, objetos para mostrar texto o números y otros elementos. Una vez construida la interfaz, el código se agrega en el diagrama de bloques utilizando subVIs y estructuras para controlar los objetos del panel frontal.


Figura 1.1. Panel Frontal.

El diagrama de bloques (véase la Figura 1.2) contiene el código fuente gráfico. Los objetos del panel frontal aparecen como terminales en el diagrama de bloques. Adicionalmente, el diagrama de bloques contiene funciones y estructuras incorporadas en las bibliotecas de LabVIEW. Los cables conectan cada uno de los nodos en el diagrama de bloques, incluyendo controles e indicadores de terminal, funciones y estructuras.


Figura 1.2. Diagrama de bloques.

En este diagrama de bloques se llama al subVI Temp, que implementa una subrutina que obtiene una temperatura desde una tarjeta de adquisición de datos (DAQ). Esta temperatura es representada, junto con el valor medio de la temperatura, en la gráfica de forma de onda Temperature History. El interruptor (Power) es un control booleano que se colocó en el panel frontal para detener la ejecución del bucle de iteración While Loop. Esta estructura iterativa (While Loop) también contiene un terminal (i) que indica el número de iteración que se está ejecutando (la primera iteración es la número 0).

A partir de LabVIEW 7.0 se introdujo un nuevo tipo de subVI denominado Express VI. Estos son VIs interactivos que tienen una configuración mediante un cuadro de diálogo que permite al usuario personalizar su funcionalidad de manera rápida e intuitiva. A partir de esta configuración LabVIEW genera un subVI basado en dichos argumentos.

Los VIs estándar están constituidos a su vez por un panel frontal y un diagrama de bloques que son usados dentro de otro VI.

Las funciones son los bloques básicos para la construcción de todos los VIs, pero no tienen un panel frontal o un diagrama de bloques (por ejemplo, funciones aritméticas de suma, resta, multiplicación, etc.).

1.4 Menús de LabVIEW

La barra de menús de la parte superior de las ventanas de LabVIEW contiene diversos menús pull-down (desplegables). Cuando hacemos clic sobre un ítem o elemento de esta barra, aparece un menú por debajo de ella. Dicho menú contiene elementos comunes a otras aplicaciones Windows, como Open (Abrir), Save (Guardar) y Paste (Pegar), y muchas otras particulares de LabVIEW.

La Figura 1.3 muestra la barra de menús para la versión 8.6.1, común para el panel frontal y el diagrama de bloques.


Figura 1.3. Barra de menús de la versión 8.6.


File (Archivo) Sus opciones se usan básicamente para abrir, cerrar, guardar, imprimir VI, etc.
Edit (Edición) Se usa principalmente para organizar el panel frontal y el diagrama de bloques y establecer nuestras preferencias.
View (Ver) Muestra las distintas paletas, errores, navegadores, etc.
Project (Proyecto) Presenta los niveles de jerarquía, los subVIs que lo
integran, los que están sin abrir, busca VIs, etc.
Operate (Función) Sus comandos sirven para ejecutar el VI.
Tools (Herramientas) Se accede a una serie de herramientas para compilar el VI, publicarlo como página Web, etc.
Windows (Ventanas) Se utiliza básicamente para mostrar (Show) ventanas.
Help (Ayuda) Muestra una ayuda sobre los diferentes iconos y otros aspectos de LabVIEW.

El menú de LabVIEW que utilizaremos con más frecuencia es el menú de contexto o emergente (Pop-up) de objetos, al que se accede situando el cursor sobre un objeto y pulsando el botón derecho del ratón. Si la pulsación se hace sobre un espacio vacío, el menú que se obtendrá variará en función de la herramienta seleccionada.

1.5 Barra de Herramientas (Toolbar)

Bajo la barra de menús se sitúa la barra de herramientas, que incluye una serie de botones para editar o ejecutar los VIs. Tal como se ilustra en la Figura 1.4, esta barra se muestra con más o menos opciones dependiendo de si estamos en modo de ejecución o de edición. Además, en el diagrama de bloques se dispone de algunas opciones adicionales. La función de los distintos botones es la siguiente:


Figura 1.4. Barra de herramientas del panel frontal: (a) en modo edición (Edit), (b) en modo ejecución (Run).


Run. Ejecuta el VI. Si la flecha aparece rota, es porque el VI tiene errores y al pinchar sobre ella muestra la lista de errores, su ubicación y descripción
Run continuously. Ejecuta indefinidamente los VIs hasta que se pulsa el botón de abortar o el de pausa.
Abort Execution. Aborta la ejecución del VI. No es recomendable utilizarlo, pues podrían quedar operaciones pendientes que hiciesen inestable el sistema.
Pause. Hace una pausa en la ejecución del VI, quedando resaltado en el diagrama de bloques el punto en el que se ha parado.

El primer botón sirve para configurar el texto (fuente, tamaño, estilo, color, etc.). El resto de botones permiten alinear, distribuir, redimensionar y ordenar los objetos seleccionados.


Help. Muestra una ventana Context Help (menú de contexto) con una ayuda resumida sobre el elemento que se haya seleccionado con el cursor.


Figura 1-5. Barra de herramientas del diagrama de bloques: (a) en modo edición (Edit), (b) en modo ejecución (Run).


Highlight Execution. Presenta una ejecución animada del diagrama de bloques.
Retain Wire Values. Retiene los valores de los hilos.
Step Into, Step Over y Step Out. Permiten ejecutar el programa paso a paso. Step Into abre y muestra la ejecución de los subVIs, Step Over los ejecuta sin abrirlos y Step Out finaliza la ejecución del nodo actual y después hace una pausa. Por ejemplo, en un bucle For de 100 repeticiones, ejecutaría todas las repeticiones y pasaría a pausa en el siguiente nodo.

1.6 Paletas de controles, funciones y herramientas

La paleta de controles (Controls) sólo está disponible en el panel frontal, y permite colocar sobre él los controles e indicadores (véase la Figura 1.6).


Figura 1.6. Paleta de controles (visible en el panel frontal).

La paleta de controles se puede desplegar: (1) seleccionando el menú View » Controls Palette o (2) haciendo clic con el botón derecho del ratón en el espacio de trabajo o en cualquier área abierta del panel frontal. Para que desaparezca la paleta de controles hay que hacer clic fuera de la paleta. También es posible fijarla pulsando el clip () de la esquina superior izquierda.

La paleta de funciones (Functions) sólo está disponible en el diagrama de bloques (véase la Figura 1.7). Se puede desplegar: (1) seleccionando el menú View » Functions Palette o (2) haciendo clic con el botón derecho del ratón en el espacio de trabajo o en cualquier área abierta del diagrama de bloques. Para que desaparezca hay que hacer clic fuera de la paleta. También es posible fijarla pulsando el clip () de la esquina superior izquierda.


Figura 1.7. Paleta de funciones (visible en el diagrama de bloques).

La paleta de herramientas dispone de 11 botones utilizados para operar y modificar objetos en el panel frontal y en el diagrama de bloques (véase la Figura 1.8). Por defecto, LabVIEW activa el cambio automático de herramienta. Si la paleta está oculta se puede mostrar mediante la opción de menú View » Tools Palette. A continuación se muestran las funciones de cada uno de sus botones:


Automatic Tool Selection. Selecciona una herramienta de forma automática dependiendo del objeto o parte del objeto sobre la que se sitúe el cursor.
Operate Value. La herramienta de operación sirve para cambiar valores o para seleccionar texto de un control.
Position/Size/Select. Selecciona, mueve y redimensiona objetos.
Edit Text. Crea y edita textos.
Connect Wire. Enlaza objetos en el diagrama de bloques.
Object Shortcut Menu. Despliega el mismo menú que si pulsamos el botón derecho del ratón sobre el objeto.
Scroll Window. Desplaza la pantalla.
Set/Clear Breakpoint. Permite establecer o quitar puntos de ruptura en el diagrama de bloques.
Probe Data. Crea una ventana flotante que muestra el valor que circula por el cable.
Get Color. Captura el color que tienen objetos, texto u otros elementos.
Set Color. Colorea un elemento. Tiene un color principal y otro de fondo, pudiendo seleccionarse de forma independiente.


Figura 1.8. Paleta de herramientas.

2. Diseño y creación de una aplicación Instrumento Virtual
2.1 Introducción

En este capítulo se describen los pasos necesarios para la creación de aplicaciones, denominadas Instrumentos Virtuales (VI, Virtual Instrument) en el entorno de programación gráfico LabVIEW.

2.2 Creación de un VI

La programación en LabVIEW se realiza en el diagrama de bloques, mientras que en el panel frontal se presenta la interfaz con el usuario de la aplicación, donde se encuentran las entradas y salidas.

Cuando en el panel frontal se crea un control para la entrada de datos o un indicador para la salida de datos, en el diagrama de bloques aparecen sus respectivos terminales. Estos terminales dan acceso a los objetos del panel frontal, permitiendo operar con ellos mediante las herramientas de la paleta de funciones y generar el código de ejecución asociado en el diagrama de bloques.

Cada terminal contiene información útil del objeto asociado en el panel frontal. Por ejemplo, el color y los símbolos indican el tipo de dato. Los números de punto flotante son representados con terminales anaranjados con un acrónimo que indica su precisión (DBL para double, SGL para single, y EXT para extended). Los terminales booleanos se dibujan en color verde con el acrónimo TF.

Tal como se muestra en la Figura 2.1, los terminales de los controles tienen una flecha en el lado derecho y un borde grueso. Los indicadores tienen una flecha en el lado izquierdo y un borde fino.


Figura 2.1. Indicador numérico (Thermometer) y control booleano (Boolean) en el panel frontal (izquierda) y sus terminales asociados en el diagrama de bloques (derecha).

Como regla general, deben cablearse los terminales del mismo tipo: anaranjados con anaranjados, verdes con verdes, etc. También es posible conectar terminales de tipos compatibles, por ejemplo, LabVIEW permite conectar un terminal azul (correspondiente a un valor entero) a un terminal anaranjado (valor fraccional). En estos casos se produce una conversión automática al tipo de destino (por ejemplo, un truncamiento de los decimales si el destino es un terminal entero).

Además de los terminales del panel frontal, el diagrama de bloques contiene funciones (algebraicas, booleanas, etc.). Cada función puede tener múltiples terminales de entradas y salidas, cuya conexión constituirá una parte muy importante de la programación en LabVIEW.

Al realizar el cableado, cada cable tendrá un único origen, generalmente un control, pero puede derivarse hacia varios indicadores o funciones.

En el ejemplo de la Figura 2.2, el VI toma datos de A y B y pasa los valores a una función de adición y a una función de resta. Los resultados son mostrados en los indicadores de la derecha.


Figura 2.2. Panel frontal y diagrama de bloques de un VI para la suma y resta de dos variables.

Para la realización del cableado en el diagrama de bloques deben tenerse en cuenta las siguientes consideraciones:

 Cuando se utilice la herramienta de cableado, el cable se ubicará en el extremo superior del icono .

 Durante el movimiento de la herramienta de cableado sobre las funciones, aparece una viñeta amarilla que indica el nombre del terminal al que se está conectando:

 Para obtener más ayuda sobre los terminales, haga clic en la función con el botón derecho del ratón y seleccione Visible Items (Objetos Visibles) » Terminals (Terminales). Aparecerá un dibujo con los terminales de conexión de la función. Los colores corresponden a los tipos de datos utilizados por los terminales del panel frontal.

 Para obtener una ayuda adicional, seleccione Help » Show Context Help (Mostrar Ayuda Contextual), o presione Ctrl+H. Al mover el ratón sobre una función, esta ventana mostrará la función, terminales, y una breve descripción.

 Si el cableado no sigue un trazado correcto, haga clic derecho en el cable que se desea arreglar y escoja la opción de Clean Up Wire (Limpieza del Cable) para que automáticamente el cable haga su ruta de nuevo.

2.3 Flujo de Datos (Dataflow)

La ejecución de un VI en LabVIEW sigue un modelo de flujo de datos. Cada nodo del diagrama de bloques se ejecuta cuando están disponibles todas sus entradas. Cuando un nodo completa la ejecución, suministra datos a sus terminales de salida y pasa los datos de salida al siguiente nodo en la trayectoria del flujo de datos. Visual Basic, C++, JAVA y otros lenguajes de programación basados en texto, siguen un modelo de control de flujo de la ejecución de un programa. En flujo de control, el orden secuencial de los elementos del programa determina el orden de ejecución.

El diagrama de bloques de la izquierda de la Figura 2.3, suma dos números y luego resta 50 al resultado de la suma. En este caso, el diagrama de bloques se ejecuta de izquierda a derecha, no porque los objetos estén puestos en ese orden, sino porque una de las entradas de la función de resta no es válida hasta que la función de suma o adición haya terminado su ejecución y pasado los datos a la función de resta. Recuerde que un nodo se ejecuta solamente cuando tiene datos disponibles en todos sus terminales de entrada, y suministra datos a sus terminales de salidas solamente cuando termina su ejecución.

En el código de la derecha, ¿Cuál será el segmento que se ejecutará primero: la suma, el número aleatorio o la función de división? Como las entradas a las funciones de suma y división están disponibles al mismo tiempo, y la función de número aleatorio no tiene entradas, no se puede saber. Cuando se pretenda que un segmento del código se ejecute antes que otro, y no exista dependencia de datos entre las funciones, hay que utilizar una estructura de Secuencia para forzar el orden de la ejecución.


Figura 2.3. Ejemplo de flujo de datos con LabVIEW.

2.4 SubVIs

Un SubVI es un VI que puede ser utilizado dentro de otro VI. Corresponde a una subrutina en lenguajes de programación basados en texto. La utilización de subVIs ayuda a gestionar de manera más eficiente cambios en los programas y a eliminar errores del diagrama de bloques. Además, simplifica los esquemas de cableado mejorando su comprensión.

Un SubVI, debe disponer de su propio icono y terminales de conexión. Del mismo modo que los terminales de un control o de un indicador pueden ser vistos como un icono o como un simple terminal en el diagrama de bloques, los subVIs pueden ser vistos como un icono, un nodo expandible o un nodo expandido (véase la Figura 2.4). Las diferentes vistas dependen de la preferencia del usuario, pero la funcionalidad del subVI no cambia.


Figura 2.4. Diferentes vistas de un subVI.

Cada VI muestra un icono en la esquina superior derecha de las ventanas del panel frontal y del diagrama de bloques. El icono es la representación grafica del VI, y puede contener texto, imágenes, o una combinación de ambos. Si se utiliza un VI como subVI, el icono identifica el subVI en el diagrama de bloques del VI en el que se inserta.

El conector muestra los terminales disponibles para la transferencia de datos hacia y desde el subVI. Hay varios patrones de conectores que se pueden elegir haciendo clic-derecho sobre el conector y seleccionando el patrón del menú de patrones. Posteriormente, se asignan los controles e indicadores del panel frontal al terminal del conector, como veremos mas adelante.

El diagrama de bloques mostrado en la Figura 2.5 contiene cuatro subVIs. Para ver el panel frontal de un subVI basta con hacer doble clic sobre el subVI. También se puede ver la jerarquía de los subVIs dentro de un VI principal en el menú View » VI Hierarchy.


Figura 2.5. SubVIs en el diagrama de bloques.

Los pasos para crear un subVI son los siguientes:

a) Crear el icono

Para reemplazar los iconos predeterminados por otros personalizados, se debe hacer clic-derecho sobre el icono de la esquina superior derecha del panel frontal o del diagrama de bloques y seleccionar Edit Icon del menú de emergente, o bien, haciendo doble clic en el icono. También se puede acceder desde el menú File » VI Properties, seleccionando General en el menú Category de la ventana emergente, y haciendo clic en el botón de editar (Edit Icon). Con las herramientas del lado izquierdo de la ventana de diálogo del Icon Editor se llevará a cabo el diseño del icono en el área de edición. En la parte derecha aparece la imagen del icono en el tamaño que se mostrará (véase la Figura 2.6).

También se puede arrastrar un gráfico desde cualquier archivo y colocarlo en la esquina superior derecha del panel frontal o del diagrama de bloque. LabVIEW convierte el gráfico a un icono de 32 × 32 píxeles.


Figura 2.6. Ventana de diálogo del editor de iconos (Icon Editor).

b) Crear el conector

Para utilizar un VI como un subVI, es necesario crear un conector. El conector es un conjunto de terminales que corresponden a los controles y a los indicadores de ese VI, similar a la lista de parámetros de una función basada en un lenguaje de programación de texto. En el conector se definen los terminales de entrada y de salida asociados al icono del subVI, que serán utilizados para realizar el cableado dentro del VI al que se incorpore.

Las conexiones se definen asignando un control o un indicador del panel frontal a cada uno de los terminales del conector. Para definir un conector, se hace un clic-derecho sobre el icono del panel frontal y se selecciona Show Connector del menú emergente (véase la Figura 2.7).


Figura 2.7. Mostrar conectores (Show Connector).

El conector substituye al icono (véase la Figura 2.8). Cada rectángulo del conector representa un terminal, al que se le asignará una entrada o salida. El número de terminales que LabVIEW muestra en el conector depende del número de controles e indicadores en el panel frontal (se puede seleccionar en Patterns del menú emergente). El panel frontal tiene cuatro controles y un indicador, así que LabVIEW muestra cuatro terminales de entradas y una terminal de salida en el conector.

c) Asignar terminales

El siguiente paso consiste en definir las conexiones, asignando un control o indicador del panel frontal a cada uno de los terminales del conector. Cuando se hacen los vínculos, las entradas deben colocarse a la izquierda (controles) y las salidas a la derecha (indicadores). Para asignar un terminal a un control o indicador del panel frontal, se selecciona un terminal del conector y, seguidamente, se selecciona el control o indicador del panel frontal que se desea asignar a la terminal (véase la Figura 2.8). El terminal cambiará de color para indicar el tipo de datos del control. Cuando estén todos los terminales seleccionados, se debe hacer clic en un área abierta del panel frontal.


Figura 2.8. Asignación de terminales.

d) Guardar el VI

Tras realizar las asignaciones de los terminales, se debe guardar el VI. Existen varias maneras de organizar los subVIs. La más común es organizarlos por aplicación. En este caso, todos los VIs para una aplicación en particular se guardan en el mismo directorio o dentro de un archivo de librería de VI. La utilización de un archivo de librería permite transportar una aplicación entera dentro de un solo archivo.

Para guardar un VI dentro de una librería se debe seleccionar en el menú File » Save As … (salvar como). En el cuadro de diálogo, presione New VI Library (nueva librería de VI), esto permitirá nombrar la librería, y después guardar el VI en ella. Para agregar otros VIs, simplemente hay que hacer un doble-clic en el archivo .llb del cuadro de diálogo Save y dar un nombre al VI.

e) Insertar un subVI dentro de otro VI

Después de construir un VI y crear su icono y conector, podemos utilizarlo como un subVI. Para colocar un subVI en el diagrama de bloques, seleccionamos Functions » Select VI (véase la Figura 2.9). Seleccionaremos con un doble-clic el VI que deseamos utilizar como subVI y lo colocaremos en el diagrama de bloques.

También se puede colocar un VI abierto en el diagrama de bloques de otro VI abierto, simplemente arrastrando el icono desde el VI que se desea utilizar como subVI hasta el diagrama de bloques del otro VI.


Figura 2.9. Inserción de un subVI en otro VI.

2.5 Proyectos

A partir de la versión 8.0 de LabVIEW se introduce la posibilidad de crear proyectos para gestionar de forma más eficiente las aplicaciones complejas desarrolladas en este entorno. El proyecto se almacena en un fichero XML con extensión .lvproj que contiene información de todos los ficheros incluidos en el proyecto. Estos ficheros pueden ser VIs, controles, ficheros de configuración, de documentación o cualquier otro archivo que el programador desee incluir.

Los proyectos se gestionan desde el Explorador de Proyectos (Project Explorer), que presenta, en forma de árbol desplegable, una categoría principal denominada My Computer, que incluye los ficheros que componen el proyecto y sus propiedades. Además de esta categoría derivan siempre otras dos:

 Dependencies, que muestra las dependencias del proyecto (por ejemplo, librerías compartidas).

 Build Specifications, que recoge la información para las distribuciones del proyecto (ejecutables, librerías, instaladores, etc.).


Figura 2.10. Explorador de Proyectos (Project Explorer).

Los ficheros de un proyecto se pueden agrupar en directorios o librerías que a su vez incluyen otros VIs (no confundir con las librerías .llb). Las librerías de un proyecto no contienen físicamente a los distintos VIs que la componen, sino que representan referencias a los mismos. Los ficheros de una librería pueden ser públicos (accesibles desde cualquier parte del proyecto) o privados (sólo accesibles desde otros VIs de esa misma librería).

3. Programación Estructurada y Tipos de Datos
3.1 Introducción

Todo programa requiere de una serie de instrucciones que permiten la ejecución condicional o repetitiva de su código. En el entorno de programación LabVIEW, este tipo de instrucciones se denominan estructuras e incluyen en su interior, de forma gráfica, el código a ejecutar de manera repetitiva o condicional.

3.2 Estructuras en LabVIEW

Las estructuras disponibles para la programación de instrumentos virtuales en LabVIEW se encuentran disponibles en la paleta de funciones del diagrama de bloques dentro de la categoría Programming » Structures, tal como se muestra en la Figura 3.1. A continuación se describe con detalle cada una de estas estructuras.


Figura 3.1. Estructuras de la paleta de funciones.

3.2.1 Estructuras iterativas

Podemos encontrar dos tipos de estructuras iterativas, también llamadas estructuras de ciclos o bucles: While Loop y For Loop, que analizaremos a continuación.

3.2.1.1 Bucle While (While Loop)

El bucle while repite el código que tenga en su interior hasta o mientras se cumpla una condición, que se evalúa en cada iteración (véase la Figura 3.2). Esta estructura dispone de dos terminales:

a) El terminal de iteración . En cada iteración del bucle aumenta su valor una unidad, empezando a contar desde cero.

b) El terminal condicional . El ciclo se repite hasta que recibe un valor booleano de verdadero o falso. A través del menú contextual (clic sobre el botón derecho del ratón), podrá elegirse que el bucle se detenga cuando el valor booleano sea verdadero (Stop if True ) o que continúe mientras sea verdadero (Continue if True ).


Figura 3.2. Estructura While Loop.

Los terminales de cualquier función suelen permitir, además de sus funciones específicas, una serie de funciones adicionales como crear constantes, controles o indicadores. Para ello se puede emplear su menú contextual (pulsando con el botón derecho del ratón sobre el objeto en el diagrama de bloques o bien utilizando la herramienta Object Shortcut Menu).

A continuación se presenta las principales opciones del menú contextual del bucle (véase la Figura 3.3):

Visible Item: oculta o visualiza la etiqueta de identificación.

Description and Tip: permite añadir comentarios.

Set Breakpoint: establece un punto de ruptura para depurar el VI.

Replace: cambia el bucle por For Loop, Timed Loop o por cualquier otra función con la opción paleta de estructuras (Structures Plette).

Remove Loop: borra la estructura pero sin eliminar el código de su interior.


Figura 3.3. Menús contextúales de la estructura While Loop (clic botón derecho del ratón).

La opción Add Shift Register (registro de desplazamiento), añade dos terminales a cada lado de la estructura. Estos terminales sirven para transferir un valor desde una iteración del bucle a la siguiente o, visto de otro modo, tener acceso a un valor de una iteración anterior.


Figura 3.4. Registro de desplazamiento (Shift Register) en un bucle While.

Tal como se muestra en la Figura 3.4, en la primera iteración se leerá el valor 15 en el terminal de la izquierda, se le sumará 1 y se escribirá en el terminal de la derecha el valor 16. Este valor será leído en la siguiente iteración y se le volverá a sumar 1, repitiéndose este proceso hasta que sea igual o mayor a 20. En este momento recibirá un valor verdadero el terminal condicional (Stop if True) y se terminará el ciclo.

El Feedback Node, presente en la misma paleta de estructuras funciona de forma similar al Shift Register. Consta de dos terminales:

a) El terminal inicializador, situado sobre el borde izquierdo de la estructura, proporciona el valor inicial al nodo.

b) El terminal Feedback Node, con forma de flecha, es el encargado de trasladar el valor leído a la siguiente iteración.

En la Figura 3.5 se muestra un ejemplo de empleo del Feedback Node para realizar la misma función que en el ejemplo de la Figura 3.4.


Figura 3.5. Ejemplo de utilización de Feedback Node.

La entrada o salida de datos a un While Loop se hace a través de túneles, que se crean de forma automática en los laterales cuando son cruzados con el cableado. Dichos túneles se muestran mediante un cuadrado. Por defecto, un túnel de salida en un bucle while proporcionará, una vez finalizado el bucle, el valor correspondiente a la última iteración. Existe la opción de modificar el comportamiento de un túnel de salida mediante su menú de contexto asociado (botón derecho de ratón) mediante la opción Enable Indexing, en cuyo caso se proporcionará un array con todos los valores generados durante las sucesivas iteraciones del bucle. Este comportamiento se estudiará con más detalle en el apartado de Arrays.

La Figura 3.6 ilustra un ejemplo de las alternativas en la utilización de túneles. En el borde derecho de la estructura hay tres túneles. El primero no tiene habilitada la característica de indexado, por lo que en el indicador Túnel: último valor se mostrará el último valor generado una vez finalizado el bucle. En el indicador Shift Register se mostrará el mismo valor. El tercer túnel tiene habilitado el indexado, por lo que proporcionará a su salida un array con todos los valores generados en las sucesivas iteraciones. Por ello el tercer indicador es de tipo array.


Figura 3.6. Ejemplo de utilización de túneles en bucle while.

3.2.1.2 Bucle For (For Loop)

El bucle For (For Loop) repite el código ubicado en su interior un número de veces que se fija inicialmente. Este número de iteraciones no se podrá modificar en su interior. Dispone de dos terminales:

a) El terminal de iteración , similar al indicado para el bucle While Loop.

b) El terminal de conteo permite fijar el número de repeticiones del bucle. Se simboliza con la letra “N” y está ubicado en la esquina superior izquierda.


Figura 3.7. Estructura For Loop.

En este bucle también se emplea Shift Register y Feedback Node del mismo modo que se ha explicado para el bucle While Loop. Los menús contextuales son también muy similares, al igual que el empleo de túneles.

3.2.1.3 Funciones de Temporización en Estructuras

Con frecuencia es necesario temporizar la ejecución de una estructura iterativa. Las funciones ilustradas en la Figura 3.8, disponibles en Timing de la paleta de funciones, permiten temporizar el tiempo de ejecución de ambos bucles.


Figura 3.8. Funciones de temporización.

La función Wait introducirá un retardo especificado en milisegundos, mientras que la función Time Delay lo hará en segundos a través de su terminal de entrada Delay Time (s). La función Wait Until Next ms Multiple introduce una espera hasta que el reloj del sistema sea múltiplo del valor asignado a su terminal de entrada millisecond multiple. De este modo se garantiza un retardo de ejecución del bucle con un período fijo de tiempo. En todos los casos, el retardo se puede especificar mediante una constante en el diagrama de bloques, un control en el panel frontal o cablearse al resultado de otras funciones dentro del bucle. La Figura 3.9 muestra un ejemplo de bucle for con temporización. El bucle se ejecutará diez veces, con una iteración cada 100 milisegundos (especificados mediante la constante conectada al terminal de entrada de la función Wait Until Next ms Multiple). En cada iteración se genera un número aleatorio entre 0 y 1 (función Random Number (0-1)), se muestra en el indicador number (0-1) y se produce la espera hasta que el reloj del sistema llegue al próximo múltiplo de 100 ms.


Figura 3.9. Ejemplo de temporización en un bucle For.

3.2.2 Estructuras de casos y eventos

Estas estructuras se caracterizan por contener varios subdiagramas, de los cuales sólo uno se ejecuta en función de una condición. Además, sólo uno de los subdiagramas es visible en cada momento.

3.2.2.1 Estructuras de casos (Case Structure)

Permite ejecutar el código correspondiente a cada uno de sus subdiagramas en función de la condición seleccionada y puede utilizarse para dos o más condiciones. Es por tanto equivalente a sentencias de tipo if o switch en lenguajes de programación textuales.

Tal como ilustra la Figura 3.10, esta estructura incluye un identificador y un terminal selector:

 El identificador se ubica en la parte superior, formado por un menú desplegable, donde se muestran los distintos Casos. Su selección permite ver y editar el subdiagrama a ejecutar para cada caso. Desde el menú de contexto se pueden añadir nuevos casos y eliminar o duplicar los existentes. El orden de los subdiagramas se puede modificar con la opción Rearrange Case.

 El terminal selector está ubicado en el lateral izquierdo con el símbolo “?”. Se encarga de evaluar la condición que le llega para seleccionar el subdiagrama a ejecutar.

Los datos que se pueden conectar al selector del Case son los siguientes:

 Booleano: actuará como una sentencia if..then..else en un lenguaje textual. El selector booleano sólo podrá tomar los valores verdadero o falso (True, False). Si se cumple la condición verdadera se ejecutará el código correspondiente al subdiagrama True, y si no, la correspondiente al subdiagrama False.

 Numérico: la condición será que el número del selector sea igual al mostrado en el menú del Case. Cuando queramos ejecutar el mismo código para un rango de valores deberemos escribirlos separados por comas en el menú del Case, por ejemplo “3, 4, 5, 6”. Se debe utilizar números enteros (control numérico azul). Para datos enum o ring se puede escribir el nombre del ítem en lugar del valor numérico.

 String: se diferencia del numérico en que el menú desplegable del identificador se utilizará texto encerrado entre comillas. La condición será que el texto sea igual al del selector. Se puede conectar un String Control o un Combo Box de la subpaleta String & Path de la paleta de Controles del Panel Frontal.

 Cluster de Error (Error Cluster): actúa del mismo modo que con un booleano, y la condición será que la variable Status del cluster de error sea verdadera. Dispone de dos subdiagramas: Error y No Error.

Dependiendo de que el tipo de dato que se le conecte al selector sea booleano, String o numérico, éste tomará un color verde, magenta o azul, respectivamente.

Cuando el selector se conecta a un String o a un dato numérico es obligatorio disponer de un caso que se ejecute por defecto. Se puede realizar escribiendo en el identificador una coma y seguido Default o seleccionando Make This The Default Case en el menú contextual. Al igual que con las estructuras iterativas, se pueden pasar datos a través de túneles.


Figura 3.10. Ejemplos de uso de la estructura Case con distintos tipos de datos para la condición.

3.2.2.2 Estructura de eventos (Event Structure)

Es una estructura similar a la de casos (véase la Figura 3.11). Permite ejecutar una u otra parte del código, en función de diferentes eventos relacionados con nuestra aplicación, tales como clics o movimientos del ratón, de ventanas para maximizar o minimizar, pulsación de teclas, etc.


Figura 3.11. Estructura de eventos (Event Structure).

Durante la ejecución, se espera a que se produzca un evento, y entonces se ejecuta el subdiagrama que se le haya asociado. Esta estructura tiene siempre un evento por defecto: el Timeout. Asociado a este evento, en la esquina superior izquierda aparece un término denominado Event Timeout que se utiliza para asignar el tiempo en milisegundos para el cual se produce su ejecución. El valor por defecto para este terminal es de -1 (nunca se produce timeout).

Del mismo modo que la estructura Case, dispone de varios subdiagramas y un identificador en la parte superior. En este identificador se muestra la condición que produce la ejecución de su subdiagrama asociado. Los subdiagramas se gestionan del mismo modo que en la estructura Case (añadir, eliminar, duplicar, etc.). Los eventos se configuran mediante la ventana Edit Events (menú de contexto » Edit Events Handled by This Case …, o al añadir nuevos casos), tal como se muestra en la Figura 3.12.

En la lista de eventos predefinidos existen dos tipos:

 Los marcados con una flecha verde, sin interrogación al final.

 Los marcados con una flecha roja, terminados en interrogación y con el mismo nombre que los anteriores. Estos eventos funcionan como filtros (Filter Event) y se evalúan antes de la acción asociada al evento. Además, pueden desactivar el evento utilizando el terminal Discard? que aparece. En la Figura 3.13 se muestra una estructura de este tipo que evita que el usuario cierre el panel frontal.

En la parte izquierda de cada subdiagrama de esta estructura se muestran los terminales Event Data Node que proporcionan información relacionada con el evento como, por ejemplo, una referencia al control o el tipo de evento.

Cuando se utilicen este tipo de estructuras, hay que tener en consideración algunas recomendaciones:

 La estructura de eventos debe utilizarse dentro de un bucle while loop.

 No debe utilizarse una estructura de eventos dentro de otra.

 Si la estructura de eventos está dentro de un bucle while y éste contiene un control de Stop de tipo latch (comportamiento mecánido del control), la estructura de eventos debe contener un caso asociado al cambio de valor de dicho control.Figura 3.12. Cuadro de diálogo de edición de eventos.Figura 3.13. Ejemplo de uso de Filter Event.

 Los cambios de valor en los controles del panel frontal sólo generan eventos cuando el cambio se produce en la interfaz de usuario, pero no cuando se alteran mediante el programa (utilizando, por ejemplo, variables locales).

3.2.3 Estructuras de secuencia (Flat Sequence y Stacked Sequence)

En un lenguaje textual, las instrucciones del programa se ejecutan secuencialmente en el orden en que aparecen. En LabVIEW, una función se ejecuta cuando tiene disponible todos los datos de entrada.

Cuando sea necesario que un subdiagrama se ejecute antes que otro se debe utilizar una estructura de secuencia. Cada subdiagrama estará contenido en un frame o marco, y éstos se ejecutarán en el orden de aparición. Existen dos estructuras de secuencia: Flat Sequence y Stacked Sequence, tal como se muestra en la Figura 3.14.


Figura 3.14. Estructuras Flat Sequence (izquierda) y Stacked Sequence (derecha).

Flat Sequence funciona de igual forma que Stacked Sequence, sólo que es más visual. Su diseño recuerda a los fotogramas de una película. Los frames se ejecutan uno tras otro, siguiendo el orden de izquierda a derecha. Los datos pueden cablearse directamente desde un frame a otro a través de túneles.

Stacked Sequence 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. Para crear túneles entre un frame y los demás, es necesario utilizar la opción Sequence Local del menú contextual.

Presionando con el botón derecho del ratón en el borde de ambas estructuras, aparece un menú contextual que permite crear frames, editar, borrar, cambiar el tipo de secuencia, etc.

3.2.4 Estructuras temporizadas. Timed Loop y Timed Sequence

Las estructuras temporizadas aparecieron en la versión 7.1 de LabVIEW con el objetivo de ser utilizadas en aplicaciones de tiempo real.

La estructura Timed Loop repite el código ubicado en su interior con unas condiciones temporales hasta que se cumple una determinada condición (véase la Figura 3.15). Está disponible en el diagrama de bloques (Functions » Programming » Structures » Timed Structures) y su representación es similar a la de un while loop rodeado de un borde azul. A diferencia del bucle while en un Timed Loop no es necesario establecer una condición de parada o continuación. Además, incluye varios nodos que pueden extenderse/contraerse para mostrar más o menos datos. Éstos son:

 El nodo de entrada a la izquierda, fuera del bucle. Permite configurar los parámetros temporales del bucle bien mediante un asistente, bien cableando los terminales de datos.

 Nodo de salida a la izquierda, dentro del bucle. Proporciona información sobre la iteración anterior: si se ha producido error (Error), tiempo esperado y real de finalización (Expected End[i-1], Actual End[i-1]), si se ha finalizado a tiempo (Finished Late?[i-1]), etc.

 Nodo de entrada a la derecha, dentro del bucle. Permite modificar de manera dinámica los parámetros de tiempo de la estructura para la siguiente iteración. Estos parámetros son los mismos que los del nodo de entrada externo al bucle, a excepción del nombre del bucle y de la fuente de reloj.

 Nodo de salida a la derecha, fuera del bucle. Proporciona información del bucle una vez que ha finalizado su ejecución.Figura 3.15. Estructura Timed Loop.

La configuración en los nodos de entrada se puede realizar cableando valores a sus terminales o bien haciendo doble click sobre ellos, en cuyo caso se muestra un cuadro de diálogo de configuración como el que se muestra en la Figura 3.16. A continuación se describen los parámetros de configuración más importantes:

 Fuente de reloj (Loop Timing Source). Dependiendo de la plataforma hardware sobre la que se esté ejecutando la aplicación, se podrán seleccionar diferentes fuentes de reloj (Timing Source). En el caso particular de un ordenador personal, esta fuente será un reloj de 1KHz del sistema operativo. La fuente de reloj también se puede crear externamente al Timed Loop en el diagrama de bloques mediante el VI Creat Timing Source (Programming »Structures » Timed Structures) y cablearlo al terminal de fuente de reloj. En la paleta Timed Structures se dispone de otras funciones para la sincronización de Timed Loops (Syncronize Timed Structure Starts) o para establecer el inicio de cada una de las estructuras (Buiding Timing Source Hierarchy).


Figura 3.16. Cuadro de diálogo de configuración de Timed Loop.

 Period. Es el intervalo de tiempo entre el inicio de una iteración y la siguiente.

 Priority. Establece la prioridad de ejecución de un bucle respecto a los demás. Un mayor valor corresponde a mayor prioridad.

 Offset. Tiempo que el bucle espera antes de iniciar la primera ejecución.

 Deadline. Tiempo máximo de que dispone el bucle para ejecutar el código alojado en su interior. Si la ejecución no se realiza en dicho tiempo el terminal Finished Late[i-1]? tomará valor True.

 Action on Late Iterations. Permite configurar cómo se debe comportar el bucle cuando la ejecución del código supone más tiempo del establecido. Se pueden saltar iteraciones (Discard missed periods) o bien volver a sincronizar la siguiente iteración con el período (Maintain original phase).

Además, es posible añadir frames a un Timed Loop mediante la opción Add Frame After o Add Frame Before del menú de contexto que aparece al hacer clic con el botón derecho del ratón sobre su marco. Cada uno de los subdiagramas se ejecutará de forma secuencial con sus propias especificaciones temporales. Si se modifican los parámetros temporales en el nodo derecho del primer subdiagrama, dichos parámetros serán los utilizados en el segundo.


Figura 3.17. Utilización de varios frames en una estructura Timed Loop.

La estructura Timed Sequence presenta las mismas características en cuanto a su comportamiento temporal. La única diferencia es que no se repite la ejecución de sus subdiagramas, por lo que no se especifica el periodo y no tiene condición de parada/continuación, tal como se ilustra en la Figura 3.18.


Figura 3.18. Estructura Timed Sequence.

3.2.5 Nodos de Fórmula (Formula Node) y Scripts

Los Formula Node evalúan funciones matemáticas utilizando una sintaxis similar a la empleada en lenguaje C. Formula Node está disponible en el diagrama de bloques en la subpaleta Structures »Mathematics »Script&Formula.

Se utiliza fundamentalmente para programar expresiones matemáticas con funciones basadas en texto en vez de utilizar funciones gráficas que pueden ocupar mucho espacio en el diagrama. La Figura 3.19 muestra una expresión matemática programada con primitivas gráficas y con Formula Node.


Figura 3.19. Expresión matemática expresada mediante primitivas gráficas (izquierda) y su equivalente con Formula Node (derecha).

Para el empleo de Formula Node deben tenerse en cuenta las siguientes recomendaciones:

 Para agregar variables, pulsar con el bótón derecho del ratón sobre el marco izquierdo o derecho de la estructura y seleccionar la opción de agregar entrada (Add Input) o agregar salida (Add Output). Los nombres asignados a las variables serán los mismos que se utilicen al escribir la fórmula en el interior de la estructura (los nombres son sensibles a mayúsculas/minúsculas).

 Las declaraciones deben terminar con un punto y coma (;)

 Al usar varias fórmulas en el mismo nodo de fórmula, cada variable asignada (las que aparecen en la parte izquierda de cada fórmula) debe de tener un terminal de salida en el nodo. No obstante, el cableado de estos terminales de salida no es obligatorio (véase la Figura 3.20).Figura 3.20. Formula Node con varias expresiones.

 No hay límite para el número de variables o de fórmulas, y nunca podrá haber dos entradas o dos salidas con el mismo nombre, aunque una salida sí podrá tener el mismo nombre que una entrada. Todas las variables de salida deberán estar asignadas a una fórmula por lo menos una vez.

 Desde la ayuda del menú contextual (Help), se pueden consultar todas las funciones y operadores que se pueden utilizar en Formula Node.

Cuando únicamente se necesita implementar una ecuación compuesta por una única variable se puede utilizar la función Expresión Node (véase la Figura 3.21) que se encuentra ubicada en la subpaleta de Numerics, de la paleta de funciones.


Figura 3.21. Uso de Expression Node para ecuaciones de una sola variable.

Otra forma de incorporar fórmulas consiste en utilizar el VI Express Formula, el cual se ubica en Express> Arithmetic & Comparison, y utiliza el icono mostrado en la Figura 3.22. Haciendo doble clic sobre el icono aparece una ventana similar a una calculadora donde se pueden introducir directamente las fórmulas (véase la parte derecha de la Figura 3.22)


Figura 3.22. VI Express Formula. Icono (izquierda). Ventana de configuración (derecha).

Existen otras estructuras similares a Formula Node, denominadas Scripts, que también aceptan textos, permitiendo combinar la programación propia de LabVIEW con la programación textual tradicional.

Mathscript Node, Matlab Script Node y XMath Script Node, disponibles en el menú Mathematics > Scripts & Formulas > Script Nodes, utilizan una sintaxis similar a Matlab.

3.2.6 Variables locales, globales y compartidas

Las variables son imprescindibles en programación, ya que permiten almacenar la información necesaria para la resolución de cualquier tipo de problema.

Todos los controles situados en el Panel Frontal que generan un terminal asociado en el Diagrama de Bloques son variables que se identifican mediante el nombre asignado en su etiqueta.

Cuando deseemos utilizar el valor de una determinada variable en otro subdiagrama u otro VI, o simplemente queramos almacenar un resultado intermedio, será necesario recurrir a las variables (locales, globales o compartidas), dependiendo de la aplicación.

3.2.6.1 Variables locales

Las variables locales están asociadas a los controles o indicadores existentes en el Panel Frontal del VI. Su principal utilidad radica en el hecho de que una vez creada la variable local, independientemente de su procedencia (indicador o control), se podrá utilizar en el mismo Diagrama de Bloques, tanto a modo de entrada como de salida. Se suelen utilizar cuando no se puede realizar el cableado, como en el caso de bucles funcionando en paralelo, ya que el cableado entre bucles impediría dicho paralelismo de ejecución.

Estas variables sólo se pueden utilizar en el VI donde se han creado, y no sirven para intercambiar datos entre distintos VI’s. Existen dos formas de crear variables locales:

1. Seleccionando Local Variable en la subpaleta Structures de la Paleta Functions del Diagrama de Bloques. Después se le debe asociar a uno de los controles o indicadores que existen mediante el menú contextual Select Item, tal como se ilustra en la Figura 3.23.


Figura 3.23. Creación de una variable local a partir de la paleta de funciones del diagrama de bloques.

2. Directamente desde el menú contextual del terminal del control o indicador del Diagrama de Bloques, y seleccionando Create » Local Variable (véase la Figura 3.24). En ambos casos, una vez creada la variable, se puede indicar si se usará como lectura o escritura (por defecto escritura) con Change To Read o Change To Write. Que la variable local sea de lectura o escritura es independiente de si el terminal es un control o un indicador.


Figura 3.24. Creación de una variable local de lectura a partir del menú de contexto de un control.

3.2.6.2 Variables globales

Las variables globales se utilizan para compartir información entre distintos Vl’s ejecutándose en la misma máquina.

Son un tipo especial de VI, que únicamente dispone de Panel Frontal, en el cual se define el tipo de dato de la variable y el nombre de identificación imprescindible para después podernos referir a ella.

Al igual que las variables locales; las variables globales se pueden crear desde la subpaleta Structures. También se pueden crear desde File » New … » Global Variable.

Cuando escogemos la función Global creamos un nuevo terminal en el Diagrama de Bloques; este terminal corresponde a un VI que inicialmente no contiene ninguna variable. Para poderlas añadir haremos doble clic en el terminal y se abrirá el panel frontal. Una vez abierto, las variables se definen igual que cualquier control o indicador de un VI normal. Podemos crear un VI para cada variable global o definirlas todas en el mismo, que es la opción más indicada para cualquier aplicación.


Figura 3.25. Inserción de controles en el Panel Frontal de la variable global (izquierda), y selección de la variable a partir del menú contextual (derecha).

Cuando terminemos de colocar todas las variables grabaremos el VI y lo cerraremos. Si una vez cerrado queremos añadir nuevas variables, bastará con volverlo a abrir e introducir los cambios necesarios. Para añadir nuevos terminales que hagan referencia a las variables globales creadas, no volveremos a ejecutar la función Global, ya que esto crearía un nuevo VI, sino que abriremos el ya existente mediante la opción Select a VI del menú de la paleta Functions y seleccionaremos la variable a través del comando Select ltem del menú contextual.

Del mismo modo que para las variables locales, podemos utilizar una variable ya creada para leer datos o para almacenarlos mediante Change To Read Global o Change To Wríte Global.

3.2.6.3 Variables compartidas (shared variables)

Las variables compartidas (shared variables) permiten compartir información entre VI’s de un mismo ordenador, entre distintos ordenadores conectados en red o incluso entre programas ejecutándose en distintos dispositivos hardware. Son unos de los elementos básicos en la programación en tiempo real junto con las estructuras temporizadas. Este tipo de variables está disponible desde la versión 8.0 de LabVIEW.

Para crear una variable compartida ésta ha de añadirse dentro de una librería de un proyecto mediante su menú de contexto (New » Variable), tal como se muestra en la Figura 3.26. Entonces aparece un cuadro de diálogo que permite modificar sus propiedades. Una vez creada la variable, sus propiedades pueden modificarse mediante el menú de contexto (véase la Figura 3.27).


Figura 3.26. Variables compartidas.


Figura 3.27. Propiedades de la variable compartida.

Al crear la variable ha de establecerse, como mínimo, su nombre, el tipo de variable (Variable Type) y su tipo de datos (Data Type) dentro de la categoría Variable. La variable puede ser de los siguientes tres tipos:

 Single-Process. Su comportamiento es similar al de una variable global, y se utilizan para compartir datos entre diferentes VIs dentro del mismo ordenador.

 Network-Published. Para compartir datos a través de la red entre diferentes ordenadores. Dentro de la categoría Network se muestran las propiedades de este tipo de variable (véase la Figura 3.28). Al activar la casilla Use Buffering, los valores de la variable se almacenan en una cola FIFO (First-In-First-Out) del tamaño que se especifique. En caso contrario, sólo dispondrá del último valor generado. Si se activa Single Writer la variable sólo acepta escrituras desde el primer VI que inicie la conexión de red, y no de Vl’s que conecten más tarde. Cuando el primer VI se desconecta, el siguiente en la cola podrá escribir la variable. La casilla Enble Aliasing permite conectar con otra variable. Si esta casilla no está activada, el ordenador publica la variable en la red. Si se activa, se puede elegir otra variable ya publicada en otro ordenador mediante el botón Browse, que muestra un diálogo como el de la Figura 3.29, o bien escribiendo su ruta (con el formato \\ordenador\librería\variable).


Figura 3.28. Propiedades de red la variable compartida.


Figura 3.29. Enlace a otra variable (binding) ya publicada.

Una vez creada la variable compartida, para utilizarla basta arrastrarla sobre un Panel Frontal o un Diagrama de Bloques y configurarla para su uso como lectura o escritura. Cuando se arrastra sobre el Diagrama de Bloques, el nodo de la variable tiene tres terminales: valor, error y time stamp (opcional). También es posible ubicar una variable compartida en el Diagrama de Bloques mediante Functions » Programming » Shared Variable. Una vez ubicado el terminal, habrá que hacer doble clic sobre el mismo y navegar el proyecto para asociarlo a una variable compartida creada previamente.

3.3 Tipos de Datos

Los controles e indicadores que se ubican en el Panel Frontal tienen asociado, como se describió en capítulos anteriores, un terminal en el Diagrama de Bloques, cuyo color y acrónimo varía en función del tipo de datos de que se trate, y que presenta una flecha saliente y borde grueso para los controles y una flecha entrante y borde fino para los indicadores. Además, en el Diagrama de Bloques es posible insertar constantes, que no tienen objeto asociado en el Panel Frontal.

Los controles e indicadores pueden tener diferente aspecto, aunque su terminal asociado en el Diagrama de Bloques sea del mismo tipo. Por otra parte, LabVIEW permite representar los terminales en el Diagrama de Bloques en dos modos: como iconos o como terminales. Para ello se puede marcar/desmarcar en el menú de contexto del terminal la opción View As Icon. También es posible modificar la forma en que LabVIEW representa los terminales por defecto en el menú Tools » Options … » Block Diagram » casilla Place Front Panel Terminals As Icons.


Figura 3.30. Controles e indicadores de distintos tipos de datos primitivos y sus correspondientes terminales en el Diagrama de Bloques.

En el menú de contexto de los objetos del Panel Frontal se incluyen una serie de opciones, como se muestra en la Figura 3.30. Algunas son comunes y otras varían según el tipo de datos.

Asociados al propio objeto en el panel frontal aparecen varios elementos, muchos de los cuales pueden mostrarse/ocultarse desde el menú de contexto:


Figura 3.31. Elementos asociados a los objetos del Panel Frontal.

 Label. Texto que se visualiza asociado al objeto del Panel Frontal y a su correspondiente terminal en el Diagrama de Bloques. Es importante asignar a cada objeto un nombre significativo, ya que esto facilitará la tarea de localizar su terminal asociado en el Diagrama de Bloques.

 Caption. Texto también asociado al objeto, pero que sólo aparece en el Panel Frontal.

 Radix. Indica el formato de visualización de los terminales numéricos (d: decimal, o: octal, x: hexadecimal, b: binario).

 Valor. Es el valor representado en el objeto.

 Unidades. Los objetos numéricos pueden tener asociado un tipo de unidades.

 Botones de incremento/decremento. Para aumentar/disminuir el valor del objeto numérico.

De entre las opciones de contexto específicas según el tipo de datos cabe destacar que:

 En los numéricos se puede modificar el formato de visualización, rango de entrada, etc (Properties en su menú de contexto).

 En los controles Booleanos, la opción Mechanical Action permite seleccionar su comportamiento ante la pulsación sobre el mismo. La Figura 3.32 ilustra los tipos disponibles. En cada diagrama, la “m” representa la acción mecánica, la “v” el valor que toma el terminal y la “RD” el momento en que el VI lee el valor. Las opciones son: Switch When Pressed y Switched When Released para comportamiento como interruptor (el terminal cambia de valor al pulsar o soltar el botón del ratón sobre el control, independientemente de cuándo el VI lea el valor o el número de veces que lo lea). Switch Until Released para pulsador. Latch When Pressed, Latch When Released. Cambia el valor del terminal cuando se pulsa o se suelta el botón del ratón sobre él y retiene el valor hasta que el VI lo lee. Latch Until Released. Cambia el valor del terminal cuando se pulsa y lo mantiene hasta que se suelta o el VI lo lee (lo que ocurra en último lugar).Los distintos tipos de controles booleanos tienen una acción mecánica asignada por defecto (por ejemplo, los botones son de tipo Latch, los interruptores de tipo Switch, etc.).Figura 3.32. Diferentes comportamientos de los controles booleanos (Mechanical Action).

 En los objetos de tipo String el contenido de la variable se puede presentar en el Panel Frontal de diferentes formas (opción de contexto Display): como texto normal, como los códigos ASCII del texto en formato hexadecimal, como asteriscos (por ejemplo, para introducir contraseñas) o como códigos especiales (\t para tabulador, \r para retorno de carro, etc.).

A continuación se describen con más detalle los tipos de datos más importantes disponibles en el entorno de programación LabVIEW.

3.3.1 Tipos Primitivos: Boolean, Numericy String
3.3.1.1 Booleanos (Boolean)

Los datos booleanos sólo pueden tener dos valores: verdadero (True) y falso (False). Se asocian a controles e indicadores del tipo pulsador, interruptor, bombilla, LED, etc.

3.3.1.2 Numéricos (Numeric)

LabVIEW agrupa en la categoría Numeric diferentes tipos de datos, recogidos en la Figura 3.33:

 Enteros con o sin signo de 8, 16 o 32 bits (I8, I16, I32, U8, U16 e I32), representados por terminales en color azul.

 Racionales y complejos de precisión simple, doble o extendida (SGL, DBL, EXT o CSG, CDB, CXT), que se representan en color naranja y siguen el estándar IEEE para el formato mantisa-exponente de números en punto flotante.Figura 3.33. Tipos numéricos en LabVIEW y representación de los terminales.

Cada control numérico tiene asociado por defecto uno de estos tipos numéricos. No obstante, es posible modificarlo mediante la opción Representation en su menú de contexto. Las conversiones de tipo se hacen de manera automática. Lo mismo ocurre con las constantes que se pueden insertar en el Diagrama de Bloques.

Existen algunos controles, como los situados en la paleta Ring & Enum, que también son de tipo numérico, pero que permiten confeccionar listas de elementos de texto a los que se les asocia un número de orden, que será el valor proporcionado por el terminal asociado al control en el Diagrama de Bloques (véase la Figura 3.34). Estos valores se asocian con la opción Edit Items … de su menú de contexto, o bien mediante la opción Properties, que da acceso a todos los parámetros de configuración del control.


Figura 3.34. Controles enumerados.

3.3.1.3 Cadenas de Caracteres (Strings)

En LabVIEW, los terminales y cables asociados al tipo String (cadena de caracteres) se representan en color rosa. Al igual que en otros lenguajes de programación, una variable de tipo String se alamacena en forma de un puntero de cuatro bytes con el tamaño de la cadena seguido de los sucesivos caracteres. Los objetos de tipo String pueden tener caracteres imprimibles (con representación en pantalla) o no imprimibles. Por ello, en el Panel Frontal es posible modificar la forma de representación (opción Display) como normal, códigos especiales, tipo clave o hexadecimal (Normal Display, ‘\’ Codes Display, Password Display o Hex Display), tal como se indicó en apartado 3.3.

3.3.2 Arrays y Clusters
3.3.2.1 Arrays

Los arrays agrupan elementos de datos del mismo tipo. Un array puede tener una o más dimensiones y hasta 231-1 elementos por dimensión, si lo permite la memoria. Se pueden construir arrays de cualquier tipo de datos, excepto otro array, chart o graph.

Los elementos del array están ordenados, y se accede a cada elemento mediante un índice, que tiene un rango de 0 a n-1, donde n es el número de elementos del array.

Los arrays están disponibles en la paleta Controls » Array Matrix & Cluster, del Panel Frontal (véase la Figura 3.35).


Figura 3.35. Arrays en el Panel Frontal. Ubicación en la Paleta de Controles.

En el Diagrama de Bloques, el cableado de un array aparecerá más grueso y en el color del tipo de datos de que se trate. En el caso de dos o más dimensiones, aparece como una doble línea. En lo referente a los terminales, el acrónimo del tipo de datos aparecerá en corchetes (por ejemplo, [TF] para un array de booleanos, [DBL] para un array numérico de tipo DBL, etc.).

Los arrays se pueden configurar como grupo de salidas de datos o como grupo de entrada de datos. Para ello, los controles o indicadores deben colocarse dentro de la estructura (shell) del array (ventana de objetos), antes de utilizarlo en el Diagrama de Bloques. En caso contrario, el terminal aparece negro con un paréntesis vacío.

Para realizar el ejemplo de la Figura 3.36, primero se selecciona un control Switch y se inserta dentro de uno de los arrays y, posteriormente se inserta un Led dentro del otro. Para crear varios botones y varios leds, se va con el puntero del ratón a uno de los bordes del recuadro del array e inmediatamente aparecen botones azules con los cuales podemos agrandar el recuadro y la cantidad de elementos dentro del mismo, creando, de este modo, un array de una dimensión.

En el Diagrama de Bloques conectaremos el array de los switches con el array de los leds, tal como se observa en la Figura 3.36. Cada uno de los botones queda enlazado con su respectivo led, dependiendo de la posición en la que está.

Cuando se ejecuta el VI, los botones del índice sirven para indicar el número de orden del primer elemento que se ve en el objeto array.


Figura 3.36. Creación de un array de una dimensión.

Para agregar dimensiones, se hace clic con el botón derecho del ratón sobre el área de índice y se selecciona Add Dimension del menú de contexto. También se puede utilizar la herramienta de posicionamiento para cambiar el tamaño del índice.

Ücretsiz ön izlemeyi tamamladınız.

Türler ve etiketler

Yaş sınırı:
0+
Hacim:
398 s. 298 illüstrasyon
ISBN:
9788426720665
Yayıncı:
Telif hakkı:
Bookwire
İndirme biçimi:

Benzer kitaplar