Version actualizada.

This commit is contained in:
Angel Ivan
2026-05-13 08:34:24 -06:00
parent 757ff3cf4f
commit d88c796ec5

View File

@@ -1,12 +1,14 @@
using System; using System;
using System.IO; using System.IO;
using System.IO.Compression;
using System.Threading;
using Cognex.DataMan.SDK; using Cognex.DataMan.SDK;
class Program class Program
{ {
static void Main(string[] args) 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 exeDirectory = AppDomain.CurrentDomain.BaseDirectory;
string configPath = Path.Combine(exeDirectory, "config.txt"); string configPath = Path.Combine(exeDirectory, "config.txt");
@@ -28,74 +30,78 @@ class Program
} }
string ipString = configLines[0].Trim(); string ipString = configLines[0].Trim();
string dmbPath = configLines[1].Trim().Trim('"'); // Leer la ruta original del .dmb desde el config
Console.WriteLine($"[DEBUG] Intentando buscar el archivo en la ruta exacta: ->{dmbPath}<-"); string originalDmbPath = configLines[1].Trim().Trim('"');
// 1. Crear el sistema de conexión (Ethernet) usando la IP del archivo de configuración if (!File.Exists(originalDmbPath))
EthSystemConnector connector = new EthSystemConnector(System.Net.IPAddress.Parse(ipString));
DataManSystem myDevice = new DataManSystem(connector);
try
{ {
myDevice.Connect(); Console.WriteLine($"No se encontró el archivo .dmb original en la ruta: {originalDmbPath}");
// 2. Validar que el archivo .dmb existe en la ruta
if (!File.Exists(dmbPath))
{
Console.WriteLine($"No se encontró el archivo .dmb en la ruta: {dmbPath}");
Console.WriteLine("\nPresiona cualquier tecla para salir..."); Console.WriteLine("\nPresiona cualquier tecla para salir...");
Console.ReadKey(); Console.ReadKey();
return; return;
} }
Console.WriteLine("Enviando archivo de backup .dmb al dispositivo... esto puede tardar unos segundos."); // 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));
EthSystemConnector connector = new EthSystemConnector(System.Net.IPAddress.Parse(ipString));
DataManSystem myDevice = new DataManSystem(connector);
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).");
return;
}
// --- 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..."); Console.WriteLine("Forzando al lector a modo Offline...");
try try
{ {
myDevice.SendCommand("SET SYSTEM.ONLINE OFF"); myDevice.SendCommand("SET SYSTEM.ONLINE OFF");
// Darle un segundo para que asimile el cambio de estado Thread.Sleep(1000);
System.Threading.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 // --- FASE 3: GUARDADO Y REINICIO ---
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
Console.WriteLine("Guardando configuración en la memoria flash..."); Console.WriteLine("Guardando configuración en la memoria flash...");
myDevice.SendCommand("CONFIG.SAVE"); 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..."); Console.WriteLine("Reiniciando el lector...");
try try
{ {
@@ -103,44 +109,45 @@ class Program
} }
catch catch
{ {
// Es completamente normal que REBOOT arroje un error o excepción de red aquí. // REBOOT corta la conexión abruptamente, este catch silencia el falso error.
// Al reiniciarse, el lector "corta" el cable de red internamente, lo que el SDK interpreta como una desconexión abrupta.
// Lo atrapamos silenciosamente.
} }
Console.WriteLine("\nRestauración y reinicio ejecutados con éxito."); Console.WriteLine("\n------------------------------------------------");
Console.WriteLine("¡Restauración completada y lector reiniciado!");
// 3.2 Cargar la calibración del lente (.cdc) Console.WriteLine("------------------------------------------------");
// (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.");
} }
catch (Cognex.DataMan.SDK.UnknownErrorException ex) 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("\n[ERROR COGNEX] El lector rechazó la operación.");
Console.WriteLine("Comando interno que falló: " + ex.Command); Console.WriteLine("Comando que falló: " + ex.Command);
Console.WriteLine("Detalle técnico: " + ex.Message); Console.WriteLine("Detalle: " + ex.Message);
} }
catch (Exception ex) catch (Exception ex)
{ {
// Este catch atrapará cualquier otro error general (cables desconectados, fallos de red, etc.) Console.WriteLine("\n[ERROR GENERAL]: " + ex.Message);
Console.WriteLine("\n[ERROR GENERAL]: " + ex.ToString());
} }
finally finally
{ {
// --- FASE 4: DESCONEXIÓN Y LIMPIEZA TOTAL ---
try try
{ {
// Intentamos desconectar siempre para liberar el puerto
myDevice.Disconnect(); 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 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.");
} }
} }