Building a Comment parser inspired on Python & C/C++.

Hi again…  after a while without posting anything,  I am here .

The initial idea with this blog, was to post information related with NI LabVIEW programming environment for the Spanish Speakers, this because there are few LabVIEW resources in Spanish compared against English, but I have received many suggestions from non Spanish speakers so I have been consider seriously post in English also. I am not a native English Speaker, and I hate to use  on-line translators, So I will do my best.

This time let’s review a code I developed months ago, this is comment parser based on Python & C/ C++.

You could wonder how come  a comment parser could be useful for a graphical programming environment such as LabVIEW?

It is quite common to use external files in our projects: Test executives or Script runners, configuration files, etc.

This is where a Comment parser could be useful.

This is an specific example of a Script runner application, where the commands could be saved in external files to call them later if needed.  The application send those commands to a micro controller, and the micro controller firmware process it and returns a value for each command.

W//xxx;
WR107ABB1;
R108458E2;
Wait(100);
W104D02C4;

Despite of the possible documentation about those commands, it could be handy have a small description of each command… So here is where a comment parser makes sense.

W//1234;       # This command give access to the : enter test mode.
WR107ABB1;     # Sets a temperature value.
R108458E2;     # Reads the current temperature setpoint.
Wait(100);     # Waits 100 mS.... this is command is not for the firmware, 
               # this command is processed by LabVIEW application.
W104D02C4;     #Locks the enter access mode.

Now, the external Script contains the commands which makes more readable using comments, this VI parsed out the comments and returns the commands which invokes firmware functions Notice for this particular case I use the Python comment style, because  C/C++ comment convention is not recommended since the first command (W//1234;) contains the “//” characters which in C/C++ are considered as comment line… If the C/C++ convention is used for this particular case all the text after the “W”  will be swept out.

Different example,  using again a Script runner or test executive.

/*Test sequence for BP products*/

#define CONST_VAR1 3.000
#define CONST_VAR2 2.502
#define CONST_SR 20000
#define CONST_SA 2000
//#include<C:\a.txt>
BP.Init
BP.PowerOn adjVdc(5.105)
BP.Gain (CONST_VAR1) arg1(3.141516) sr(CONST_SR) sa(CONST_SA)
BP.PowerOn
BP.Offset goal(CONST_VAR2)
BP.Offset goal(CONST_VAR2)
BP.PowerOff
BP.End
//Developed by eZ

This time I want to use an additional feature from C/C++. The directive: #define

I use it to define a variable value in my Test Sequence file… but the application will parsed out the variable and its value and the code will substitute the variable name for its variable value…

So, If I will use then the directive #define… This time it is not recommended to use the Python convention for the comments… But the C/C++ conventions fits quite well..

Take a look the picture shown below.

You may notice the output did not contain the variable name as the Input did… Now the Output(Right side) have the variable values instead… Also the comments did not appear at the right side… Now you could use then the data to feed a sequencer (Queued State Machine, etc) using the commands without ignoring the useful comments.

Feel free to write a comment (Python or C/C++ style… ) about this article

eZ

9no Congreso Internacional de Ingenieria Mecatrónica

En marzo se celebrará el congreso internacional de mecatrónica: Automatización y tecnologia, organizado por el ITESM Campus Monterrey.

Este congreso de Mecatrónica más grande de America Latina.

 

 

Habrá conferencias, talleres, concursos , Eventos sociales, etc

 

Aqui dejo la pagina oficial:

http://www.congreso-mecatronica.com/

 

Has planes para que asistas a este magno evento que tiene mucho que ofrecer

 

 

VI Nugget: Llamando código externo Parte 3::Transparencias

El ejemplo anterior nos mostró la flexibilidad que ofrece LabVIEW para llamar y ejecutar código externo… y los beneficios que se pueden obtener

Ahora mostraremos un ultimo ejemplo: Establecer transparencia a una ventana…

Ahora, no estoy del todo seguro desde que version de LabVIEW contiene la propiedad de transparecia (LabVIEW 8.2?) pero lo que si es un hecho es que en la version LabVIEW 7.x no existe dicha propiedad…

Sin embargo, es posible hacer una ventana transparente utilizando el user32.dll (Aqui dejo una breve explicación… aunque el código fuente es para VB… tiene mucha similitud en la forma de llamar a la API de Windows) http://www.codeguru.com/vb/gen/vb_graphics/transparency/article.php/c6979

Este código aún funciona en versiones de LabVIEW que tengan integrada la función de transparencia como parte de su libreria

Consideraciones:

1.-  bAlpha espera valores de 0 a 255 … como se puede observar, mediante una ecuación estos valores se pasan a representarse como un porcentaje (0% significa que la pantalla es completamente visibile, y 100% que es completamente invisible).Es por ello que hay que considerar el valor de la entrada : “Transparency(%)”. Este valor no debe aceptar valores negativos ni mayores a 100.

Esto es posible alcanzarlo creando un control adaptado que aceptes los rangos de valores definidos… y/0, definir dicha condición en la estructura “Formula node”

2.- Este SubVI debe de colocarse en el VI que queremos que tenga las propiedades traslucidas…. es decir, si se ejecuta este SubVI observaras que aunque pongas el valor del control ” “Transparency(%)” al 100%  este SubVI no cambiara, puesto que solo surte efecto para el VI que lo manda llamar…

Como regla de oro: El VI que tu deses que sea transparente, colocale este SubVI y alimenta la entrada y obtendras las propiedades traslucidas de dicha ventana.

Aqui un ejemplo de como funciona:

VI nugget:Llamando código externo::Parte2

El ejemplo propuesto en la primer parte de esta serie sugiere el uso de un dialogo… sin embargo, LabVIEW contiene algunos nodos muy similares (One Button Dialog, Two button Dialog, Three Button Dialog).

Lo más atractivo por ahora seria buscar ciertas utilidades con las que LabVIEW no venga equipado… Que tal: Un VI que detecte el estado del CAPS-LOCK?

Esta caracterisitica la has visto en muchas apliacaciones,  sobre todo en aquellas que te pide que ingreses un Password…

LabVIEW no cuenta con un nodo, funcion o método (considerando aún LabVIEW9.0), sin embargo esto puede ser alcanzado utilizando código externo… en este caso utilizaremos una vez mas el API de Windows: User32.dll

La funcion a invocar se llama: GetKeyState… aqui mayor información : http://msdn.microsoft.com/en-us/library/ms646301%28v=VS.85%29.aspx

A continuación se presenta un ejemplo muy sencillo incorporando el VI explicado anteriormente

La leyenda: Caps Lock is ON…  aparecera solo cuando este esté activado, de otro modo no se desplegara dicho mensaje.

VI nugget:Llamando código externo::Parte I

Tal como los archivos ejecutables (.exe) los archivos .dll pueden contener código (hecho en algun lenguaje de programación) datos o algun otro recruso

LabVIEW tiene la capacidad de llamar y ejecutar código externo (Dynamic link libraries o Shared libraries, generalmente bajo las extensiones: dll, drv, ocx) incrementando el poderio y robustez de la plataforma de programacion creada por National Instruments.

Vamos a describir un ejemplo básico utilizando una API de Windows (WinAPI) bastante conocida: user32.dll

Esta API contiene una funcion llamada: MessageBox (bastante intuitivo el nombre… no crees?) la cual despliega un cuadro de dialogo  “modal” el cual contiene el icono y apariencia del sistema, un set de botones.

A pesar de ser una aplicacion sencilla es muy util para desplegar información de “estatus” o de errores, una vez seleccionada la opción, el dll retorna un numero entero dependiendo el boton que el usuario haya presionado.

Para mayores informes, lea la MSDN de dicha función : http://msdn.microsoft.com/en-us/library/ms645505%28VS.85%29.aspx

El VI presentado como ejemplo, funciona de manera similar (aunque no igual) al nodo: One Dialog Button contenido en la libreria de LabVIEW,  este ejemplo no pretende sustituirlo, sino solo demostrar de una manera clara como se puede ejecutar coódigo externo.

Código Fuente

Como puede observarse,  dependiendo de el tipo de mensaje seleccionado (Message Type) es el tipo de dialogo que aparece en pantalla y la opcion seleccionada retorna un entero (en este caso se hizo un indicador tipo enum para su mejor visualización)

Tal como lo indica la MSDN, el dialogo contiene la apariencia del sistema,  asi mismo ofrece la oportunidad de colocr titulo y mensaje al dialogo.

Este ultimo dialogo correponde entonces a el tipo de mensaje llamado : OK/Cancel

Finalmente se presenta un dialogo mostrado a traves de Twitter

Y aqui uno lanzado desde nuestro VI

Saludos, espero sus comentarios

VI nugget: Obtener valores de un cursor en Gráfica XY

Es posible obtener los valores de los cursores de una gráfica XY

A continuación se presenta una propuesta para hacerlo

Asi luce la interface de usuario

Notese en este caso en particular se tienen 2 cursores… pero pueden ser más

Ahora se presenta el código fuente:

Evento XY Graph:Mouse Up

.

.

Código fuente del VI principal---Evento Stop:Value Change

Y finalmente se presenta el código fuente del SubVI:

Ahora… como habran notado, la salida (cluster) llamada Cursor “x” (donde x es el numero de cursor al que corresponde) ademas de las posiciones X-Y contiene un indice…

Supongamos que no existiera la manera de obtener (por medio de propiedades) la posicion X-Y…. bueno, con el indice seria posible obtenerlos, solo utilicen el indice en los arreglos de 1D originados en la salida del for loop (X – Y) y esos serian los datos correspondientes

No lo hice asi, puesto que ya existen dichas propiedades

Comentarios Bienvenidos!!

Saludos!

VI Nugget: Sombrero Mexicano edición Bicentenario… utilizando MathScript

Aqui solo un ejemplo como puedes hacer un sombrero Mexicano… edición Bicentenario y esto  utilizando solamente un nodo (estructura MathScript)

Esto nos da una idea de la potente capacidad de dicha estructura

La próxima vez que necesites hacer operaciones aritméticas… intenta con MathScript en lugar de utilizar muchos nodos

P.D

La sintaxis de MathScript  (lo que está escrito dentro de la estructura)  es compatible con Matlab

Saludos!

VI Nugget: Interfaces para mensajes de usuario

El rol del usuario en las aplicaciones es muy importante… y aunque muchos procesos son automatizados,  algunas aplicaciones requieren de la intervención del usuario o bien, el usuario requiere intervenir en la aplicación.

Es todo un reto desarrollar aplicaciones que sean: Facil de uilizar, robustos,  faciles de leer, faciles de mantener, confiables, etc… y este aumenta a medida que los objetivos y tamaño de la aplicación crece.

Existen libros que encaran estos y otros requisitos importantes de una manera muy completa, uno de ellos es: “The LabVIEW style book” escrito por Peter A.  Blume… aqui la liga por si te interesa, la verdad vale la pena la inversión: http://www.bloomy.com/lvstyle/

Retomando el tema,  uno de los tantos aspectos de que la aplicacion debe de contener Interfaces de usuario amigables… una de ellas es la de desplegar los mensajes para el usuario.

La manera mas simple de hacerlo, la cual en ocasiones cumple con los requerimientos, es utilizando los nodos:

One Button Dialog, Two Button Dialog o Three Button Dialog.

Algunos expertos en la materia sugieren el uso de estos mensajes de usuario cuando se trata de aplicaciones de escritorio… es decir no en el uso de la industria, o aplicaciones criticas…  dado el tamano del cuadro del  mensaje, tamaño de letra,  tipo de letra,  color, etc…

Para cubir entonces esos requerimientos, es posible hacer tus propias interfaces para desplagar los mensajes.

  • Ejemplo 1.-  Interface para mensajes de usuario básico:

Aunque esta es una interface de usuario básica, cumple con los requisitos necesarios… pero al igual que el mensaje tipo “pop-up” que viene integrada como parte de la libreria de LabVIEW (One button dialog), esta interface no permite modificar el tamaño de letra, u otras propiedades del texto. La interface no ofrece la oportunidad de adaptar el texto del boton “Ok” (obviamente el desarrollador lo puede incluir agregandolo al código, a lo que me refiero es que como libreria no la tiene) .

  • Ejemplo 2.- Inteface de usuario

Ahora,  que ya tienes tu interface de usuario para mensajes… en algunas ocasiones necesitas enfatizar parte del texto… por ejemplo el uso de “negritas”, de “italicas” o el uso de  colores en el texto, tamaño de letra, tipo de letra,  etc.

Aqui se resuelve el problema de agregarle el texto de tu preferencia al boton (tal como lo puedes hacer con el One button Dialog).

Esta interface tambien permite que modifiques algunas propiedades del texto, tales como: Italicas, Negritas, Tipografia, Tamaño de letra, color de texto, subrayado, tachado.

Entre otras cosas, el código ofrece adaptar el tamaño y centrar el boton cuando el texto de este crece mas alla del especificado.

Ahora bien, es algunas ocasiones necesitamos enfatizar palabras claves de nuestro texto… en el ejemplo anterior podemos observar que al seleccionar alguna propiedad tal como: “negritas“  estas pasaran a todo el texto. lo mismo aplica para color, tamaño de letra, tipografia, etc… asi que con esa interface no es posible delimitar que parte del texto necesitamos con tal o cual propiedad.

  • Ejemplo 3.- Interface de usuario basado en html (marcas de hipertexto)

Para poder lograr que solo la parte deseada del texto tenga alguna propiedad ofrece complejidad… es decir, va mucho mas alla que solo activar alguna propiedad o metodo incluida en LabVIEW… se tiene que hacer algun tipo de “parser” tal como lo hacen los exploradores (Firefox, Safari, Opera, Explorer, etc)… y para ello entonces nos podemos basar en las marcas de hipertexto…

Estoy de acuerdo que las etiquetas <color>, </color>, <font>,</font> y <size>,</size> no forman (al menos no de esa manera) parte de HTML, por eso mencione que esta basado en… la verdad no busco tanto que sean “compatibles”, sino que de alguna forma sean frases cortas e intuitivas…

En estos ejemplos el texto del usuario es muy similar… pero con distinto impacto visual hacia el usuario

Saludos!

VI Nugget —Menu de usuario adaptable

Esta pequeña subrutina esta diseñada para ser utilizada como menú de usuario.

Soporta hasta 4 opciones.

Entre otras cosas ofrece bastante flexibilidad porque algunas características tales como el nombre de cada boton, color de boton (estado verdadero y falso), color del fondo de menú, y el texto que aparece cuando colocas el puntero sobre cada opción (boton).

Algunas características adicionales, es que si solo necesitas por ejemplo 3 botons, basta dejar uno de los campos del nombre del boton vacio y aparecera la leyenda: “Not used” y quedara deshabilitado el boton… asi mismo la leyenda definida quedara deshabilitada pues el boton esta deshabilitado

Finalmente cuando se presione un boton, la suubrutina (SubVI) dara como salida el nombre del boton presionado (por si se utiliza una estructura case para strings)… y tambien regresa el numero del boton presionado

Porque?

1.-La salida del nombre del boton presionado es bueno… sin embargo utilizarlo en una estructura case basado en strings es una arma de dos filos, ya que estructuras basadas en strings son sensibles a mayusculas/minusculas, espacios, tabs, etc…

Es por ello que se decidio agregar cual fue el boton presionado… de este modo se elimina el problema que ofrecen las estructuras case basados en texto

Notese que el boton presionado fue el #3, nombrado como: “Presentar”

Saludos!

Pequeño clasificador de esferas desarrollado con NXT-G

Aunque este diseño de pequeña maquina no es mio (viene propuesto como ejercicio en el NXT2.0), aun con todo es bastante satisfactorio poder armarlo y aprender de ellos.

Cabe mencionar asimismo que el robot aun no esta terminado… aun asi es bastante practico mostrarlo para dar una idea del funcionamiento.

Basicamente reconoce el color de cada esfera y la llama por su nombre (en Inglés)… el mecanismo completo bien podra no tan solo llamarla por su color, sino tambien clasificarlas segun su color.

El SW fué desarrollado utilizando la plataforma NXT-G.

Vista superior

Vista lateral

NXT2.0 on VIve LabVIEW

NXT2.0 on VIve LabVIEW

saludos!