Discusiones sobre Productos NI

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

Medias y almacenamiento en archivos

Hola, estoy haciendo una aplicación de lectura de un puerto RS-232 y me he quedado algo atascada a la hora de almacenar los valores. Me explico:

 

Cada segundo obtengo un valor (hasta ahi bien, obtengo sin problemas el string con la lectura), pero ahora necesito crear una serie de archivos diarios con esos valores. Por ejemplo, necesito guardar los valores de un minuto y hacer la media de esos valores. Una vez hecha la media  de ese minuto, esta es la que almaceno en el archivo diario. No sé muy bien como realizar esto, si tengo que ir guardando los datos en un array nuevo para cada minuto, o si debo hacerlo de otra forma. Ademas tengo dudas de como crear el archivo diario con los valores de cada minuto de forma automatica.

 

¿alguien me podria explicar?

 

Gracias. 

0 kudos
Mensaje 1 de 40
4.307 Vistas

Hola Vista22,

 

Por lo que entiendo del post, el problema que tienes es de temporización, es decir que no ves claro como tienes que temporizar las tareas para que vaya escribiendo como quieres. Puedes utilizar varias técnicas en función si quieres temporizar en función del reloj de Windows (especificando un tiempo concreto de parada para los bucle, con las funciones WAIT o WAIT UNTIL NEXT MS MULTIPLE) o en función del reloj estándar de horas minutos y segundos (utilizando las demás funciones de la paleta TIMING).

 

Te adjunto un ejemplo de lo que estas buscando aplicando estas dos técnicas de temporización. Es para LabVIEW 8.0 o superior.

 

Salu2

 

Remember kudos those who help 😉

Mensaje 2 de 40
4.286 Vistas

Hola, lo primero gracias por tu respuesta, me ha ayudado mucho a tener algo más claro como poder hacerlo. Con el ejemplo que me has pasado he modificado mi programa pero haciendo algunas pruebas he comprobado que se queda bloqueado en el bucle interior ya que el número de iteración no aumenta, siempre es 0. No sé si tiene algo que ver que tenga que hacer una parada en la secuencia de 1 seg para evitar errores en la lectura utilizando un buffer. He adjuntado esta parte de la aplicación para ver si alguien me puede decir que falla.

 

Un saludo y gracias. 

0 kudos
Mensaje 3 de 40
4.280 Vistas

Otra alternativa. 

 

Existe una funcion de LV que te permite hacer la media directamente "punto por punto" (Analyze>Poni By Ponit> Varias funciones...)

La pregunta es cuándo realizar la media o mejor dicho, cuándo iniciar la acumulación da los datos para hacer esta media: mediante una condición.

 

Te propongo este ejemplo.

 

Para grabar los valores puedes utilizar: la función express que utilizo en el ejemplo; Write to spreadsheet / write to characters (nome gusta si se ha de grabar continuamente); o la forma ideal que sería open-write-close. Con estas dos últimas tendrás el inconveniente de que no te crea un nuevo fichero cada día. No es muy difícil resolverlo (si no te sale, dilo).

 

Mensaje 4 de 40
4.278 Vistas

Hola Vista22

 

Deberias abrir y cerrar la comunicación visa solo una vez, colocando el VISA Configure y el VISA close fuera del bucle que adquiere a 1segundo. Por otro aldo, si tu tarea de adquisición ya está temporizada y te devuelve un resultado por segundo, puedes prescindir ed la temporización del bucle interiro (quita el wait de 1segundo).

 

Para ver porque se queda en la iteración 1, te recomiendo que ejecutes en modo Highlighnt execution, que lo hace paso a paso y puedes ver que datos van pasando por los cables.

 

Salu2

Mensaje 5 de 40
4.273 Vistas

Hola, gracias a ambos por la ayuda. como he hecho bastantes cambios se me había pasado lo de sacar fuera el VISA configure y el VISA close. También le he quitado el WAIT al bucle porque como dice sendia el tiempo de obtención de datos ya lo controlaba por otro lado. Lo raro, es que al ejecutarlo y ver los valores, se ve que siempre me guarda el valor de lectura en la primera posición del Array, ya que el valor del número de iteraciones siempre se mantiene en 0. Otra cosa que me parece extraño, es que si pincho en el cable de salida del resultado de la media me da cada segundo un valor diferente, algo que no entiendo ya que mientras no se cumpla la condicion de parada del bucle no debería obtener resultados ahí ¿no?

 

¿Alguien sabe a qué puede ser debido? Gracias 

0 kudos
Mensaje 6 de 40
4.268 Vistas

Yo tengo la version 7.1, así que no se muy bien a que te refieres ya que no puedo habrir tu ejemplo.

Con lo de la variación de la media, puede que estés haciendo bucles continuos y, por lo tanto, usando el valor 0 (cero) en cada bucle y variando la media cada vez. No se, es lo primero que se me ocurre, así, sin ver el código.

Mensaje 7 de 40
4.262 Vistas

Intenta dos cosas:

 

- Coloca un indicado que muestre el valor "i" del bucle interno.

 - Haz un Highligh execution para ver com se esta comportanto el bucle interno y porque no funciona.

 

Si no consigues avanzar, adjuntame el VI que tienes ahora para ver si te puedo ayudar.

 

Salu2

Mensaje 8 de 40
4.249 Vistas

Hola, gracias de nuevo por la ayuda. No entiendo muy bien por qué, pero el error de quedar bloqueado en el bucle y de dar valores erroneos se produce al sacar del bucle el Visa configure y Visa close, si lo vuelvo a colocar como lo tenía, esa parte funciona perfectamente, pero ahora el problema viene con la media, ya que no la realiza bien. Normalmente obtengo valores del rango 0,10-0,20, incluso de vez en cuando me da algún valor desorbitado que tendré que eliminar más adelante o hacer que en esa posición del Array cuando obtenga un valor no válido, guarde el valor anterior para no enturbiar el resultado. Sin embargo está dando valores de medias de 0,0002 y valores similares, por lo cual algo falla.

 

¿Alguna idea? Gracias.

 

Adjunto el .vi en la versión 8.2 que es la que estoy utilizando.  He intentado sacarlo también válido para los que usáis versiones anteriores pero la versión más antigua que me deja es la 8.

0 kudos
Mensaje 9 de 40
4.234 Vistas

Hola, sigo haciendo pruebas para solucionar el problema de la media, y colocando unos indicadores intermedios he comprobado que el problema reside en el array. Los valores llegan bien al array pero éste no funciona como debería, ya que no sé si porque los valores que obtengo son próximos a 0 (0,10, 0,14..) parece que almacena en el array valores sin decimales ya que casi todo es 0.

 

¿como puedo solucionar esto? 

 

También tengo otra pregunta, como por regla general hay alguna lectura de las 60 realizadas en el segundo que da valores incorrectos (a veces números que no corresponden o simplemente a veces una cadena sin sentido). ¿Hay alguna forma de poder comprobar que un String tiene un determinado formato? Por ejemplo: Letra-espacio-numero-numero... ¿o alguna forma de comprobarlo quizás posición a posición del String? Por ejemplo, que en la posición 0 haya una letra, en la 2 un espacio...

 

Gracias por la ayuda. 

0 kudos
Mensaje 10 de 40
4.212 Vistas