jeudi 17 avril 2014

Calcul G02 ou G03 depuis l'APT

Bonsoir,

Suite à une demande sur ma messagerie de Martin, voici comment je calcul le code ISO pour un cercle à partir de l'APT. Voici donc quelques explications sur l'instruction CIRCLE dans l'APT et un exemple de code VB6 pour calculer la direction de l'arc.

Notation de CIRCLE dans l'APT

La notation la plus courante de l'instruction cercle dans l'APT est CIRCLE . Elle donne le point de centre et la normal ainsi que le rayon. Cette normal permet de spécifier le sens de parcours ( G02 ou G03 par exemple pour Z=1 avec un cercle dans le plan G17 ( XY) on aura une interpolation trigo G03 et G02 si Z=-1.

Syntaxe APT
CIRCLE/ XCentre,YCentre,ZCcentre, XNormal,YNormal,ZNormal, Rayon)
GOTO/ XPointFin,YPointFin,ZPointFin



Exemple :
CIRCLE/508.000,762.000,0.000,0.000,0.000,1.000,137.000
GOTO/645.000,762.000,0.000

Autre notation en utilisant INDRIV

L'autre notation reconnue et utilisée par exemple par les sorties de CATIA utilise le code TLON,GOFWD avec la notation INDIRV qui donne le sens de parcours au premier point du cercle. Le vecteur ainsi défini permet de connaitre le sens de parcours G02 / G03.

Syntaxe APT
INDIRV/ x, y, z
TLON,GOFWD/(CIRCLE/ xcentre,ycentre,zcentre,rayon),ON,(LINE/ xcentre,ycentre,zcentre, xPointFin,yPointFin,zPointFin)

Exemple :
INDIRV/ 0.99503, 0.09957, 0.000
TLON,GOFWD/ (CIRCLE/ 16.933, 12.173, 0.000,4.177),ON,(LINE/ 16.933, 12.173, 0.000,20.325, 14.611, 0.000)

Enfin la même notation est aussi traitée si les codes CIRCLE et LINE sont défini en leur affectant une référence (Lx et Cx ) qui sera utilisée dans le code TLON,GOFWD comme dans l'exemple suivant :
C1=CIRCLE/41.6,-1.0681,14.7351,3
L1=LINE/41.6,-1.0681,14.7351,38.6,-1.0681,14.7351
INDIRV/-1,0,0
TLON,GOFWD/C1,ON,L1

Attention dans ce cas la déclaration des commandes CIRCLE et LINE doit se faire avant l'appel par TLON,GOFWD. Il n'est ainsi pas possible de définir en début de code APT toutes les références CIRCLE & LINE.

Autre syntaxe APT déjà rencontré

INDIRV/ x, y, z TLON,GOFWD/(CIRCLE/ xcentre,ycentre,zcentre,rayon), ON, 2,INTOF,(LINE/ xcentre,ycentre,zcentre, xPointFin,yPointFin,zPointFin)


Où :
xcentre, ycentre, zcentre = coordonnées centre arc
xPointFin, yPointFin, zPointFin = Point fin arc
x, y, z = Vecteur de direction INDIRV



Exemple de code VB6 utilisé pour calculer le code G



Option Explicit
'---------------------------------------------------------------------------------------
' Module    : Calcul_cercle
' DateTime  : 05/12/2006 15:08
' Author    : usinage5axes
' Purpose   : Calcul des informations pour sortie circulaires
'---------------------------------------------------------------------------------------

Type INTERPO_CIRCULAIRE
 Code As String                     ' Code sous forme G02 ou G03
 GCode As Integer                   ' valeur du Code G  02 ou 03
 Centre As Point3                   ' Coordonnées point de centre
 Centre_Relatif As Point3           ' Coordonnées point de centre en relatif depuis point de départ pour certaines notation ISO
 P1 As Point3                       ' Point depart
 P2 As Point3                       ' Point millieu dans le cas de définition par 3 points
 P3 As Point3                       ' Point de fin
 Rayon As Double                    ' Rayon du cercle
 Normal As Point3                   ' Vecteur Normal du cercle utilisé pour calculer par exemple G02 ou G03
 Angle As Double                    ' Angle de l'arc de cercle
 Angle_Machine As PosAngulaire      ' Angle des axes rotatifs machine A/B/C pour sortie avec CN acceptant la notation
End Type

'---------------------------------------------------------------------------------------
' Procedure : Calcul_Info_Cercle
' DateTime  : 05/12/2006 15:10
' Author    : usinage5axes
' Purpose   : Avec les infos relues dans le fichier APT (P1, P3 , Point de centre
'---------------------------------------------------------------------------------------
'

Sub Calcul_Info_Cercle(Cercle_Cur As INTERPO_CIRCULAIRE, Optional INDIRV_Vect As Point3)

Dim VectP1 As Point3  ' Vecteur du point de centre au point 1
Dim VectNP1 As Point3 ' Vecteur normal

Dim Po1 As Point3
Dim Po2 As Point3
Dim Po3 As Point3
Dim Angle As Double
      
        ' Se produit si l'on traite une instruction TLON,GOFWD dans ce cas il n'y a pas de notion de normal défini
        ' mais on utilise le vecteur INDIRV

        If Longueur(Cercle_Cur.Normal) = 0 Then
           ' Normal_Plan_Courant = Variable globale de type point défini selon G17/G18/G19
            Cercle_Cur.Normal = Normal_Plan_Courant
        End If
       
        'P1 Point de départ
        'P3 Point de fin


        Po1 = VecSub(Cercle_Cur.P3, Cercle_Cur.P1)
        Po2 = VecteurUnitaire(VecProd(Po1, Cercle_Cur.Normal))
        Po3 = VecteurUnitaire(PointMilieu(Cercle_Cur.P1, Cercle_Cur.P3))
        VectP1 = VecteurUnitaire(VecSub(Cercle_Cur.P1, Cercle_Cur.Centre))
            ' VectNP1 est le vecteur direction calculé au point de départ. il donne normalement le sens Trigo
            ' Comparé avec INDIRV il servira à déterminer G02 ( horaire ) ou G03 (Trigo)

        VectNP1 = VecProd(Cercle_Cur.Normal, VectP1)
           
        ' Calcul de l'angle
        Cercle_Cur.Angle = Angle3Pt(Cercle_Cur.P1, Cercle_Cur.Centre, Cercle_Cur.P3)

                   
        ' Détermine le sens de l'intero circulaire
        If Longueur(INDIRV_Vect) Then ' INDIRV_Vect :  Détermination du sens avec info INDIRV
            If Dot(VectNP1, INDIRV_Vect) < 0 Then
               Cercle_Cur.Code = PP_ARC_R 'G02 ( horaire )
               Cercle_Cur.GCode = 2
               Cercle_Cur.P2 = VecAdd(Cercle_Cur.Centre, Po2, -Cercle_Cur.Rayon)
            Else
               Cercle_Cur.Code = PP_ARC_L ' G03 (Trigo)
               Cercle_Cur.GCode = 3
               Cercle_Cur.P2 = VecAdd(Cercle_Cur.Centre, Po2, Cercle_Cur.Rayon)
            End If
        Else
            ' Notation CERCLE avec vecteur NORMAL pas d'indication du sens de parcours : utilisation de la normal
            If Dot(Cercle_Cur.Normal, Normal_Plan_Courant) < 0 Then
               Cercle_Cur.Code = PP_ARC_R ' G02 ( horaire )
               Cercle_Cur.GCode = 2
               Cercle_Cur.P2 = VecAdd(Cercle_Cur.Centre, Po2, -Cercle_Cur.Rayon)
            Else
               Cercle_Cur.Code = PP_ARC_L ' G03 (Trigo)
               Cercle_Cur.GCode = 3
               Cercle_Cur.P2 = VecAdd(Cercle_Cur.Centre, Po2, Cercle_Cur.Rayon)
            End If
        End If

        Cercle_Cur.Centre_Relatif = VecSub(Cercle_Cur.Centre, Cercle_Cur.P1)
       
        ' Remise à Zéro du vecteur INDIRV_Vect
        INDIRV_Vect.X = 0
        INDIRV_Vect.Y = 0
        INDIRV_Vect.Z = 0
End Sub

2 commentaires:

  1. Hi! I am a student. I'm trying to learn APT programming language and Visual Basic language.
    The code you posted, seemed hard to understand.
    Could you explain to me, please, what does VecProd, Longueur, Dot, VecSub VecAdd and sub-functions.

    Why not just use a cross product INDIRV vector and the vector from the start point to the center point of the circle?

    I spend a lot of time trying to find some useful information on the circular interpolation, but did not find, it looks difficult.


    Salut! Je suis un élève. J'essaie d'apprendre le langage de programmation APT et le langage Visual Basic.
    Le code que vous avez posté semblait difficile à comprendre.
    Pourriez-vous m'expliquer, s'il vous plaît, ce que VecProd, Longueur, Dot, VecSub VecAdd et sous-fonctions.

    Pourquoi ne pas utiliser un vecteur INDIRV produit croisé et le vecteur du point de départ au point central du cercle?

    Je passe beaucoup de temps à essayer de trouver des informations utiles sur l'interpolation circulaire, mais n'a pas trouvé, il semble difficile.

    RépondreSupprimer
  2. The different codes relativ to the vector calculation can be found here : http://5axes.blogspot.fr/2016/12/code-vb-vba-generqiue.html

    RépondreSupprimer