Programación General > VBA
Duda filtro y cambiar de fila
(1/1)
alex1510:
Hola buenas:
Tengo el siguiente archivo que va generando una maquina continuamente y necesito filtrar algunas instrucciones y pasarlas a otra hoja. Ya he conseguido que se actualice con aplication ontime cada 30 segundos y lo he programado para que se sobreescriba. Mi problema es que solo quiero leer a partir de donde lo dejo la ultima vez, es decir, hacer un filtro a partir de ahí. Les agradecería mucho que me dijeran como se le pone a cada instrucción un número, es decir, en la columna A un número que identifique esa instrucción, pero que solamente llege asta el final del texto, no como yo tengo ahora hasta la fila 65500.jjj.que le di a rellenar con una serie.
Miren, para hacerse a la idea:
Tengo esto:
520 04/05/2009 17:45:59 ALERT 2903 90 Cycle Start Pressed 2 42
521 04/05/2009 17:46:00 ALERT 1900 90 Automatic Cycle Started 2 42
522 04/05/2009 17:46:01 DATAPOINT FEED_RATE_OVERRIDE=100
523 04/05/2009 17:46:03 MESSAGE PLY NAME ======> P1-61 3 0
524 04/05/2009 17:46:03 MESSAGE PLY CREATED ===> 2006/01/17 12:16:55 3 0
525 04/05/2009 17:46:03 MESSAGE BNDLNAM=YF00D TRAMPA WING PRAL.IZQ. 3 0
526 04/05/2009 17:46:03 MESSAGE PROGNAM=NC0003 3 0
527 04/05/2009 17:46:06 MESSAGE PLYNAME=P1-61 / STARTED 3 1
528 04/05/2009 17:46:06 MESSAGE COURSE=0001 / STARTED 3 1
529 04/05/2009 17:46:16 MESSAGE COURSE=0001 / ENDED 3 1
530 04/05/2009 17:46:20 MESSAGE COURSE=0002 / STARTED 3 2
531 04/05/2009 17:46:30 MESSAGE COURSE=0002 / ENDED 3 2
532 04/05/2009 17:46:30 MESSAGE PLYNAME=P1-61 / ENDED 3 2
533 04/05/2009 17:46:30 MESSAGE EST-CYCLE-TIME= 0.41 MINUTES 3 2
534 04/05/2009 17:46:30 MESSAGE EST-TOW-LENGTH= 59238.27 MMS 3 2
535 04/05/2009 17:46:34 MESSAGE VERIFICAR CAPA 3 2
536 04/05/2009 17:46:34 ALERT 2907 90 M00-Executed 3 2
537 04/05/2009 17:46:35 ALERT 1902 90 Automatic Cycle Stopped 3 2
538 04/05/2009 17:46:35 ALERT 2903 90 Cycle Start Pressed 3 2
539 04/05/2009 17:46:37 ALERT 1900 90 Automatic Cycle Started 3 2
y quiero algo como esto:
5571 2009-06-22 19:46:02.000 2009-06-22 19:47:16.000 74 Parada PARADA Fiber1 NULL
5572 2009-06-22 19:47:16.000 2009-06-22 19:47:36.000 20 Velocidad Reducida VELOCIDAD REDUCIDA Fiber1 NULL
5573 2009-06-22 19:47:36.000 2009-06-22 19:52:28.000 292 Parada PARADA Fiber1 NULL
5574 2009-06-22 19:52:28.000 2009-06-22 19:52:30.000 2 Velocidad Reducida VELOCIDAD REDUCIDA Fiber1 NULL
5575 2009-06-22 19:52:30.000 2009-06-22 19:52:32.000 2 Entrada ENTRADA Fiber1 NULL
5576 2009-06-22 19:52:32.000 2009-06-22 19:53:02.000 30 En Marcha EN MARCHA Fiber1 NULL
5577 2009-06-22 19:53:02.000 2009-06-22 19:53:06.000 4 Entrada ENTRADA Fiber1 NULL
5578 2009-06-22 19:53:06.000 2009-06-22 19:56:10.000 184 Velocidad Reducida VELOCIDAD REDUCIDA Fiber1 Velocidad Reducida
5579 2009-06-22 19:56:10.000 2009-06-22 19:56:56.000 46 Parada PARADA Fiber1 NULL
5580 2009-06-22 19:56:56.000 2009-06-22 19:56:58.000 2 Velocidad Reducida VELOCIDAD REDUCIDA Fiber1 NULL
5581 2009-06-22 19:56:58.000 2009-06-22 19:57:28.000 30 Entrada ENTRADA Fiber1 NULL
5582 2009-06-22 19:57:28.000 2009-06-22 19:57:30.000 2 Parada PARADA Fiber1 NULL
5583 2009-06-22 19:57:30.000 2009-06-22 19:57:34.000 4 Entrada ENTRADA Fiber1 NULL
5584 2009-06-22 19:57:34.000 2009-06-22 20:20:58.000 1404 Velocidad Reducida VELOCIDAD REDUCIDA Fiber1 Velocidad Reducida
5585 2009-06-22 20:20:58.000 2009-06-22 20:35:10.000 852 En Marcha EN MARCHA Fiber1 NULL
5586 2009-06-22 20:35:10.000 2009-06-22 20:35:42.000 32 Parada PARADA Fiber1 NULL
5587 2009-06-22 20:35:42.000 2009-06-22 20:36:30.000 48 En Marcha EN MARCHA Fiber1 NULL
5588 2009-06-22 20:36:30.000 2009-06-22 20:37:00.000 30 Parada PARADA Fiber1 NULL
5589 2009-06-22 20:37:00.000 2009-06-22 20:41:22.000 262 En Marcha EN MARCHA Fiber1 NULL
5590 2009-06-22 20:41:22.000 2009-06-22 20:41:40.000 18 Parada PARADA Fiber1 NULL
5591 2009-06-22 20:41:40.000 2009-06-22 20:42:20.000 40 En Marcha EN MARCHA Fiber1 NULL
5592 2009-06-22 20:42:20.000 2009-06-22 20:42:40.000 20 Parada PARADA Fiber1 NULL
5593 2009-06-22 20:42:40.000 2009-06-22 20:42:42.000 2 Velocidad Reducida VELOCIDAD REDUCIDA Fiber1 NULL
5594 2009-06-22 20:42:42.000 2009-06-22 20:42:44.000 2 Entrada ENTRADA Fiber1 NULL
5595 2009-06-22 20:42:44.000 2009-06-22 20:44:58.000 134 Parada PARADA Fiber1 NULL
5596 2009-06-22 20:44:58.000 2009-06-22 20:45:00.000 2 Velocidad Reducida VELOCIDAD REDUCIDA Fiber1 NULL
Se que es complicado, pero me ayudarian mucho diciendome lo del indice de la columna A y como grabar el indice de la ultima instruccion y sumarle uno para así, en el proximo ciclo solamente partir desde esa instrucción para filtrar.
Gracias
Nebire:
Te he leído 3 veces y no acabo de terminar de entenderte del todo.... tu te explicas como dando por hecho que conocemos la 'máquina' esa y que estamos familiarizados con lo que hace...
Supongo que a instruccción te refieres a cada línea ahí escrita, y supongo (por que no lo indicas) que dichas líneas proceden de un archivo de texto ¿...?, luego hablas de columnas que yo no veo, por lo que asumo (ya me dirás si acierto) que cada columna debe ser el texto definido entre 2 espacios. Para terminar, en el texto encabezado indicas: (solo quiero leer a partir de donde lo dejó la ultima vez) pero luego previo al último párrafo dices (y quiero algo como esto)... entonces cuál de las 2 cosas quieres ?... nuevamente asumo (no se si acierto) que esta 2ª idea nace como una posible respuesta a la 1ª...
Entonces para poder ayudarte de la forma más óptima dime exactamente cual es el problema raíz, deja aparte de momento las posibles soluciones, dime si lo que haces es:
a - leer el contenido de un fichero, trabajas en el y si
b - lo modificas o no, y si luego
c - más tarde ese mismo fichero ha sido escrito añadiendo contenido al final,
...y es por eso que quieres 'revisar' desde la vez anterior... porque si esto es así, la solución sería bastante más fácil de loque te puedas imaginar.
Si en cambio lo quieres es
d - alterar un texto para que tenga otro 'aspecto' pués acláralo,
si esto 2º es resultado para solucionar lo 1º es trabajo inútil,ahora si
e- es obligatorio hacer esa cambio, entonces es un nuevo y 2º problema.
Defínelo claramente... plis. al menos confirmando a,b,c,d,e...
alex1510:
Lo siento, me explico fatal:
Mire, el archivo es el siguiente: gigasize.com/get.php?d=7ssdn54nl8f
Este es el archivo final de la pieza terminada, yo lo tengo que ir leyendo en tiempo real que eso ya lo tengo (cada 30 seg) y ir elaborando la información para al final obtener algo asi:
gigasize.com/get.php?d=nn6ql3qo77b
Tambien por si le sirve le pongo lo que llevo hecho, (no se ria mucho):
gigasize.com/get.php?d=83cw6007ngd
Espero que nos hayamos aclarado.
Gracias
Nebire:
Bueno, hay cosas que sigo sin entender, son detalles que sólo tu sabes.
No obstante eso no quita para te pueda indicar una línea de trabajo....
Yo te expongo un código que luego debes completar y adaptar a tus necesidades. Como no he podido descargar hasta hoy los otros 2 ficheros (tras descargar el fichero *.plf el 'gigasize' me indicó que alcancé el límite), ... pués no he visto que lo trabajas todo en excel.
Hay partes que está comentada y parte que tiene código, te lo meto todo en un archivo rar, lo abres y lo miras detenidamente, para hacerc cambios hazlos sobre una copia,a así quedando este intacto, podrás volver a ver el original cuando lo necesites. Obviamente tendrás que modificarlo bastante para adaptarlo a excel.... Sin embargo está bastante comentado, como para que puedas hacer un seguimiento casi completo sin perderte.
De todas formas te lo voy comentando por encima...
Tenemos un formulario, tiene 3 botoners, uno de iniciar y otro de detener, el tercero sólo aparece si ocurre aalgún error inesperado, el resto de la interfaz sólo tiene propósitos de aclarar el estado del proceso.
Los estados posibles son EnEspera de iniciarse(a fin de cuentas parado) , petición de inicio, inicio, petición de parada, parado.
Cuando el estado es petición de inicio, el timer se pone en marcha e invoca un método de una clase que es quien realiza todo el trabajo. Si tiene éxito dispara un evento 'procesando', entonces el estado pasa a ser iniciado. si ocurre un error el estado pasa a ser parado.
Cuando se pulsa el botón de parar, el estado se establece en petición de parada, la parada sólo ocurre cuando se termine de procesar los datos actuales. cuando esto ocurre se dispara un evento de terminado.
Estos botones 'fluctuan' , con el disparo de dichos eventos (procesando y terminado) habilitándose/desahbilitándose y cambio el color de fondo de los mismos, lo cual está controlado de modo general por el timer...
Cuando se inicia la aplicación se crea una instancia de la clse 'Trnsformar' y se invoca una función de ésta, la idea es que en esa función busquees el fichero inicial de entrada, debes también asignar las rutas a las variables de dichos archivos (entrada y salida)
El resto de la interfaz son el propio timer y 2 shapes, para indicar estados... adicional al estado que marcan los botones, para distinguir la fluctuación de los botones del estado global.
Como el código del formulario es bastante 'sencillo', creo que no necesita más comentario
El código del formulario es éste:
--- Código: Visual Basic --- Private Procesando As BooleanPrivate WithEvents Transforma As TransformarPrivate Reintentos As Byte Private Const Carmin As Long = &HE0E0F0Private Const Verdin As Long = &HE0F0E0 ' inicia un intento de paro o puesta en marcha del proceso' la notificación de paro sólo sucederá cuando se termine el actual' bloque de operaciones en curso.Private Sub ComProceso_Click(Index As Integer) ' color de transición, tras un evento de transforma ya se cambiarán a su color adecuado If Index = 0 Then ComProceso(0).BackColor = Verdin ComProceso(0).Enabled = False ElseIf Index = 1 Then ComProceso(1).BackColor = Carmin ComProceso(1).Enabled = False End If Timer1.Enabled = (Index = 0) ShaEnMarcha.Visible = Timer1.EnabledEnd Sub ' regresa los cambios operados ante error al modo operativo normalPrivate Sub ComResetError_Click() ComResetError.Enabled = False ComResetError.Visible = False ShaError.Visible = False ComProceso(0).Enabled = True ShaEnMarcha.Visible = True Timer1.Enabled = TrueEnd Sub ' esto es lo primero que se va a ejecutar cuando se inicie la aplicación.' prepara los controles y valores....Private Sub Form_Initialize() Set Transforma = New Transformar Reintentos = 0End Sub ' realiza hasta 12 intentosPrivate Sub Form_Load() Dim Ok As Boolean Timer1.Enabled = False Timer1.Interval = 30000 Do While Reintentos < 12 If Not (Transforma Is Nothing) Then If Transforma.InicializarProceso = True Then Ok = True Exit Do Else ' avisar, algo no está conforme a lo que necesitamos ' ver descripción de InicializarProceso End If Else Reintentos = Reintentos + 1 ' pausa de 3 segundos y reintentamos Call Pausa(3) Set Transforma = New Transformar End If Loop Reintentos = 0 If Ok = False Then MsgBox "Ocurrió un error, no se consiguió inicializar el proceso..." Unload Me Else ' el sistema está listo para comenzar.... sin embargo espera a que se pulse el botón de comienzo. ComProceso(0).Enabled = True ComProceso(1).Enabled = False ComResetError.Enabled = False ComResetError.Visible = False ShaError.Visible = False End IfEnd Sub ' antes de cerrar intentamos ver si es posible terminar el proceso actual (si estaba en marcha)Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) If Timer1.Enabled = True Then ' petición de terminar Call ComProceso_Click(1) MsgBox "Hay una operación en curso intentaremos esperar a que termine... antes decerrar." Me.Hide ' lo ocultamos para evitar que insista y al final recurra a medidas drásticas sin darle tiempo a terminar y guardar el resultado. Do DoEvents Loop While Procesando = True End If Set Transforma = NothingEnd Sub Private Sub Form_Terminate() Timer1.Enabled = False Set Transforma = NothingEnd Sub Private Sub Timer1_Timer() If Procesando = False Then Procesando = True Transforma.Procesar End IfEnd Sub '================================================'======== eventos de el objeto Transforma ======= Private Sub Transforma_Procesando() ComProceso(0).Enabled = False ComProceso(0).BackColor = vbGreen ComProceso(1).Enabled = True ComProceso(1).BackColor = Carmin Beep Call Pausa(1) BeepEnd Sub Private Sub Transforma_Terminado() Procesando = False ComProceso(1).Enabled = False ComProceso(1).BackColor = vbRed ComProceso(0).Enabled = True ComProceso(0).BackColor = Verdin Beep Call Pausa(1) BeepEnd Sub Private Sub Transforma_ParoError() Timer1.Enabled = False ShaEnMarcha.Visible = False ShaError.Visible = True ComResetError.Enabled = True ComResetError.Visible = True Call Transforma_Terminado ComProceso(1).Enabled = False MsgBox "Ha ocurrido un error inesperado..." ' otras acciones posibles ' acciones...End Sub ' realiza una pausa con los segundos especificados antes de continuar' esto es aproximado... no es un tiempo exacto. puede fluctuar 200 milisegundosPrivate Sub Pausa(ByVal Segundos As Byte) Dim t As Single t = Timer Do DoEvents Loop While Timer - t < SegundosEnd Sub
La clase se compone de algunas enumeraciones, yo sólo he puesto la de 'eventos', que parece la más obvia y una matriz que se correponde indice a indice con esta enumeración. el resto de enumeraciones que precisares podrías tratarlas del mismo modo.
He tratado cada 'linea' como una estructura, supuse que tu idea inicial era guardarlo como fichero, te texto plano... Cyuando el timer entra en marcha, invoca una función de la clase que se dedica a procesar, hay bastante descripción detallada que señala los pasos que se deben seguir, naturalmente ni está completo ni es obligatorio, deberás añadir, quitar y modificar de acuerdo a tus necesidades, yo sólo te proveo una orientación...
Esa función determina si el fichero en seguimiento ha variado de tamaño, a fin de determinar si se debe seguir leyendo del mismo, intuyo que algo al final de un archivo debe ser indicador de que el archivo está completo, a falta de ello verificar el tamaño es una opción (más pobre pero que sirve). Si el fichero estuviera completo, se debe localizar el siguiente, se llama a una función que realiza esa labor.
Una vez localizado el fichero (si es otro distinto del anterior) se llama a una función que lee el contenido del actual archivo de entrada. Lo leemos todo de una vez (vb6 puede leer perfectamente incluso 10Mb. en menos de 1 sg.) y lo troceamos en líneas, asumimos que cada línea está separada de la siguiente por un retorno de carro y avande de línes (CR= CarryReturn , LF= Line Feed) ó vbCrlf en vb6. Esta función devuelve por referencia el número de líneas contenidas. Si el fichero no está al inicio se posiciona el cursor en la posición actual de lectura, antes de leerlo, lógicamente y guardamos el cursor de lectura tras tomar los datos, luego se cierra el archivo y se devuelve la matriz de líneas
Tras tomar la matriz de líneas si lineas -1 (error ocurruid) ó 0 (no hay texto ???) dispara un evento de error y sale de la función, en otro caso se invoca a otra función, la que va a realizar la transformación de estas líneas en las que tu quieres.
La función que formatea las líneas, está a medio codificar, hay datos que yo no tengo y lógicamente no se en base a que han detomar una u otra constante, a mi la línea, por ejemplo: '2009.05.04 15:42:28 MESSAGE PLY0023,23,3,~CM100GEN', no me dice gran cosa, es de asumir que el código de mensaje responde a un manual de operativa de la máquina , yo he tratado las fechas (sesupone que la fecha de inicio de una operación es la fecha de finalización de la anterior), y he calculado la duración usando una funcion de fecha, para totalizar segundos. El resto de esta función son sugerencias, por ejemplo verás un bloque 'select case', donde debes procesar la parte de 'mensaje', imagino que el resto de texto a la derecha se interpreta de modo uniforme de acuerdo a ese 'mensaje'.
finalmente en la misma función indicada anteriormente, te ofrezco 2 funciones de salida a fichero (es loque creía que tenías que hacen antes de descargar estos ficheros de excel). Nota que la salida en binario siempre será más rápida y cómoda pero ofrece un fichero ilegible a la vista si lo abres con el 'bloc de notas' (igual que sucede si abres un archivo excel con el mismo 'bloc de notas'), un 2º método te ofrece guardarlo en formato de cadena, es siempre más lento, porque tiene que hacerse a través de un bucle línea a línea.
No obstante esta (última) salida es aceptable para excel... excel permite importar ficheros de texto, interpretando como fila de excel cada línea de fichero e interpretando como columna cada dato separado de otro. con esto tienes pués 2 caminos a seguir para crear tus archivos excel, tomar todo el código y adaptarlo, completarlo a tu proyecto actual o crear un nuevo proyecto, completar este que ten envío y luego importar a excel el fichero ya elaborado, las 'fórmulas' que tengas en excel, te siguen valiendo... Sólo cambia el método de adquisición de datos.
El código de la clase es éste:
--- Código: Visual Basic --- Private Enum EventosMaquinaIn EVENTO_AVERIA = -1 EVENTO_ENTRADA = 0 EVENTO_PARADA = 1 EVENTO_MARCHA = 2 EVENTO_REDUCE_VELOCIDAD = 3End Enum Private Type LineaSalida id As Long Inicio As Date Fin As Date Duracion As Integer ' eventoEspecificado as string Evento As String ' se toman de la matriz EventosMaquinaOut Maquina As String Motivo As StringEnd Type ' nótese que las cadenas se hacen coincidir en índices con EventosMaquinaIn' los valores se generan al crear la clase: ver Class_InitializePrivate EventosMaquinaOut(-1 To 3) As String Private s_LinAnterior As LineaSalidaPrivate p_FicheroEntrada As StringPrivate p_FicheroSalida As String Private s_cursorEntrada As LongPrivate s_CursorSalida As Long Private s_TamañoEntrada As LongPrivate s_Id As LongPrivate s_Maquina As String Public Event Procesando()Public Event Terminado()Public Event ParoError() Public Property Get FicheroSalida() As String FicheroSalida = p_FicheroSalidaEnd Property Public Property Get FicheroEntrada() As String FicheroEntrada = p_FicheroEntradaEnd Property ' esto debería invocarse cuando se arranca el programa antes de ejecutarse nada' para hacer esas cosas que sólo ocurrirán una única vez al principio.Public Function InicializarProceso() As Boolean ' leemos de un fichero estado.txt ' si no existe se crea. ' pero si ya existe leemos ' donde quedamos la vez anterior, esto es si quedó un fichero sin terminar (suponiendo que esto interese) ' si estamos interesados en devolver algún estado devolvemos true, o false según convenga o cambiamos el tipo de devolución ' si queremos devolver otro tipo de dato. ' si deseamos decidir si empezar, o resetear el archivo de estado previo, deberíamos establecer un parámetro a la función. ' antes de devolver nos aseguramos de ver y asignar laos valores para las variables: ' p_ficheroentrada y p_ficherosalida InicializarProceso = TrueEnd Function Public Function Procesar() Dim Texto() As String Dim Lineas As Long ' si existe p_ficheroEntrada luego s_TamañoEntrada = FileLen(p_FicheroEntrada) ' si tamaño del fichero es mayor que p_cursorentrada luego (se ha escrito nuevo contenido) ' ' (continuamos con la lectura, esto es en el siguiente apartado) ' el tamaño es el mismo ' nada que procesar, se está esperando a que la máquina realice operaciones o está terminado ? ' (necesitamos saber cuando un fichero está terminado: ¿ obbsstop indica esto ?) ' si sabemos que está terminado luego (debemos buscar el siguiente fichero) ' localizado = llamar a función: BuscarSiguienteEntrada ' si localizado False luego ( no hay ficheros de entrada pendientes) ' raiseevent Terminado ' exit function ' fin condición: localizar siguiente fichero ' si sabemos que no está terminado (debemos esperar) ' raiseevent Terminado ' exit function ' fin condicion: de lo que sabemos ' fin condicion: Tamaño no varía ' no existe fichero entrada ' localizado = llamar a función: BuscarSiguienteEntrada ' si localizado False luego ( no hay ficheros de entrada pendientes) ' raiseevent Terminado ' exit function ' fin condición: localizar siguiente fichero ' fin condicion: existe fichero entrada Texto = TomarContenidoFicheroEntrada(Lineas) ' ( llamar a función tomar contenido de fichero de entrada) If Lineas < 1 Then ' -1= (ocurrió un error), 0= se leyó el fichero pero parece que no contiene texto ???? RaiseEvent Terminado Exit Function Else ' lineas es mayor que (hay líneas que procesar) Call ConvertirLineas(Texto) ' llamamos a otra función para tratar las líneas (sólo por claridad y sencillez de modificar las funciones) RaiseEvent Terminado End If ' fin condición hay líneas de texto leídasEnd Function ' localiza el siguiente fichero que genera la máquina para ser procesadoPrivate Function BuscarSiguienteEntrada() As Boolean ' si localiza un ficheo ' p_ficheroentrada= ElficheroEncontrado ' s_cursorentrada= 1 ' cerramos ficherosalida ' s_cursorSalida=1 ' creamos y abrimos nuevoFichero de salida ' p_Ficherosalida = ElNuevoficherosalida ' elegir el nombre y la ruta, supuestamente basado en el nombre y ruta del de entrada ' ' s_Maquina= "fiber-1" ' se supone que tú debes saber como obtener este dato. ' ' devuelve True ' no localiza un nuevo fichero (quizás la máquina esté parada, o está en medio de un largo proceso y no escribe hasta el ´termino) ' Devolver false ' fin condicion: localizar ficheroEnd Function Private Function TomarContenidoFicheroEntrada(ByRef Lineas As Long) As String() ' abrimos el fichero ' posicionamos el crusor ' leemos hasta el final del archivo ' Troceamos el texto en líneas ' Devolvemos el texto Dim ff As Integer Dim Texto As String Dim txt() As String On Local Error GoTo ErrorTomar Texto = String(s_TamañoEntrada - p_cursorentrada + 1, " ") ff = FreeFile Open p_FicheroEntrada For Binary As #ff Get #ff, p_cursorentrada, Texto Close #ff Texto = Trim$(Texto) If Texto <> "" Then If InStr(1, Texto, vbCrLf) > 0 Then txt = Split(Texto, vbCrLf) Texto = "" ' liberamos memoria Lineas = UBound(txt) + 1 TomarContenidoFicheroEntrada = txt Erase txt ' liberamos memoria Else Lineas = 1 redim txt(0 to 0) Txt(0)=texto TomarContenidoFicheroEntrada = txt Texto="" erase txt End If Else Lineas = 0 End If Exit Function ErrorTomar: Close #ff RaiseEvent ParoError 'MsgBox "Error al leer fichero de entrada: " & vbCrLf & _ 'Err.Number & " " & Err.Description, vbCritical Lineas = -1End Function Private Sub ConvertirLineas(ByRef Lineas() As String) ' iniciamos bucle ' procesamos línea a línea ' eventuualmente según la cantidad de parámetros de cada línea debe procesarse aparte ' terminamos bucle ' abrimos fichero de salida ' posicionamos el cursor de salida ' escribimos contenido ' cerramos fichero de salida Dim k As Long, n As Long Dim Salida() As LineaSalida Dim Linea() As String Dim txt As String ReDim Salida(-1 To UBound(Lineas)) ' ojo: insertamos la línea usada la última vez del proceso anterior como la línea -1 Salida(-1) = s_LinAnterior For k = 0 To UBound(Lineas) Linea = Split(Lineas(k), " ") ' el divisor es un espacio Salida(k).Maquina = s_Maquina ' se supone que al cargar el fichero siguiente se obtiene ese valor que presumiblemente es constante para el mismo fichero. Salida(k).id = Salida(k - 1).id + 1 Salida(k).Fin = Replace(Linea(0), ".", "-") & " " & Linea(1) ' Salida(k).Inicio = Salida(k - 1).Fin Salida(k).Duracion = DateDiff("s", Salida(k).Fin, Salida(k).Inicio) ' importante: al guardar el fichero en modo binario, resulta ilegible si abrimos luego el archivo para leerlo, si queremos ' que sea legible (a la vista) debemos hacerque todos los campos de la estructura sean cadenas de texto ' entonces deberíamos declarar al menos 2 datos de fecha a nivel de la función ' por ejemplo: ' estas 3 líneas iría antes del bucle ' Dim Ini As Date, Fin As Date, id As Long ' id = Val(Salida(-1).id) ' fin= salida(-1).Fin ' estas líneas irían dentro del bucle sustituyendo a las previas ' Ini = Fin ' Fin = Replace(Linea(0), ".", "-") & " " & Linea(1) ' Salida(k).Duracion = CStr(DateDiff("s", Fin, Ini)) ' Salida(k).Fin = CStr(Fin) ' Salida(k).Inicio = CStr(Ini) ' id = id + 1 ' Salida(k).id = CStr(id) ' estos datos se supone que tienes que interpretar las constantes que aparecen en las líneas ' podrían meterse enuna enumeración o no con y una matriz asociada con ello nos podríamos ahorramos el select case en algunos casos Select Case Trim$(Linea(2)) Case "MESSAGE" Salida(k).Evento = "?" Salida(k).Motivo = "?" Case "COMMENT" Salida(k).Evento = "?" Salida(k).Motivo = "?" Case "MATERIALFP" Salida(k).Evento = "?" Salida(k).Motivo = "?" ' más casos 'Salida(k).Evento = "?" 'Salida(k).Motivo = "?" ' ................ End Select Next s_LinAnterior = Lineas(UBound(Lineas)) Erase Lineas ' liberamos memoria redim preserve Salida(0 to ubound(salida)) ' eliminamos la línea previa -1 que añadimosprevio al bucle. ' qué queremos hacer con las salida ???. ' si sólo lo queremos escribir a fichero ' escribiendo en modo binario (ilegible a la vista). Open p_FicheroSalida For Binary As #ff 'Loc(ff) = s_CursorSalida 'Put #ff, , Salida Put #ff, s_CursorSalida, Salida ' tiene la ventaja de que escribe estructuras, matrices y matrices de estructura con 1 sola línea. s_CursorSalida = Seek(ff) Close #ff ' alternativamente puedes escribirlo como texto y usando un bucle (es totalmente legible a la vista) Open p_FicheroSalida For Output As #ff Loc(ff) = s_CursorSalida With Salida(k) For k = 0 To UBound(Salida) Print #ff, .id, .Inicio, .Fin, .Duracion, .Evento, .Maquina, .Motivo Next End With s_CursorSalida = Seek(ff) Close #ff Erase Salida ' liberamos memoriaEnd Sub Private Sub Class_Initialize() EventosMaquinaOut(-1) = "AVERIA" EventosMaquinaOut(0) = "ENTRADA" EventosMaquinaOut(1) = "PARADA" EventosMaquinaOut(2) = "MARCHA" EventosMaquinaOut(3) = "VELOCIDAD REDUCIDA"End Sub
Considero que tienes bastante materia como para poder completar tu proyecto. :beer: Si tienes alguna duda, consulta, pero sé explícito y no des por hecho que la ¿ troqueladora ? , ¿ torno ? , la hemos fabricado nosotros ni tampoco el programa que la maneja :ph34r: ?. Mejor si son preguntas concretas, las preguntas genéricas dispersan mucho la respuesta...
envío y luego edito para adjuntar el fichero:
alex1510:
Gracias de nuevo Nebire. Lo siento por lo de gigasize, es que no encontre otra forma de colgarlo en internet.
Me ha servido de mucho lo que me has dicho, ademas de que te curras mucho las respuestas. Por mi parte yo voy a currarme las mias. Te lo explico todo desde el comienzo:
Tenemos una máquina que va poniendo capas de fibra de carbono para las alas del avión.
Esta máquina va generando de forma continua el archivo que te he enviado y que nos interesa (.txt). Lo que queremos obtener es cuando esta parada (stop cycle), cuando esta funcionando (start cycle), cuando esta en avería y por la capa que va, para poder hacer una barra de progreso que indique el tiempo aproximado de finalización de la pieza. Todo esto lo quiero hacer mediante un scada (wincc v7), por lo que necesito mandarle al scada variables con las que jugar, luego ya este se encargara de hacer graficos e historiales con la información recibida.
Hasta ahi creo que me he explicado:
Localizar el archivo dentro del directorio es el primer problema, el cual te pregunte al comienzo. Tenemos que saber cual es el ultimo archivo que se esta modificando, y una vez localizado, leerlo. Se genera un archivo por pieza construida.
Dentro del tiempo de construccion de la pieza, se incluyen los tiempos de poner y quitar el útil. Para controlar este tiempo voy a poner un pulsador para que el operador al pulsar sobre él, indique Cambio de Pieza, es decir, cuando he sacado la pieza elaborada, pulso y le indico que voy a comenzar a introducir los utiles para la nueva pieza.
Mi idea es conseguir lo que se observa en la presentación de power point, si no igual, parecido.
De esta forma puedo llevar la cuenta del tiempo que lleva parada la maquina y el por qué, para elaborar graficos y un pareto.
Por tanto, mi duda se resume en conseguir leer de ese archivo las varibles que indiquen el estado del sistema (parado, marcha, averia, velocidad reducida(feed_rate<70), nombre de pieza y plano por el que va la construccion de la pieza.
Por ultimo quiero decirte que el archivo ese de la maquina se va generando en el ordenador de control de la maquina, y yo voy a utilizar otro. La solución ideal sería crear una intranet entre ambos, conectarlos mediante ethernet y poner el directorio de almacenamiento de historiales a compartir no??
Te pongo el link del archivo y siento no poder adjuntarlo aqui en el mensaje, pero es que ocupa mas de 2MB.
Archivo rapidshare.de/files/48526391/Captura_Datos_Airbus_v4_ivan.rar.html
Un saludo y mil gracias por la atención que me estas prestando.
Navegación
Ir a la versión completa