• Lunes 23 de Diciembre de 2024, 09:19

Autor Tema:  Abrir archivo texto mas reciente  (Leído 3066 veces)

alex1510

  • Miembro activo
  • **
  • Mensajes: 35
    • Ver Perfil
Abrir archivo texto mas reciente
« en: Sábado 10 de Octubre de 2009, 19:25 »
0
Hola buenas.
Miren, soy estudiante de ingeniería y tengo algunos conocimientos de vba, pero me han planteado un problema sumamente complicado para mi.
Se trata de una maquina de cnc que va escribiendo un historial a medida que realiza una pieza . Mi duda es que yo, cuando me conecte cada 30 segundos a ese historial, por medio de ethertet, debo escoger un archivo de todos los que habra, concretamente el que se este rellenando en ese momento. Luego esos datos necesito filtrarlos y quedarme con ciertas paradas, para elaborar un scada y una serie de graficos. Cómo podría hacer un programa que leyera cada 30 seg el ultimo archivo de texto modificado (o en ejecución) de una carpeta donde hay muchos (uno por cada pieza que fabrica la maquina). Gracias

Los archivos de texto tienen un título de la siguiente forma: 2009_05_04 15_42_28 YF00D.plf (año,mes,dia,hora,pieza fabricada)

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Abrir archivo texto mas reciente
« Respuesta #1 en: Domingo 11 de Octubre de 2009, 21:49 »
0
Tu aplicación debe estar controlada por un temporizador, un control tinmer con el intervalo puesto a 30000 (milisegundos).
En el evento de consumo del timer, debes poner una llamada al procedimiento que realiza la labor.

El procedimiento lo  que hará será tomar los ficheros que hay en la carpeta. Para  esto será útil disponer de un objeto filesystyemobject (añades una referencia del Microsoft Scripting Runtime), y algunos subobjetos de éste. Un objeto folder y 2 objetos file, uno para recorrer el bucle y el otro para asignación cuando se comparen fechas yéste sea más reciente.
se hace un : set elFolder = fso.getfolder(ruta)
y a continuación un bucle: for each f in elfolder.files ....
A partir de aquí puedes hacer una de 2 cosas, fiarte del nombre de archivo que (como indicas) contiene una especificación de fecha en su nombre, o no fiarte de dicho nombre y preferir la fecha de creación, o modificación del fichero.

Se trata por tanto, en este bucle de localizar el de fecha más reciente, una vez localizado (ya fuera del bucle) hace una llamada al procedimiento que tiene que operar con el fichero pasándole preciamente el objeto file. y ahí ya trabajas  con él.

Debes tener algunas cosas en cuenta...
- por ejemplo  si la aplicación que elabora los ficheros los tiene bloqueados hasta que termina de utilizarlos, no podrás usarlo, entonces tendrás que utilizar el fichero justo anterior a éste e ir por tanto siempre un fichero por detrás... si hay más de una aplicación escribiendo ficheros en esa carpeta esto te exigirá esmerarte más en recoger el archivo deseado.
- Si tardas más de los 30segundos en localizar y manipular el archivo se te iría acumulando trabajo y memoria, para evitar que el proceso se atasque, sería conveniente disponer de un portero en el timer, si no has terminado de operar con el fichero actual, sale del timer sin buscar el siguiente fichero, dándole otro plazo de 30sg.

- Si la carpeta contiene infinidad de archivos y/o son de diferente tipo, tal vez te interese más utilizar un objeto filelistbox y sobre el estableces un filtro. De entrada el filtro sería sobre la extensión de archivo. ' *.plf' y después dado que el propio nombre incluye datos relativos, a la fecha del  proceso deberías ir actualizando este filtro, por ejemplo si el último fichero fue 2009_05_04 15_42_28 YF00D.plf  y sabemos que cada hora al menos se crean 2 (por poner una cifra) entonces tomas como filtro la longitud del fichero que has usado, hasta el patrón del fivhero anterior '2009_05_04 15*.plf , nota el asterisco. Si la lista queda vacía sin duda ha cambiado la hora de 15 a 16, siempre que ocurra esto retiramos el último carácter al patrón de filtro anterior al asterisco, esto hasta que a lo sumo llegue el salto al año, una vez que se encuentra la lista con contenido el siguiente patrón de filtro volverá a ser el nombre del fichero entero menos el último campo (la referencia de pieza ignoro el patrón que sigue por tanto ahí deberás asegurarte tú), con este filtro, lo que consigues es que la lista de ficheros sea muy pequeña y por tanto sólo tendrás que localizar entre esta lista el más reciente. En este caso el cometido del timer será primero actualizar el fltro del filelistbox, como se ha comentado hasta que la lista tenga al menos 1 fichero.  Eso si en este caso cuando arrancas la aplicación el primer fichero debe localizarse fuera del uso del timer, no tienes más remedio que recorrer toda la lista completa para localizar el más reciente, luego ya se usará ese nombre como filtro en las sucesivas llamadas.  Ahora bien si sólo hay 40 ó 50 ficheros en la carpeta no habría diferencia entre usar el filesystemobject y el filelistbox

Ten en cuenta que el filelistbox, filtra la lista de ficheros que en realidad no es otra cosa que recorrer los ficheros de dicha carpeta y ver si el nombre cumple el patrón, algo que igualmente podrías hacer con el filesystemobject, no obstante el filelistbox te ahorra trabajo en ese sentido. Si la lista de ficheros es muy grande habría de mirarse si resulta conveniente ir pasando ficheros a otra carpeta, a fin de que esta lista siempre sea lo más pequeña posible...

Saludos.
«Ma non troppo»
----> ModoVacaciones = False<----

alex1510

  • Miembro activo
  • **
  • Mensajes: 35
    • Ver Perfil
Re: Abrir archivo texto mas reciente
« Respuesta #2 en: Lunes 12 de Octubre de 2009, 00:02 »
0
Bueno Nebire, sinceramente no se que decir. Te has currado muchisimo la respuesta. Francamente muchisimas GRACIAS por esta explicación, que me lo ha aclarado bastante y el martes vuelvo a trastear con la maquina, por que el problema grande es que creo que este archivo lo genera el programa al terminar la pieza, y esto no me interesa, por que lo que quiero es hacer una barra de progreso para ver cuanto le queda para terminar la pieza. A ver como me las apaño, por que en algun sitio se debe ir creando al menos algun archivo temporal. Muchas GRACIAS de nuevo por esta respuesta a un novato del foro.GRACIAS