From a535cbe5fe048d1f7d1d69b521c778d9350429db Mon Sep 17 00:00:00 2001 From: Angel Ivan Date: Thu, 14 May 2026 10:50:14 -0600 Subject: [PATCH] =?UTF-8?q?Creaci=C3=B3n=20de=20archivo=20resultbackup.txt?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Soporte para LabVIEW y nuevo formato de configuración Se cambia el archivo de configuración a configbackup.txt, ahora con tres líneas (IP, ruta .dmb y MAC). Se añade la función ActualizarEstadoLabVIEW para comunicar el estado del proceso a LabVIEW mediante un archivo bandera. Se eliminan mensajes innecesarios y se automatiza el cierre de la app. Mejoras menores en manejo de errores y formato del archivo de ejemplo. --- BackupCognex/Program.cs | 92 ++++++++++++++++++++++++----------------- BackupCognex/config.txt | 3 +- 2 files changed, 56 insertions(+), 39 deletions(-) diff --git a/BackupCognex/Program.cs b/BackupCognex/Program.cs index d331812..5ab70c5 100644 --- a/BackupCognex/Program.cs +++ b/BackupCognex/Program.cs @@ -10,64 +10,60 @@ class Program { // 1. Leer configuración desde config.txt string exeDirectory = AppDomain.CurrentDomain.BaseDirectory; - string configPath = Path.Combine(exeDirectory, "config.txt"); + string configPath = Path.Combine(exeDirectory, "configbackup.txt"); if (!File.Exists(configPath)) { Console.WriteLine($"No se encontró el archivo de configuración: {configPath}"); - Console.WriteLine("\nPresiona cualquier tecla para salir..."); Console.ReadKey(); return; } string[] configLines = File.ReadAllLines(configPath); - if (configLines.Length < 2) + if (configLines.Length < 3) { - Console.WriteLine("El archivo config.txt debe tener al menos dos líneas: IP y ruta del archivo .dmb"); - Console.WriteLine("\nPresiona cualquier tecla para salir..."); + Console.WriteLine("El archivo configbackup.txt debe tener 3 líneas: IP, Ruta .dmb y MAC Address"); Console.ReadKey(); return; } string ipString = configLines[0].Trim(); - // Leer la ruta original del .dmb desde el config string originalDmbPath = configLines[1].Trim().Trim('"'); + string macAddress = configLines[2].Trim(); // Guardada para uso futuro + string labviewFolder = "C:\\Pruebas"; //TODO: Actualizar ruta if (!File.Exists(originalDmbPath)) { Console.WriteLine($"No se encontró el archivo .dmb original en la ruta: {originalDmbPath}"); - Console.WriteLine("\nPresiona cualquier tecla para salir..."); Console.ReadKey(); return; } - // 2. Preparar el entorno para los archivos temporales - // Crear una carpeta temporal única en la carpeta Temp de Windows + // 2. Preparar el entorno string tempFolder = Path.Combine(Path.GetTempPath(), "DMBackup_" + Guid.NewGuid().ToString().Substring(0, 8)); - EthSystemConnector connector = new EthSystemConnector(System.Net.IPAddress.Parse(ipString)); DataManSystem myDevice = new DataManSystem(connector); + // --- MARCAMOS INICIO DE PROCESO PARA LABVIEW (0) --- + ActualizarEstadoLabVIEW(0, exeDirectory, labviewFolder); + try { // --- FASE 1: MANEJO DE ARCHIVOS (Descomprimir) --- Console.WriteLine("Extrayendo archivos del backup (.dmb)..."); Directory.CreateDirectory(tempFolder); - // Copiar el .dmb como .zip a la carpeta temporal string zipPath = Path.Combine(tempFolder, "backup.zip"); File.Copy(originalDmbPath, zipPath); - - // Extraemos todo el contenido ZipFile.ExtractToDirectory(zipPath, tempFolder); - // Buscar los archivos específicos extraídos string[] cfgFiles = Directory.GetFiles(tempFolder, "*.cfg"); string[] cdcFiles = Directory.GetFiles(tempFolder, "*.cdc"); if (cfgFiles.Length == 0) { Console.WriteLine("\n[ERROR] El archivo .dmb no contenía un archivo de configuración (.cfg)."); + ActualizarEstadoLabVIEW(2, exeDirectory, labviewFolder); // Error return; } @@ -81,18 +77,15 @@ class Program myDevice.SendCommand("SET SYSTEM.ONLINE OFF"); Thread.Sleep(1000); } - catch { /* Ignorar si el lector no soporta el comando o ya está offline */ } + catch { /* Ignorar si ya está offline */ } - // Cargar el archivo .CFG (Configuración) Console.WriteLine($"Cargando configuración: {Path.GetFileName(cfgFiles[0])}..."); myDevice.SetConfig(cfgFiles[0]); Thread.Sleep(2000); - // Cargar el archivo .CDC (Calibración - Si existe en el backup) if (cdcFiles.Length > 0) { Console.WriteLine($"Cargando calibración: {Path.GetFileName(cdcFiles[0])}..."); - // Para el CDC sí se utiliza el comando interno DEVICE.RESTORE a través del método Restore() myDevice.Restore(cdcFiles[0]); Thread.Sleep(2000); } @@ -103,55 +96,78 @@ class Program Thread.Sleep(1000); Console.WriteLine("Reiniciando el lector..."); - try - { - myDevice.SendCommand("REBOOT"); - } - catch - { - // REBOOT corta la conexión abruptamente, este catch silencia el falso error. - } + try { myDevice.SendCommand("REBOOT"); } catch { } Console.WriteLine("\n------------------------------------------------"); Console.WriteLine("¡Restauración completada y lector reiniciado!"); Console.WriteLine("------------------------------------------------"); + + // --- MARCAMOS ÉXITO PARA LABVIEW (1) --- + ActualizarEstadoLabVIEW(1, exeDirectory, labviewFolder); } catch (Cognex.DataMan.SDK.UnknownErrorException ex) { Console.WriteLine("\n[ERROR COGNEX] El lector rechazó la operación."); Console.WriteLine("Comando que falló: " + ex.Command); Console.WriteLine("Detalle: " + ex.Message); + ActualizarEstadoLabVIEW(2, exeDirectory, labviewFolder); // Error } catch (Exception ex) { Console.WriteLine("\n[ERROR GENERAL]: " + ex.Message); + ActualizarEstadoLabVIEW(2, exeDirectory, labviewFolder); // Error } finally { // --- FASE 4: DESCONEXIÓN Y LIMPIEZA TOTAL --- - try - { - myDevice.Disconnect(); - } - catch { /* Silenciar el error si el equipo ya se desconectó por el REBOOT */ } + try { myDevice.Disconnect(); } catch { } Console.WriteLine("\nLimpiando archivos temporales..."); try { - // Si la carpeta existe, la eliminamos junto con todo su contenido (true = recursivo) if (Directory.Exists(tempFolder)) { Directory.Delete(tempFolder, true); Console.WriteLine("Basura eliminada correctamente."); } } - catch - { - Console.WriteLine("Aviso: No se pudieron eliminar algunos archivos temporales. Puede que estén en uso."); - } + catch { Console.WriteLine("Aviso: No se pudieron eliminar algunos archivos temporales."); } } - Console.WriteLine("\nPresiona cualquier tecla para salir..."); - Console.ReadKey(); + Console.WriteLine("\nLa aplicación se cerrará automáticamente en 5 segundos..."); + Thread.Sleep(5000); + } + + /// + /// Crea el archivo de resultado localmente, elimina el existente en la carpeta destino (para disparar el evento en LabVIEW) + /// y luego copia el nuevo archivo actualizado. + /// + static void ActualizarEstadoLabVIEW(int estado, string directorioLocal, string carpetaDestino) + { + try + { + // 1. Escribir el estado en el archivo local de la aplicación + string archivoLocal = Path.Combine(directorioLocal, "resultbackup.txt"); + File.WriteAllText(archivoLocal, estado.ToString()); + + // 2. Ruta del archivo en la carpeta que monitorea LabVIEW + string archivoDestino = Path.Combine(carpetaDestino, "resultbackup.txt"); + + // 3. Eliminar el archivo destino si existe (Obligatorio para que LabVIEW detecte el cambio) + if (File.Exists(archivoDestino)) + { + File.Delete(archivoDestino); + // Pequeña pausa para asegurar que el sistema de archivos registre la eliminación + Thread.Sleep(100); + } + + // 4. Copiar el archivo actualizado a la carpeta destino + File.Copy(archivoLocal, archivoDestino); + Console.WriteLine($"[SISTEMA] Bandera LabVIEW actualizada a: {estado}"); + } + catch (Exception ex) + { + Console.WriteLine($"\n[AVISO] Ocurrió un problema al intentar actualizar el archivo para LabVIEW: {ex.Message}"); + } } } \ No newline at end of file diff --git a/BackupCognex/config.txt b/BackupCognex/config.txt index d27205f..167dd94 100644 --- a/BackupCognex/config.txt +++ b/BackupCognex/config.txt @@ -1,2 +1,3 @@ 192.168.1.10 -C:\Backups\mi_lector.dmb \ No newline at end of file +C:\Backups\mi_lector.dmb +00:1A:2B:3C:4D:5E \ No newline at end of file