Vous êtes sur la page 1sur 17

PROGRAMAS DE FORMACIÓN REGULAR

PROGRAMACIÓN APLICADA A
LA INDUSTRIA
V CICLO

Guía de Laboratorio N°13

Técnicas de sincronización de eventos


Ejercicio 3-2 Creación de una consola de cola de
impresión
Objetivo
Utilizar la plantilla
Productor/Consumidor (Evento) para
crear una consola de cola de impresión
que envíe trabajos a una impresora y
monitorice la cola de impresión.

Escenario
Debe crear un VI de consola de impresión
que controle los envíos de trabajos de
impresión y monitorice el estado de
procesamiento de estos. Cada vez que el
usuario haga clic en el botón Enqueue
Element, se enviará un trabajo de
impresión a la impresora. Usted
monitorizará el número de trabajos de
impresión de la cola mediante una barra
vertical. Los LEDs indicarán el estado del
proceso de impresión.
El proceso de impresión de cada trabajo
incluye dos pasos: una etapa de
inicialización con una duración fija de 300
ms y una etapa de impresión con una
duración variable en función del tamaño
del trabajo.

Diseño
Los controles y los enums de
definición de tipo necesarios para
este proyecto ya están creados. Su
tarea es utilizar la plantilla del patrón
de diseño Productor/Consumidor que
incluye LabVIEW para crear el VI de
consola de impresión. La tabla 3-1
muestra los controles e indicadores
utilizados en el panel frontal del VI
de consola de impresión.
Tabla 3-1. Controles/Indicadores y
descripciones del panel frontal
Control e Indicador Descripción

Botón Enqueue Element Cada vez que el usuario haga clic en este botón, se enviará un
trabajo de impresión a la impresora.

Barra Queued Print Jobs Esta barra muestra el número de trabajos de impresión de la cola.
Cada vez que se envíe un trabajo de impresión a la impresora, se
añadirá un nuevo trabajo a la cola. Cuando la impresora inicia un
nuevo trabajo, el trabajo de impresión se elimina de la cola.

LED Waiting Este LED se enciende sólo cuando no haya trabajos de impresión
en la cola.

LED Initializing Este LED se enciende durante la etapa de configuración de cada


trabajo de impresión.

LED Printing Este LED se enciende durante la etapa de impresión de cada


trabajo de impresión.

Stop Button Este botón detiene el VI.


La tabla 3-2 muestra los casos Event que implementará en el bucle
productor.

Tabla 3-2. Loop Event Cases productor

Caso Event Descripción del caso

Queue Event: Value Change En este caso, utilice la función Enqueue Element para poner
en cola una constante de cadena de caracteres con el valor de
print job.

Stop: Value Change En este caso, detiene el bucle While.

Timeout En este caso, utilice la función Get Queue Status para obtener
el número de elementos de la cola. Pasa el valor a la barra
Queued Print Jobs.

La tabla 3-3 muestra los estados que implementará en la máquina de


estados del bucle consumidor.
Tabla 3-3. Estados del bucle consumidor

Estado Descripción del estado

Wait Realice las siguientes tareas en este estado.


• Use la función Dequeue Element para esperar un trabajo de impresión
en cola.
• Configure la función Dequeue Element para que establezca un tiempo
límite de 100 ms.
• Configure el siguiente estado para que sea el estado Wait, si se alcanza
el tiempo límite de la función Dequeue Element. Configure el
siguiente estado para que sea Initialize Setup, si no se alcanza el
tiempo límite de la función Dequeue Element.
• Configure el LED Waiting en True.

Initialize Setup Realice las siguientes tareas en este estado.


• Configure el LED Waiting en False.
• Configure el LED Initializing en True.

• Cambie al estado Setup.


Setup Realice las siguientes tareas en este estado.
• Simule la configuración de impresión con una espera de 300 ms.
• Configure el LED Initializing en False.
• Cambie al estado Initialize Print.
Tabla 3-3. Estados del bucle consumidor (Continuación)

Estado Descripción del estado

Initialize Print Realice las siguientes tareas en este estado.

• Configure el LED Printing en True.

• Cambie al estado Print.

Print Realice las siguientes tareas en este estado.

• Simule el trabajo de impresión con un tiempo de espera variable.

• Configure el LED Printing en False.

• Cambie al estado Wait.

Implementación

Nota Para reforzar los conocimientos de desarrollo que ha aprendido hasta


ahora, recibirá instrucciones limitadas para crear la aplicación.

Creación de un nuevo VI desde una plantilla


1. Abra Print Console.lvproj en el directorio
<Exercises>\ LabVIEW Core 2\Print Console.

2. Cree un nuevo VI con el patrón de diseño Producer/Consumer Design


Pattern (Events).

3. Seleccione File»VI Properties»Documentation. En la sección de


descripción del VI, sustituya la documentación de la plantilla por una
descripción concisa de su aplicación.

4. Cree un icono significativo para el VI.


5. Guarde el VI como Print Console.vi en el directorio
<Exercises>\LabVIEW Core 2\Print Console. Confirme que

el nuevo VI se ha añadido al proyecto Print Console.lvproj.

6. Guarde el proyecto Print Console.lvproj.


Creación del panel frontal
Cree el panel frontal como se ve en la figura 3-2 utilizando Queued
Print Jobs.ctl y Print LEDs.ctl disponibles en el proyecto
Print Console.lvproj.
1

Y
a

c
r
e
a
d
o
en Print Console.lvproj

Figura 3-2. Panel frontal de la consola de impresión

Bucle productor
Complete el diagrama de bloques modificando primero el bucle productor
y después el bucle consumidor.

El bucle productor responde a los eventos del panel frontal. Cada vez que
el usuario haga clic en el botón Enqueue Element, se añadirá un trabajo de
impresión a la cola. El bucle productor también es responsable de
actualizar la barra Queued Print Jobs con el número de elementos de la
cola.
La figura 3-3 y la figura 3-4 son ejemplos del bucle productor completado.

Figura 3-3. Caso Enqueue Element del bucle


productor

1. En el caso Enqueue Element, sustituya la cadena de caracteres


element

por print job en la función Enqueue Element.

2. Añada un caso Timeout a la estructura Event. El caso Timeout


actualiza la barra Queued Print Jobs leyendo el número de elementos
de la cola.

❑ Seleccione <Application> en la sección Event Sources y


seleccione
Timeout en la sección Events.

Nota Si la etiqueta Event Data Node no es válida (texto negro), haga clic
derecho y seleccione una válida.

Nota Como el caso Timeout es un evento de aplicación, la etiqueta Event Selector

en la parte superior del caso Timeout difiere de otros objetos asociados a los eventos.
El nombre de la etiqueta sólo especifica el evento y no incluye el objeto asociado.
Figura 3-4. Caso Timeout del bucle
productor

❑ Añada la función Get Queue Status para leer el


número de elementos de la cola.
❑ Configure la estructura Event para que finalice la espera cada 100
ms cableando un valor de constante de 100 al terminal Timeout.

Nota No necesita realizar cambios en el caso Stop, puesto que ya se encuentra


en la plantilla.

Bucle consumidor
El bucle consumidor simula el proceso de impresión y actualiza los LEDs.
Implemente el proceso de impresión utilizando una máquina de estados. El
estado Wait recibe trabajos de impresión. Cuando se recibe un trabajo de
impresión, la máquina de estados inicia varios pasos para simular el
proceso de impresión. Los LEDs de impresión se actualizan después de
cada estado. Por lo tanto, el LED Initializing se enciende tras el estado
Initialize Setup y se apaga después del estado Setup. Igualmente, el LED
Printing se enciende tras el estado Print y se apaga después del estado
Print.
Las figuras 3-5 a la 3-9 son ejemplos del bucle consumidor completado.
1. Cree una máquina de estados en el bucle consumidor empezando con
el estado Wait. El estado Wait recibe trabajos de impresión utilizando
la función Dequeue Element. Si la función Dequeue Element recibe un
elemento de cola dentro del tiempo límite de espera especificado de
100 ms, la máquina de estados cambiará al estado Initialize Setup.
Si expira el tiempo de espera de la función Dequeue Element, la
máquina de estados permanecerá en el estado Wait.

1 Ya creado en Print Console.lvproj

Figura 3-5. Caso Wait del bucle consumidor

❑ El enum de definición de tipo print processing states ya está


creado.

Seleccione y arrastre Print Processing States.ctl


desde la ventana Project Explorer al diagrama de bloques.

❑ Cablee Print Processing States.ctl al selector Case


para asociar la estructura Case con los valores enum.

❑ Mueva la función Dequeue Element a la estructura Case.

❑ Use la salida timed out? de la función Dequeue Element para


determinar si el siguiente estado es Wait o Initialize Setup.

❑ Añada una función Bundle by Name para configurar el


estado booleano del LED Waiting.
❑ Arrastre Print LEDs.ctl desde la ventana Project Explorer al
diagrama de bloques para crear una constante de cluster Print
LEDs en el diagrama de bloques.
2. Consulte la figura 3-6 para crear el caso Initialize Setup.

Figura 3-6. Caso Initialize Setup del bucle


consumidor

❑ Para crear casos asociados con cada valor del enum, haga clic
derecho en el borde de la estructura Case y seleccione Add Case
for Every Value.

Consejo También puede crear nuevos casos duplicando los existentes. Para duplicar
un caso, haga clic con el botón derecho en el borde de la estructura Case y seleccione
Duplicate Case. Tenga cuidado al duplicar casos que incluyan terminales del panel
frontal, ya que podría duplicar objetos del panel frontal.
❑ Haga clic derecho en el túnel de error y seleccione Use Default
if
Unwired.

3. Consulte la figura 3-7 para crear el estado Setup.

Figura 3-7. Caso Setup del bucle


consumidor
❑ Simule la duración de la inicialización con una espera de 300
ms.
4. Consulte la figura 3-8 para crear el estado Initialize Print.

Figura 3-8. Caso Initialize Print del bucle


consumidor

5. Consulte la figura 3-9 para crear el estado Print.

Figura 3-9. Caso Print del bucle


consumidor

❑ Para simular una duración de impresión variable, genere un


tiempo de espera aleatorio entre 300 ms y 1500 ms. Use el VI
Random Number in Range de su Print Console.lvproj para
configurar una duración aleatoria de la espera para un trabajo de
impresión.
6. Guarde el VI y el proyecto Print Console.lvproj.
Prueba
1. Ejecute el VI para confirmar que actúa correctamente. Cada vez que el usuario haga clic en el
botón Enqueue Element, se enviará un nuevo trabajo de impresión a la cola. Si envía varios
trabajos de impresión seguidos, verá una lista de espera de trabajos de impresión en la barra
Queued Print Jobs.

❑ Tenga en cuenta que tras dejar de poner en cola los trabajos de impresión, el proceso
de impresión seguirá ejecutándose.

❑ Tenga en cuenta que el bucle consumidor sólo se detiene cuando exista un error. Esto
ocurre cuando el bucle productor se detiene y la función Release Queue destruye la
referencia de la cola. Sin una referencia de cola válida, la función Dequeue Element en el
bucle consumidor devuelve un código de error 1122 con la explicación Refnum became
invalid while node waited for it o un código de error 1 con la explicación An
input parameter is invalid (si quedan elementos en la cola cuando se presiona stop).

Detener un bucle consumidor con error es relativamente fácil, pero no se recomienda si


crea aplicaciones profesionales, escalables y mantenibles. Es mejor cerrar correctamente e
informar de todos los errores al usuario.

2. Cierre los VIs y el proyecto. Guarde los cambios.

Fin del ejercicio 3-2

1. BIBLIOGRAFÍA.
● LabVIEW Core 1.

Vous aimerez peut-être aussi