Cognex In-Sight 7000 500

1. Einleitung

Die In-Sight 7000 Serie ist ein voll-ausgestattetes Bildverarbeitungssystem, das genaue Inspektionen selbst bei hoher Produktionsliniengeschwindigkeit durchführt. Durch das modulare Design kann das System problemlos an die jeweiligen Anwendungsanforderungen angepasst werden.

Die In-Sight 7000 Serie ist als Schwarz-Weiß- und Farbmodell mit einer Auflösung von VGA bis 5 MP erhältlich. Es sind verschiedene Toolkonfigurationen vom Basis-Werkzeugset des In-Sight 7500 bis zu den komplett ausgestatteten Modellen 7600, 7800 und 7900 erhältlich.

Je nach Anforderung kann mit der Kamera auf unterschiedliche weise kommuniziert werden. Hierzu stehen folgende industriellen Protokolle OPC UA, EtherNet/IP mit Add-On Profile (AOP), PROFINET Class B, iQSS, Modbus TCP, SLMP/SLMP Scanner, IEEE 1588 (CIP Sync), CC-Link IE Field Basic sowie allgemeine Protokolle TCP/IP, UDP, FTP, SFTP, Telnet, SMTP, RS-232 zur Verfügung.

In folgendem Artikel wird die Einrichtung und Kommunikation zwischen Kamera und Roboter über digitale IOs sowie TCP/IP Sockets beschrieben. 

2. Installation der Kamera und Konfiguration im In-Sight Explorer

Die Kamera kann zur Versorgung an den 24 V Klemmenblock des Roboters angeschlossen werden. Ebenso können die digitalen Ein- und Ausgänge der Kamera mit den jeweiligen Klemmen im Schaltschrank des Roboters verdrahtet werden. Der Belegungsplan der Kamera ist in der jeweiligen Anleitung zu finden.

Zur Konfiguration der Kamera muss von Cognex der In-Sight Explorer heruntergeladen und installiert werden.

Um mit der Kamera kommunizieren zu können, muss die IP-Adresse der Teilnehmer im selben Bereich liegen. Wie die IP-Adresse des Roboters geändert werden kann, ist in folgender Dokumentation beschrieben IP-Adresse ändern.

Die IP-Adresse der Kamera kann in dem In-Sight Explorer eingestellt werden. 

2.1. Konfiguration der Kamera über den EasyBuilder

Mittels dem EasyBuilder kann die Kamera in dem In-Sight Explorer konfiguriert werden. 

Hierzu kann unter dem Menü "Verbindung herstellen" ein neuer Job angelegt werden. Die Kamera muss sich dafür in dem Offline Modus befinden.

2.1.1. Triggern der Kamera

In dem Menü "Bild einrichten" können grundlegende Aufnahmeeinstellungen bearbeitet werden. Soll der Trigger digital erfolgen, muss bei dem Feld "Trigger" "Extern" ausgewählt werden. Anschließend muss unter dem Menü "Eingänge / Ausgänge" ein Eingang so konfiguriert werden, dass bei einer steigenden Flanke der Bildaufnahme-Trigger ausgelöst wird.

2.1.2. Teil einlernen

Unter dem Menü "Teil suchen" sowie "Teil einlernen" können die gewünschten Objekte eingelernt werden. Informationen dazu finden sich in der Hilfe zu dem EasyBuilder bzw. zu dem In-Sight Explorer.

2.1.3. Einrichten der Kommunikation

Mittels dem Menü "Kommunikation" kann die Kommunikation zwischen Kamera und Roboter konfiguriert werden.

Um eine Kommunikation per TCP/IP mit dem Roboter einzurichten muss zunächst unter dem Button "Gerät hinzufügen" das Protokoll hinzugefügt werden. Unter "Gerät" wählt man anschließend "Andere" sowie bei "Protokoll" "TCP/IP" aus.

Wird das Textfeld bei "Serverhostname" leer gelassen agiert die Kamera als Server. Wird ein Hostname eingetragen, übernimmt die Kamera die Rolle des Clients. 
Unter "Anschluss" wird die Portnummer eingetragen. Diese muss identisch mit der Portnummer des Servers bzw. Clients sein mit welchem die Verbindung über einen Socket aufgebaut wird. 

Unter "Formatausgabezeichenfolge" wird die Zeichenfolge definiert, wie die Kamera die Ergebnisse als Nachricht über den Socket an den weiteren Teilnehmer sendet. In folgendem Bild wurde die Formatzeichenkette so eingerichtet, dass der Objektscore, der X- und Y-Wert sowie die Orientierung des Objekts ausgegeben werden. Getrennt werden die einzelnen Positionen mittels Semikolon. Dadurch können später die Werte in horstFX sehr einfach separiert und zugeordnet werden. 

2.2. Konfiguration der Kamera mittels Spreadsheet

Mittels dem Spreadsheet kann die Kamera als Alternative zu dem EasyBuilder in dem In-Sight Explorer konfiguriert werden. Diese Variante erfordert eine etwas stärkere Einarbeitung, jedoch sind die Möglichkeit im Vergleich zu dem EasyBuilder größer.

Mittels Rechtsklick auf den Sensor in dem Netzwerkfenster kann die Tabellenansicht ausgewählt werden. 

2.2.1. Grundlegende Aufnahmeeinstellungen und Triggern der Kamera

Bei dem Anlegen eines neuen Projekts wird standardmäßig in Zelle A0 ein Image Objekt erstellt. Mittels Doppelklick auf diese Zelle können Grundlegende Einstellungen zur Bildaufnahme ausgewählt werden. Ist bei dem Listenfeld Trigger Kamera ausgewählt, kann durch eine Verdrahtung der digitalen Triggerdrahtleitung der Kamera, über das Setzen eines digitalen Ausgangs des Roboters, eine Bildaufnahme an der Kamera ausgelöst werden.

2.2.2. Teil einlernen

In dem Fenster Palette finden sich Funktionen zur Steuerung der Kamera die man in die Tabelle hinzufügen kann. Unter den Vision Tools befinden sich Funktionen um Objekte einzulernen bzw. zu überprüfen. Per drag and drop kann die gewünschte Aktion in die Tabelle gezogen und anschließend mittels Doppelklick darauf parametriert werden.

2.2.3.  Einrichten der Kommunikation

Zur Einrichtung der Kommunikation über einen TCP/IP Socket wird zunächst ein TCPDevice hinzugefügt. Dieses findet man in dem Fenster Palette unter den Funktionen Eingang/Ausgang → Netzwerk → TCPDevice. Nach dem Hinzufügen wird dieses par Doppelklick parametriert. Wird das Feld Hostname leer gelassen, agiert die Kamera als Server. Die eingestellte Zeit in dem Feld Timeout wird in diesem Falle nicht weiter betrachtet. Als Protokoll wird TCP/IP ausgewählt. 

Anschließend wird die weitere Aktion WriteDevice hinzugefügt. Diese findet sich auch unter Eingang/Ausgang → Netzwerk. Diese Aktion wird folgendermaßen parametriert:

Bei dem ersten Argument Ereignis wird die Zellennummer der Funktion Image ausgewählt. Die Zellennummer ist hierfür in der Regel A0.
Als zweites Argument wird die Zellennummer des Geräts vergeben. Das Gerät ist hierbei das soeben hinzugefügte TCPDevice.
Als drittes Argument wird anschließend die Zellennummer der Aktion übergeben, welche die gewünschten Daten über den Socket sendet. Um den Fall abzufangen, dass die Kamera kein Objekt erkennt, wird hier zusätzlich eine if-Bedingung eingefügt. In diesem Beispiel überprüfen wir hierbei die Güte. Ist diese Güte != 0 wird die Nachricht der Zelle übertragen, welche als zweites Argument in der if-Bedingung steht. In diesem Beispiel wählen wir hier einfach die leere Zelle neben der Aktion WriteDevice aus. Ist die Güte == 0 senden wir diese Information, also die Zelle in welcher die Güte steht (in diesem Beispiel G5), (drittes Argument der if-Bedingung) an den Roboter. Mit dieser Information weiß der Roboter nun, dass kein Objekt erkannt wurde.


In der oben ausgewählten leeren Zelle fügen wir nun eine Funktion hinzu, welche die gewünschten Ergebnisse der Kameraerkennung beinhaltet die über den Socket an den Roboter gesendet werden. Als Aktion nutzen wir hierfür einen FormatString. Diese Aktion findet man unter Text → Zeichenfolge. Mittels Doppelklick kann diese Funktion nun parametriert werden. Mittels dem Button hinzufügen können die gewünschten Zellen der Detektionsparameter ausgewählt werden. Mittels dem Trennzeichen kann anschließend auf dem Roboter der gesamte über den Socket gesendete String separiert werden. 

3. Kommunikation in horstFX

Um mit der Kamera kommunizieren zu können, muss die IP-Adresse der Teilnehmer im selben Bereich liegen. Wie die IP-Adresse des Roboters geändert werden kann, ist in folgender Dokumentation beschrieben IP-Adresse ändern.

Folgend wird die Kommunikation per digitalem Triggersignal sowie per TCP/IP mittels einem Socket beschrieben.

Um die Kamera per digitaler Drahtleitung zu triggern, muss wie in Abschnitt 2.1.1 Triggern der Kamera beschrieben, der digitale Eingang der Kamera eingerichtet werden. Anschließend kann nach korrekter Verdrahtung mit der "digital out" Klemme im Schaltschrank des Roboters, über das setzen des zugehörigen digitalen Ausgangs die Kamera getriggert werden.

// Kamera per digitalem Ausgang triggern (flankengesteuert)
output_literal( "OUTPUT_2", 1.0 );
sleep(100);
output_literal( "OUTPUT_2", 0.0 );

Die Objektkoordinaten werden mittels TCP/IP Sockets an den Roboter gesendet. Ausführlichere Informationen zur Kommunikation über TCP/IP Sockets finden sich in Sockets.

3.1. Herstellen der Verbindung über einen Socket

var IP_Cam = "192.168.0.20";
var Port_Cam = 3000;

var socket = new java.net.Socket();
socket.connect(new java.net.InetSocketAddress(IP_Cam, Port_Cam),  10000); // 10 s timeout

Ein Timeout, falls einige Zeit keine Nachricht von der Kamera gesendet wird, kann über folgende Zeile definiert werden. Ansonsten könnte das Programm nicht abgebrochen werden, da der Roboter ständig auf die Nachricht wartet.

// 10 sek Timeout beim Einlesen der Nachricht ueber einen Socketsocket.setSoTimeout(10000);

3.2. Einlesen der Kameranachricht per Socket

Mittels folgender Funktion kann die Kameranachricht eingelesen werden:

function readFromSocket() {
    var bufferedReader =
        new java.io.BufferedReader(
            new java.io.InputStreamReader(
                socket.getInputStream()));
    var charArrayType = Java.type("char[]");
    var buffer = new charArrayType(1000);
    try {
        var anzahlZeichen = bufferedReader.read(buffer, 0, 1000);    
        var nachricht = new java.lang.String(buffer);
    } catch (e) {
        var nachricht = "Timeout: Keine Nachricht erhalten";
    }
    return nachricht;
}

Die Funktion kann über folgende Zeile aufgerufen werden:

// Einlesen der Kameranachricht
var Msg_Cam = readFromSocket();
show_info(Msg_Cam);

3.3. Aufsplitten der Kameranachricht

Die Kameranachricht kann über folgende Zeilen aufgesplittet werden. Die Nachricht sowie das Aufsplitten hängt mit der in 2.1.3 Einrichtung der Kommunikation definierten Formatzeichenkette zusammen.

// Aufsplitten der Kameranachricht
Msg_Cam = Msg_Cam.split(";");
var Cam_Score = parseFloat(Msg_Cam[0]);
var Cam_X = parseFloat(Msg_Cam[1]);
var Cam_Y = parseFloat(Msg_Cam[2]);
var Cam_rz = parseFloat(Msg_Cam[3]); 

show_info(Cam_Score + "\n" + Cam_X + "\n" + Cam_Y + "\n" + Cam_rz);

4. Komplettes Beispielprogramm

Bei folgendem Programm handelt es sich um ein simples Beispielprogramm, welches die Kommunikation zwischen Roboter und Kamera veranschaulicht. 

var IP_Cam = "192.168.0.20";    // IP Adresse der Kamera
var Port_Cam = 3000;        // Port der Kamera

// Verbindung ueber Socket herstellen
var socket = new java.net.Socket();
socket.connect(new java.net.InetSocketAddress(IP_Cam, Port_Cam),  10000); // 10 s timeout
// 10 sek Timeout beim Einlesen der Nachricht ueber einen Socket
socket.setSoTimeout(10000);

// Programmablauf
try 
{
    while(true)
    {    
        // Roboter in Aufnahmeposition fahren
        move({
                'Coord': 'CARTESIAN_BASIS', 
                'MoveType': 'JOINT', 
                'PoseRelation': 'ABSOLUTE', 
                'anyconfiguration': false, 
                'speed.ratio': 1.0, 
                'target': {'xyz+quat': [0.421058, 0.296112, 0.555801, -0.000097, 0.548429, -0.836197, -0.000003]}, 
                'tool': 'No Tool'
        }, "Aufnahmepos");

        // Kamera per digitalem Ausgang triggern (flankengesteuert)
         output_literal( "OUTPUT_1", 1.0 );
          sleep(100);
        output_literal( "OUTPUT_1", 0.0 );

        // Einlesen der Kameranachricht
        var Msg_Cam = readFromSocket();

        // Ueberpruefe ob Objekt erkannt wurde    
        if((parseFloat(Msg_Cam) != 0.000) && (Msg_Cam != "Timeout: Keine Nachricht erhalten"))
        {
            // Aufsplitten der Kameranachricht
            Msg_Cam = Msg_Cam.split(";");
            var Cam_Score = parseFloat(Msg_Cam[0]);
            var Cam_X = parseFloat(Msg_Cam[1]);
            var Cam_Y = parseFloat(Msg_Cam[2]);
            var Cam_rz = parseFloat(Msg_Cam[3]);    

            show_info("Score: " + Cam_Score + "\n" + "X: " + Cam_X + "\n" + "Y: " + Cam_Y + "\n" + "rz: " + Cam_rz);
        }
        else if(Msg_Cam == "Timeout: Keine Nachricht erhalten")
        {
            show_info(MSG_Cam);
        }
        else
        {
            show_info("Kein Objekt von der Kamera erkannt");
        }
    }
} finally {
    socket.close();
}

// ******************************************* Funktionen *******************************************

function readFromSocket() {
    var bufferedReader =
        new java.io.BufferedReader(
            new java.io.InputStreamReader(
                socket.getInputStream()));
    var charArrayType = Java.type("char[]");
    var buffer = new charArrayType(1000);
    try {
        var anzahlZeichen = bufferedReader.read(buffer, 0, 1000);    
        var nachricht = new java.lang.String(buffer);
    } catch (e) {
        var nachricht = "Timeout: Keine Nachricht erhalten";
    }
    return nachricht;
}

5. Download Beispielprogramme:

Beispiel_Spreadsheet.job

Cognex-7000_Beispiel.js