Traitement des erreurs
Exemple de programme 6.1
Type d’exemple :
Gestion d’une situation d’erreur potentielle au sein de la fonction de rappel
Configuration
- Nombre de robots : 1
- Nombre de distributeurs : 1
- Nombre de types de pièces sur le distributeur : 1
- Nombre de positionnements : 1
- Orientation de la caméra : caméra fixe et orientée vers le bas au-dessus du distributeur n° 1
Description
Cet exemple permet de détecter et de gérer une situation d’erreur potentielle au sein d’une fonction de rappel, afin que l’erreur ne se produise pas dans la boucle principale du processus Part Feeding. Dans cet exemple, la fonction de rappel PF_Vision est utilisée pour acquérir une image et charger la file d’attente des coordonnées de la pièce avec les résultats de vision. Le robot a un décalage d’outil important. Dans certains cas, l’outil ne peut pas s’aligner sur l’angle de la pièce (déterminé par la vision), car cela obligerait le robot à sortir de son enveloppe de travail.
Si elle n’est pas traitée, cette situation entraînerait une erreur de « conversion de coordonnées ». Cet exemple de code vérifie si le robot est en mesure de prélever la pièce à l’aide de l’outil sous l’angle de vision avant de charger les coordonnées dans la file d’attente des pièces. Pour ce faire, l’instruction TargetOK est utilisée.
Exemple de code
Main.prg
Function main
If Motor = Off Then
Motor On
EndIf
Power Low
Jump Park
PF_Start 1
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
’ Tool 1 will be used to pick up the part
Tool 1
Do While PF_QueLen(PartID) > 0
P0 = PF_QueGet(PartID)
Jump P0
On Gripper; Wait 0.2
Jump Place
Off Gripper; Wait 0.2
PF_QueRemove PartID
If PF_IsStopRequested(PartID) = True Then
Exit Do
EndIf
Loop
PF_Robot = PF_CALLBACK_SUCCESS
Fend
Function PF_Vision(PartID As Integer, ByRef numBack As Integer) As Integer
Boolean found
Integer i, numFront
Real RB_X, RB_Y, RB_U, RB_Z
’ Tool 1 will be used to pick up the part
Tool 1
’ Pick Z coordinate
RB_Z = -132.0
’ Initialize coordinates queue
PF_QueRemove PartID, All
PF_Backlight 1, On
’ Detect the parts
VRun UsrVisionSeq
PF_Backlight 1, Off
VGet UsrVisionSeq.Geom01.NumberFound, numFront ’Front Parts
VGet UsrVisionSeq.Geom02.NumberFound, numBack ’Back Parts
If numFront <> 0 Then
For i = 1 To numFront
VGet UsrVisionSeq.Geom01.RobotXYU(i), found, RB_X, RB_Y, RB_U
If found Then
If TargetOK(XY(RB_X, RB_Y, RB_Z, RB_U)) Then
PF_QueAdd PartID, XY(RB_X, RB_Y, RB_Z, RB_U)
EndIf
EndIf
Next
EndIf
PF_Vision = PF_CALLBACK_SUCCESS
Fend
Exemple de programme 6.2
Type d’exemple :
Gestion d’une erreur de traitement au sein de la fonction de rappel
Configuration
- Nombre de robots : 1
- Nombre de distributeurs : 1
- Nombre de types de pièces sur le distributeur : 1
- Nombre de positionnements : 1
- Orientation de la caméra : caméra fixe et orientée vers le bas au-dessus du distributeur n° 1
Description
Dans cet exemple, la fonction de rappel PF_Vision est utilisée pour acquérir une image et charger la file d’attente des coordonnées de la pièce avec les résultats de vision. Dans cet exemple, un nombre minimum de pièces à prélever doit se trouver sur le plateau du distributeur pour que la file d’attente des pièces puisse être chargée. Si la file d’attente des pièces n’est pas chargée après 3 tentatives, un message s’affiche pour demander à l’opérateur s’il souhaite continuer à rechercher des pièces ou s’il préfère s’arrêter.
Exemple de code
Main.prg
Function main
If Motor = Off Then
Motor On
EndIf
Power Low
Jump Park
PF_Start 1
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
’ Tool 1 will be used to pick up the part
Tool 1
Do While PF_QueLen(PartID) > 0
P0 = PF_QueGet(PartID)
Jump P0
On Gripper; Wait 0.2
Jump Place
Off Gripper; Wait 0.2
PF_QueRemove PartID
If PF_IsStopRequested(PartID) = True Then
Exit Do
EndIf
Loop
PF_Robot = PF_CALLBACK_SUCCESS
Fend
Function PF_Vision(PartID As Integer, ByRef numBack As Integer) As Integer
Boolean found
Integer i, numFront
Real RB_X, RB_Y, RB_U, RB_Z
Integer RetryCount
String msg$
Integer mFlags, answer
’ Pick Z coordinate
RB_Z = -132.0
’ Initialize coordinates queue
PF_QueRemove PartID, All
RetryCount=0
Do
PF_Backlight 1, On
’ Detect the parts
VRun UsrVisionSeq
PF_Backlight 1, Off
VGet UsrVisionSeq.Geom01.NumberFound, numFront ’Front Parts
VGet UsrVisionSeq.Geom02.NumberFound, numBack ’Back Parts
If numFront >= 5 Then ’Min number of parts = 5 for this example
For i = 1 To numFront
VGet UsrVisionSeq.Geom01.RobotXYU(i), found, RB_X, RB_Y, RB_U
If found Then
PF_QueAdd PartID, XY(RB_X, RB_Y, RB_Z, RB_U)
EndIf
Next
Exit Do
Else
If RetryCount < 3 Then
PF_Center 1, PF_CENTER_LONG_AXIS
PF_Center 1, PF_CENTER_SHORT_AXIS
PF_Flip 1, 500
RetryCount = RetryCount + 1
Else
msg$ = PF_Name$(PartID) + CRLF + CRLF
msg$ = msg$ + "Min Number of Parts Cannot be Loaded." + CRLF
msg$ = msg$ + "Do you want to Continue trying?"
mFlags = MB_YESNO + MB_ICONQUESTION
MsgBox msg$, mFlags, "Minimum Number Parts", answer
If answer = IDNO Then
PF_Stop(PartID)
Exit Do
Else
RetryCount=0
EndIf
EndIf
EndIf
Loop
PF_Vision = PF_CALLBACK_SUCCESS
Fend
Exemple de programme 6.3
Type d’exemple :
Gestion d’une erreur d’état dans la fonction de rappel PF_Status
Configuration
- Nombre de robots : 1
- Nombre de distributeurs : 1
- Nombre de types de pièces sur le distributeur : 1
- Nombre de positionnements : 1
- Orientation de la caméra : caméra fixe et orientée vers le bas au-dessus du distributeur n° 1
Description
Dans cet exemple, la dernière pièce du plateau est détectée comme étant une pièce non conforme. Le plateau est équipé de l’option Purge Gate (Vanne de purge), qui est activée. La « mauvaise pièce » détectée sera évacuée du plateau, de nouvelles pièces seront acheminées depuis la trémie, puis les pièces seront centrées et retournées.
Exemple de code
PartFeeding.prg
Function PF_Status(PartID As Integer, Status As Integer) As Integer
Select Status
’ Other Status Cases have been removed from this sample code for simplicity
Case PF_STATUS_WRONGPART
’ There may be a wrong part on the feeder platform.
’ Purge Part 1 without vision feedback. Purge duration is default.
’ The Purge Gate automatically opens and closes
PF_Purge 1, PF_PURGETYPE_NOVISION
’ Turn on the hopper for 3 sec
PF_OutputOnOff 1, On, 1, 3000
Wait 3.0
PF_Center 1, PF_CENTER_LONG_AXIS
PF_Center 1, PF_CENTER_SHORT_AXIS
PF_Flip 1, 500
’ Other Status Cases have been removed from this sample code for simplicity
Send
PF_Status = PF_CONTINUE
Fend
Exemple de programme 6.4
Type d’exemple :
Gestion d’une erreur utilisateur dans la fonction de rappel PF_Status
Configuration
- Nombre de robots : 1
- Nombre de distributeurs : 1
- Nombre de types de pièces sur le distributeur : 1
- Nombre de positionnements : 1
- Orientation de la caméra : caméra fixe et orientée vers le bas au-dessus du distributeur n° 1
Description
Le robot est équipé d’un préhenseur à ventouse doté d’un vacuostat pour détecter que la pièce a été correctement prélevée. Si le capteur de vide ne parvient pas à détecter la pièce, le robot tentera de la prélever à nouveau. Après 3 tentatives infructueuses, une erreur utilisateur (8000) est générée.
L’erreur utilisateur est transmise à la fonction de rappel PF_Status en définissant la valeur de retour de PF_Robot sur le numéro de l’erreur utilisateur. La fonction de rappel PF_Status affiche une boîte de dialogue permettant à l’opérateur de continuer ou de quitter l’application.
Exemple de code
Main.prg
Function main
If Motor = Off Then
Motor On
EndIf
Power Low
Jump Park
PF_Start 1
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
Integer PickRetryCount ’ Pick Retry Count
Do While PF_QueLen(PartID) > 0
’ Get position of part to be picked
P10 = PF_QueGet(PartID)
PickRetryCount = 0
Do
Jump P10
On Vacuum
Wait Sw(VacOn), 0.5 ’ 0.5 second timeout on
Vacuum switch
If TW = False Then ’ Vacuum successful
Exit Do ’ Exit Do Loop and place the part
EndIf
Off Vacuum
PickRetryCount = PickRetryCount + 1 ’ Increment retry count
If PickRetryCount = 3 Then
’ Vacuum retries were not successful
Jump Park
PF_QueRemove PartID
PF_Robot = 8000 ’ Set the return value to user
Error 8000
’ PF_Status callback will be called with status value 8000
Exit Function
EndIf
Loop
’ Part detected in vacuum gripper
Jump Place
Off Vacuum
Wait 0.25
’ Deque
PF_QueRemove PartID
’Check Cycle stop
If PF_IsStopRequested(PartID) = True Then
Exit Do
EndIf
Loop
PF_Robot = PF_CALLBACK_SUCCESS
Fend
Function PF_Status(PartID As Integer, Status As Integer) As Integer
String msg$
Integer mFlags, answer
Select Status
’ Other Status Cases have been removed from this sample code for simplicity
Case 8000 ’ User Error 8000 occured.
msg$ = PF_Name$(PartID) + CRLF + CRLF
msg$ = msg$ + "Vacuum Pick error has occurred." + CRLF
msg$ = msg$ + "Do you want to Continue?"
mFlags = MB_YESNO + MB_ICONQUESTION
MsgBox msg$, mFlags, "Vacuum Pick Error", answer
If answer = IDNO Then
PF_Status = PF_EXIT
Else
PF_Status = PF_CONTINUE
EndIf
Exit Function
Send
Fend
Exemple de programme 6.5
Type d’exemple :
Gestion d’une erreur du contrôleur dans la fonction de rappel Part Feeding
Configuration
- Nombre de robots : 1
- Nombre de distributeurs : 1
- Nombre de types de pièces sur le distributeur : 1
- Nombre de positionnements : 1
- Orientation de la caméra : caméra fixe et orientée vers le bas au-dessus du distributeur n° 1
Description
En règle générale, lorsqu’une erreur de contrôleur se produit, le processus Part Feeding attribue automatiquement la valeur constante PFSTATUSERROR au paramètre Status (État), et la fonction PF_Status est alors appelée. Cela se produit sans qu’aucun code utilisateur supplémentaire ne soit nécessaire. La fonction PF_Status affiche généralement le numéro et le message d’erreur. Le processus Part Feeding s’arrêtera dès que la fonction PF_Status aura pris fin.
Cependant, dans cet exemple, nous souhaitons gérer une erreur spécifique du contrôleur au sein de la fonction de rappel PF_Robot.
Toutes les autres erreurs du contrôleur seront transmises à la fonction de rappel PF_Status, le paramètre Status (État) étant défini sur PFSTATUSERROR.
Dans ce cas, les conduites électriques et pneumatiques du préhenseur empêchent l’axe U (robot SCARA) d’effectuer une rotation complète de +/-360 degrés.
La plage de mouvement de l’articulation 4 a été limitée dans Epson RC+ Robot Manager. La limitation de la plage de mouvement de l’articulation 4 permet d’éviter tout endommagement des conduites électriques et pneumatiques. Si une pièce présente sur le distributeur oblige l’articulation 4 à pivoter au-delà de sa plage de mouvement, une erreur 4001 « Arm reached the limit of motion range » (Le bras a atteint la limite de sa plage de mouvement) se produira. Le gestionnaire d’erreurs retire la pièce de la file d’attente et le robot reprend le prélèvement de toutes les pièces restantes.
Afin d’empêcher le système de vision d’acquérir à nouveau une image des mêmes pièces rejetées et de les rajouter à la file d’attente, une commande PF_Flip est exécutée une fois que toutes les pièces ont été prélevées et que la file d’attente est vide.
Exemple de code
Main.prg
Function main
If Motor = Off Then
Motor On
EndIf
Power Low
Jump Park
PF_Start 1
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
Integer errNum
OnErr GoTo ehandle ’ Error Handler
retry:
Do While PF_QueLen(PartID) > 0
’ Get position of part to be picked
P10 = PF_QueGet(PartID)
’Error 4001 can occur if the part’s angle
’ causes Joint 4 to rotate beyond its motion range
Jump P10
On Gripper
Wait 0.25
Jump Place
Off Gripper
Wait 0.25
’Deque
PF_QueRemove PartID
’Check Cycle stop
If PF_IsStopRequested(PartID) = True Then
Exit Do
EndIf
Loop
PF_Flip PartID
PF_Robot = PF_CALLBACK_SUCCESS
Exit Function
ehandle:
errNum = Err
If errNum = 4001 Then ’ Example of Handled error
Print "Error 4001: Arm reached the limit of motion range"
PF_QueRemove PartID ’ Remove the part from the queue
EResume retry ’ Continue picking the remaining parts in the queue
Else
’ Other unhandled errors
’ PF_Status is called with the PF_STATUS_ERROR status parameter
PF_Robot = PF_STATUS_ERROR
EndIf
Fend
Function PF_Status(PartID As Integer, Status As Integer) As Integer
Select Status
’ Other Status Cases have been removed from this sample code for simplicity
Case PF_STATUS_ERROR ’ Error.
msg$ = PF_Name$(PartID) + CRLF
msg$ = msg$ + "Error!! (code: " + Str$(Err) + " ) " + ErrMsg$(Err)
MsgBox msg$, MB_ICONSTOP
’ Other Status Cases have been removed from this sample code for simplicity
Send
If Status = PF_STATUS_ERROR Then
’ A controller error occurred. Terminate the Part Feeding Process.
PF_Status = PF_EXIT
Else
’ Otherwise Continue running the Part Feeding Process.
PF_Status = PF_CONTINUE
EndIf
Fend