jueves, 19 de enero de 2012

Multihilo sincronización mediante semáforos

Muy buenas a todos, en esta entrada os voy a enseñar otra de las diferentes aplicaciones que nos otorga  labview. Estas aplicaciones se llaman semáforos y nos servirán para sincronizar acciones. Podríamos decir que esta aplicación consta de varias partes, las utilizaremos o no en función de lo que queramos hacer.

El proceso se inicia con “obtain semaphore reference”.







 “Acquire semaphore” es una de las aplicaciones más importantes puesto que esta es la que sincroniza a todas. De tal manera que, cuando “acquire” recibe una señal desde “obtain” los demás deberán esperar a que termine éste proceso.








Esta siguiente aplicación sirve para reanudar el flujo, es decir, cuando la señal llega al “release semaphore” podrá iniciarse otro “acquire”.








Y por último, como todos los útiles al abrirlos, tenemos que cerrarlos, para eso utilizamos “release semaphore reference”




Como en las anteriores entradas, vamos a utilizar un Vi entero preparado concretamente para explicar las utilidades que nos pueden dar estas aplicaciones.
Este es el VI:





Esta es la parte del oscilador.






Este parámetro hace la función de oscilador, de tal manera que estará constantemente oscilando entre 1000 y -1000, mientras un semáforo estará encargado de llenarlo, cuando llegue justo a 1000, otro semáforo hará que vaya disminuyendo.


En primer lugar lo que haremos será poner el indicador a 0 y además poner en false el pulsador de stop. Como os enseño aquí.






Una vez iniciemos el proceso en 0, pasaremos a entrar en un “flat sequence” que será donde iniciemos la acción de los semáforos.




Como os enseñé al principio en el VI, el programa consta de dos while loops, es el turno de entrar en el while loop superior, en este while loop, se va a cerrar un semáforo para poder entrar en un “flat sequence”.


Si os fijais, en el “flat sequence” también tenemos otro while loop, éste va a ser el encargado de incrementar nuestro oscilador y, si osfijais, mediante una puerta OR, unida a un stop, hacemos que esta, en caso de llegar a 1000 o pulsar stop, se salga del while.


Cuando acabamos éste proceso salimos del flat sequence pero, dejamos el semáforo abierto, para que se pueda ejecutar otra acción.






El segundo loop es igual que el primero, de tal manera, en primer lugar se cierra el semáforo, entra en un flat sequence  y dentro hay un while, que se irá ejecutando y haciendo el decremento, siempre y cuando el oscilador se encuentre en -5, porque si os fijáis, hemos puesto una puerta “menor o igual” que a su vez está unida a una or, para acabar el proceso.





En resumen, esto lo que hará será, cuando el oscilador está a 1000, pasa a este segundo bucle que hará un decremento de ese 1000 hasta que llegue a -5, ya que, cuando lo haga, se saldrá del while y del flat sequence, y por último abrimos el semáforo para poder hacer este bucle constantemente.
Esto sería todo este VI, sobre cómo sincronizar acciones deseadas.

Descargar proyecto aquí

Un saludo.



No hay comentarios:

Publicar un comentario