Agregar archivos de proyecto.
This commit is contained in:
25
Contraste.sln
Normal file
25
Contraste.sln
Normal file
@@ -0,0 +1,25 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.14.37216.2 d17.14
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Contraste", "Contraste\Contraste.csproj", "{D7324B75-9036-4DC1-91B8-84FCF8D101D6}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{D7324B75-9036-4DC1-91B8-84FCF8D101D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{D7324B75-9036-4DC1-91B8-84FCF8D101D6}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{D7324B75-9036-4DC1-91B8-84FCF8D101D6}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{D7324B75-9036-4DC1-91B8-84FCF8D101D6}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {04815428-65B0-4F3E-A204-944E0F290470}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
25
Contraste/Contraste.csproj
Normal file
25
Contraste/Contraste.csproj
Normal file
@@ -0,0 +1,25 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Reference Include="Cognex.DataMan.CogNamer.PC">
|
||||
<HintPath>..\..\..\..\Cognex\DataMan SDK 5.6.3\Binaries\PC\Cognex.DataMan.CogNamer.PC.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Cognex.DataMan.SDK.Discovery.PC">
|
||||
<HintPath>..\..\..\..\Cognex\DataMan SDK 5.6.3\Binaries\PC\Cognex.DataMan.SDK.Discovery.PC.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Cognex.DataMan.SDK.PC">
|
||||
<HintPath>..\..\..\..\Cognex\DataMan SDK 5.6.3\Binaries\PC\Cognex.DataMan.SDK.PC.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Cognex.DataMan.SDK.Utils.PC">
|
||||
<HintPath>..\..\..\..\Cognex\DataMan SDK 5.6.3\Binaries\PC\Cognex.DataMan.SDK.Utils.PC.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
228
Contraste/Program.cs
Normal file
228
Contraste/Program.cs
Normal file
@@ -0,0 +1,228 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Threading;
|
||||
using System.Xml;
|
||||
using Cognex.DataMan.SDK;
|
||||
|
||||
class Program
|
||||
{
|
||||
private static AutoResetEvent _esperaLectura = new AutoResetEvent(false);
|
||||
private static bool _contrasteCapturado = false;
|
||||
private static object _lock = new object();
|
||||
|
||||
private static string _configDirectory = "C:\\Jabil DM Config Station\\Files\\";
|
||||
private static string _configPath = "";
|
||||
|
||||
static void Main(string[] args)
|
||||
{
|
||||
_configPath = Path.Combine(_configDirectory, "ConfigIP.txt");
|
||||
|
||||
Console.WriteLine("==========================================");
|
||||
Console.WriteLine(" PROGRAMA: CAPTURA DE CONTRASTE ");
|
||||
Console.WriteLine("==========================================\n");
|
||||
|
||||
// --- 1. VALIDACIÓN DEL ARCHIVO DE CONFIGURACIÓN ---
|
||||
if (!File.Exists(_configPath))
|
||||
{
|
||||
Console.WriteLine($"[ERROR] No se encontró el archivo base: {_configPath}");
|
||||
Thread.Sleep(3000);
|
||||
return;
|
||||
}
|
||||
|
||||
string[] configLines = File.ReadAllLines(_configPath);
|
||||
if (configLines.Length < 2)
|
||||
{
|
||||
Console.WriteLine("[ERROR] El archivo ConfigIP.txt no tiene el formato correcto.");
|
||||
Thread.Sleep(3000);
|
||||
return;
|
||||
}
|
||||
|
||||
string ipString = configLines[1].Trim();
|
||||
if (!IPAddress.TryParse(ipString, out var lectorIp))
|
||||
{
|
||||
Console.WriteLine($"[ERROR] La IP '{ipString}' no es válida.");
|
||||
Thread.Sleep(3000);
|
||||
return;
|
||||
}
|
||||
|
||||
Console.WriteLine($"Conectando al DataMan en la IP: {lectorIp}...");
|
||||
EthSystemConnector connector = new EthSystemConnector(lectorIp);
|
||||
DataManSystem myDevice = new DataManSystem(connector);
|
||||
|
||||
try
|
||||
{
|
||||
myDevice.Connect(5000);
|
||||
Console.ForegroundColor = ConsoleColor.Green;
|
||||
Console.WriteLine("[OK] Conectado con éxito.");
|
||||
Console.ResetColor();
|
||||
|
||||
Console.WriteLine("[SISTEMA] Analizando modelo de cámara y forzando configuración...");
|
||||
|
||||
// --- 2. BLINDAJE DE HARDWARE Y CONFIGURACIÓN DMCC ---
|
||||
try
|
||||
{
|
||||
DmccResponse respuestaModelo = myDevice.SendCommand("GET DEVICE.TYPE");
|
||||
string modeloCamara = respuestaModelo.PayLoad.ToUpper();
|
||||
Console.WriteLine($"[SISTEMA] Hardware físico detectado: {modeloCamara}");
|
||||
|
||||
// Forzamos el Disparador a modo Único / Network (Valor Oficial DMCC: 0)
|
||||
myDevice.SendCommand("SET TRIGGER.TYPE 0");
|
||||
|
||||
// Intentamos encender las métricas. Si la cámara no tiene licencia, lo rechazará internamente.
|
||||
try { myDevice.SendCommand("SET DECODER.1D-QUALITY-METRICS 1"); } catch { }
|
||||
try { myDevice.SendCommand("SET TRUCHECK.STANDARD 2"); } catch { }
|
||||
try { myDevice.SendCommand("SET DECODER.1D-PCM 1"); } catch { }
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"[AVISO] Algunas configuraciones DMCC previas fallaron: {ex.Message}");
|
||||
}
|
||||
|
||||
// --- 3. SUSCRIPCIÓN Y EXTRACCIÓN DE RESULTADOS ---
|
||||
myDevice.SetResultTypes(ResultTypes.ReadString | ResultTypes.ReadXml);
|
||||
Console.WriteLine("[SISTEMA] Suscripción a métricas activada.");
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// EVENTO 1: XML
|
||||
// -------------------------------------------------------------------------
|
||||
myDevice.XmlResultArrived += (sender, e) =>
|
||||
{
|
||||
lock (_lock)
|
||||
{
|
||||
if (_contrasteCapturado) return;
|
||||
|
||||
if (!string.IsNullOrEmpty(e.XmlResult))
|
||||
{
|
||||
try
|
||||
{
|
||||
XmlDocument doc = new XmlDocument();
|
||||
doc.LoadXml(e.XmlResult);
|
||||
|
||||
XmlNode nodoContraste = doc.SelectSingleNode("//contrast/value") ?? doc.SelectSingleNode("//symbol_contrast/value");
|
||||
if (nodoContraste != null)
|
||||
{
|
||||
string contrasteDetectado = nodoContraste.InnerText.Replace("+", "").Trim();
|
||||
Console.ForegroundColor = ConsoleColor.Cyan;
|
||||
Console.WriteLine($"\n[ÉXITO - VÍA XML] Contraste capturado: {contrasteDetectado}");
|
||||
Console.ResetColor();
|
||||
|
||||
_contrasteCapturado = true;
|
||||
ActualizarArchivoConfigSeguro(contrasteDetectado);
|
||||
_esperaLectura.Set();
|
||||
}
|
||||
else
|
||||
{
|
||||
// =================================================================
|
||||
// ALERTA VISUAL DE HARDWARE INCOMPATIBLE O SIN LICENCIA
|
||||
// =================================================================
|
||||
Console.ForegroundColor = ConsoleColor.Red;
|
||||
Console.WriteLine("\n========================================================");
|
||||
Console.WriteLine(" [ALERTA DE HARDWARE] ");
|
||||
Console.WriteLine("========================================================");
|
||||
Console.WriteLine("La cámara realizó la lectura, pero NO incluyó contraste.");
|
||||
Console.WriteLine("Causa posible: Este lector NO TIENE LA LICENCIA (Feature");
|
||||
Console.WriteLine("Key) de 'Quality Metrics' o 'PCM' instalada de fábrica.");
|
||||
Console.WriteLine("========================================================");
|
||||
Console.ResetColor();
|
||||
_esperaLectura.Set(); // Abortamos la espera para no perder 10 segundos
|
||||
}
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// EVENTO 2: TEXTO (Respaldo)
|
||||
// -------------------------------------------------------------------------
|
||||
myDevice.ReadStringArrived += (sender, e) =>
|
||||
{
|
||||
lock (_lock)
|
||||
{
|
||||
if (_contrasteCapturado) return;
|
||||
|
||||
if (!string.IsNullOrEmpty(e.ReadString))
|
||||
{
|
||||
string[] partes = e.ReadString.Split('\t');
|
||||
if (partes.Length >= 2)
|
||||
{
|
||||
string contrasteDetectado = partes[1].Trim();
|
||||
Console.ForegroundColor = ConsoleColor.Cyan;
|
||||
Console.WriteLine($"\n[ÉXITO - VÍA TEXTO] Contraste capturado: {contrasteDetectado}");
|
||||
Console.ResetColor();
|
||||
|
||||
_contrasteCapturado = true;
|
||||
ActualizarArchivoConfigSeguro(contrasteDetectado);
|
||||
_esperaLectura.Set();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// --- 4. EJECUCIÓN DEL DISPARO ---
|
||||
Console.WriteLine("\nEnviando disparo por software...");
|
||||
myDevice.SendCommand("TRIGGER ON");
|
||||
|
||||
// Esperamos hasta 10 segundos
|
||||
_esperaLectura.WaitOne(10000);
|
||||
|
||||
if (!_contrasteCapturado)
|
||||
{
|
||||
Console.WriteLine("\n[FINALIZADO] La sesión de lectura concluyó.");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.ForegroundColor = ConsoleColor.Red;
|
||||
Console.WriteLine($"\n[ERROR CRÍTICO] Hubo un problema de conexión: {ex.Message}");
|
||||
Console.ResetColor();
|
||||
}
|
||||
finally
|
||||
{
|
||||
try { myDevice.SendCommand("TRIGGER OFF"); } catch { }
|
||||
try { myDevice.Disconnect(); } catch { }
|
||||
}
|
||||
|
||||
Console.WriteLine("\nEl programa finalizará en 3 segundos...");
|
||||
Thread.Sleep(3000);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Modifica de forma segura el archivo TXT para que LabVIEW lea el contraste
|
||||
/// </summary>
|
||||
private static void ActualizarArchivoConfigSeguro(string valorContraste)
|
||||
{
|
||||
try
|
||||
{
|
||||
string copiaPath = Path.Combine(_configDirectory, "ConfigIP_Copia.txt");
|
||||
string[] lineasOriginales = File.ReadAllLines(_configPath);
|
||||
|
||||
string lineasMAC = lineasOriginales.Length > 0 ? lineasOriginales[0] : "";
|
||||
string lineaIP = lineasOriginales.Length > 1 ? lineasOriginales[1] : "";
|
||||
|
||||
string[] nuevasLineas = new string[] {
|
||||
lineasMAC,
|
||||
lineaIP,
|
||||
valorContraste
|
||||
};
|
||||
|
||||
File.WriteAllLines(copiaPath, nuevasLineas);
|
||||
|
||||
if (File.Exists(_configPath))
|
||||
{
|
||||
File.Delete(_configPath);
|
||||
Thread.Sleep(100);
|
||||
}
|
||||
|
||||
File.Move(copiaPath, _configPath);
|
||||
Console.WriteLine("[SISTEMA] ConfigIP.txt actualizado en la línea 3.");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.ForegroundColor = ConsoleColor.Red;
|
||||
Console.WriteLine($"[ERROR DE ARCHIVO] No se pudo guardar: {ex.Message}");
|
||||
Console.ResetColor();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user