Kitabı oku: «Programación gráfica para ingenieros», sayfa 4
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.