using Cognex.VisionPro.Comm; // Stellt Basisfunktionen für die Kommunikation bereit
using Cognex.VisionPro.IO; // Stellt Klassen für den direkten I/O-Zugriff bereit
public partial class Form1 : Form
{
CogImageFileTool mIFTool;
CogAcqFifoTool mAcqTool;
long numPass = 0;
long numFail = 0;
// NEU: Variablen für die I/O-Karte
private CogCommCard mCard;
private CogPrio mPrio; // Precision I/O Schnittstelle
//... restlicher Code...
}
try {
// Sucht nach allen installierten Cognex-Kommunikationskarten.
CogCommCards cards = new CogCommCards();
if (cards.Count > 0) {
// Greift auf die ERSTE gefundene Karte in der Sammlung zu.
mCard = cards[0];
// Holt die Schnittstelle für das Precision I/O-System.
mPrio = mCard.DiscreteIOAccess.CreatePrecisionIO();
if (mPrio != null) {
// Deaktiviert zunächst alle alten Ereignisse
mPrio.DisableEvents();
mPrio.Events.Clear();
// Erstellt ein neues Precision I/O-Ereignis für den "PASS"-Fall.
CogPrioEvent passPulseEvent = new CogPrioEvent();
passPulseEvent.Name = "PassSignalPulse"; // Eindeutiger Name für das Ereignis
// Definiert die Aktion: Ein Impuls auf Ausgang 0.
CogPrioEventResponseLine response = new CogPrioEventResponseLine(
CogPrioBankConstants.OutputBank0, // Bank der Ausgänge
0, // Ausgangsnummer 0
CogPrioOutputLineValueConstants.PulseHigh, // Aktion: einen High-Impuls senden
50, // Dauer des Impulses in Millisekunden
CogPrioDelayTypeConstants.None, // Keine Verzögerung
0); // Wert der Verzögerung
// Fügt die definierte Reaktion zum Ereignis hinzu.
passPulseEvent.ResponsesLine.Add(response);
// Fügt das Ereignis zur Ereignissammlung der Karte hinzu.
mPrio.Events.Add(passPulseEvent);
// Aktiviert das Precision I/O-System. Die Karte ist nun bereit.
mPrio.EnableEvents();
}
} else {
MessageBox.Show("Keine Cognex CC24 Kommunikationskarte gefunden.",
"Hardware-Fehler", MessageBoxButtons.OK, MessageBoxIcon.Warning);
mCard = null;
mPrio = null;
}
} catch (Exception ex) {
MessageBox.Show("Fehler bei der Initialisierung der E/A-Karte: " + ex.Message,
"Hardware-Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
mCard = null;
mPrio = null;
}
void Subject_Ran(object sender, EventArgs e) {
// ... (bestehender Code zur Zählung von Pass/Fail) ...
// NEUE LOGIK ZUR STEUERUNG DES AUSGANGS
// Prüfen, ob das Prio-System erfolgreich initialisiert wurde.
if (mPrio != null) {
// Den öffentlichen Ausgang "InspectionPassed" aus dem ToolBlock auslesen.
bool inspectionPassed = (bool)(cogToolBlockEditV21.Subject.Outputs["InspectionPassed"].Value);
if (inspectionPassed) {
// Wenn die Inspektion erfolgreich war, löse das vordefinierte "PassSignalPulse"-Ereignis aus.
mPrio.Events["PassSignalPulse"].Schedule();
}
}
// ... (restlicher Code zur Anzeige der Ergebnisse) ...
}
protected override void Dispose(bool disposing) {
// NEUEN CODE ZUR BEREINIGUNG HINZUFÜGEN
if (mPrio != null) {
// Deaktiviert das Precision I/O-System beim Schließen der Anwendung.
mPrio.DisableEvents();
}
if (mCard != null) {
// Gibt die Ressourcen der Karte frei.
mCard.Dispose();
mCard = null;
}
// ... (vorhandener Code zum Trennen der Event-Handler und Dispose) ...
base.Dispose(disposing);
}
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
public partial class Form1 : Form {
// ... (bestehende Variablen) ...
private CogPrio mPrio;
// NEU: Variablen für den TCP/IP Server
private TcpListener tcpServer;
private TcpClient connectedClient;
private Thread serverThread;
// ...
}
private void Form1_Load(object sender, EventArgs e) {
// NEU: Den TCP-Server beim Start der Anwendung starten.
StartTcpServer();
}
void Subject_Ran(object sender, EventArgs e) {
// ... (gesamter Code aus Teil 1 für Pass/Fail-Zählung und I/O-Triggerung) ...
// NEU: Senden der Ergebnisse über TCP/IP nach jeder Auswertung
SendResultsViaTcp();
// ... (restlicher Code zur Anzeige der Ergebnisse) ...
}
///
///
try {
// Ergebnis aus dem ToolBlock holen (z.B. "Klasse").
string messageToSend = cogToolBlockEditV21.Subject.Outputs["Klasse"].Value.ToString();
// Nachricht senden (CR+LF wird von vielen Geräten als Zeilenende erwartet).
NetworkStream stream = connectedClient.GetStream();
byte[] data = Encoding.ASCII.GetBytes(messageToSend + "\r\n");
stream.Write(data, 0, data.Length);
} catch (IOException) {
// Verbindungsabbruch behandeln
connectedClient.Close();
connectedClient = null;
} catch (Exception) {
// Andere Sendefehler behandeln
}
protected override void Dispose(bool disposing) {
// NEU: TCP-Server und Client sauber beenden
tcpServer?.Stop();
connectedClient?.Close();
// ... (bestehender Code zur Bereinigung der I/O-Ressourcen) ...
base.Dispose(disposing);
}