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.
This commit is contained in:
Angel Ivan
2026-05-14 10:50:14 -06:00
parent d88c796ec5
commit a535cbe5fe
2 changed files with 56 additions and 39 deletions

View File

@@ -10,64 +10,60 @@ class Program
{ {
// 1. Leer configuración desde config.txt // 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, "configbackup.txt");
if (!File.Exists(configPath)) if (!File.Exists(configPath))
{ {
Console.WriteLine($"No se encontró el archivo de configuración: {configPath}"); Console.WriteLine($"No se encontró el archivo de configuración: {configPath}");
Console.WriteLine("\nPresiona cualquier tecla para salir...");
Console.ReadKey(); Console.ReadKey();
return; return;
} }
string[] configLines = File.ReadAllLines(configPath); 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("El archivo configbackup.txt debe tener 3 líneas: IP, Ruta .dmb y MAC Address");
Console.WriteLine("\nPresiona cualquier tecla para salir...");
Console.ReadKey(); Console.ReadKey();
return; return;
} }
string ipString = configLines[0].Trim(); string ipString = configLines[0].Trim();
// Leer la ruta original del .dmb desde el config
string originalDmbPath = configLines[1].Trim().Trim('"'); 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)) if (!File.Exists(originalDmbPath))
{ {
Console.WriteLine($"No se encontró el archivo .dmb original en la ruta: {originalDmbPath}"); Console.WriteLine($"No se encontró el archivo .dmb original en la ruta: {originalDmbPath}");
Console.WriteLine("\nPresiona cualquier tecla para salir...");
Console.ReadKey(); Console.ReadKey();
return; return;
} }
// 2. Preparar el entorno para los archivos temporales // 2. Preparar el entorno
// Crear una carpeta temporal única en la carpeta Temp de Windows
string tempFolder = Path.Combine(Path.GetTempPath(), "DMBackup_" + Guid.NewGuid().ToString().Substring(0, 8)); string tempFolder = Path.Combine(Path.GetTempPath(), "DMBackup_" + Guid.NewGuid().ToString().Substring(0, 8));
EthSystemConnector connector = new EthSystemConnector(System.Net.IPAddress.Parse(ipString)); EthSystemConnector connector = new EthSystemConnector(System.Net.IPAddress.Parse(ipString));
DataManSystem myDevice = new DataManSystem(connector); DataManSystem myDevice = new DataManSystem(connector);
// --- MARCAMOS INICIO DE PROCESO PARA LABVIEW (0) ---
ActualizarEstadoLabVIEW(0, exeDirectory, labviewFolder);
try try
{ {
// --- FASE 1: MANEJO DE ARCHIVOS (Descomprimir) --- // --- FASE 1: MANEJO DE ARCHIVOS (Descomprimir) ---
Console.WriteLine("Extrayendo archivos del backup (.dmb)..."); Console.WriteLine("Extrayendo archivos del backup (.dmb)...");
Directory.CreateDirectory(tempFolder); Directory.CreateDirectory(tempFolder);
// Copiar el .dmb como .zip a la carpeta temporal
string zipPath = Path.Combine(tempFolder, "backup.zip"); string zipPath = Path.Combine(tempFolder, "backup.zip");
File.Copy(originalDmbPath, zipPath); File.Copy(originalDmbPath, zipPath);
// Extraemos todo el contenido
ZipFile.ExtractToDirectory(zipPath, tempFolder); ZipFile.ExtractToDirectory(zipPath, tempFolder);
// Buscar los archivos específicos extraídos
string[] cfgFiles = Directory.GetFiles(tempFolder, "*.cfg"); string[] cfgFiles = Directory.GetFiles(tempFolder, "*.cfg");
string[] cdcFiles = Directory.GetFiles(tempFolder, "*.cdc"); string[] cdcFiles = Directory.GetFiles(tempFolder, "*.cdc");
if (cfgFiles.Length == 0) if (cfgFiles.Length == 0)
{ {
Console.WriteLine("\n[ERROR] El archivo .dmb no contenía un archivo de configuración (.cfg)."); Console.WriteLine("\n[ERROR] El archivo .dmb no contenía un archivo de configuración (.cfg).");
ActualizarEstadoLabVIEW(2, exeDirectory, labviewFolder); // Error
return; return;
} }
@@ -81,18 +77,15 @@ class Program
myDevice.SendCommand("SET SYSTEM.ONLINE OFF"); myDevice.SendCommand("SET SYSTEM.ONLINE OFF");
Thread.Sleep(1000); 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])}..."); Console.WriteLine($"Cargando configuración: {Path.GetFileName(cfgFiles[0])}...");
myDevice.SetConfig(cfgFiles[0]); myDevice.SetConfig(cfgFiles[0]);
Thread.Sleep(2000); Thread.Sleep(2000);
// Cargar el archivo .CDC (Calibración - Si existe en el backup)
if (cdcFiles.Length > 0) if (cdcFiles.Length > 0)
{ {
Console.WriteLine($"Cargando calibración: {Path.GetFileName(cdcFiles[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]); myDevice.Restore(cdcFiles[0]);
Thread.Sleep(2000); Thread.Sleep(2000);
} }
@@ -103,55 +96,78 @@ class Program
Thread.Sleep(1000); Thread.Sleep(1000);
Console.WriteLine("Reiniciando el lector..."); Console.WriteLine("Reiniciando el lector...");
try try { myDevice.SendCommand("REBOOT"); } catch { }
{
myDevice.SendCommand("REBOOT");
}
catch
{
// REBOOT corta la conexión abruptamente, este catch silencia el falso error.
}
Console.WriteLine("\n------------------------------------------------"); Console.WriteLine("\n------------------------------------------------");
Console.WriteLine("¡Restauración completada y lector reiniciado!"); Console.WriteLine("¡Restauración completada y lector reiniciado!");
Console.WriteLine("------------------------------------------------"); Console.WriteLine("------------------------------------------------");
// --- MARCAMOS ÉXITO PARA LABVIEW (1) ---
ActualizarEstadoLabVIEW(1, exeDirectory, labviewFolder);
} }
catch (Cognex.DataMan.SDK.UnknownErrorException ex) catch (Cognex.DataMan.SDK.UnknownErrorException ex)
{ {
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 que falló: " + ex.Command); Console.WriteLine("Comando que falló: " + ex.Command);
Console.WriteLine("Detalle: " + ex.Message); Console.WriteLine("Detalle: " + ex.Message);
ActualizarEstadoLabVIEW(2, exeDirectory, labviewFolder); // Error
} }
catch (Exception ex) catch (Exception ex)
{ {
Console.WriteLine("\n[ERROR GENERAL]: " + ex.Message); Console.WriteLine("\n[ERROR GENERAL]: " + ex.Message);
ActualizarEstadoLabVIEW(2, exeDirectory, labviewFolder); // Error
} }
finally finally
{ {
// --- FASE 4: DESCONEXIÓN Y LIMPIEZA TOTAL --- // --- FASE 4: DESCONEXIÓN Y LIMPIEZA TOTAL ---
try try { myDevice.Disconnect(); } catch { }
{
myDevice.Disconnect();
}
catch { /* Silenciar el error si el equipo ya se desconectó por el REBOOT */ }
Console.WriteLine("\nLimpiando archivos temporales..."); Console.WriteLine("\nLimpiando archivos temporales...");
try try
{ {
// Si la carpeta existe, la eliminamos junto con todo su contenido (true = recursivo)
if (Directory.Exists(tempFolder)) if (Directory.Exists(tempFolder))
{ {
Directory.Delete(tempFolder, true); Directory.Delete(tempFolder, true);
Console.WriteLine("Basura eliminada correctamente."); Console.WriteLine("Basura eliminada correctamente.");
} }
} }
catch catch { Console.WriteLine("Aviso: No se pudieron eliminar algunos archivos temporales."); }
{
Console.WriteLine("Aviso: No se pudieron eliminar algunos archivos temporales. Puede que estén en uso.");
}
} }
Console.WriteLine("\nPresiona cualquier tecla para salir..."); Console.WriteLine("\nLa aplicación se cerrará automáticamente en 5 segundos...");
Console.ReadKey(); 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}");
}
} }
} }

View File

@@ -1,2 +1,3 @@
192.168.1.10 192.168.1.10
C:\Backups\mi_lector.dmb C:\Backups\mi_lector.dmb
00:1A:2B:3C:4D:5E