Detención de bucles while paralelos en LabVIEW con un botón de stop

Actualizado el Nov 24, 2021

Ambiente

Software

  • LabVIEW Full

Tengo múltiples bucles while paralelos en LabVIEW y quiero usar un botón para detenerlos todos. ¿Cómo puedo hacer esto y también hacer que el botón vuelva a su estado inicial?

Dependiendo de la versión de LabVIEW que esté usando, elija entre los siguientes métodos para detener múltiples ciclos While paralelos en LabVIEW usando un botón.

Nota: Los métodos que se enumeran a continuación no son una presentación exhaustiva de los métodos para detener los bucles While paralelos. Estos métodos son los más habituales.

Channel Wires

Si está usando LabVIEW 2016, puede usar channel wires para detener múltiples bucles while paralelos con un botón de stop. Esto es posible porque los channel wires son cables asíncronos que conectan dos bucles while paralelos sin forzar una orden de ejecución. Por lo tanto, no hay dependencia de datos entre los dos bucles while paralelos.

Nota:  los channel wires son compatibles con el Módulo LabVIEW Real-Time pero no con el Módulo LabVIEW FPGA.

El siguiente diagrama de bloques demuestra cómo detener los bucles While paralelos mediante un canal tag:

La siguiente lista describe detalles importantes sobre el diagrama de bloques anterior:

  1. El loop A contiene un extremo del tag writer que escribe valores en un canal tag.
  2. Un channel wire conecta la salida del canal del extremo del tag writer a un extremo del tag reader.
  3. El bucle B contiene un extremo del tag reader que lee valores de un tag channel.
  4. El botón de stop conectado al parámetro de elemento del punto final del escritor en el lazo A se comunica con el lazo B. Si hace clic en el botón de stop en el bucle A , el bucle B también se detiene.

El siguiente diagrama de bloques demuestra cómo detener los bucles while paralelos mediante un stream channel:

Cuando se utilizan stream channels, el botón de stop conectado al último parámetro de elemento del punto final del escritor en el bucle A se comunica con el bucle B.

El tag channel y el stream channel tienen grandes diferencias cuando se utilizan para detener bucles While paralelos.

  • El uso de un tag channel para detener los bucles while paralelos hace que todos los bucles se detengan lo antes posible porque el valor del botón de stop del bucle A se comunica con el bucle B directamente. El uso de un canal de flujo para detener los bucles while paralelos puede hacer que el bucle B se detenga varias iteraciones más tarde que el bucle A porque el valor del botón de stop del bucle A se comunica con el bucle B a través del último elemento. , lo que significa que el bucle A se detiene tan pronto como ha escrito el último elemento. Sin embargo, Loop B continúa leyendo los elementos restantes en el canal y no se detendrá hasta que haya leído el último elemento. El canal Stream asegura que todos los elementos de datos comunicados a través del canal se procesen antes de que se detenga el Bucle B.
  • El tag channel le permite detener dos o más bucles While paralelos porque el tag channel se puede bifurcar en varios escritores y lectores. El canal de corriente le permite dejar de sólo dos bucles paralelos Mientras porque el canal de flujo permite que sólo un escritor y un lector.
El siguiente diagrama de bloques demuestra el uso del canal de etiqueta para detener tres bucles while paralelos.

Consideración

No puede ampliar la arquitectura de etiquetas anterior para tener varios botones de stop. Sin embargo, puede agregar uno o más botones de stop usando el VI Share Stop Signal ubicado en labview\vi.lib\ChannelSupport , que le permite detener múltiples bucles labview\vi.lib\ChannelSupport paralelos con cualquiera de los botones de stop.

El siguiente fragmento de VI demuestra cómo detener múltiples bucles While paralelos usando cualquiera de los dos botones de stop. Para agregar más botones de stop, siga la misma arquitectura.

Variables locales

Puede detener múltiples bucles while paralelos con un botón de stop pasando el valor del botón de stop booleano desde el control de su primer bucle a todos los otros bucles utilizando una variable local para cada bucle adicional. El siguiente diagrama de bloques demuestra la detención de dos bucles While paralelos mediante una variable local.

La siguiente lista describe detalles importantes sobre el diagrama de bloques anterior:

  1. El bucle superior contiene un stop control. Configure la acción mecánica del stop control haciendo clic con el botón derecho en el stop control en el front panel y seleccionandoMechanical Action»Switch When Pressed. Esto permite que todos los bucles lean el booleano de stop, mientras que el pestillo cuando se presiona se restablecerá a verdadero cuando se lea el valor, dejando algunos bucles aún en ejecución.
  2. Los dos bucles inferiores contienen una variable local del stop control. La variable local se crea haciendo clic con el botón derecho en el stop control y seleccionando Create»Local Variable. Configure la variable local para leer el valor haciendo clic con el botón derecho en la variable local y seleccionando Change to Read.
  3. Es importante tener en cuenta el nodo de invocación Reinit To Default que es haciendo referencia implícita al botón de stop, esto restablece el valor a verdadero al comienzo de la siguiente ejecución.
  4. Todos estos bucles contienen un Wait ms para resaltar que todos los bucles se detienen, independientemente de sus diferentes tiempos de ejecución.

Para detener más de tres bucles while paralelos, siga la misma arquitectura agregando más variables locales para leer desde el stop control inicial.

Property Nodes

Puede utilizar un property node para pasar el valor del botón de stop booleano desde el control de su primer ciclo a todos los demás ciclos. El siguiente diagrama de bloques muestra cómo detener dos bucles While paralelos mediante un property node.

La siguiente lista describe detalles importantes sobre el diagrama de bloques anterior:

  1. El bucle superior contiene un stop control. Configure la acción mecánica del control de parada haciendo clic con el botón derecho en el stop control en el front panel y seleccionando Mechanical Action»Switch When Pressed. Esto permite que todos los bucles lean el booleano de parada, mientras que el pestillo cuando se presiona se restablecerá a verdadero cuando se lea el valor, dejando algunos bucles aún en ejecución.
  2. El bucle inferior contiene un property node del stop control. El property node se crea haciendo clic con el botón derecho en el stop control y seleccionando Create»Property Node»Value. Configure el property node Valor para leer el valor haciendo clic con el botón derecho en el property node Valor y seleccionando Change to Read.
  3. Es importante tener en cuenta el nodo de invocación Reinit To Default que es haciendo referencia implícita al botón de stop, esto restablece el valor a verdadero al comienzo de la siguiente ejecución.
  4. Todos estos bucles contienen un Wait ms para resaltar que todos los bucles se detienen, independientemente de sus diferentes tiempos de ejecución.

Para detener más de dos bucles While paralelos, siga la misma arquitectura agregando más Value property nodes para leer desde el stop control inicial.

Para obtener más información sobre cuándo utilizar una variable local frente a un property node, consulte el artículo Diferencia entre una variable local y un nodo de propiedad de valor .

Notifiers

Para aplicaciones que implican un comportamiento complejo, los notifiers se pueden utilizar para detener varios bucles que se ejecutan en paralelo. Las funciones delnotificador son accesibles desde Programming»Synchronization»Notifier Operations.

Nota: El uso de notificadores se adapta fácilmente a varios subprocesos, pero no siempre se integra bien con las arquitecturas de programas existentes.

El siguiente fragmento de VI demuestra una forma en que los notifiers pueden usarse para detener múltiples bucles while.

La siguiente lista describe detalles importantes sobre el fragmento de VI anterior:

 

  • Cada iteración del bucle superior escribe el estado del botón de parada en el notificador.
  • Los otros dos bucles verifican el estado del notificador en cada iteración.

    Nota: Asegúrese de que el notificador no se libere hasta que se detengan todos los subprocesos que lo supervisan. En el fragmento de VI anterior, el VI Merge Errores garantiza que el VI Release Notifiers no se ejecutará hasta que se detengan todos los bucles.

  • Cuando haga clic en el botón Stop, el estado se envía al notificador, lo que hace que se detengan todos los bucles.

Queues (colas)

Puede utilizar colas para detener la ejecución de varios bucles en paralelo para aplicaciones que implican un comportamiento más complejo. Las funciones de cola son accesibles desde Programming»Synchronization»Queue Operations.

Nota: muchas aplicaciones más grandes ya tienen un sistema de cola para intercambiar datos entre bucles paralelos. En estas configuraciones, la cola existente puede modificarse o mejorarse para incluir una instrucción de parada para bucles paralelos.

El siguiente fragmento de VI demuestra el uso de colas para detener múltiples bucles while:

Algunas aplicaciones que utilizan una arquitectura Master-Slave liberan la cola antes de que salgan los slave threads. El error arrojado al sacar de la cola de una referencia destruida se utiliza para detener los slave loops. En lugar de depender de una condición de error para detener los slave loops, el fragmento de VI anterior tiene una instrucción de parada discreta que se pasa al slave loop desde el master loop.