Discusiones sobre Productos NI

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

Optimizar Código

Buenas,

 

Estoy teniendo problemas a la hora de enviar datos mediante Network Stream.

Cuando lleva tiempo ejecutándose, pierde datos de envío. El caso que cuando miro desde el PC en mi programa si veo que lo esté enviando (dentro del subvi de networkstream), pero no recibe todos los datos en el receptor.

 

He implementado estas dos opciones (Envio_data1.png & Envio_data2.png),

Lo que ejecuta es, cada vez que llegan datos en "results 2" los divide en 3 sub clusters de menor tamano (2000) y los envia sucesivamente a través de networkstream.

 

 

Me podeis por favor indicar alguna forma de optimizar este código, y a qué puede ser debido este problema?

 

Un saludo y muchísimas gracias!!!!

Descargar todos
0 kudos
Mensaje 1 de 6
4.346 Vistas

Hola Juanfer23,

 

Tu aplicacion se ve bastante interesante sin embargo creo que falta informacion para realmente poder serte de ayuda. De lo que puedo ver de tus imagenes estas utilizando variables globales  que se escriben a si mismas. Hacer este tipo de operaciones puede ocasionar incertidumbre en los valores de la variable (DATA por ejemplo).  Tienes el codigo de la parte receptora?   Puedes describir mejor la perdida de datos que estas experimentando?

 

saludos

Erwin Franz

Certified LabVIEW Architect, Certified TestStand Developer
0 kudos
Mensaje 2 de 6
4.309 Vistas

Hola EFranz,

 

Muchas gracias por tu ayuda, te adjunto el código de la parte receptora, que se encuentra en el Host (PC).

El sistema parece funcionar correctamente por una media hora y entonces a pesar de que en el RT parece realizar las operaciones correctamente, en mi PC no recibo los datos enviados. Recibe sólo cada cierto tiempo.

Agradecería cualquer sugerencia para mejorar el código.

 

Un saludo y gracias!!!!

0 kudos
Mensaje 3 de 6
4.288 Vistas

Yo realmente no se mucho de ese tema pero voy a hacer un pequeño comentario. Cuando lleve el curso de labview vimos 

un tema que se llamaban queue o algo asi en el productor consumidor y la ventaja que daba es que no se perdian datos

como ejemplo ponian un transmisor o un generador de valores a una cierta velocidad y un receptor o un lector de valores

pero a diferentes velocidades y lo que pasava era que con el metodo tradicional al ser mas rapido el que lee valores repetidos 

por decir algo el que genera el valor genera un 50 despues un 40  y un 30 y el que los lee puede leer 50 50 40 30 30 ya que lee 

mas rapido ahora si el que lee fuera mas lento podria leer 50 30 ya que al leer mas lento puede perder datos y con los queue

la ventaja era que no se perdian datos ya que siempre esta esperando por un dato nuevo si es mas rapido y si es mas lento al

terminar de mandar datos el que los lee sigue leyendo o trabajando hasta terminar con todos los datos que leeria 50 40 30 

 

espero esto te sirva de ayuda mira algun ejemplo con este tema y haber si se puede resolver tu problema y adaptarlo a tu programa

 

saludos.

0 kudos
Mensaje 4 de 6
4.265 Vistas

Hola juanfer23,

 

Despues de ver tu codigo me parece que tu problema es un memory leak. Cuando estas usando network streams con un tipo de dato escalar (booleanos, numericos, etc..) el bufer determina la cantidad de memoria que la computadora va a estar reservando para tus operaciones. En el caso de usar tipos de datos como clusters o strings la memoria se va utilizando y alocando dinamicamente. Esto quiere decir que los paquetes que vas recibiendo van incrementando el uso de la memoria de tu sistema.

Para evitar esto hay muchas soluciones. Por lo que veo tu arquitectura y los tipos de datos seleccionados ya estan determinados ( trabajar con escalares ayudaria muchisimo y seria mas facil de debuggear) por lo que te recomiendo que trates de reducir el buffer size del reader o establezcas la propiedad para leer todas las muestras disponibles en el stream (ver imagen).

 

Por otro lado tu variable global RECEIVE es un arreglo que no deja de crecer. Esto esta impactando muchisimo a la memoria de tu sistema. Te sugiero que mejor escribas a disco (a un archivo tipo TDMS por ejemplo)  y que vayas sobreescribiendo los valores de esta variable y tus otras variables globales que veo que usas para controlar la logica de tu programa.

 

Espero que con estos consejos logres mejorar el rendimiento de tu programa.

Te deseo exito!

Erwin Franz

Certified LabVIEW Architect, Certified TestStand Developer
0 kudos
Mensaje 5 de 6
4.255 Vistas

Hola Juanfer,

 

también puedes hacer un sniffer de red con el WireShark para monitorizar el tráfico y que nos dé alguna pista adicional:

 

http://www.solarwinds.com/products/freetools/response-time-viewer-for-wireshark.aspx?program=18902&C...

 

saludos!

 

Jesús

0 kudos
Mensaje 6 de 6
4.234 Vistas