Читать книгу: «LabVIEW: Entorno gráfico de programación», страница 5
El MathScript Node es otra de las nuevas estructuras de LabVIEW 8.0 y mejorada en 8.20. A diferencia de otras, MathScript Node no llama a otros programas, y su código es compilado junto con el resto del VI.
En Tools > MathScript Window… puede abrirse una ventana (Figura 2-25) para ayudar a depurar el código. En el campo Command Window pueden escribirse los comandos, también puede ejecutarse un script completo desde la pestaña Script y los resultados pueden verse en la pestaña Variables.

Figura 2-25. Depuración de código con MATH SCRIPT.
La sintaxis que se usa en la estructura MathScript Node es en gran medida compatible con la de MATLAB. Dispone de cientos de funciones que pueden consultarse en la ayuda.
Por otra parte, MATLAB Node también se encuentra únicamente en el menú Mathematics > Scripts & Formulas > Script Nodes. Esta estructura llama al servicio «Matlab Server» a través de ActiveX para ejecutar los comandos (sólo en Windows).
En versiones antiguas también existía XMath Script Node, que utilizaba el programa MATRIXx de National Instruments, similar a MATLAB, pero en las versiones actuales ya no se mantiene.
Al igual que con FORMULA NODE, se deben crear variables de entrada y salida, pero en este caso hay que asignar explícitamente el tipo de datos, tal y como puede verse en la figura 2-26.

Figura 2-26. MathScript Node y MATLAB Script Node.
En la figura 2-27 pueden verse estas dos estructuras. El código de ambas es equivalente: se trata del diseño de un filtro y su aplicación a una señal aleatoria. Obsérvese el parecido de los códigos.

Figura 2-27. Implementación de un filtro utilizando las dos estructuras.
2.10. Ejemplos
2.10.1. Ejemplo I: Filtro promediador
2.10.1.1. Explicación teórica
Los filtros integradores o promediadores son un tipo de filtro paso bajo. Se emplean para reducir el ruido de una señal suponiendo que éste es de frecuencia mucho más alta que la propia señal. También se aplica en la edición de imágenes para añadir difuminados.
El funcionamiento es sencillo: calcular el promedio de una señal en un intervalo determinado.
En un promediador móvil existe lo que se llama ‘ventana’, que indica el tamaño del intervalo a promediar. En un sistema discreto este tamaño serán las muestras de la secuencia de entrada que se promediarán. Una ventana móvil avanza en cada paso del algoritmo una posición en la secuencia de entrada para realizar el promediado como se muestra en la figura 2-28.

Figura 2-28. Ventana móvil para realizar el promediado.
Matemáticamente puede expresarse la ecuación en diferencias del sistema como:

Donde:
y(n): valor calculado.
N: tamaño de la ventana.
x: señal de entrada.
k: índice para recorrer los valores a promediar.
Aplicando la propiedad del desplazamiento temporal, se puede hallar la transformada Z del sistema definido por la ecuación anterior y, a su vez, de esta nueva expresión se obtendrá la estructura del filtro.

La estructura de la figura 2-29 se ha particularizado para un orden igual a tres.

Figura 2-29. Filtro de orden tres.
2.10.1.2. Código
Para realizar este ejemplo se implementará un filtro promediador móvil de orden tres que añada un difuminado a una fotografía.
La entrada será una imagen en blanco y negro con formato BMP que consiste en una lista (array) de valores de cada uno de los componentes de la imagen. Estos componentes son RGB (Red, Green, Blue), por lo que para cada punto habrá tres valores. La siguiente lista representa cómo sería este array para una imagen con cuatro puntos:
R1, G1, B1, R2, G2, B2, R3, G3, B3, R4, G4, B4...
Como la imagen sólo contiene grises, los valores de los tres componentes son iguales, por lo tanto bastará con aplicar el filtro a sólo uno de los componentes o lo que es lo mismo, a uno de cada tres valores.
El programa empezará leyendo el fichero y desglosando su información; entre esta información se obtendrá un array RGB como el anterior. Por simplicidad se trabajará en una dimensión; una mejora sería actuar por filas y luego otra vez por columnas.
La función Decimate 1D Array con un tamaño de tres elementos obtendrá en la primera de sus salidas un array cuyos elementos sean los de las posiciones 1, 4, 7, 10, 13… del array de entrada, es decir, obtendrá todos los valores del componente R de cada punto.
Después los valores R de cada punto son promediados: el promediador sumará el último valor leído y los tres anteriores; el resultado se dividirá por cuatro. La ‘ventana’ se implementará mediante shift registers y el resultado se irá indexando en el lateral del FOR.
Para reconstruir la imagen basta con hacer el proceso inverso al de decimar: interpolar. Finalmente, se dibujan las imágenes antes y después de aplicar el filtro.
Mediante la señal selector se podrá elegir el tipo de estructura implementada. Si el selector está activado el filtro será como en la figura 2-29, y si no está activado habrá realimentación de las salidas a la entrada (IIR).

Figura 2-30. VI que implementa un filtro promediador móvil de orden 4.
2.10.1.3. Resultado
Para explicar el efecto del filtro se puede decir que proporciona cierta resistencia o inercia al cambio en la imagen. En la figura 2-31 puede verse el resultado del filtro sobre una fotografía.

Figura 2-31. Resultado del filtro sobre una fotografía.
La figura 3-32 es un detalle del principio de la fotografía después de aplicar el filtro usando realimentación de salidas a la entrada para magnificar este efecto. En ella se ve cómo hay una serie de puntos negros en la esquina que en la original no estaban, esto se debe a la condición inicial del filtro (hay que esperar a que todos los shift registers tengan datos que provengan de la foto).

Figura 2-32. Detalle de los primeros puntos que pasan por el filtro y del borde izquierdo.
Otro efecto que se puede apreciar es que la parte derecha de la imagen parece extenderse en la izquierda; es decir, la línea del horizonte de la parte derecha se puede ver que se extiente por la parte izquierda también. Esto se produce porque se ha considerado la imagen como un único array; para solucionar esto se podría aplicar el filtro a cada una de las filas.
Es aconsejable ejecutar este ejemplo con la opción Highlight Execution activada, pues de esta manera se puede ver un ejemplo práctico del uso de los shift registers y la salida indexada en los bucles.
Como puede intuirse, este método se puede generalizar para otros tipos de filtros FIR e IIR.
2.10.2. Ejemplo II: Generación de números primos
2.10.2.1. Explicación teórica
Como todo el mundo sabe, un número primo es el número natural que sólo es divisible por él mismo y por la unidad.
Desde los tiempos de Euclides (300 a. de C.) se sabe que existen infinitos números primos. Los primeros algoritmos para encontrar números primos también proceden de la época de los antiguos griegos, como la «criba de Eratóstenes». Desde entonces ha pasado mucho tiempo, pero aún se sigue investigando en este campo. Por ejemplo, en el año 2004 se creó otro algoritmo que mejora el anterior llamado «criba de Atkin».
La generación de números primos es una herramienta muy interesante en campos como la criptografía, donde algunos algoritmos como el RSA usan números primos de valores altos como base para realizar el cifrado.
2.10.2.2. Código
En este ejemplo se optará por un algoritmo que sea lo más sencillo posible, consistirá en hacer un barrido de números empezando por el dos hasta el límite indicado por el usuario, es decir, se recorrerán los números 2, 3, 4, 5, 6, 7, 8… Para cada número se volverá a hacer un barrido hasta encontrar un número que sea divisor del primero. Si estos dos números son iguales significa que el único divisor de este número es él mismo, por lo tanto es un número primo. En la figura 2-33 puede verse un diagrama de flujo de este algoritmo. Nótese que en este algoritmo, al igual que en muchos otros, se obvia el número uno.
El código para implementar este algoritmo con el nodo FORMULA es exactamente igual que en lenguaje C. En primer lugar, se declararán las variables y, a continuación, se usan dos bucles FOR, uno para cada barrido.
Para determinar si un número es divisor del otro, se comprobará si el resto de la división entre ambos es igual a cero. Finalmente, los números primos encontrados se almacenan en un array.

Figura 2-33. Algoritmo para la obtención de números primos.

Figura 2-34. Implementación del algoritmo en un VI.
2.10.2.3. Resultado
La figura 2-35 muestra un array con los números primos que hay entre dos y quince como resultado de la ejecución del programa anterior.

Figura 2-35. Números primos obtenidos.
En este ejemplo se han aprendido dos cosas: en primer lugar a usar el FORMULA NODE, y en segundo lugar a darse cuenta de que, a pesar de su nombre, esta estructura no sólo sirve para introducir fórmulas matemáticas sino que también se pueden emplear en ella elementos de un lenguaje de programación como bucles, funciones, etc.
2.10.3. Ejemplo III: Bingo
2.10.3.1. Explicación teórica
En esta ocasión se desea realizar un programa que genere un cartón para jugar al bingo. Para esto se necesita crear una matriz o array de dos dimensiones que contenga valores aleatorios entre 1 y 100. Habrá diez columnas (una para cada decena) y cuatro filas.
2.10.3.2. Código
El programa principal tiene la típica estructura de un WHILE y un EVENT.
El evento que se muestra en la figura 2-36 corresponde al cambio de valor de un botón llamado cartón. Este botón tiene por acción mecánica Latch When
Released (se verá en el próximo capítulo). Cuando se presiona el botón se ejecutará el subdiagrama.
Para generar un cartón se necesitan dos bucles; el primero recorrerá cada una de las decenas. Como la cantidad de ejecuciones es conocida, se usará un FOR. Dentro de este bucle habrá otro; este segundo bucle será un WHILE, y en él se generarán números de forma aleatoria entre dos límites, límites que sirven para acotar los números dentro de la decena correspondiente.
La función Random Number (en Programming > Number) devuelve números entre el 0 y el 1. Para generar números enteros se multiplicará por 10 y se sumará el límite inferior; el valor resultante se aproxima al entero superior. En caso de que el número ya haya sido generado antes se descartará; si no había sido generado, se almacenará en un array. Para detectar si el número ya se había generado, se busca dentro del array si algún valor coincide con el nuevo mediante Search 1D Array (en Programming > Array). Si no había ninguno, la salida de esta función contendrá el valor «-1» y se ejecutará el diagrama mostrado en el CASE. Para cualquier otro número se ejecutará el caso por defecto que simplemente deja pasar el array de la entrada a la salida.
Cuando se han generado cuatro números, se detiene el WHILE, se ordenan los números del array con Sort 1D Array y se pasa a la siguiente decena.
Después de recorrer todas las decenas, en la salida indexada del FOR se habrá generado un array de dos dimensiones con los números de un nuevo cartón.
La estructura EVENT contiene otro subdiagrama para cuando se presione el botón Stop. Este subdiagrama únicamente contiene una constante booleana con el valor TRUE cableada a la condición del WHILE principal. Puede pensarse que sería más sencillo dejar vacío este caso y cablear directamente el botón de Stop a la condición, pero no es recomendable porque, como se ha explicado en la sección 2.5, esto provocaría que la condición del bucle se evaluara antes de presionar el botón, con lo que el valor que tiene en ese instante obligaría a ejecutar otra iteración más.

Figura 2-36. VI para la generación de cartones para jugar al bingo.
2.10.3.3. Resultado
En la figura 2-37 puede verse un cartón de bingo generado con el programa de este ejemplo. Cada vez que se presione el botón Cartón, se generará un nuevo cartón.

Figura 2-37. Cartón obtenido de la ejecución del VI.
Este ejemplo muestra el uso de las estructuras EVENT, WHILE, FOR y CASE. Por una parte, se ha visto cuándo se debe usar FOR (con un número de ejecuciones conocido) y cuándo WHILE (cuando no hay un número determinado de ejecuciones); también se ha visto el uso de la estructura EVENT y el típico problema del botón de Stop y, por último, se ha utilizado un CASE dejando un caso por defecto. En el próximo capítulo se explicarán más detalladamente los arrays.
2.11. Ejercicios
1. ¿A qué es equivalente el siguiente programa?

Figura 2-38. Ejercicio 1.
2. Realizar un programa que calcule el factorial de un número. Hacerlo primero con estructuras de repetición y luego con FORMULA NODE.
3. Realizar un programa que genere un array con el primer millón de números enteros mediante un bucle WHILE y un FOR. ¿Cuál es más eficiente? ¿Por qué?
4. Modificar el programa del ejemplo I para que también acepte imágenes a color.
5. Realizar mediante programación visual el mismo algoritmo que en el ejemplo II. Comparar ambos programas en términos de velocidad y espacio.
6. Añadir al evento del ejemplo III otro caso cuando se presione un botón llamado bola. El subdiagrama debe simular el funcionamiento de un bombo para jugar al bingo, debiéndose tener en cuenta no repetir las bolas que ya habían sido sacadas. Opcionalmente también puede añadirse algún mecanismo para detectar si la bola que ha salido estaba en el cartón. (Pista: ver en el siguiente capítulo las propiedades de los controles.)
2.12. Bibliografía
J. Kodosky, E. Pérez, AN 039: Linear System in LabVIEW, National Instruments, 1993.
National Instruments, AN 200: Using the Timed Loop to Write Multirate Applications in LabVIEW, 2004.
National Instruments, LabVIEW Basics I Course Manual, 2000.
National Instruments, LabVIEW User Manual, 2001.
Rick Bitter et al. LabVIEW Advanced Programming Techniques, CRC Press LLC, 2001.
Capítulo 3
Tipos de datos
3.1. Tipos de terminales
En el Panel Frontal se pueden colocar controles e indicadores. Como se ha dicho en los capítulos anteriores, los controles son el punto de entrada de información al VI y los indicadores son las salidas. Los controles e indicadores tendrán su representación en el Diagrama de Bloques, donde podrán ser cableados para leer o escribir su valor.
En el Diagrama de Bloques, además, se podrán tener tambiéiran constantes. En el menú contextual de estos elementos hay opciones para cambiar de un tipo a otro. En la figura 3-1 se ha marcado la opción para cambiar un control de tipo string a un indicador del mismo tipo.

Figura 3-1. Tipos de terminales básicos y cómo cambiar de un tipo a otro.
Dependiendo del tipo de datos y del tipo de terminal se tendrán unas opciones u otras; las más importantes para cada tipo de datos son:
En los controles de tipo booleano se tiene la opción de Mechanical Action, que les permite actuar como pulsadores (latch) o interruptores (switch) (ver figura 3-2).

Figura 3-2. Interruptores y pulsadores.
Los numéricos pueden acotar el rango de entrada con Data Range y modificar varias opciones de visualización con Format and Precision.
En los controles e indicadores de tipo string se puede ver el contenido de forma normal, representado por unos códigos (ver tabla 3-1), como asteriscos o por su valor hexadecimal.
Junto a un terminal pueden aparecer varios ítems. En la figura 3-3 se muestra un control numérico con los siguientes ítems:
• Label: es un texto que da un nombre al terminal en el Panel Frontal. Esta etiqueta se empleará para identificar al elemento en variables, propiedades, etc.
• Caption: es otro texto asociado al terminal que sólo puede aparecer en el Panel Frontal.
• Incremento/decremento: en los terminales numéricos también se dispone de este elemento para aumentar o disminuir el valor del dato.
• Radix: indica el formato de visualización en los terminales numéricos enteros. Las opciones son: en decimal (d), octal (o), hexadecimal (x), binario (b) y en notación del sistema internacional (p).
• Valor: es el valor que hay en el terminal representado en el formato elegido.
• Unidades: el tipo de datos numérico también puede tener un símbolo que represente sus unidades.

Figura 3-3. Ítems de un Terminal.
Para terminales de otro tipo habrá otras opciones, incluso para terminales con el mismo tipo de datos pero con diferente forma también cambiarán estas opciones. En la figura 3-4 pueden apreciarse tres controles numéricos con formas diferentes.

Figura 3-4. Controles numéricos con diferente formato.
En el Diagrama de Bloques se representan los indicadores con una flecha en el lado izquierdo que apunta hacia el terminal simbolizando que el dato entra en el indicador desde el código, y los controles con una flecha a la derecha apuntando hacia afuera. Estos terminales pueden verse como icono o con su aspecto clásico, como se aprecia en la figura 3-5.

Figura 3-5. Símbolos de los terminales.
La visualización con forma de icono permite ver la forma del terminal, lo que puede ayudar a identificarlo; por otra parte, la vista clásica ocupa menos espacio y será la utilizada en el resto del libro. En Tools > Options > Block Diagram puede cambiarse la forma en que LabVIEW dibuja los terminales por defecto.
3.2. Tipos de datos
Una de las primeras cosas que se aprende en cualquier lenguaje de programación son los tipos de datos disponibles, bucles y estructuras de bifurcación. Las dos últimas ya se vieron en el capítulo anterior; en este se verán los tipos de datos. No debe confundirse tipo de datos con tipo de terminal. Cuando se habla de tipo de datos, se hace referencia a si son numéricos, cadenas de caracteres, booleanos, etc.
El tipo de datos se representa en el Diagrama de Bloques por el color del terminal y del cable; así, un dato booleano tendrá terminales y cables verdes para diferenciarlo de un string, que será rosa.
A continuación, se estudiarán los distintos tipos de datos con sus características más destacables, transformaciones de unos a otros y la forma en que los distintos tipos de datos de LabVIEW se almacenan en memoria. Esto último es algo a tener en cuenta en algunas ocasiones muy concretas, como pueden ser:
• Llamar a código externo.
• Trabajar con ficheros binarios.
• Otras funciones I/O.
3.2.1. Boolean
Los datos de este tipo sólo pueden tener dos posibles valores: verdadero (TRUE) o falso (FALSE), debido a lo cual suelen usarse en controles con forma de botón o pulsador y como resultado al evaluar una expresión.
Cada dato booleano se almacena en memoria en un byte completo. Si este byte tiene todos sus bits a cero, el dato tendrá el valor FALSE y cualquier otro valor del byte hará que el dato pase a TRUE.

Figura 3-6. Dato booleano.
En los controles booleanos se puede seleccionar su Mechanical Action, como mostraba la figura 3-2. Ya se dijo que los switch son equivalentes a interruptores y los latch a pulsadores. En los dibujos de la figura 3-2, que representan cada acción, hay unas letras a la izquierda: «m», «v» y «RD». La primera de ellas («m») simboliza la acción mecánica que hace el usuario sobre el control, es decir, la pulsación. La segunda («v») representa el cambio de estado que sufre el control, se indica el valor del terminal. Finalmente, la tercera («RD») sólo se puede ver en los de tipo latch y alude al momento en que, desde el Diagrama de Bloques, es leído el valor del control. Como puede verse en los iconos tipo latch, el control tiene un ‘estado estable’ y uno ‘aestable’; cuando se activa el control se pasa del estado estable al aestable durante un tiempo, y vuelve al estable inmediatamente después de que el control sea leído.
3.2.2. Numeric
Al trabajar con datos numéricos hay que distinguir entre números enteros, números racionales y complejos.
Los números enteros tienen asociado el color azul y puede elegirse su tamaño (8, 16, 32 o 64 bits), si se emplea un bit de signo (signed o unsigned) y su representación (binario, octal, decimal, hexadecimal).
Los controles de tipo Enum y Ring también son numéricos. Se trata de listas que asocian una cadena de caracteres a un valor numérico. Mediante su menú contextual se puede acceder a Edit Item para definir la lista de valores. La principal diferencia entre estos dos tipos es que en los enum el texto se considera también parte del control, por lo que para conectar un control o constante enum a un indicador enum se necesita que ambos tengan ítems con los mismos nombres, mientras que con los ring no es necesario.
En la figura 3-7 pueden verse dos constantes, el símbolo que aparece a su izquierda (una letra «d» o «x») es su representación, este ítem puede activarse con la opción radix en el menú contextual Visible Items; la primera constante es decimal y la segunda hexadecimal. La primera está conectada a un indicador que visualiza datos con signo de 32 bits (I32), mientras que la segunda lo está a un indicador sin signo de 16 bits (U16).

Figura 3-7. Constantes con diferente representación.
Los números racionales y complejos tienen asociado el color naranja. Siguen el estándar IEEE; el tamaño es de 32 bits para los de precisión simple, 64 bits para los de doble precisión y el tamaño de los extendidos depende del procesador: puede ser 128, 96, 80 o 64 bits (en procesadores más antiguos sobre Windows el más habitual solía ser 80, en procesadores actuales es 128). El primer bit siempre es el signo, los siguientes el exponente, que es de tamaño 7, 10 y 14 bits respectivamente, y finalmente la mantisa. Los complejos simplemente son dos números racionales de uno de los tamaños anteriores.

Figura 3-8. Representación en memoria de números en coma flotante.
En la figura 3-9 puede verse un número complejo, dos constantes con los valores y e y tres constantes que se conectan a tres indicadores, cada uno de la precisión indicada.

Figura 3-9. Diferentes tipos de valores numéricos.
En la versión 8.5 de LabVIEW también se introdujeron los números en coma fija, que se representan con color gris. El espacio de memoria para almacenarlos es de 64 bits, y debe configurarse para indicar cómo se deben interpretar los valores que contengan.
Para configurar un dato en coma fija hay que dirigirse a la pestaña Properties > Data Type del menú contextual como aparece en figura 3-10. La configuración consiste en indicar cuántos bits se dedican en memoria a almacenar el número (Word length) y cuántos se deben usar para interpretar la parte entera (Integer word length). Por ejemplo, si ambas cantidades son iguales y de valor 8, sería equivalente a un entero de tamaño 8 bits y el valor máximo que se puede representar sin signo es 255 (FFh en memoria). Si se cambia Integer word length a 7 y el valor y Word length se mantienen en 8, el valor entero máximo será 127 y el bit que queda se utilizará para representar valores decimales; al tener sólo un bit para esto sólo se puede representar el 0,0 y 0,5. Si, por el contrario, Integer word length es 9 el valor más alto representado será el 510 (FFh en memoria), pero el salto de uno a otro será de dos unidades, es decir, el valor en memoria 00h será el valor 0 y el 01h será el valor 2. Los valores máximo y mínimo que pueden ser representados y el incremento de uno al siguiente (delta) se pueden ver en Range.
En las funciones numéricas, como Add o Multiply, se puede acceder a Properties > Output Configuration donde se obtiene un menú similar al de la figura 3-10 en el que, además, se indica el tipo de redondeo.
La principal utilidad de los números en coma fija se da en aplicaciones para FPGA.

Figura 3-10. Configuración de un control de coma fija.
Las conversiones entre tipos de datos numéricos suelen ser automáticas. Cuando se hace esto, se representa mediante un pequeño punto de color rojo (coercion dot) justo donde el cable se conecta al indicador, como se puede ver en el indicador de precisión simple de la figura 3-9 (en versiones anteriores a la 8.20 el color por defecto es gris, pero puede cambiarse en Tools > Environment > Colors). También existen funciones para forzar el tipo de conversión de un dato numérico a otro.
Otra característica interesante es la opción de usar unidades junto con los números. Así en la figura 3-11 se puede ver la resta de 1 V y 1 mV; el resultado mostrado en el indicador será 0,999 V.

Figura 3-11. Resta de dos números utilizando unidades.
Otro tipo de datos es el de tiempo (Time Stamp). Éste es un conjunto de cuatro enteros de 16 bits, de los que los dos primeros indican el número de segundos transcurridos desde el 1 de enero de 1904 a la 1:00:00; los otros dos enteros son las fracciones de segundo.
3.2.3. Strings
Los strings son cadenas de caracteres. LabVIEW asocia el color rosa a este tipo de datos. En memoria se almacenan como un puntero de cuatro bytes que apunta a una estructura compuesta por el tamaño y a continuación los valores de los caracteres. Así, el texto «hola» se almacenará como «0000 0004 686F 6C61», siendo 4 el tamaño y 68h, 6Fh, 6Ch y 61h los códigos ASCII de cada una de las letras del texto anterior.

Figura 3-12. Representación en memoria de strings.
En la figura 3-13 puede verse una constante con el contenido «texto» y otras dos constantes que representan un string vacío y un retorno de carro.

Figura 3-13. Strings.
Aunque los strings están destinados a texto, pueden contener valores que no tienen un carácter de representación. Esto puede comprobarse cambiando la forma de representación a hexadecimal a través del menú contextual o con la opción visible Items > Display Style. Al visualizar los códigos se verán los caracteres precedidos de una barra inversa, desde /00 a /FF; algunos códigos representan caracteres especiales; éstos se escriben siempre en minúsculas, y son:
Código | Descripción |
\b | Retroceso (BS) |
\f | Fin de documento (FF) |
\n | Fin de línea (LF) |
\r | Retorno de carro (CR) |
\t | Tabulador |
\s | Espacio |
\\ | Barra invertida |
%% | Porcentaje |
Tabla 3-1. Códigos especiales.
3.2.3.1. Transformaciones número-texto
Las transformaciones de números a texto y viceversa son las más usadas en LabVIEW. Muchos VI trabajan con datos de tipo texto (strings) como, por ejemplo, los de GPIB, sin embargo puede ser que los datos que se envían o reciben sean números y necesiten convertirse para realizar algún cálculo con ellos.
En la paleta Programming > String > String/Number Conversion se encuentran varios VI para realizar estas transformaciones.

Figura 3-14. Paleta de conversión número/texto.
En la primera fila se encuentran las funciones para pasar de número a texto, la segunda fila es para pasar de texto a número. El formato de los números puede ser entero o de coma flotante, decimal, hexadecimal u octal. Los dos VI de la derecha son Format Value y Scan Value. Estos VI tienen un terminal llamado format string en el que se puede especificar el formato de la conversión; para más información sobre la sintaxis de este string, consultar la ayuda de LabVIEW.
En el menú string también aparecen dos funciones llamadas Scan From String y Format Into String. Estos VI realizan funciones de escaneo, transformaciones y concatenación. Básicamente son una herramienta configurable con la que transformar números y textos a otro formato. Todos los VI de esta ‘familia’ trabajan de forma parecida a la función sprintf
del lenguaje C. Tienen un terminal común, el format string que sirve para configurar la transformación mediante unos códigos precedidos del símbolo «%
». Los códigos más habituales son: «%s
» para strings, «%f
» para números en coma flotante, «%.xf
» para indicar el número de decimales de los números flotantes, «%d
» para enteros decimales, etc.
Por ejemplo, si se desea construir un texto que diga: «He medido 3,64 voltios en la entrada 2.», siendo 3,64 y 2 entradas numéricas, se podría usar el código de la figura 3-15.
Начислим
+22
Покупайте книги и получайте бонусы в Литрес, Читай-городе и Буквоеде.
Участвовать в бонусной программе