Discusiones sobre Productos NI

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

Temporizacion bucles

Hola a todos,

 

Escribo este post porque tengo una duda con respecto a la temporización en bucles en LabView. Os comento mi problema, yo quiero contar el tiempo transcurrido en un instante determinado de mi programa, y lo hago hasta ahora mediante un TimeLoop. El problema es que no sé inicializar el tiempo que cuento en ese TimeLoop, de manera que cuando inicializo la aplicación (sin cerrarla) continúa el tiempo en el valor que se había detenido previamente, pero no se inicializa a '0'.

 

¿Cómo puedo volver a inicializar el valor del bucle cada vez que reinicio la aplicación sin cerrarla? Es evidente que si la cierro la bucle se inicializa, pero esa no es la circunstancia problemática.

 

Espero haberme explicado de manera adecuada y que alguien me pueda echar una mano en la medida de lo posible. Es una aplicación algo urgente y requiero solucionar este tema lo antes posible. Llevo varios días intentando encontrar la solución pero no sé que opción del TimeLoop (si es que existe) debo tocar para que el tiempo se inicialice.

 

Un saludo a todos y gracias de antemano.

0 kudos
Mensaje 1 de 10
9.465 Vistas

Hola ropel aqui mas que el problema de el timed loop, el problema es de conceptos.  En LabVIEW existen dos tipos de temporización.

  • Tiempo de Ejecución: Controla que tan rápido se ejecuta una aplicación en el procesador
  • Control de tiempo por software: Controla el tiempo en el que se tiene que realizar una operación en el mundo real.

 

El tiempo de ejecución es el tiempo que vas a colocar en el ciclo, si no colocas nada de temporización en tu ciclo este va a correr lo mas rápido que puede y satura el procesador, para controlar este tiempo de ejecución te sirven funciones como el wait, wait until next ms o los timed loops (estos últimos con manejo avanzado también se pueden utilizar para controlar tiempo por software pero hay manejaras mas sencillas de hacerlo.

El control de tiempo por software, te permite temporizar actividades por ejemplo si tu quieres que un semáforo este encendido 5 segundos, no vas a usar un ciclo que tarde 5 segundos por ciclo, si haces esto nada dentro del ciclo se va a poder ejecutar durante 5 segundos. Una forma de implementar esto es por ejemplo usas un wait de 10ms (esto es para que tu ciclo reaccione cada 10 ms, y dentro del ciclo agregas un Elapsed time, o generas esta variable funcional global para manejar el tiempo. Cada vez que transcurra el tiempo cambias el semáforo, pero tu ciclo corre mas rápido lo que permite que otras funciones trabajen con esto.

 

Ahora regresando a tu pregunta original si quieres hacerlo con el timed loop, lo que vas a tener que jugar es con los nodos de timed loop, una de las ventajas que te da es que puedes saber cuanto tiempo duro la ejecución anterior, y en base a eso modificar la actual. El problema que tu ves es que el timed loop funciona en base  a el reloj de ms del sistema operativo. Por lo que aunque tu lo detengas, el reloj sigue avanzando.

Anexo un ejemplo muy sencillo de las distintas formas de temporizar.

Saludos

Mensaje editado por BeCeGa
Benjamin C
Principal Systems Engineer // CLA // CLED
0 kudos
Mensaje 2 de 10
9.455 Vistas

Gracias por tu respuesta Becega, pero entonces a ver que me aclare. Yo en mi aplicación he situado un TimeLoop, el cual se ejecuta lo que tiene dentro cada 10 milisegundos. Si cuando sale del TimeLoop y vuelve a ejecutarse, sin cerrar la aplicación (tal y como dije en la pregunta anterior), quiero que el tiempo comience desde '0', igual que si lo hiciera cuando se arranca el programa, ¿cómo puedo hacerlo? ¿no hay opción alguna de iniciar el tiempo de ese TimeLoop?

 

Gracias de antemano. Un saludo.

0 kudos
Mensaje 3 de 10
9.444 Vistas

Hola,

 

Realmente no he trabajado con los time loop, pero tal vez puedes probar que tu time-loop este contenido dentro de un subVI, y probablemente cada vez que se vuelva a llamar el subVI inicia con los valores por defecto incluyendo el valor de '0' en el tiempo. Es una suposición, pruebalo tu y avisa los resultados.

 

Saludos.

Luis A. Mata C.
Ing. Electrónico
Whatsapp: +58-414-1985579
BBM Pin: 2B83E99A
Thanks: Kudos
0 kudos
Mensaje 4 de 10
9.337 Vistas

Hola,

recupero este tema con una duda ya que creo que encaja bien en este hilo, quería hacer una temporización para que un indicador  presente un retraso en su encendido, de modo que he operado de esta forma(con un bucle "while loop" contador de ciclos), y mi pregunta es si es un bueno método o ¿existe algo mas eficiente? PD Aún no domino todos los recursos de LabView.Emoticono frustrado

temporizador.PNG

Es un placer echar una mano siempre( Base de una sana convivencia). Si mi respuesta te sirve por favor agradecemelo con un Kudo 🙂
Un especial saludo a mis hermanos latinos. Un mundo mejor es posible.
0 kudos
Mensaje 5 de 10
7.964 Vistas

Hola Jorge en general para obtener respuestas mas rapidas es mejor usar un hilo nuevo (este es del 2008).

 

 La forma en la que estas controlando tu ciclo no es la  ideal, ya que estas mezclando tanto el tiempo de ejecución (el tiempo que quieres esperar) con el tiempo que tarda en ejecutarse el while, y wait no es la función ideal.

 Lo que programaste lo que hace es ejecuta el código que tiene dentro del ciclo, en algún momento espera 500ms, y después se vuelve a ejecutar. La función de wait, simplemente agrega ese tiempo a el tiempo que hay en tu ciclo. Es decir (solo por simplificar) si tu función de incremento y comparación tardaran 1ms en ejecutarse, el tiempo total de tu ciclo seria de 500ms (del wait) + 1 segundo del código = 501 ms. AL final esto significa que esperaste 20ms de mas.  Para que funcionara mejor como lo estas haciendo deberías de usar el wait until next ms que usa el complemento, es decir si tu código tarda 1ms el wait solo espera 499ms.

 

 Ahora con respecto a la temporización aquí idealmente separaría el tiempo de espera del control del ciclo, como puedes ver en el ejemplo que puse que puse en este hilo, si te fijas el ciclo se ejecuta cada 100ms pero el evento se dispara cuando el tiempo de 1 segundo se completa.

 

 Ahora sin ver el resto de tu código, por la cantidad de variables locales que tienes en esta sección, me imagino que hay bastantes en tu código. con el uso de las variables locales tienes que tener cuidad principalmente con lo que se conoce como race conditions (que es les las variables en el momento equivocado) y eso puede generar problemas en tu aplicación.

 También por lo que veo aquí lo que estas haciendo es un secuenciado y necesitas manejar tiempo, te recomiendo que leas sobre maquinas de estados, que te pueden ayudar a controlar mejor tu secuencia en una forma mas reusable y te ayudaran a reducir el número de variables.

 

http://www.ni.com/academic/students/learn-rio/state-machine/

 

Saludos

 

 

Benjamin C
Principal Systems Engineer // CLA // CLED
Mensaje 6 de 10
7.960 Vistas

Magnifica respuesta BeCeGa!!!Emoticono riéndose a carcajadas

 

Me vale de mucho, voy aprender mucho con tu comentario.

Entiendo lo que dices sobre el tiempo de ejecucion, algo importantisimo, por suerte mi aplicacion no va a requerir unos tiempos exactos. De todas formas me apunto tu gran aportacion y lo tendré en cuenta para futuras aplicaciones. Ayer por la tarde antes de que contestaras me decidí a cambiar la forma de realizar esta temporización que necesito y quedó así. Dame tu punto de vista, estaré muy agradecido.temporizador 2.PNG

Respeto a lo de las variables locales, es verdad que estoy utilizando bastantes. LLevo como unas 30 o así. No he apreciado ningún problema que me comentas pero estaré alerta.

 

Le echaré un vistazo tambien a ese enlace:

También por lo que veo aquí lo que estas haciendo es un secuenciado y necesitas manejar tiempo, te recomiendo que leas sobre maquinas de estados, que te pueden ayudar a controlar mejor tu secuencia en una forma mas reusable y te ayudaran a reducir el número de variables.

 

           http://www.ni.com/academic/students/learn-rio/state-machine/

 

PD: Te he agregado como amigo. Espero que no te moleste.

 

Un saludo.

 

Es un placer echar una mano siempre( Base de una sana convivencia). Si mi respuesta te sirve por favor agradecemelo con un Kudo 🙂
Un especial saludo a mis hermanos latinos. Un mundo mejor es posible.
0 kudos
Mensaje 7 de 10
7.948 Vistas

Hola Jorge81, como temporizaste el código ahora, es un poco más preciso pero aun así tiene un par de técnicas de programación que no son ideales en LabVIEW.

Las variables locales en general solo se deben de utilizar para actualizar controles, no indicadores, el método ideal para actualizar un indicador es con el valor del cable. Ahora en el caso de lo que colocaste aquí no se puede porque estas usando una flat sequence.

Las Flat sequence son estructuras buenas para forzar flujo de datos, y cuando programas en FGPA son mas comunes. Sin embargo no deben de ser el principal mecanismo para forzar secuencias. Dentro de sus principales problemas es que te obliga a usar mas variables, no es escalable (es decir si quieres agregar estados adicionales) y también no puedes cambiar la secuencia en forma dinámica lo cual obliga a escribir mas código.

El tercer problema de usar el wait de 10 segundos es que si eso está dentro de un loop, ese loop va a dejar de responder por 10 segundos hasta que el tiempo termine. Es decir si hay un paro de emergencia o necesitas hacer algo mas mientras esperas, no va a responder hasta después de 10 segundos, es mas en este caso la velocidad máxima de este ciclo seria de 13 segundos.

Aquí te agrego un ejemplo sencillo con una maquina de estados que prende un LED por tres segundos , lo apaga y por 10 y después lo vuelve a prender.

Algunas cosas importantes son que el tiempo del ciclo lo da el wait de 100ms . Es importante agregarlo porque si no lo tenemos la aplicación va a ejecutar lo más rápido que pueda y va a usar el 100% de tu CPU.

 

Capture.png

Dentro de los estados hay dos partes una que es el código que ejecuto y la decisión al estado que quiero pasar.

Por ejemplo cuando prendo el LED, mi código de ejecución es simplemente actualizar mi valor, y la decisión es siempre pasar al siguiente estado. En los de espera no estoy ejecutando ningún código, simplemente veo si ya paso el tiempo, si no a pasado puedo regresar y si ya paso cambio de estado.

Ahora cambio el estado del LED en dos casos pero no necesito variables porque la actualización del valor la realizo fuera del case. Con esto puedo reducir el número de variables que utilizo.

El clúster de estado es mi información local que controlo dentro del ciclo y me da el estado de mi maquina, esto permite encapsular la información y facilitar entender que está pasando en el programa.

También tanto el cluster como el Enum que estoy utilizando son Type definitions, esto permite que cuando las actualice en todos los lugares de mi código se actualicen y es más fácil cambiar el código.

Saludos

Benjamin C
Principal Systems Engineer // CLA // CLED
0 kudos
Mensaje 8 de 10
7.940 Vistas

Tengo que leerlo tranquilamente esto. jeje

No me deja abrir tu archivo, mi version es de LabView es del 2012. Me lo podrias pasar en version 2012?

un saludo

Es un placer echar una mano siempre( Base de una sana convivencia). Si mi respuesta te sirve por favor agradecemelo con un Kudo 🙂
Un especial saludo a mis hermanos latinos. Un mundo mejor es posible.
0 kudos
Mensaje 9 de 10
7.933 Vistas

Hola Jorge aqui esta en 2012.

Saludos

Benjamin C
Principal Systems Engineer // CLA // CLED
0 kudos
Mensaje 10 de 10
7.931 Vistas