Avertissement

Vous lisez une ancienne version de cette documentation. Si vous souhaitez obtenir des informations actualisées, veuillez consulter 5.0 .

Exemple - Beckhoff TwinCAT

Cette section donne un exemple d’une intégration simple d’EYE+ avec le module EtherCAT dans Beckhoff TwinCAT version 3.1.

Conditions préalables

Avant de commencer, veuillez télécharger les fichiers suivants :
  • Fichier EYE+ EtherCAT ESI (electronic datasheet)

  • Facultativement, modèle de projet EYE+ TwinCAT contenant des variables prédéclarées pour faciliter l’intégration.

Ces fichiers peuvent être téléchargés à partir des Téléchargements EtherCAT.

Une fois que vous avez téléchargé les fichiers nécessaires, veillez à installer le fichier ESI dans le dossier d’installation de Beckhoff TwinCAT :

<chemin_du_dossier_installation_twincat>\3.1\Config\Io\EtherCAT

<chemin_du_dossier_installation_twincat> correspond généralement à C:\TwinCAT\ .

Après avoir installé le fichier ESI dans le bon dossier, veuillez redémarrer Beckhoff TwinCAT.

Intégration de base

Une fois que tout est en place, vous pouvez procéder à la création d’un nouveau projet Beckhoff TwinCAT. Ensuite, assurez-vous que vous êtes en mode configuration en appuyant sur l’icône suivante dans la partie supérieure gauche :

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

Une fois cela effectué, vous êtes prêt à scanner le bus EtherCAT pour reconnaître et localiser votre EYE+ et le périphérique Master. L’option de scan est disponible en cliquant avec le bouton droit de la souris sur Devices dans le panneau de gauche :

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

Le processus de scannage peut prendre quelques secondes, il trouvera tous les appareils actuellement connectés au bus.

Remarque

Si votre EYE+ ne figure pas dans la liste après le scannage, vérifiez qu’il est correctement connecté et enclenché. Si le problème persiste, veuillez contacter notre équipe d’assistance.

Une fois le scannage terminée, vous devriez voir votre Box EYE+ dans la liste des périphériques (Devices) :

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

Si vous avez téléchargé le modèle optionnel, veuillez suivre les étapes suivantes. L’importation du modèle permet de créer toutes les variables nécessaires pour tirer pleinement parti de votre système EYE+. L’importation du modèle est simple, faites un clic droit sur votre projet API et cliquez sur Import From ZIP :

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

En cas de succès, vous devriez disposer de structures entières de variables :

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

Vous devrez construire le projet de manière à ce que les variables soient disponibles à partir de TwinCAT. Le mappage des variables aux variables propres à EYE+ peut être réalisé facilement avec la fonctionnalité Multi Link :

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

Une fois que les variables ont été mappées, et après avoir redémarré en mode de fonctionnement, vous devriez être en mesure d’obtenir un retour en direct des registres :

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

L’exemple de code suivant vous permet de démarrer une production et d’obtenir vos premières pièces pour une recette qui a été créée précédemment sur votre EYE+ Controller. Pour cela, définissez udRecipeID comme égal à l’ID de cette recette, puis paramétrez boStart sur True. Les coordonnées de la pièce trouvée sont retournées dans reRobotTargetX, reRobotTargetY et reRobotTargetRz.

(*
 * 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