From d88c796ec533f8f893b1e61634bc96121dc0d6c8 Mon Sep 17 00:00:00 2001 From: Angel Ivan Date: Wed, 13 May 2026 08:34:24 -0600 Subject: [PATCH] Version actualizada. --- BackupCognex/Program.cs | 139 +++++++++++++++++++++------------------- 1 file changed, 73 insertions(+), 66 deletions(-) diff --git a/BackupCognex/Program.cs b/BackupCognex/Program.cs index fbcb2ab..d331812 100644 --- a/BackupCognex/Program.cs +++ b/BackupCognex/Program.cs @@ -1,12 +1,14 @@ using System; using System.IO; +using System.IO.Compression; +using System.Threading; using Cognex.DataMan.SDK; class Program { static void Main(string[] args) { - // Leer configuración desde config.txt en la misma carpeta que el ejecutable + // 1. Leer configuración desde config.txt string exeDirectory = AppDomain.CurrentDomain.BaseDirectory; string configPath = Path.Combine(exeDirectory, "config.txt"); @@ -28,74 +30,78 @@ class Program } string ipString = configLines[0].Trim(); - string dmbPath = configLines[1].Trim().Trim('"'); - Console.WriteLine($"[DEBUG] Intentando buscar el archivo en la ruta exacta: ->{dmbPath}<-"); + // Leer la ruta original del .dmb desde el config + string originalDmbPath = configLines[1].Trim().Trim('"'); + + 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 + string tempFolder = Path.Combine(Path.GetTempPath(), "DMBackup_" + Guid.NewGuid().ToString().Substring(0, 8)); - // 1. Crear el sistema de conexión (Ethernet) usando la IP del archivo de configuración EthSystemConnector connector = new EthSystemConnector(System.Net.IPAddress.Parse(ipString)); DataManSystem myDevice = new DataManSystem(connector); try { - myDevice.Connect(); + // --- FASE 1: MANEJO DE ARCHIVOS (Descomprimir) --- + Console.WriteLine("Extrayendo archivos del backup (.dmb)..."); + Directory.CreateDirectory(tempFolder); - // 2. Validar que el archivo .dmb existe en la ruta - if (!File.Exists(dmbPath)) + // 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($"No se encontró el archivo .dmb en la ruta: {dmbPath}"); - Console.WriteLine("\nPresiona cualquier tecla para salir..."); - Console.ReadKey(); + Console.WriteLine("\n[ERROR] El archivo .dmb no contenía un archivo de configuración (.cfg)."); return; } - Console.WriteLine("Enviando archivo de backup .dmb al dispositivo... esto puede tardar unos segundos."); + // --- FASE 2: CONEXIÓN Y CARGA AL DATAMAN --- + Console.WriteLine("\nConectando al lector..."); + myDevice.Connect(); - // Poner el lector fuera de línea para que acepte archivos Console.WriteLine("Forzando al lector a modo Offline..."); try { myDevice.SendCommand("SET SYSTEM.ONLINE OFF"); - // Darle un segundo para que asimile el cambio de estado - System.Threading.Thread.Sleep(1000); + Thread.Sleep(1000); } - catch + catch { /* Ignorar si el lector no soporta el comando o 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("El lector ya estaba offline o no soportó el comando, continuando..."); + 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); } - Console.WriteLine("Enviando archivo de backup .dmb al dispositivo... esto puede tardar unos segundos.");// Poner el lector fuera de línea para que acepte archivos - Console.WriteLine("Forzando al lector a modo Offline..."); - try - { - myDevice.SendCommand("SET SYSTEM.ONLINE OFF"); - // Darle un segundo para que asimile el cambio de estado - System.Threading.Thread.Sleep(1000); - } - catch - { - Console.WriteLine("El lector ya estaba offline o no soportó el comando, continuando..."); - } - - Console.WriteLine("Enviando archivo de backup .dmb al dispositivo... esto puede tardar unos segundos."); - - // 3. Usar el método nativo Restore del SDK - //myDevice.Restore(dmbPath); - - // 3.1 Cargar la configuración principal (.cfg) - // Asegúrate de que dmbPath ahora apunte a tu archivo .cfg extraído - - Console.WriteLine("Cargando archivo de Configuración (.cfg)..."); - myDevice.SetConfig(dmbPath); - - // Pausa recomendada para que el hardware procese el archivo - System.Threading.Thread.Sleep(2000); - - // 4. Guardar la configuración permanentemente en la memoria Flash + // --- FASE 3: GUARDADO Y REINICIO --- Console.WriteLine("Guardando configuración en la memoria flash..."); myDevice.SendCommand("CONFIG.SAVE"); - System.Threading.Thread.Sleep(1000); + Thread.Sleep(1000); - // 5. Reiniciar el equipo para aplicar los cambios (y hacer que suene) Console.WriteLine("Reiniciando el lector..."); try { @@ -103,44 +109,45 @@ class Program } catch { - // Es completamente normal que REBOOT arroje un error o excepción de red aquí. - // Al reiniciarse, el lector "corta" el cable de red internamente, lo que el SDK interpreta como una desconexión abrupta. - // Lo atrapamos silenciosamente. + // REBOOT corta la conexión abruptamente, este catch silencia el falso error. } - Console.WriteLine("\nRestauración y reinicio ejecutados con éxito."); - - // 3.2 Cargar la calibración del lente (.cdc) - // (Opcional: Solo si tu .dmb contenía un .cdc y necesitas calibrar el lente) - // string cdcPath = @"C:\Ruta\Al\Archivo_extraido.cdc"; - // Console.WriteLine("Cargando archivo de Calibración (.cdc)..."); - // myDevice.Restore(cdcPath); - - - Console.WriteLine("Restauración ejecutada con éxito. El lector aplicará la configuración."); + Console.WriteLine("\n------------------------------------------------"); + Console.WriteLine("¡Restauración completada y lector reiniciado!"); + Console.WriteLine("------------------------------------------------"); } catch (Cognex.DataMan.SDK.UnknownErrorException ex) { - // Este catch atrapará específicamente el error del DataMan que estabas viendo Console.WriteLine("\n[ERROR COGNEX] El lector rechazó la operación."); - Console.WriteLine("Comando interno que falló: " + ex.Command); - Console.WriteLine("Detalle técnico: " + ex.Message); + Console.WriteLine("Comando que falló: " + ex.Command); + Console.WriteLine("Detalle: " + ex.Message); } catch (Exception ex) { - // Este catch atrapará cualquier otro error general (cables desconectados, fallos de red, etc.) - Console.WriteLine("\n[ERROR GENERAL]: " + ex.ToString()); + Console.WriteLine("\n[ERROR GENERAL]: " + ex.Message); } finally { + // --- FASE 4: DESCONEXIÓN Y LIMPIEZA TOTAL --- try { - // Intentamos desconectar siempre para liberar el puerto myDevice.Disconnect(); } + catch { /* Silenciar el error si el equipo ya se desconectó por el REBOOT */ } + + 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("Error al intentar desconectar el dispositivo de forma segura."); + Console.WriteLine("Aviso: No se pudieron eliminar algunos archivos temporales. Puede que estén en uso."); } }