Warnung

Sie lesen eine alte Version dieser Dokumentation. Wenn Sie aktuelle Informationen wünschen, schauen Sie bitte unter 5.0 .

Beispiel - Beckhoff TwinCAT

Dieser Abschnitt zeigt ein Beispiel einer einfachen Integration von EYE+ mit dem EtherCAT-Modul in Beckhoff TwinCAT Version 3.1.

Voraussetzungen

Bevor Sie beginnen, laden Sie bitte folgende Dateien herunter:
  • EYE+ EtherCAT ESI-Datei (Electronic datasheet)

  • Ggf. EYE+ TwinCAT Projektvorlage, die vordeklarierte Variablen für eine einfachere Integration enthält

Diese Dateien können unter EtherCAT Downloads heruntergeladen werden.

Nachdem Sie die notwendigen Dateien heruntergeladen haben, müssen Sie die ESI-Datei in das Installationsverzeichnis von Beckhoff TwinCAT installieren:

<pfad_zu_twincat_install>\3.1\Config\Io\EtherCAT

Wobei <pfad_zu_twincat_install> normalerweise C:\TwinCAT\ entspricht.

Nachdem Sie die ESI-Datei in den richtigen Ordner installiert haben, starten Sie Beckhoff TwinCAT bitte neu.

Basis-Integration

Sobald alles eingerichtet ist, können Sie mit der Erstellung eines neuen Beckhoff TwinCAT Projekts fortfahren. Vergewissern Sie sich dann, dass Sie sich im Konfigurationsmodus befinden, indem Sie auf das folgende Symbol oben links drücken:

../../../_images/twincat_config_mode.png

Danach sind Sie bereit, den EtherCAT-Bus zu scannen, um Ihr EYE+ und das Master-Gerät zu erkennen und zu lokalisieren. Die Scan-Option können Sie abrufen, indem Sie mit der rechten Maustaste auf Devices im linken Navigationsfenster klicken:

../../../_images/twincat_scan.png

Der Scan-Vorgang kann einige Sekunden dauern und findet alle Geräte, die derzeit an den Bus angeschlossen sind.

Bemerkung

Wenn Ihr EYE+ nach dem Scan nicht in der Liste erscheint, stellen Sie bitte sicher, dass es korrekt angeschlossen und eingeschaltet ist. Wenn das Problem weiterhin besteht, wenden Sie sich bitte an unser Support-Team.

Nach Abschluss des Scans sollten Sie Ihre EYE+ Box in der Liste unter Devices sehen:

../../../_images/twincat_scan_complete.png

Wenn Sie die optionale Projektvorlage heruntergeladen haben, folgen Sie bitte den nächsten Schritten. Durch das Importieren der Vorlage werden alle notwendigen Variablen erstellt, sodass Sie die Vorteile Ihres EYE+ in vollem Umfang ausschöpfen können. Das Importieren der Vorlage ist ganz einfach: Klicken Sie mit der rechten Maustaste auf Ihr SPS-Projekt und klicken Sie dann auf Import From ZIP:

../../../_images/twincat_import_template.png

Wenn dies gelingt, sollten Sie vollständige Variabel-Strukturen zur Verfügung haben:

../../../_images/twincat_variables.png

Sie müssen das Projekt so erstellen, dass die Variablen innerhalb von TwinCAT verfügbar sind. Das Mapping der Variablen zu den Variablen von EYE+ kann mit der Multi-Link-Funktionalität leicht erreicht werden:

../../../_images/twincat_variables_built.png
../../../_images/twincat_multilink.png

Nachdem die Variablen zugeordnet wurden und Sie im Betriebsmodus neu gestartet haben, sollten Sie in der Lage sein, eine Live-Rückmeldung der Register zu erhalten:

../../../_images/twincat_prod.png

Das folgende Codebeispiel ermöglicht es Ihnen, eine Produktion zu starten und die ersten Teile für ein Rezept zu erhalten, das zuvor auf Ihrem EYE+ Controller erstellt wurde. Setzen Sie dazu udRecipeID auf die ID des Rezepts und boStart auf True. Die Koordinaten des gefundenen Teils werden in reRobotTargetX, reRobotTargetY und reRobotTargetRz zurückgegeben.

(*
 * This sample code is distributed under the license CC0 1.0 Universal,
 * you can get a copy of the license at https://creativecommons.org/publicdomain/zero/1.0/
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *)

 VAR
         udRecipeID: UDINT;
         boStart: BOOL;
         R_TRIG_Start: R_TRIG;
         boStop: BOOL;
         R_TRIG_Stop: R_TRIG;
         boClearError : BOOL;
         inLastErrorID: UDINT;
         eState: UDINT;
         reRobotTargetX: REAL;
         reRobotTargetY: REAL;
         reRobotTargetRz: REAL;
 END_VAR

 VAR CONSTANT
         STATE_IDLE: UDINT := 0;
         STATE_START_PRODUCTION: UDINT := 10;
         STATE_ROBOT_MOVE_OUT_FOV: UDINT := 20;
         STATE_GET_PART: UDINT := 30;
         STATE_ROBOT_PICK_PLACE: UDINT := 50;
         STATE_STOP_PRODUCTION: UDINT := 60;
         STATE_ERROR: UDINT := 100;
 END_VAR

 R_TRIG_Start(CLK:= boStart);
 R_TRIG_Stop(CLK:= boStop);

 CASE eState OF

         STATE_IDLE:
                 IF R_TRIG_Start.Q THEN
                         eState := STATE_START_PRODUCTION;
                 END_IF

         STATE_START_PRODUCTION:
                 EYEplus.suEYEplusOutputGLO.udRecipeIDGOU := udRecipeID;
                 EYEplus.suEYEplusOutputGLO.boStartProductionTriggerGOU := TRUE;

                 IF EYEplus.suEYEplusInputGLO.boStartProductionDoneGIN AND NOT EYEplus.suEYEplusInputGLO.boIsErrorGIN THEN
                         EYEplus.suEYEplusOutputGLO.boStartProductionTriggerGOU := FALSE;
                         eState := STATE_ROBOT_MOVE_OUT_FOV;
                 ELSIF EYEplus.suEYEplusInputGLO.boIsErrorGIN THEN
                         EYEplus.suEYEplusOutputGLO.boStartProductionTriggerGOU := FALSE;
                         eState := STATE_ERROR;
                 END_IF

         STATE_ROBOT_MOVE_OUT_FOV:
                 //Robot move out of field of view
                 //Check that the movement is done before to go first get_part
                 eState := STATE_GET_PART;

         STATE_GET_PART:
                 EYEplus.suEYEplusOutputGLO.boGetPartTriggerGOU := TRUE;

                 IF EYEplus.suEYEplusInputGLO.boGetPartDoneGIN AND NOT EYEplus.suEYEplusInputGLO.boIsErrorGIN THEN
                         reRobotTargetX  := EYEplus.suEYEplusInputGLO.rePose1XGIN;
                         reRobotTargetY  := EYEplus.suEYEplusInputGLO.rePose1YGIN;
                         reRobotTargetRz := EYEplus.suEYEplusInputGLO.rePose1RzGIN;
                         EYEplus.suEYEplusOutputGLO.boGetPartTriggerGOU := FALSE;
                         eState := STATE_ROBOT_PICK_PLACE;
                 ELSIF EYEplus.suEYEplusInputGLO.boIsErrorGIN THEN
                         EYEplus.suEYEplusOutputGLO.boGetPartTriggerGOU := FALSE;
                         eState := STATE_ERROR;
                 END_IF

         STATE_ROBOT_PICK_PLACE:
                 //Robot pick and place the part
                 //Check that the movement is done before to go make another get_part
                 eState := STATE_GET_PART;

         STATE_STOP_PRODUCTION:
                 EYEplus.suEYEplusOutputGLO.udStopStateGOU := 16#FF;

                 IF EYEplus.suEYEplusInputGLO.boStopStateDoneGIN AND NOT EYEplus.suEYEplusInputGLO.boIsErrorGIN THEN
                         EYEplus.suEYEplusOutputGLO.udStopStateGOU := 16#00;
                         eState := STATE_IDLE;
                 ELSIF EYEplus.suEYEplusInputGLO.boIsErrorGIN THEN
                         EYEplus.suEYEplusOutputGLO.udStopStateGOU := 16#00;
                         eState := STATE_ERROR;
                 END_IF

         STATE_ERROR:
                 EYEplus.suEYEplusOutputGLO.udStopStateGOU := 16#00;
                 EYEplus.suEYEplusOutputGLO.boStartProductionTriggerGOU := FALSE;
                 EYEplus.suEYEplusOutputGLO.boGetPartTriggerGOU := FALSE;

                 inLastErrorID := EYEplus.suEYEplusInputGLO.udErrorIDGIN;
                 EYEplus.suEYEplusOutputGLO.boClearErrorTriggerGOU := boClearError;

                 IF NOT EYEplus.suEYEplusInputGLO.boIsErrorGIN THEN
                         EYEplus.suEYEplusOutputGLO.boClearErrorTriggerGOU := FALSE;
                         eState := STATE_STOP_PRODUCTION;
                 END_IF;
 END_CASE

 IF R_TRIG_Stop.Q THEN
         EYEplus.suEYEplusOutputGLO.boStartProductionTriggerGOU := FALSE;
         EYEplus.suEYEplusOutputGLO.boGetPartTriggerGOU := FALSE;
         EYEplus.suEYEplusOutputGLO.boClearErrorTriggerGOU := FALSE;

         eState := STATE_STOP_PRODUCTION;
 END_IF