Compare commits

...

5 Commits

Author SHA1 Message Date
Angel Ivan
deba5d7e96 Se agregó un timer para obtener el tiempo de ejecución del programa. 2026-05-15 10:59:31 -06:00
Angel Ivan
5ad683d52a Cambios relacionados con las rutas de los archivos de configuración y respaldo 2026-05-14 12:04:12 -06:00
Angel Ivan
3cf3ac6c40 Cambios menores 2026-05-14 11:01:47 -06:00
Angel Ivan
a535cbe5fe Creación de archivo resultbackup.txt.
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.
2026-05-14 10:50:14 -06:00
Angel Ivan
d88c796ec5 Version actualizada. 2026-05-13 08:34:24 -06:00

View File

@@ -1,19 +1,26 @@
using System;
using System;
using System.Diagnostics;
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
// Iniciar cronómetro para medir tiempo de ejecución
Stopwatch timer = Stopwatch.StartNew();
// 1. Leer configuración desde config.txt
string exeDirectory = AppDomain.CurrentDomain.BaseDirectory;
string configPath = Path.Combine(exeDirectory, "config.txt");
string configDirectory = "C:\\Jabil DM Config Station\\Files\\";
string configPath = Path.Combine(configDirectory, "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;
}
@@ -21,130 +28,165 @@ class Program
string[] configLines = File.ReadAllLines(configPath);
if (configLines.Length < 2)
{
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 2 líneas: IP y Ruta .dmb");
Console.ReadKey();
return;
}
string ipString = configLines[0].Trim();
string dmbPath = configLines[1].Trim().Trim('"');
Console.WriteLine($"[DEBUG] Intentando buscar el archivo en la ruta exacta: ->{dmbPath}<-");
string originalDmbPath = configLines[1].Trim().Trim('"');
string labviewFolder = "C:\\Jabil DM Config Station\\Files\\"; //TODO: Actualizar ruta
// 1. Crear el sistema de conexión (Ethernet) usando la IP del archivo de configuración
if (!File.Exists(originalDmbPath))
{
Console.WriteLine($"No se encontró el archivo .dmb original en la ruta: {originalDmbPath}");
Console.ReadKey();
return;
}
// 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
{
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))
string zipPath = Path.Combine(tempFolder, "backup.zip");
File.Copy(originalDmbPath, zipPath);
ZipFile.ExtractToDirectory(zipPath, tempFolder);
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).");
ActualizarEstadoLabVIEW(2, exeDirectory, labviewFolder); // Error
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 ya está offline */ }
Console.WriteLine($"Cargando configuración: {Path.GetFileName(cfgFiles[0])}...");
myDevice.SetConfig(cfgFiles[0]);
Thread.Sleep(2000);
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])}...");
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
{
myDevice.SendCommand("REBOOT");
}
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.
}
try { myDevice.SendCommand("REBOOT"); } catch { }
Console.WriteLine("\nRestauración y reinicio ejecutados con éxito.");
Console.WriteLine("\n------------------------------------------------");
Console.WriteLine("¡Restauración completada y lector reiniciado!");
Console.WriteLine("------------------------------------------------");
// 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.");
// --- MARCAMOS ÉXITO PARA LABVIEW (1) ---
ActualizarEstadoLabVIEW(1, exeDirectory, labviewFolder);
}
catch (Cognex.DataMan.SDK.UnknownErrorException ex)
{
// Este catch atrapará específicamente el error del DataMan que estabas viendo
timer.Stop();
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);
Console.WriteLine($"Tiempo transcurrido: {timer.Elapsed.TotalSeconds:F2} segundos");
ActualizarEstadoLabVIEW(2, exeDirectory, labviewFolder); // Error
}
catch (Exception ex)
{
// Este catch atrapará cualquier otro error general (cables desconectados, fallos de red, etc.)
Console.WriteLine("\n[ERROR GENERAL]: " + ex.ToString());
timer.Stop();
Console.WriteLine("\n[ERROR GENERAL]: " + ex.Message);
Console.WriteLine($"Tiempo transcurrido: {timer.Elapsed.TotalSeconds:F2} segundos");
ActualizarEstadoLabVIEW(2, exeDirectory, labviewFolder); // Error
}
finally
{
// --- FASE 4: DESCONEXIÓN Y LIMPIEZA TOTAL ---
try { myDevice.Disconnect(); } catch { }
Console.WriteLine("\nLimpiando archivos temporales...");
try
{
// Intentamos desconectar siempre para liberar el puerto
myDevice.Disconnect();
}
catch
{
Console.WriteLine("Error al intentar desconectar el dispositivo de forma segura.");
if (Directory.Exists(tempFolder))
{
Directory.Delete(tempFolder, true);
Console.WriteLine("Basura eliminada correctamente.");
}
}
catch { Console.WriteLine("Aviso: No se pudieron eliminar algunos archivos temporales."); }
}
Console.WriteLine("\nPresiona cualquier tecla para salir...");
Console.ReadKey();
Console.WriteLine("\nEsperando 30 segundos hasta que se reinicie el lector");
Thread.Sleep(30000);
timer.Stop();
TimeSpan tiempoTotal = timer.Elapsed;
Console.WriteLine($"\n================================================");
Console.WriteLine($"Tiempo total de ejecución: {tiempoTotal.TotalSeconds:F2} segundos");
Console.WriteLine($"Desglose: {tiempoTotal.Hours}h {tiempoTotal.Minutes}m {tiempoTotal.Seconds}s {tiempoTotal.Milliseconds}ms");
Console.WriteLine($"================================================");
Console.WriteLine("\nLa aplicación se cerrará automáticamente en 5 segundos...");
Thread.Sleep(5000);
}
/// <summary>
/// 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.
/// </summary>
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}");
}
}
}