Component Kit FlexiBowl

Dieser Artikel beschreibt die Kommunikation zwischen dem Vereinzelungssystem FlexiBowl von ars und dem HORST Robotersystem.

1. Versionshinweise

Der Artikel sowie die Beispielprogramme und Funktionen beziehen sich auf folgende Versionen:

  • horstFX 2023.11.01
  • FlexiBowl Revision 2.6 - Edition 08/2022

2. Einleitung

Flexibowl

FlexiBowl ist ein vielseitiges Zuf�hrsystem, das �ber die Bewegung einer von einem Servoantrieb und einem Impulsgeber bet�tigten Drehfl�che f�r die richtige Ausrichtung und Vereinzelung der Teile sorgt. Es lassen sich Teilefamilien mit Abmessungen von 1-250 mm und einem Gewicht von 1-250 g zuf�hren. Der FlexiBowl ist in 5 verschieden gro�en Modellen erh�ltlich. 

Dieser Artikel beschreibt die Kommunikation zwischen dem Robotersystem HORST und dem FlexiBowl. Am Ende des Artikels kann ein globaler Funktionssatz, welcher die Befehle zur Ansteuerung des FlexiBowls beinhaltet, heruntergeladen werden

3. Einrichtung des Systems

Die Einrichtung sowie die Montage des Systems ist gut in der Montageanleitung des FlexBowls beschrieben. ars Liefert eine Windows Anwendung mit, mit welcher �ber eine grafische Benutzeroberfl�che der FlexiBowl angesteuert sowie parametriert werden kann.

Flexibowl_UI

4. Kommunikation

Zwischen dem Roboter und dem FlexiBowl kann sowohl digital als auch mittels TCP/IP kommuniziert werden. Dabei ist zu beachten, dass nur eine der beiden Varianten im laufenden Betrieb verwendet werden kann. In der Benutzeroberfl�che von ars, muss bei digitaler Kommunikation der Schalter "Enable Digital I/O" aktiviert sein. Bei aktivierter digitaler Schnittstelle, kann nicht mehr auf die grafische Benutzeroberfl�che zugegriffen werden, da diese auch mittels TCP/IP kommuniziert.

Flexibowl_IO

In diesem Artikel wird haupts�chlich auf die Kommunikation mittels TCP/IP eingegangen. Diese Kommunikationsm�glichkeit hat den Vorteil, dass dar�ber die ganzen Parameter, f�r beispielsweise den Shake- oder Move-Prozess des FlexiBowls, mit �bergeben werden k�nnen. Dagegen hat die digitale Schnittstelle aktuell den Vorteil, dass auch w�hrend einer Bewegung des Roboters der FlexiBowl angesteuert werden kann. Dadurch kann eventuell die Taktzeit in einer Applikation verringert werden.

Umfassende Informationen zu der Kommunikation sind in der Montageanleitung des FlexiBowls zu finden.

4.1 TCP/IP

4.1.1 Einstellen der IP-Adresse

Damit der FlexiBowl mit dem Roboter oder auch �ber die grafische Benutzeroberfl�che mit dem Windows PC kommunizieren kann, m�ssen sich beide Teilnehmer in dem selben Bereich der IP-Adresse befinden. Wie die IP-Adresse des Roboters eingestellt werden kann, ist in folgendem Artikel beschrieben: IP-Adresse �ndern

Die IP-Adresse des FlexiBowls kann �ber die dort mitgelieferte Windows Anwendung "IP Adress Tool" ge�ndert werden. Es wird empfohlen den PC zun�chst in den selben Bereich der Standard IP-Adresse des FlexiBowls (192.168.1.10) zu bringen. Nach dem Start des IP Address Tools kann bei IP Address diese Adresse in das oberste Feld eingetragen werden. �ber einen verbauten Dip-Switch im FlexiBowl k�nnen mehrere Adressen eingestellt und mittels diesem mechanisch ausgew�hlt werden. Standardm��ig ist dieser auf der Position 1. Mittels dem Button "Read from Drive" k�nnen die auf dem FlexiBowl gespeicherten und zugewiesenen Adressen abgerufen werden. Um keine mechanische Umstellung an dem Dip Switch des FlexiBowls vornehmen zu m�ssen, kann die IP-Adresse bei Switch Position 1 ge�ndert werden. Nach einer �nderung der IP-Adresse wird empfohlen diese abzuspeichern. Mit dem Button "Save to Drive" werden die �nderungen auf dem FlexiBowl gespeichert. Bei einer erneuten Verbindung muss beachtet werden, dass der PC nun auch wieder in den passenden IP-Adressen-Bereich gebracht werden muss.

Flexibowl_IP-Adresse

4.1.2 Herstellen der Verbindung

�ber folgende Funktion kann in horstFX ein Verbindung zu dem FlexiBowl hergestellt werden:

var IPFlexibowl = "192.168.0.20";
var PortFlexibowl = 7776;
var SocketFlexibowl = null;

// Establish connection to Flexibowl
connectToFlexibowl();

// Establish connection to Flexibowl
function connectToFlexibowl()
{
    var [ConnectSuccessFlexibowl, socket_local] = openSocket(IPFlexibowl, PortFlexibowl, 10000);

    if(ConnectSuccessFlexibowl == 1.0)
    {
        showHint("Connection to Flexibowl established");
        SocketFlexibowl = socket_local;
    }
    else
    {
        showError("An error occurred while connecting to the Flexibowl! The program is aborted for safety reasons!");
        exitRobotScript();
    }    
}

4.1.3 Senden von Informationen an den FlexiBowl

Um Informationen an den FlexiBowl zu senden, muss der richtige Syntax beachtet werden. Dabei besteht eine Nachricht aus folgenden 3 Teilen:

  • Header: Chr(0) Chr(7)
  • Befehl: Z.B. QX2 f�r "Move" (Der Befehlssatz befindet sich ab Seite 68 in der Montageanleitung des FlexiBowls)
  • Footer: Chr(13)

In horstFX kann das folgenderma�en umgesetzt werden: 

var SocketFlexibowl = null;

var Command = "QX2";
writeToFlexibowl(Command);

// Send message to Flexibowl
function writeToFlexibowl(Command)
{
    var Header = "\0" + "\x07";
    var Futher = "\r";

    var WriteSuccess = writeSocket(SocketFlexibowl, Header+Command+Futher);

    if(WriteSuccess != 1.0)
    {
        showError("An error occurred while writing to the Flexibowl! The program is aborted for safety reasons!");
        exitRobotProgram();    
    }
}

4.1.4 Einlesen von Informationen von dem FlexiBowl

Der FlexiBowl meldet zur�ck, ob die an ihn gesendete Nachricht richtig interpretiert werden konnte. Die Nachricht besteht hierbei aus folgenden 3 Teilen:

  • Header: Chr(0) Chr(7)
  • Echo: % Falls die Nachricht richtig interpretiert wurde; andernfalls bei einem Fehler ?
  • Footer: Chr(13)

In horstFX kann das folgenderma�en umgesetzt werden:

// Get and check echo of Flexibowl command
function getCommandEchoFlexibowl()
{
    readFromFlexibowl();

    if (Data.charAt(2) != "%")
    {
        showError("The Flexibowl could not interpret the command correctly! \nThe program is aborted for safety reasons!"); 
        exitRobotProgram();
    }
}

// Read message of Flexibowl
function readFromFlexibowl()
{
    var [ReadSuccess, Data_local] = readSocketToDelimiter(SocketFlexibowl, "\r", 10000);
    Data = Data_local;

    if (ReadSuccess != 1.0)
    {
        showError("An error occurred while reading from the Flexibowl! The program is aborted for safety reasons!");
        exitRobotProgram();    
    }
}

4.1.5 Trennen der Verbindung

Bei einem Abbruch des Programms oder im Fehlerfall ist darauf zu achten, dass die Socket-Verbindung zu dem FlexiBowl richtig getrennt wird. Das kann �ber folgenden Funktionsaufruf realisiert werden:

closeSocket(SocketFlexibowl);

4.1.6 Komplette Beispielfunktion

Um in korrekter Weise einen Befehl an den FlexiBowl zu senden, sollte zun�chst �berpr�ft werden, ob der FlexiBowl bereit ist diesen Befehl zu empfangen oder noch selbst eine Aktion ausf�hrt (Die Quick-Emptying Funktion ben�tigt z.B. einiges an Zeit). In folgendem Beispiel wartet der Roboter solange an der Stelle, bis der FlexiBowl wieder bereit ist eine Aktion durchzuf�hren (Funktion: getStateFlexibowl()). Im Anschluss wird �berpr�ft, ob der FlexiBowl sich in einem Fehlerzustand befindet. Ist dies nicht der Fall, wird die eigentlich gew�nschte Aktion an ihn gesendet.

Folgender Code-Auszug beschreibt einen "move-Befehl" des FlexiBowls. Diese Funktion ist so aufgebaut, dass sie einfach als globale Funktion in einem horstFX-Programm verwendet werden kann. Weitere Infos dazu befinden sich in Kapitel 5 Verwendung der Funktionen in horstFX

function Flexibowl_move()
{
// Move parts on the Flexibowl

var IPFlexibowl = "192.168.0.20";
var PortFlexibowl = 7776;
var SocketFlexibowl = null;
var Data = null;

// Establish connection to Flexibowl
connectToFlexibowl();

try
{
    moveFlexibowl();
}

finally
{
    var CloseSuccessFlexibowl = closeSocket(SocketFlexibowl);
}

// Establish connection to Flexibowl
function connectToFlexibowl()
{
    var [ConnectSuccessFlexibowl, socket_local] = openSocket(IPFlexibowl, PortFlexibowl, 10000);

    if(ConnectSuccessFlexibowl == 1.0)
    {
        showHint("Connection to Flexibowl established");
        SocketFlexibowl = socket_local;
    }
    else
    {
        showError("An error occurred while connecting to the Flexibowl! The program is aborted for safety reasons!");
        exitRobotScript();
    }    
}

// Move the Flexibowl with the current parameters
function moveFlexibowl()
{
    showHint("Move Flexibowl");

    getStateFlexibowl();

    var Command = "QX2";
    writeToFlexibowl(Command);

    // Check CommandEcho of Flexibowl
    getCommandEchoFlexibowl();
}

// Check if Flexibowl ist ready and has performed previous action
function getStateFlexibowl()
{
    var Command = "IO";
    var CountLoops = 0;
    
    writeToFlexibowl(Command);
    sleep(50);

    readFromFlexibowl();
    // Get last significant bit of Flexibowl message
    var Ready = Data.substr(Data.length-2, Data.length);

    // Wait until Flexibowl is ready to perform an action
    while ( (Ready != 1) && (CountLoops < 500) )
    {    
        writeToFlexibowl(Command);
        sleep(50);

        readFromFlexibowl();
        Ready = Data.substr(Data.length-2, Data.length);
    
        if ( (CountLoops % 10) == 0 )
        { 
            showHint("Flexibowl is busy");
        }

        sleep(100);
        CountLoops =  CountLoops + 1;
    }
    getErrorStateFlexibowl();
}

// Check the Error State of Flexibowl
function getErrorStateFlexibowl()
{
    var Command = "IOY";
    writeToFlexibowl(Command);

    readFromFlexibowl();
    // Get last significant bit of Flexibowl message
    var Error = Data.substr(Data.length-2, Data.length);    

    if (Error == 1)
    {
        showError("The Flexibowl has an internal error! \n"+
                "You can try to reset the flexibowl via the function: resetAlarmFlexibowl() or try a reboot. \n\n" +
                "The program is aborted for safety reasons!");
        exitRobotProgram();    
    } 
}

// Get and check echo of Flexibowl command
function getCommandEchoFlexibowl()
{
    readFromFlexibowl();

    if (Data.charAt(2) != "%")
    {
        showError("The Flexibowl could not interpret the command correctly! \nThe program is aborted for safety reasons!"); 
        exitRobotProgram();
    }
}

// Send message to Flexibowl
function writeToFlexibowl(Command)
{
    var Header = "\0" + "\x07";
    var Futher = "\r";

    var WriteSuccess = writeSocket(SocketFlexibowl, Header+Command+Futher);

    if(WriteSuccess != 1.0)
    {
        showError("An error occurred while writing to the Flexibowl! The program is aborted for safety reasons!");
        exitRobotProgram();    
    }
}

// Read message of Flexibowl
function readFromFlexibowl()
{
    var [ReadSuccess, Data_local] = readSocketToDelimiter(SocketFlexibowl, "\r", 10000);
    Data = Data_local;

    if (ReadSuccess != 1.0)
    {
        showError("An error occurred while reading from the Flexibowl! The program is aborted for safety reasons!");
        exitRobotProgram();    
    }
}

// Close sockets and exit robot program
function exitRobotProgram()
{
    closeSocket(SocketFlexibowl);
    sleep(1000);
    exitRobotScript();
}
}

5 Verwendung der Funktionen in horstFX 

Der gesamte Befehlssatz des FlexiBowls steht als globale Funktionen f�r horstFX zur Verf�gung und kann direkt im Programm oder mittels Makro-Button aufgerufen werden.

5.1 Hinzuf�gen der globalen Funktionen in horstFX

In Abschnitt 6 k�nnen die Funktionen heruntergeladen werden. Anschlie�end k�nnen diese mittels USB-Stick auf den Roboter oder den Windows-PC gezogen werden. 

Auf dem Robotersystem m�ssen die Funktionen in folgendes Verzeichnis kopiert werden:

home -> fruitcore -> functions -> textual

Sollte das Verzeichnis noch nicht vorhanden sein, liegt es daran, dass noch keine globale Funktion auf dem Robotersystem erstellt wurde. Ist das der Fall, kann ganz einfach �ber horstFX eine globale textuelle dummy-Funktion erstellt werden. Nach dem Erstellen m�ssten die Ordner nun vorhanden sein.

Auf dem Windows System befindet sich der functions Ordner in dem selben Verzeichnis in welchem beispielsweise auch die save-Dateien oder die tools liegen. Z.B.

Documents\fruitcore\functions\textual

Sollte das Verzeichnis noch nicht vorhanden sein, liegt es daran, dass noch keine globale Funktion auf dem Windows-System erstellt wurde. Ist das der Fall, kann ganz einfach �ber horstFX eine globale textuelle dummy-Funktion erstellt werden. Nach dem Erstellen m�ssten die Ordner nun vorhanden sein.

5.2 Aufruf und ver�ndern der textuellen Funktionen in horstFX

In horstFX k�nnen die Funktionen nach dem Hinzuf�gen aufgerufen oder ver�ndert werden. Dabei ist zu beachten, dass die IP-Adresse in den jeweiligen Funktionen mit der IP-Adresse des Flexibowls �bereinstimmt und sich diese in dem Bereich der IP-Adresse des Roboters oder des Computers befindet. Am Anfang in jeder Funktion kann die IP-Adresse ge�ndert werden.

Innerhalb der Funktionen sollte lediglich die IP-Adresse oder der Port angepasst werden, da ansonsten die Funktion nicht mehr funktionieren k�nnte. Eine Ausnahme stellt die Funktion "Flexibowl_setParameters" dar. In dieser k�nnen die Parameter f�r beispielsweise Shake- oder Move-Befehle eingestellt werden. 

Die Funktionen k�nnen �ber die Aktion "Funktions-Aufruf" aufgerufen werden.

Flexibowl_Funktionsaufruf

5.3 Funktionsaufruf �ber Makro-Button

Um den FlexiBowl auch ohne das Ausf�hren eines Programms, z.B. bei der Einrichtung, anzusteuern, k�nnen die jeweiligen Funktionen �ber Makro-Buttons ausgef�hrt werden. Diese k�nnen Innerhalb des Programms konfiguriert und im Anschluss daran aufgerufen werden.

Flexibowl_MakroButtons

6 Downloadbereich

6.1 globale Funktionen

Globale Funktionen

6.2 FlexiBowl Montageanleitung

Flexibowl Montageanleitung