Discusiones sobre Productos NI

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

a la aplicacion le cuesta mucho cerrarse

Hola a todos;

 

tengo una aplicación bastante grande, que comunica con diferentes perifericos, y adquiere datos de ellos registrando resultados, en definitiva una especie de scada, la aplicación funciona correctamente, pero en el momento de cerrarla, dependiendo del tiempo que haga que esta en marcha, le cuesta mas cerrarse, si hace menos de una hora que esta en marcha, se cierra practicamente de inmediato, si el tiempo es mayor, queda el vi principal abierto, sin ninguna funcionalidad, de hecho no se refresca, si activas cuelquier otra ventana, no se vuelve a pintar, queda en blanco, con el mensaje (no responde), durante largo tiempo, puede a llegar ha estar mas de una hora para cerrarse.

he puesto controladores que me visualizan si sale de todas las rutinas, y lo hace tardando un par de segundos como maximo, en salir de todas, la ultima marca esta ya fuera de toda ejecución, por lo tanto cuando se queda "en suspenso" ya no esta activa ninguna parte del codigo, pero alguna dll o no se decir exactamente que queda activa en background, la unica manera de cerrar, es mediante el administrador de tareas, finalizar la aplicación.

 

no tengo ni idea de por donde atacar el problema. 

0 kudos
Mensaje 1 de 5
3.335 Vistas

Hola Joju, aquí lo mas fácil es que nos enseñes tu aplicación para buscar que es lo que esta haciendo que se tarde. Ahora por lo que dices que en ocasiones refresca imágenes y en otras no, supongo que estas usando IMAQ, y aquí el problema puede ser que estés dejando referencias abiertas o muchas variables y estés generando un memory leak. De esta forma mientras mas tiempo corre más referencias va abriendo y al momento de cerrarlo tiene que cerrar o limpiar más de la memoria.

La parte de refreías también puede ser hacia a los puertos o instrumentos, y ver si se queda esperando comunicación con ellos y el tiempo total es el timeout sumado de todos los instrumentos.

Ahora aquí lo que puede revisar es si el consumo de  memoria y procesador de tu programa va incrementando con el tiempo. Si es esto hay que revisar que estés cerrando bien todas las referencias en tu programa. También disminuir la cantidad de variables ayuda a disminuir esto.

Saludos

Benjamin C
Principal Systems Engineer // CLA // CLED
0 kudos
Mensaje 2 de 5
3.326 Vistas

hola BeCeGa;

intento pasar un poco de explicación de la aplicación, pero como digo es un aplicación bastante grande, tiene unos 40 vi, y por tanto se hace dificil explicarlo en pocas palabras, acontinuación paso la estructura de la rutina principal e intento explicarme

main1.jpg 

main2.jpg

 

 

 

he dividido el vi en dos imagenes , es demasiado largo, como se puede ver en la parte inicial, se inicializan las variables de uso global, despues se cargan valores iniciales, se abre un vi de visualización de alarmas, que se oculta y posteriormente el codigo hace aparecer en caso necesario, posteriormente se leen las diferentes configuraciones de sondas i calculos de la base de datos donde se pueden configurar, se comprueba si ha habido modificaciones en la misma, se hace una compilación de las formulas de calculo de las variables, y se inicia la comunicación con los diferentes perifericos, estos pueden ser de diferentes tipos (FP, modbus, ethernet, serie, etc) cada uno de ellos dispone de su propio vi independiente, con sus tiempos de latencia y timeout, posteriormente se hace un check de el usuario de la aplicación con su pasword, i finalmente se inicia el vi principal de la aplicación que es el Main Menu, este controla toda la visualización de datos, programación de ciclos, analisis de historicos, y demas funciones, la parte de control por eventos solo sirve para cuando se produce el final de la aplicación, originalmente estava implementado el remot front panel, para poder controlar la aplicacion por el servidor web, pero su funcinalidad todavia esta un poco verde por parte de labview, i por tanto no se usa, finalmente cuando la rutina finaliza por que se ha producido un paro, bien sea desde este vi u otro, mediante la variable ParoVi, la rutina finaliza.

los controles de tiempo que aparecen en todos los vi, son para determinar si estos vi, tardan mucho o no en cerrarse.

 

el resultado cuando se ejecuta es que el la memoria consumida por la aplicación, no varia sustancialmente, ni mantiene ninguna progresión de aumento, ademas todos los controles de tiempo mencionados en ningun caso superan los 2 o 3 segundos, sobre todo aquellos que estan ejecutando comunicaciones, pero insisto que todos los vi tienen su salida en un tiempo muy razonable de un par de segundos, en la parte final se puede ver que cierro todos los vi que hubiere abiertos, aunque no es necesario, el ultimo tiempo final2 tambien esta dentro de los valores anteriormente comentados, por cierto la variable global "moment  paro glo" toma el valor de tiempo en el momento que se pulsa la tecla de salida, finalmente e incluido el Stop de vi, que es redundante, pero es una prueba mas para asegurar la salida del vi, pero desde el momento final2 hasta que la aplicación queda realmente cerrada, no existe ningun codigo que ejecutar, pero es en este punto donde puede llegar ha estar mas de una hora, y no se que puede realmente estar haciendo.

 

no se si he sido suficientemente claro explicando el problema, si necesitais mas informción yo sigo suministrandola........

gracias de nuevo. 

 

 

 

0 kudos
Mensaje 3 de 5
3.313 Vistas

Hola Joju, como recomendaciones generales de tu programa puedes cambiar tu flat sequence a una maquina de estados, esto te ayudaría a disminuir el uso de variables, otras recomendaciones las puedes ver en esta liga: http://forums.ni.com/ni/board/message?board.id=6170&message.id=7663#M7663

Ahora con respecto a la parte de que se tarda en salir, estaba viendo que estass utilizando una base de datos. Puedes probar el código sin la base de datos para descartar que la conexión a esta sea el problema.

Si la base de datos no es el problema podría ser que espere a que alguno de los perifericos le este respondiendo. Aquí lo ideal sería buscar cual es el que genera el problema. Podrias probar utilizando un solo tipo de periféricos y ver si esto genera el error.

Para estas pruebas puedes usar el disable structure que viendo tu programa ya lo has ocupado en otras ocasiones.

Para hacer pruebas más detalladas si necesitaremos ver más de tu código. Si no quieres ponerlo aquí en internet puedes comunicarte con tu oficina de National Intruments más cercana el de México es 018000100793.

Saludos

Benjamin C
Principal Systems Engineer // CLA // CLED
0 kudos
Mensaje 4 de 5
3.298 Vistas

Gracias por los consejos, pero la solución no esta por el camino de cambiar la estructura, el programa utiliza bastantes variables, pero son las mismas despues de un segundo de estar en marcha que una hora, no hay ninguna pila que aumente de volumen o almenos no tengo ninguna detectada, de hecho como ya comentava la memoria del ordenador no varia en la ejecución, por otra parte lo de los elementos perifericos no afecta, ya que lo he provado con una versión simulador, que en realidad no comunica con nadie, y ocurre lo mismo, ademas todas las rutinas de comunicaciones tienen controlada la salida, y como puedes ver en el codigo tambien he puesto un controlador de tiempo en la salida de estas, y responde rapidamente, por tanto no veo por donde puede estar el error en el codigo, yo no tengo problema por colgar la aplicación aqui, pero es bastante grande no se si es el camino apropiado, su instalación no es dificil pero tiene controles personalizados y un monton de vi, en cuanto al tema de la base de datos, ya he provado de hacer solo un acceso inicial para cargar y nada mas, pero sigue siendo igual.

 

no se que mas información puedo suministrar, repito que no tengo ningun problema en pasar todo el codigo pero insisto que es grande.

 

gracias de nuevo 

0 kudos
Mensaje 5 de 5
3.292 Vistas