Discusiones sobre Productos NI

cancelar
Mostrando los resultados de 
Buscar en lugar de 
Quiere decir: 

Detener ciclo while en paralelo

¡Resuelto!
Ir a solución

Buenos días,

 

Explico mi duda:

 

Estoy realizando un programa en el que hay dos bucles en Run paralelamente. 1, el principal es en el que tengo toda la aplicación propiamente dicha (maquina de estados, mediante event structure...). y el segundo es el que utilizo continuamente para lectura de variables mediante el puerto serie de un PLC.

 

Mi problema es el siguiente:

Me gustaría si hubiese alguna manera de parar el 2o bucle( el de lectura de variables) cuando entra en un evento o bucle en concreto del primer while (principal) y luego reanudarlo. Ya que en un evento( al inicio realizo la lectura de alarmas, mensajes, variables... y como le cuesta un rato, lee paralelamente el 2o bucle y me saltan errores y guarda mal los valores de variables, alarmas...). Este problema creo que viene por abrir y cerrar el puerto serie paralelamente en los dos while. 

 

He pensado en poner un booleano en el evento conflictivo en el 1er while (principal) y mediante un case en el 2o activar todo o desactivarlo. Pero supongo que habrá alguna solución mejor.

 

No se si me explicado bien.

 

Gracias.

Saludos.

0 kudos
Mensaje 1 de 10
3.977 Vistas

@jontxuM90 escribió:

 

 

Estoy realizando un programa en el que hay dos bucles en Run paralelamente. 1, el principal es en el que tengo toda la aplicación propiamente dicha (maquina de estados, mediante event structure...). y el segundo es el que utilizo continuamente para lectura de variables mediante el puerto serie de un PLC.

 

Mi problema es el siguiente:

Me gustaría si hubiese alguna manera de parar el 2o bucle( el de lectura de variables) cuando entra en un evento o bucle en concreto del primer while (principal) y luego reanudarlo. Ya que en un evento( al inicio realizo la lectura de alarmas, mensajes, variables... y como le cuesta un rato, lee paralelamente el 2o bucle y me saltan errores y guarda mal los valores de variables, alarmas...). Este problema creo que viene por abrir y cerrar el puerto serie paralelamente en los dos while. 

 

 


claro hay mejores formas de hacerlo, te recomiendo buscar información sobre "Queves" http://digital.ni.com/public.nsf/allkb/6B63645C1217827786257D50007540F2  y sobre patrones de diseño tales como "productor consumidor" http://www.ni.com/white-paper/3023/es/



Ing. Jonathan E. Cruz Ortiz

ENERGÍA PROACTIVA S.A.S

Cel : (+57) 3173669343 - (+57) 3124451894

0 kudos
Mensaje 2 de 10
3.953 Vistas

Muchas gracias,

desconocía la utilización de dichos bloques. Lo pruebo y si sigo teniendo algún problema ya te comentaré.

 

Saludos.

 

Jon.

0 kudos
Mensaje 3 de 10
3.947 Vistas

Buenos días,

He estado mirando la información que me has adjuntado y me ha ayudado bastante. Pero por lo que entiendo este tipo de función (Queue) se utiliza para un flujo de datos entre los dos whiles paralelos. 

 

Mi intención no es pasar información de un bloque a otro. Mi problema esta que en los dos bloques hago lo mismo, abro leo y cierro el puerto serie. Por lo que se solapa la información. 

 

Me gustaría una funcion que espere el puerto serie del bloque 2 hasta que no acabe el del bloque 1. No la transferencia de datos por FIFO.

 

Gracias.

 

Saludos.

 

Jon.

0 kudos
Mensaje 4 de 10
3.936 Vistas

@jontxuM90 escribió:

 

 

Me gustaría una funcion que espere el puerto serie del bloque 2 hasta que no acabe el del bloque 1. No la transferencia de datos por FIFO.


Puedes buscar tal vez informacion sobre los "Ocurrences"  http://zone.ni.com/reference/en-XX/help/371361H-01/glang/occurrence_functions/.

 


@jontxuM90 escribió:

 

Mi intención no es pasar información de un bloque a otro. Mi problema esta que en los dos bloques hago lo mismo, abro leo y cierro el puerto serie. Por lo que se solapa la información. 


Porque lo haces de esa forma? , por lo general se debe utilizar el llamado de puertos y comunicacion en un solo bucle.



Ing. Jonathan E. Cruz Ortiz

ENERGÍA PROACTIVA S.A.S

Cel : (+57) 3173669343 - (+57) 3124451894

0 kudos
Mensaje 5 de 10
3.910 Vistas

Gracias por la información.

 

Necesito hacer esto por que tengo que ver constantemente unos valores que obtengo del PLC y a su vez escribir, leer...en definitiva realizar otras acciones a la vez. 

 

Saludos

 

Jon.

0 kudos
Mensaje 6 de 10
3.893 Vistas
Solución
Aceptado por el autor del tema jontxuM90

Hola Jon,

El uso de Queues también lo puedes usar no solamente como un canal FIFO sino también como señalización hacia tu 2do ciclo. Puedes crear un Queue unitario si quisieras ahorrar memoria en tu aplicación. Otra solución que puedes usar son notificadores (Notifiers). Una 3ra opción es usar User Events. Realice este pequeño y rápido ejemplo para demostrar cómo funcionan los User Events y como los podrías implementar en tu aplicación:

UserEvent Process Communication.png

Espero esta información te sea de utilidad. 

 

Saludos.

 

Luis CT
Mensaje 7 de 10
3.884 Vistas

Muchas gracias,

 

Probarés mediante esta forma a ver que tal funciona.

 

Saludos.

 

Jon.

0 kudos
Mensaje 8 de 10
3.857 Vistas

Muchas gracias,

 

Probaré de esta forma a ver que tal funciona.

 

Saludos.

 

Jon.

0 kudos
Mensaje 9 de 10
3.856 Vistas

Buen día te ha funcionado la solución anterior? 

0 kudos
Mensaje 10 de 10
3.006 Vistas