Arquitectura de productor/consumidor en LabVIEW

Visión General

El patrón de diseño productor/consumidor se basa en el patrón maestro/esclavo y está diseñado para mejorar el intercambio de datos entre múltiples ciclos que se ejecutan a diferentes velocidades. El patrón productor/consumidor se utiliza para separar procesos que producen y consumen datos a diferentes velocidades. Los ciclos paralelos del patrón productor/consumidor se dividen en dos categorías; los que producen datos y los que consumen los datos producidos.

Este artículo discute casos de uso común y beneficios para la arquitectura de productor/consumidor y señala recursos para el uso de esta técnica en LabVIEW. Para conocer más sobre cómo compartir información entre ciclos o para una guía paso a paso y ejercicios para construir un ciclo productor/consumidor en LabVIEW, considere tomar nuestro curso LabVIEW Core 2.

Contenido

¿Por qué utilizar productor/consumidor?

El patrón productor/consumidor le brinda la capacidad de manejar fácilmente múltiples procesos al mismo tiempo al iterar a velocidades individuales.

Comunicación en búfer

Cuando hay varios procesos que se ejecutan a diferentes velocidades, la comunicación en búfer entre procesos es extremadamente efectiva. Con un búfer lo suficientemente grande, el ciclo productor puede funcionar a velocidades mucho más altas que el ciclo consumidor sin pérdida de datos.
Por ejemplo, considere que una aplicación tiene dos procesos; el primer proceso realiza la adquisición de datos y el segundo proceso toma esos datos y los coloca en una red. El primer proceso opera a tres veces la velocidad del segundo proceso. Si se utiliza el patrón de diseño productor/consumidor para implementar esta aplicación, el proceso de adquisición de datos actuará como productor y el proceso de red como consumidor. Con una cola de comunicación (búfer) suficientemente grande, el proceso de red tendrá acceso a una gran cantidad de datos que adquiere el ciclo de adquisición. Esta capacidad de almacenar datos en búfer minimizará la pérdida de datos.

Para visualizar la comunicación en búfer que ocurre cuando se usan las funciones de cola, vea el programa de ejemploMove LabVIEW Window Using Producer/Consumer Loops

Adquisición de datos y procesamiento

El patrón productor/consumidor se usa comúnmente cuando se adquieren múltiples conjuntos de datos para procesarlos en orden.
Supongamos que desea escribir una aplicación que acepte datos mientras los procesa en el orden en que se recibieron. Debido a que poner en cola (producir) estos datos es mucho más rápido que el procesamiento actual (consumir), el patrón de diseño productor/consumidor es el más adecuado para esta aplicación. Esto permitirá que el ciclo consumidor procese los datos a su propio ritmo, permitiendo que el ciclo productor ponga en cola datos adicionales al mismo tiempo.

Considere; si el productor y el consumidor están en el mismo ciclo para esta aplicación, la velocidad de adquisición de datos disminuye para coincidir con la velocidad de procesamiento de datos. Por eso es beneficioso dividir su código por procesos, adquisición de datos (Productor) y procesamiento (Consumidor). 

Comunicación en red

La comunicación en red requiere dos procesos para operar al mismo tiempo y a diferentes velocidades: el primer proceso sondearía constantemente la línea de la red y recuperaría paquetes, y el segundo proceso tomaría estos paquetes recuperados por el primer proceso y los analizaría. En este ejemplo, el primer proceso actuará como productor porque está proporcionando datos al segundo proceso, que actuará como consumidor. Esta aplicación se beneficiaría del uso del patrón de diseño productor/consumidor. Los ciclos paralelos de productor y consumidor manejarán la recuperación y el análisis de datos fuera de la red, y la comunicación en cola entre los dos permitirá el almacenamiento en búfer de los paquetes de red recuperados. Este almacenamiento en búfer se volverá muy importante cuando la comunicación en red esté ocupada. Con el almacenamiento en búfer, los paquetes se pueden recuperar y comunicar más rápido de lo que se pueden analizar.

Manejo de mensajes en cola

La arquitectura del controlador de mensajes en cola es una versión especializada de la arquitectura de productor/consumidor. Las colas de datos se utilizan para comunicar datos entre ciclos en el patrón de diseño productor/consumidor. Estas colas ofrecen la ventaja de almacenar datos en búfer entre los ciclos de productor y consumidor.

Construir un productor/consumidor

El diseño de productor/consumidor consta de ciclos paralelos que se dividen en dos categorías; productores y consumidores. La comunicación entre los ciclos productores y consumidores se realiza usando colas o cables de canal.

Colas

LabVIEW tiene VIs de operación de cola integrados que se encuentran en la paleta Funciones >> Data Communication >> Queue Operations.

Las colas se basan en la teoría de primero en entrar/primero en salir. En el patrón de diseño productor/consumidor, las colas se pueden inicializar fuera de los ciclos de productor y consumidor. Debido a que el ciclo productor produce datos para el ciclo consumidor, agregará datos a la cola (agregar datos a una cola se llama “enqueue”).

El ciclo consumidor eliminará datos de esa cola (eliminar datos de una cola se denomina “dequeue”). Debido a que las colas son primero en entrar/primero en salir, el consumidor siempre analizará los datos en el mismo orden en que el productor los colocó en la cola. La Figura 1 ilustra cómo se puede crear el patrón de diseño productor/consumidor en LabVIEW.


Figura 1: Patrón de diseño de productor/consumidor

Nota: Esta imagen es un snippet de LabVIEW, que incluye código de LabVIEW que puede reutilizar en su proyecto. Para usar un snippet, haga clic derecho en la imagen, guárdelo en su PC y arrastre el archivo a su diagrama de LabVIEW. 


Hay ejemplos para usar colas dentro de LabVIEW que puede usar como punto de inicio para su aplicación. Encuentre ejemplos usando LabVIEW Example Finder y busque Queue.

Canales

La funcionalidad de cable de canal se agregó en LabVIEW 2016. Puede utilizar cables de canal para lograr la misma funcionalidad que las colas.

En las colas, configura la referencia de cola (Obtain Queue), agrega datos (Enqueue) y elimina datos (Dequeue) y cierra la referencia de cola (Release Queue); con canales, este proceso se simplifica para configurar únicamente el escritor y el lector de los datos.

Para obtener más información sobre los cables de canal y las plantillas para comenzar, consulte Communicating Data between Parallel Sections of Code Using Channel Wires – Ayuda de LabVIEW

Notas importantes

Hay algunas advertencias a tener en cuenta al tratar con el patrón de diseño productor/consumidor, como el uso y la sincronización de colas.

Uso de colas

Problema: Las colas están vinculadas a un tipo de datos en particular. Por lo tanto, cada elemento de datos que se produce en un ciclo productor debe colocarse en diferentes colas. Esto podría ser un problema debido a la complicación que se agrega al diagrama de bloques.
Solución: Las colas pueden aceptar tipos de datos como arreglo y clúster. Cada elemento de datos se puede colocar dentro de un clúster. Esto ocultará una variedad de tipos de datos detrás del tipo de datos del clúster. La Figura 1 implementa tipos de datos de clúster con la cola de comunicación.

Sincronización

Problema: Ya que el patrón de diseño productor/consumidor no se basa en sincronización, la ejecución inicial de los ciclos no sigue un orden en particular.  Por lo tanto, iniciar un ciclo antes que el otro puede causar problemas.

Solución: Agregar una estructura de eventos al patrón de diseño productor/consumidor puede resolver este tipo de problemas de sincronización.  La Figura 2 muestra una plantilla para lograr esta funcionalidad.  En la sección Enlaces relacionados encontrará más información relacionada con las funciones de sincronización.


Figura 2: Uso de una estructura de eventos en un patrón de diseño productor/consumidor

 Nota: Esta imagen es un snippet de LabVIEW, que incluye código de LabVIEW que puede reutilizar en su proyecto. Para usar un snippet, haga clic derecho en la imagen, guárdelo en su PC y arrastre el archivo a su diagrama de LabVIEW.