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
Où <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 :
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 :
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) :
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 :
En cas de succès, vous devriez disposer de structures entières de variables :
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 :
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 :
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 contrôleur EYE+. 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