sábado, 3 de junio de 2017

Web Publishing, semáforos, concurrencias y llamadas

Web Publishing

Una de las herramientas más útiles de LabVIEW es el Web Publishing LabVIEW. Gracias a esta utilidad podemos subir nuestras creaciones a Internet, para mostrar por ejemplo resultados de un experimento que estemos haciendo, y cualquier persona desde otra parte del mundo lo pueda ver a través de Internet. Se pueden mostrar también imágenes que este captando una cámara, así como poder manejar controles del Front Panel.

Web Publishing o edición web es una forma de editar información en forma de páginas web, muy usada en la actualidad.

En primer lugar necesitamos un VI. Una vez tengamos decidido que VI vamos a utilizara, lo abrimos y nos metemos en Tools → Web Publishing Tools:

En nuestro caso hemos escogido uno muy sencillo:



Se abrirá la siguiente ventana, donde elegimos el VI, y el modo de vista. En este caso elegiremos "embebido",Esto nos creará un Front Panel en nuestra página web que puede ser manejado.


El siguiente paso será rellenar es nombre de la página y de la información que queremos colgar.



Después, tendremos que seleccionar el directorio donde queremos que se guarde, el archivo y la URL a la que debemos acceder:


Tras este paso ya podemos acceder a la página y utilizar nuestro VI. 

El problema ahora es que a la hora de visitar nuestra página web no vamos a ver el Front Panel. Esto es debido a que es un objeto de tipo desconocido para nuestro navegador, por lo que necesitamos un plugin que nos permita ver y manejar dicho Front Panel. El plugin en si se llama LabVIEW Run-Time Engine y hay dos maneras de descargarlo:
  • Con Internet Explorer podemos instalarlo directamente clickeando en el objeto que no podemos ver y dándole a instalar plugin.
  • Con Mozilla Firefox o Google Chrome necesitamos descargarlo e instalarlo manualmente. El plugin puede ser descargado de la siguiente página.

Esto es lo que podemos ver al conectarnos desde IE una vez instalado el plugin:

Hay que hacer hincapié en ese pequeño cuadro de diálogo en la parte inferior a la izquierda, donde nos informa que actualmente el control lo tiene el servidor.

Si queremos ejecutar el VI desde el explorardor, debemo solicitar el control del mismo:


Una vez realizado este paso, ya podemos ejecutarlo desde nuestro browser:

Podemos comprobar que ahora a cambiado el control del VI y que en LabView recibimos el siguiente mensaje:


Donde vemos que el programa se está ejecutando y no podemos pararlo y quién tiene el control del mismo. 


Semáforos

Un semáforo es una variable especial (o tipo abstracto de datos) que constituye el método clásico para restringir o permitir el acceso a recursos compartidos (por ejemplo, un recurso de almacenamiento del sistema o variables del código fuente) en un entorno de multiprocesamiento (en el que se ejecutarán varios procesos concurrentemente)

En labView, un semáforo es una forma de limitar las tareas que pueden operar en forma simultánea en un recurso compartido (protegido). Los recursos protegidos o partes de código críticos pueden incluir las variables globales o comunicaciones con instrumentos externos.Los semáforos son muy similares a los "Mutex" (Objeto de exclusión mutua ) en otros lenguajes de programación. 

Son muy útiles protegiendo dos o más secciones críticas del código que no deben de ser llamadas concurrentemente. Antes de hacer uso de una parte crítica del código, el hilo de ejecución debe de adquirir un semáforo. Si el código crítico se encuentra en el momento ejecutando un hilo, el hilo entrante debe esperar hasta que el hilo en ejecución libere el semáforo para poder entrar en forma inmediata.


Los VI's de la paleta del Semáforo (Programming»Synchronization»Semaphore)

Para lograr este control, se debe de crear un semáforo y poner la función de adquirir y de liberar el semáforo (Acquire Semaphore y Release Semaphore) al inicio y final de los códigos críticos, respectivamente. De esta forma, cada subVI puede obtener y liberar el semáforo uno a la vez, para asegurar el flujo de datos apropiado. Al final de la sección, la referencia del semáforo debe de ser liberada y para esto se hace uso de la función "Release Semaphore Reference VI".

Podemos probar esta teoría con el siguiente ejemplo, donde simulamos el llenado y vaciado continuo de un tanque. 

Para crear la secuencia, hemos creado un semáforo y hemos retardado la señal de entrada a una de las solicitudes de adquisición, de modo que el llenado siempre se ejecuta antes y una vez este ha liberado el recurso, es ocupado por el vaciado. Y así ad infinitum.




Para terminar el programa utilizaremos un stop como siempre, pero en este caso, añadiremos una secuencia de liberación de la referencia del semáforo, en lugar de vincularlo directamente un ciclo while general.


Ocurrencias



Las ocurrendias son mecanismos para que un hilo o un VI pueda indicar a otro que ha ocurrido cierto evento o suceso. Se usan de forma parecida a los eventos. Sirven para ejecutar un código cuando se da cierta condición; hasta que no sea cierta esa condición, la tarea que contiene el código será congelada.

Comprobaremos esto con este sencillo programa:


Con ayuda de la bombilla (ralentiza la ejecución y nos señaliza el lugar donde se encuentra la ejecución) podemos ver como el programa se queda congelado, esperando que se active la concurrencia:


Una vez activamos el booleano 3, sen enciende el 2 y se para el programa.


Llamadas dinámicas

Hasta ahora todas las llamadas a otros VI que hemos visto son estáticas, lo que hace que se se carguen en memoria, aunque no se estén ejecutando.

Para solucionar esto existen varias opciones de llamada dinámica, nosotros estudiaremos la llamada por referencia. 

Lo primero es crear un sub-VI que será llamado por el VI principal. Haremos un programa sencillo:



El siguiente paso ahora es modificar el icono del VI para configurar sus entradas y salidas, su descripción, etc. Lo que nos ayudará cuando lo veamos en una llamada (del tipo que sea). Para ello y con el botón mágico de LabView (botón derecho) haremos click sobre el icono del VI en el panel frontal, se abrirá el siguiente menú:



En el caso de los terminales o el patrón de los mismos, podremos modificarlos desde este mismo menú. Sim embargo, el caso de la información y del diseño del icono, debemos seleccionar "VI propierties", donde aparecerá la siguiente ventana:



Una vez aquí y haciendo uso del desplegable podemos modificar varios parámetros, como el icono:



O la descripción:



Por último, debemos asignar las variables a los terminales de los que hemos dotado al VI. La forma de conectar los terminales, es seleccionar un terminal libre y después una variable, así hasta haber conectado todos las variables que necesitemos (puede que algunas variables sean locales).

Ahora crearemos una llamada estática y otra dinámica.

La llamada estática se realiza seleccionando un VI en la paleta de instrucciones. Y tiene el siguietne aspecto:


A la izquierda la llamada y a la derecha la descripción del sub-VI (que hemos creado antes).

En el caso de la llamada dinámica, se complica un poco más:

  1. Abrimos la lista de instrucciones en el panel frontal y seleccionar "Refnum". 
  2. Buscamos "VI Refnum" que se nos ha creado en el diagrama de bloques.
  3. Boton derecho del ratón sobre él y...
  4. Ahora seleccionamos el VI que queremos referenciar.
  5. Dentro de las instrucciones de "Application Control" buscamos "Open VI Reference" , "Close Reference" y "Call By Reference".
  6. Con botón derecho cobre el terminar "VI path" de la instrucción de apertura y creamos un control.
  7. Unimos el terminal de referencia de la instrucción de apertura con el de la llamad por referencia y la salida con el VI de cierre (lo mismo con los errores). Nada más unirlo (si todo está bien) la instrucción de llamada cambiará, pasando a contener la configuración de terminales de nuestro sub-VI.
  8. Por último creamos variables y terminamos de conectar el VI llamado a las entradas y salidas oportunas.

No hay comentarios:

Publicar un comentario