Patrones de diseño de aplicaciones: maestro / esclavo

Actualizado el Nov 26, 2020

El patrón de diseño Maestro / Esclavo es otra arquitectura fundamental que usan los desarrolladores de LabVIEW. Se utiliza cuando tiene dos o más procesos que deben ejecutarse de forma simultánea y continua, pero a diferentes velocidades. Si estos procesos se ejecutan en un solo bucle, pueden producirse graves problemas de sincronización. Estos problemas de sincronización ocurren cuando una parte del ciclo tarda más en ejecutarse de lo esperado. Si esto sucede, las secciones restantes del ciclo se retrasan. El patrón maestro / esclavo consta de múltiples bucles paralelos. Cada uno de los bucles puede ejecutar tareas a diferentes velocidades. De estos bucles paralelos, uno actúa como maestro y los demás como esclavos. El bucle maestro controla todos los bucles esclavos y se comunica con ellos mediante arquitecturas de mensajería.

El patrón Maestro / Esclavo se usa más comúnmente cuando se responde a los controles de la interfaz de usuario mientras se recopilan datos simultáneamente. Suponga que desea escribir una aplicación que mida y registre un voltaje que cambia lentamente una vez cada cinco segundos. Adquiere una forma de onda de una línea de transmisión y la muestra en un gráfico cada 100 ms, y también proporciona una interfaz de usuario que permite al usuario cambiar los parámetros para cada adquisición.
El patrón de diseño Maestro / Esclavo es muy adecuado para esta aplicación. En esta aplicación, el bucle maestro contendrá la interfaz de usuario. La adquisición de voltaje y el registro se realizarán en un bucle esclavo, mientras que la adquisición de la línea de transmisión y la representación gráfica se realizarán en otro.

Las aplicaciones que involucran control también se benefician del uso de patrones de diseño Maestro / Esclavo. Un ejemplo es la interacción de un usuario con un brazo robótico de movimiento libre. Este tipo de aplicación está extremadamente orientada al control debido al daño físico al brazo o al entorno que podría ocurrir si el control no se maneja correctamente. Por ejemplo, si el usuario indica al brazo que detenga su movimiento hacia abajo, pero el programa está ocupado con el control de giro del brazo, el brazo robótico podría colisionar con la plataforma de soporte. Esta situación se puede evitar aplicando el patrón de diseño maestro / esclavo a la aplicación. En este caso, la interfaz de usuario será manejada por el bucle maestro, y cada sección controlable del brazo robótico tendrá su propio bucle esclavo. Con este método, cada sección controlable del brazo tendrá su propio bucle y, por lo tanto, su propio tiempo de procesamiento.
Esto permitirá un control más sensible sobre el brazo robótico a través de la interfaz de usuario.

¿Por qué utilizar Maestro / Esclavo?

El patrón de diseño maestro / esclavo es muy ventajoso al crear aplicaciones multitarea. Le brinda un enfoque más modular para el desarrollo de aplicaciones debido a su funcionalidad de bucle múltiple, pero lo más importante es que le brinda más control de la administración del tiempo de su aplicación. En LabVIEW, cada ciclo paralelo se trata como una tarea o hilo independiente. Un hilo se define como una parte de un programa que se puede ejecutar independientemente de otras partes. Si tiene una aplicación que no utiliza subprocesos separados, el sistema interpreta esa aplicación como un solo subproceso. Cuando divide su aplicación en varios subprocesos, cada uno de ellos comparte el tiempo de procesamiento por igual.

Esto le da más control sobre cómo se cronometra su aplicación y le da al usuario más control sobre su aplicación. La naturaleza paralela de LabVIEW se presta a la implementación del patrón de diseño Maestro / Esclavo.

Para el ejemplo de adquisición de datos anterior, podríamos haber puesto tanto la medición de voltaje como la adquisición de forma de onda juntas en un bucle, y solo realizar la medición de voltaje en cada 50 iteración del bucle. Sin embargo, la medición de voltaje y el registro de los datos en el disco pueden tardar más en completarse que la adquisición y visualización únicas de la forma de onda. Si este es el caso, la siguiente iteración de la adquisición de la forma de onda se retrasará, ya que no puede comenzar antes de que se complete todo el código de la iteración anterior. Además, esta arquitectura dificultaría el cambio de la velocidad a la que se adquirieron las formas de onda sin cambiar la velocidad de registro del voltaje en el disco.

El enfoque de patrón de diseño maestro / esclavo estándar para esta aplicación sería colocar los procesos de adquisición en dos bucles separados (bucles esclavos), ambos controlados por un bucle maestro que sondea los controles de la interfaz de usuario (UI) para ver si se han cambiado los parámetros . Para comunicarse con los bucles esclavos, el bucle maestro escribe en variables locales. Esto garantizará que cada proceso de adquisición no afecte al otro y que cualquier retraso causado por la interfaz de usuario (por ejemplo, abrir un cuadro de diálogo) no retrasará ninguna iteración de los procesos de adquisición.

Cree una aplicación maestro / esclavo

El patrón de diseño maestro / esclavo consta de múltiples bucles paralelos. El bucle que controla a todos los demás es el maestro y los bucles restantes son esclavos. Un bucle maestro siempre controla uno o más bucles esclavos. Dado que la comunicación de datos directamente entre estos bucles interrumpe el flujo de datos, debe realizarse escribiendo y leyendo en arquitecturas de mensajería, es decir, variables locales o globales, ocurrencias, notificadores o colas en LabVIEW. La Figura 1 muestra cómo los diferentes bucles se conectan entre sí utilizando datos compartidos.

Figura 1: Descripción general de maestro / esclavo

Ejemplo: sincronizar bucles

Esta aplicación tiene los siguientes requisitos:

  • Cree un controlador de mensajes en cola para manejar la interfaz de usuario. La interfaz de usuario debe contener dos botones de proceso de alternancia con LED y un botón de salida.

  • Cree dos procesos separados que enciendan y apaguen un LED individual a diferentes velocidades (intervalos de 100 y 200 ms). Estos dos procesos se controlarán mediante la interfaz de usuario.


Nuestro primer paso será decidir qué proceso será el maestro y qué procesos serán los esclavos. En este ejemplo, la interfaz de usuario se colocará dentro del bucle maestro y los dos procesos LED parpadeantes serán los dos bucles esclavos. La interfaz de usuario controlará el funcionamiento de cada lazo esclavo con variables locales.

Ahora estamos listos para comenzar nuestra aplicación LabVIEW Master / Slave. Para ver la aplicación Master / Slave final, abra el VI adjunto (SynchLoops.vi).

Arquitecturas de mensajería (datos compartidos)

Problema : si varios bucles intentan escribir datos en la variable compartida al mismo tiempo, no hay forma de saber qué valor se puede escribir finalmente. Esto se conoce como condición de carrera.

Solución : coloque un par de "semáforo adquirir / liberar" alrededor de cualquier fragmento de código que escriba en el global. Esto asegura que varios bucles no intenten escribir en el global al mismo tiempo. Entre los ejemplos incluidos con LabVIEW hay un par que demuestran el uso de semáforos. Los semáforos bloquearán los datos globales mientras se escriben para evitar una condición de carrera.

Sincronización

Problema : Dado que el patrón de diseño maestro / esclavo no se basa en la sincronización, es posible que los bucles esclavos comiencen a ejecutarse antes que el bucle maestro. Por lo tanto, inicializar el bucle maestro antes de que los bucles esclavos comiencen a ejecutarse puede ser un problema.

Solución : las ocurrencias se pueden utilizar para resolver este tipo de problemas de sincronización.


Para encontrar ejemplos que demuestren el uso de ocurrencias consulte los ejemplos de envío de LabVIEW. La Figura 2 ilustra un ejemplo sobre cómo utilizar las ocurrencias.


Figura 2: Ejemplo de ocurrencia