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