Outils pour utilisateurs

Outils du site


staubli

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
Prochaine révision Les deux révisions suivantes
staubli [2020/01/10 16:30]
bvandepo [Simulation]
staubli [2020/01/24 08:39]
bvandepo
Ligne 15: Ligne 15:
    
 Dans le cadre de ce projet, les communications entre le robot et l'​infrastructure se feront via Socket TCP à l'aide de chaînes de caractères ASCII et les autres entrées/​sorties numériques et analogiques ne seront pas utilisées. Dans le cadre de ce projet, les communications entre le robot et l'​infrastructure se feront via Socket TCP à l'aide de chaînes de caractères ASCII et les autres entrées/​sorties numériques et analogiques ne seront pas utilisées.
 +<ifauth @prof>
 TODO: lien vers vidéo TODO: lien vers vidéo
 +</​ifauth>​
  
 Le logiciel SRS étant payant, vous ne pourrez malheureusement pas reproduire la manip en dehors de l'AIP. Le logiciel SRS étant payant, vous ne pourrez malheureusement pas reproduire la manip en dehors de l'AIP.
Ligne 50: Ligne 50:
   - Dans SRS, cliquer en haut à gauche sur l'​icone de bras jaune.   - Dans SRS, cliquer en haut à gauche sur l'​icone de bras jaune.
   - Cliquer sur "​Nouvelle->​ Assistant nouvelle cellule"​   - Cliquer sur "​Nouvelle->​ Assistant nouvelle cellule"​
-  - Donner un nom au projet, ​par exemple ​CellStaubliAIP+  - Donner un nom au projet, ​ici vous utiliserez "CellStaubliAIP" suivi d'un numéro qui vous sera attribué en début de séance et que vous conserverez durant toutes les séances
   - S'​assurer que l'​armoire de commande est sous tension et démarrée depuis 2 minutes   - S'​assurer que l'​armoire de commande est sous tension et démarrée depuis 2 minutes
   - Cliquer sur "A partir d'un contrôleur distant"​   - Cliquer sur "A partir d'un contrôleur distant"​
Ligne 56: Ligne 56:
   - La version de l'​émulateur s7.9.1 n'est pas installée, il faut donc sélectionner ​ la 7.10   - La version de l'​émulateur s7.9.1 n'est pas installée, il faut donc sélectionner ​ la 7.10
   - Cliquer sur "​Suivant"​   - Cliquer sur "​Suivant"​
 +
 +<ifauth @prof>
 +Si problème lors du téléchargement des infos depuis le controleur à la création de la cellule, il faut faire le ménage sur le controleur avec FTP et ne laisser que camera, cognex, cognexComm7en,​ commCamera2 et EntreeSortie.
 +TODO: automatiser le ménage (sauvegarde et effacement)
 +</​ifauth>​
  
 En cas de problème pour créer la cellule, vous pouvez, après accord de l'​enseignant,​ télécharger le fichier zip suivant en remplacement: ​ http://​homepages.laas.fr/​bvandepo/​files/​staubli/​projets_SRS/​CellStaubliAIPVide.zip En cas de problème pour créer la cellule, vous pouvez, après accord de l'​enseignant,​ télécharger le fichier zip suivant en remplacement: ​ http://​homepages.laas.fr/​bvandepo/​files/​staubli/​projets_SRS/​CellStaubliAIPVide.zip
Ligne 160: Ligne 165:
 Ensuite il faut associer l'​outils à la variable tTool, pour cela: Ensuite il faut associer l'​outils à la variable tTool, pour cela:
   - Sélectionner le Tool1 dans l'​arborescence puis faire CTRL+C ​   - Sélectionner le Tool1 dans l'​arborescence puis faire CTRL+C ​
-  - pour utiliser un outils de la géométrie graphique vers une variable val3, il faut clic gauche sur le handler de l'​outils,​ CTRL+C et coller dans la ligne de la variable ​du tool dans l'​onglet données+  - pour utiliser un outils de la géométrie graphique vers une variable val3, il faut clic gauche sur le handler de l'​outils,​ CTRL+C et coller dans la ligne de la variable ​tTool[0] ​dans l'​onglet données. Vous devriez obtenir un vecteur dont toutes les composantes sont à 0 à l’exception du champ Z à 117.25.
  
  
Ligne 230: Ligne 235:
  
 ====Gestion du temps==== ====Gestion du temps====
 +Présentation au tableau de la gestion du temps par le contrôleur du robot. 
 +<ifauth @prof>
 TODO: expliquer delay, waitEndMove,​ la file d'​ordre et le lissage de trajectoire TODO: expliquer delay, waitEndMove,​ la file d'​ordre et le lissage de trajectoire
  
 dans un premier temps, mouvements saccadés puis lissés dans un premier temps, mouvements saccadés puis lissés
 +</​ifauth>​
  
  
Ligne 283: Ligne 289:
   - Fenêtre "​Emulator Controller",​ cliquer sur "​Move"​   - Fenêtre "​Emulator Controller",​ cliquer sur "​Move"​
  
 +<ifauth @prof>
 TODO : expliquer espions sur variables locales et globales TODO : expliquer espions sur variables locales et globales
 +/ifauth>
 ===Mode "​Exécution continue"​ === ===Mode "​Exécution continue"​ ===
  
Ligne 549: Ligne 555:
  
 ====Le robot en tant que capteur==== ====Le robot en tant que capteur====
 +Présentation au tableau de la gestion de l'​émission de l'​état du robot via socket UDP.
 +<ifauth @prof>
 TODO:  faire une tâche périodique en VAL3 qui envoie en UDP la pose courante du robot T,R, et joint comme n'​importe quel capteur. TODO:  faire une tâche périodique en VAL3 qui envoie en UDP la pose courante du robot T,R, et joint comme n'​importe quel capteur.
 +/ifauth>
  
 =====Mise en oeuvre sur le robot===== =====Mise en oeuvre sur le robot=====
Ligne 563: Ligne 571:
 Mettre l'​interrupteur rotatif gris clair à gauche de l'​armoire de commande en position "​flêche vers le haut" pour alimenter le robot. Mettre l'​interrupteur rotatif gris clair à gauche de l'​armoire de commande en position "​flêche vers le haut" pour alimenter le robot.
  
 +<ifauth @prof>
 TODO: mettre les 2 photos de la façade TODO: mettre les 2 photos de la façade
 +</​ifauth>​
  
 Ne surtout jamais rallumer le robot juste après l'​avoir éteint sans attendre au moins une dizaine de secondes. Ne surtout jamais rallumer le robot juste après l'​avoir éteint sans attendre au moins une dizaine de secondes.
Ligne 572: Ligne 581:
   - En mode manuel, le robot s'​arrête si l'​utilisateur n'​exerce pas de pression sur le bouton de l'​homme mort et qu'il ne presse pas en continu le bouton Move/Hold. Ce sera le mode à utiliser pendant les tests et réglages sur le robot afin de pouvoir ​   - En mode manuel, le robot s'​arrête si l'​utilisateur n'​exerce pas de pression sur le bouton de l'​homme mort et qu'il ne presse pas en continu le bouton Move/Hold. Ce sera le mode à utiliser pendant les tests et réglages sur le robot afin de pouvoir ​
   - En mode automatique... ​   - En mode automatique... ​
 +<ifauth @prof>
 ... TODO: expliquer les 3 positions de clef ... TODO: expliquer les 3 positions de clef
 +</​ifauth>​
  
 ===Cas particulier du retour de vacances==== ===Cas particulier du retour de vacances====
Ligne 599: Ligne 609:
   - caractère fin de chaine: 13   ​(identifie le caractère ASCII devant se trouver à la fin de toutes les chaines échangées via sockets)   - caractère fin de chaine: 13   ​(identifie le caractère ASCII devant se trouver à la fin de toutes les chaines échangées via sockets)
  
 +<ifauth @prof>
 TODO: Vérifier si il est possible d'​ajouter des sockets au projet SRS via le pendant virtuel???? TODO: Vérifier si il est possible d'​ajouter des sockets au projet SRS via le pendant virtuel????
 +</​ifauth>​
  
 ====Chargement de l'​application dans l'​armoire de commande==== ====Chargement de l'​application dans l'​armoire de commande====
Ligne 999: Ligne 1009:
 </​file>​ </​file>​
  
 +
 +=====Programmes Bertrand=====
 +
 +<file cpp start.c>
 +begin
 +  ​
 +  //​B.Vandeportaele 2019
 +  //​activation puissance pour mode deporte
 +  enablePower() ​
 +  //​effacement écran USER
 +  cls()  ​
 +  //selection écran USER
 +  userPage()
 +  //putln( "​démarrage application"​) ​
 +  put("​date:​ ")
 +  putln(getDate("​ %d/%m/%Y %H:​%M:​%S"​))
 +  ​
 +  nNum[0]=0
 +  put(nNum[0])
 + 
 +  //affichage compte à rebours
 +  gotoxy(0,1)
 +  put("​départ dans:   "​)
 +  for nNum[0]=1 to 0 step -1
 +    gotoxy(13,​1)
 +    put(nNum[0])
 +    putln("​ s   "​)
 +    delay(1)
 +  endFor
 +  ​
 +    ​
 +  nNum[0]=0
 +  gotoxy(0,2)
 +  putln("​ KABOUM2 !!!!!!! ​ ")
 +  ​
 +  ​
 +  //TODO faire un sous programme qui teste la communication ​
 +  //avec les différentes adresses (via timeout)
 +  call initSockets()
 +  ​
 +
 +  bOverRun=false
 +  //​emissionEtat est un programme créé, et éxecuté à une périodicité de 0.01s
 +  //​taskCreateSync "​emissionEtat",​.01,​bOverRun,​emissionEtat()
 +  taskCreateSync "​emissionEtat",​1,​bOverRun,​emissionEtat()
 +  putln("​Tache periodique emission Etat lancee"​)
 +
 +  ///////////////////////////////////////////////////////​
 +  //​configuration des points en articulaire par programme
 +  //position bras levé
 +  A={0,​ 0,​ 0,​ 0,​ 0,​ 0}
 +  //position bras vers le bas
 +  B={0,​ -50,​ -90,​ 0,​ -40,​ 0}
 +  ​
 +  //impose une vitesse faible pour les premiers déplacements du robot
 +  //on ne peut que ralentir la vitesse avec le programme, c'est à l'​utilisateur de l'​augmenter avec Emulator Controller ou avec le pendant
 +
 +  //attention cette vitesse est prise en compte par l'​armoire de commande en mode automatique
 +  //​setMonitorSpeed(10) ​
 +
 +    ​
 +  //​positionnement du bras dans une configuration initiale connue en donnant une consigne articulaire (joint)
 +  putln("​positionnement du bras dans une configuration initiale connue en donnant une consigne articulaire (joint) ")
 +  //bras vers le haut
 +  movej( A,tTool, mdescA)
 +  waitEndMove()
 +  //bras vers le bas
 +  movej( B,tTool, mdescA)
 +  ​
 +  waitEndMove()
 +  putln("​positionnement du bras atteinte"​)
 +  ///////////////////////////////////////////////////////​
 +
 +  if(true)
 +    //Cette instruction renvoie un point modifié par transformation géométrique. La transformation est définie par rapport aux axes du centre outil d'​entrée.
 +    //Le repère de référence et la configuration du point renvoyé sont ceux du point d'​entrée.
 +    //Une erreur d'​exécution est générée si aucun repère de référence n'est défini pour pPosition.
 +  ​
 +    // Approche :Mouvement d'​approche à 100 mm au-dessus du point (axe Z)
 +    // movej(appro(pDestination,​{0,​0,​-100,​0,​0,​0}),​ flange, mNomDesc)
 +    // Aller au pointmovel(pDestination,​ flange, mNomDesc)
 +  ​
 +  ​
 +    while(true)
 +      putln("​Approche pour la saisie du bouchon"​)
 +      movej(appro(pPointSaisieBou[0],​{0,​0,​-100,​0,​0,​0}),​ tTool, mdescA)
 +      //​waitEndMove()
 +      //Attendre que la position du robot se stabilise
 +      while(isSettled()==false)
 +        putln("​."​)
 +      endWhile
 +      ​
 +      ​
 +  ​
 +  ​
 +      putln("​saisie du bouchon"​)
 +      movej(pPointSaisieBou[0],​ tTool, mdescA)
 +    ​
 +      putln("​Eloignement après la saisie du bouchon"​)
 +      movej(appro(pPointSaisieBou[0],​{0,​0,​-100,​0,​0,​0}),​ tTool, mdescA)
 +      waitEndMove()
 +  ​
 +      putln("​Approche pour le vissage du bouchon"​) ​
 +      //100mm au dessus
 +      movej(appro(pPointVisBou[0],​{0,​0,​-100,​0,​0,​0}),​ tTool, mdescA)
 +      waitEndMove()
 +  ​
 +      //baisser la vitesse
 +      //​setMonitorSpeed(10)
 +      ​
 +      putln("​vissage du bouchon"​)
 +      mdescA.blend=off
 +      mdescA.leave=0
 +      mdescA.reach=0
 +      movej(pPointVisBou[0],​ tTool, mdescA)
 +    ​
 +      bBoolVisFini=false
 +    ​
 +      //il faut activer le lissage en mode '​joint'​ pour que les commandes s'​enchainent
 +      mdescA.blend=joint
 +      mdescA.leave=0
 +      mdescA.reach=0
 +      ​
 +      for nNum[0]=0 to 10 step 1 
 +        put("​itération:​ ")
 +        put(nNum[0])
 +        put(" ​ ->  ")
 +        movej(appro(pPointVisBou[0],​{0,​0,​nNum[0]*2.2/​8,​0,​0,​nNum[0]*45}),​ tTool, mdescA)
 +      endFor
 +      ​
 +      nNum[0]=0
 +      while bBoolVisFini==false
 +        //
 +        //      movej(appro(pPointVisBou[0],​{0,​0,​nNum[0]*1.2,​0,​0,​nNum[0]*90}),​ tTool, mdescA)
 +        //   ​waitEndMove()
 +      ​
 +        if(false)
 +          jJointActuel=herej()
 +          put("​jJointActuel[0]:​ ")
 +          put(jJointActuel[0].j1)
 +          put(", ")
 +          put(jJointActuel[0].j2)
 +          put(", ")
 +          put(jJointActuel[0].j3)
 +          put(", ")
 +          put(jJointActuel[0].j4)
 +          put(", ")
 +          put(jJointActuel[0].j5)
 +          put(", ")
 +          put(jJointActuel[0].j6)
 +          putln(" ​      "​)
 +        endIf
 +        ​
 +        // condition d'​arrêt si la fifo est vidée
 +        if isEmpty()
 +          bBoolVisFini=true ​
 +          putln("​arret vissage fin de mouvement!"​)
 +        endIf
 +     
 +        nNumOrdreActuel[0]= getMoveId() ​         ​
 +        put("​nNumOrdreActuel:​ ")
 +        putln(nNumOrdreActuel[0])
 +        ​
 +        //ajouter une condition sur le capteur de couple ​       ​
 +        //if nNum[0]>​=10
 +
 +        //émission chaine complète
 +        cClient_socket="​r 5 6 2"
 +        x_sMsg=cClient_socket
 +        putln("​chaine recue:"​)
 +        put(x_sMsg)
 +        x_sMsg= toNum(x_sMsg,​ nNum, bBool)
 +        x_sMsg= toNum(x_sMsg,​ nNum2, bBool)
 +        x_sMsg= toNum(x_sMsg,​ nNum3, bBool)
 +        if nNum3==1
 +          bBoolVisFini=true ​        
 +          stopMove()
 +          ​
 +          resetMotion() ​         ​
 +          putln("​arret vissage capteur!"​)
 +          ​
 +        endIf
 +    ​
 +        ​
 +        if bBoolVisFini==false
 +          nNum[0]=nNum[0]+1
 +        endIf
 +        ​
 +        //endFor
 +        ​
 +      endWhile
 +    ​
 +  ​
 +      //remonter la vitesse, ne fonctionne pas si l'​utilisateur peut régler manuellement la vitesse
 +      //​setMonitorSpeed(25)
 +      ​
 +      // il faut garder l'​angle de vissage sinon l'​outils va devisser en remontant
 +      putln("​Eloignement après le vissage du bouchon"​)
 +      //recupère la pose courante en cartésien
 +      pPointActuel[0]=here(tTool,​fFrame[0])
 +      //remonte de 100 par rapport à la position courante 100mm au dessus
 +      movej(appro(pPointActuel[0],​{0,​0,​-100,​0,​0,​0}),​ tTool, mdescA)
 +      waitEndMove()
 +      ​
 +      // problème, en cartésien, les tours faits pour le vissage ne sont pas défaits....
 +      putln("​Dévissage pour revenir au 0")
 +      jJointActuel=herej()
 +      jJointActuel[0].j6=0
 +      movej( jJointActuel[0],​ tTool, mdescA)
 +      waitEndMove()
 +  ​
 +    endWhile
 +  endIf
 + 
 +  ​
 +  ​
 +  if true
 +    while true
 +      put("​*"​)
 +    ​
 +      //​sioSet(cUdpsock,​asc(x_sMsg) ) 
 +      //​nNum[0]=ioStatus(cClient_socket)
 +      //0 L'​entrée-sortie fonctionne. ​
 +      //1 L'​entrée-sortie fonctionne mais elle est verrouillée par l'​opérateur. Les entrées ont alors une valeur fixe (contrôlée par l'​opérateur) qui peut être différente de la valeur matérielle. Les sorties ont alors une valeur
 +      //fixe contrôlée par l'​opérateur : l'​écriture sur la sortie n'a aucun effet. Le mode de verrouillage est un moyen de débogage. ​
 +      //2 L'​entrée-sortie est simulée (entrée-sortie logicielle, sans effet sur le matériel). ​
 +      //-1 L'​entrée-sortie ne fonctionne pas parce que le lien (adresse physique) n'est pas défini. ​
 +      //-2 L'​entrée-sortie ne fonctionne pas parce que le lien (adresse physique) ne correspond à aucune entrée-sortie du système. Le matériel correspondant à l'​adresse physique n'est pas installé ou n'a pas pu être initialisé. ​
 +      //-3 L'​entrée-sortie ne fonctionne pas parce que le dispositif d'​entrée-sortie est en erreur. ​
 +
 +      //​putln("​envoi"​)
 +      //émission chaine complète
 +      cClient_socket="​r 5 6 2"
 +      //​putln("​requete0"​)
 +      //émission chaine caractère par caractère
 +      //    for nNum[0]=0 to(len(x_sMsg)-1)
 +      //      sioSet(cUdpsock,​asc(x_sMsg, ​ nNum[0]))  ​
 +      //    endFor
 +      //    sioSet(cUdpsock,​13)
 +      //    sioSet(cUdpsock,​10)
 +    ​
 +      //tentative de reception d'un caractère, bloquant jusqu'​au timeout
 +      //    nNum[0]=sioGet(cUdpsock,​ nCarRecu[0])
 +      //    if nNum[0]>​0
 +      //      put(chr(nCarRecu[0])) ​     ​
 +      //    endIf
 +
 +      //reception d'une chaine de caractère d'un seul coup, devant se terminer par "​endOfString"​
 +    ​
 +      x_sMsg=cClient_socket
 +      // x_sMsg="​70"​
 +      putln("​chaine recue:"​)
 +      put(x_sMsg)
 +
 +      if false
 +        ///pour débugage; affichage des codes ascii recus
 +        putln("​chaine en ascii decimal:"​)
 +        for nNum= 0 to len(x_sMsg)-1
 +          put(nNum)
 +          put(" : ")
 +          put(asc(x_sMsg,​nNum))
 +          putln(""​)
 +        endFor
 +      endIf
 +      ​
 +      //parsing, il ne faut pas que la chaine se termine par la valeur numérique à parser, ajouter un espace à la fin
 +      //  x_sMsg="​70"​
 +      //​x_sMsg=x_sMsg+"​. "
 +     
 +      ​
 +      ​
 +      x_sMsg= toNum(x_sMsg,​ nNum, bBool)
 +      if(bBool==true)
 +        put("​décodé:"​)
 +        put(nNum)
 +      else
 +        put("​erreur décodage"​)
 +      endIf
 +      putln(""​)
 +
 +
 +
 +      x_sMsg= toNum(x_sMsg,​ nNum2, bBool)
 +      if(bBool==true)
 +        put("​décodé:"​)
 +        put(nNum2)
 +      else
 +        put("​erreur décodage"​)
 +      endIf
 +      putln(""​)
 +
 +      x_sMsg= toNum(x_sMsg,​ nNum3, bBool)
 +      if(bBool==true)
 +        put("​décodé:"​)
 +        put(nNum3)
 +      else
 +        put("​erreur décodage"​)
 +      endIf
 +      putln(""​)
 +
 +
 +      //delay(1)
 +      //true pour commande en articulaire
 +      //false pour commande en cartesien
 +      if false   
 +        nNum=nNum/​100
 +        nNum2=nNum2/​100
 +        nNum3=nNum3*50
 +       
 +        //A[0]=nNum
 +        A={nNum,​ nNum2,​ nNum3,​ -0,​ 0,​ 0}
 +        //​vérification que le point visé soit atteignable pour 
 +        //ne pas faire planter dans le cas contraire
 +        if isInRange(A)
 +          putln("​atteignable ​   ")
 +          movej( A,​tTool,​mdescA)
 +          waitEndMove()  ​
 +        else
 +          putln("​non atteignable"​)
 +          //delay pour avoir le temps de voir
 +          delay(1)
 +        endIf
 +     
 +      else
 +     
 +        nNum=nNum/​10
 +        nNum2=nNum2/​10
 +        nNum3=nNum3*50
 +     
 +     
 +       
 +        // Aj[0]= ​  ​{157,​ 84,​ -50,​ -206,​ -41,​ -51}
 +  ​
 +        //MGD
 +        Ac[0]=jointToPoint(tTool,​fFrame[0], ​ B)
 +        put("​Ac[0]:​ ")
 +        put(Ac[0].trsf.x)
 +        put(", ")
 +        put(Ac[0].trsf.y)
 +        put(", ")
 +        put(Ac[0].trsf.z)
 +        put(", ")
 +        put(Ac[0].trsf.rx)
 +        put(", ")
 +        put(Ac[0].trsf.ry)
 +        put(", ")
 +        put(Ac[0].trsf.rz)
 +        putln(",​ ")
 +        if(Ac[0].config.shoulder==righty)
 +          put("​shoulder righty"​)
 +        endIf
 +        if(Ac[0].config.shoulder==lefty)
 +          put("​shoulder lefty"​)
 +        endIf
 +        //​put(pPointRx[0].config.shoulder)
 +        //​putln(",​ ")
 +        //​put(pPointRx[0].config.shoulder)
 +        //​putln(",​ ")
 +        //​put(pPointRx[0].config.wrist)
 +        //​putln(",​ ")
 +        //​put(pPointRx[0].config.elbow)
 +        putln(" ​      "​)
 +
 +
 +        //position de travail en articulaire
 +        //movej( B,tTool, mdescB)
 +        //​waitEndMove()  ​
 +    ​
 +        Ac=here(tTool,​fFrame[0])
 +        put("​pPointRx[0]:​ ")
 +        put(Ac[0].trsf.x)
 +        put(", ")
 +        put(Ac[0].trsf.y)
 +        put(", ")
 +        put(Ac[0].trsf.z)
 +        put(", ")
 +        put(Ac[0].trsf.rx)
 +        put(", ")
 +        put(Ac[0].trsf.ry)
 +        put(", ")
 +        put(Ac[0].trsf.rz)
 +        //​putln(",​ ")
 +        //​put(Ac[0].config.shoulder)
 +        //​putln(",​ ")
 +        //​put(Ac[0].config.shoulder)
 +        //​putln(",​ ")
 +        //​put(Ac[0].config.wrist)
 +        //​putln(",​ ")
 +        //​put(Ac[0].config.elbow)
 +        putln(" ​      "​)
 +     
 +     
 +     
 +
 +        //génère un nombre aléatoire suivant
 +        //call rand(0) ​   ​
 +        //​xObj=-200+seed%400
 +        //call rand(0) ​   ​
 +        //​yObj=-200+seed%400
 +      ​
 +        //injecte la consigne issue du capteur
 +        Ac[0].trsf.x=-400+nNum
 +        Ac[0].trsf.y=49+nNum2
 +        Ac[0].trsf.z=-116-nNum3
 +      ​
 +        //    Ac[0].trsf.x=Ac[0].trsf.x+1
 +    ​
 +    ​
 +        //​vérification que le point visé soit atteignable pour 
 +        //ne pas faire planter dans le cas contraire
 +        if pointToJoint(tTool,​herej(),​Ac[0],​B[0])
 +          putln("​atteignable ​   ")
 +          // if isInRange(()
 +    ​
 +    ​
 +          movej( Ac,tTool, mdescA)
 +          waitEndMove()  ​
 +        else
 +          putln("​non atteignable"​)
 +          //delay pour avoir le temps de voir
 +          delay(1)
 +        endIf
 +     
 +        //    pPointRx=here(tTool,​fFrame[0])
 +        //    put("​pPointRx[0]:​ ")
 +        //    put(pPointRx[0].trsf.x)
 +        //    put(", ")
 +        //    put(pPointRx[0].trsf.y)
 +        //    put(", ")
 +        //    put(pPointRx[0].trsf.z)
 +        //    put(", ")
 +        //    put(pPointRx[0].trsf.rx)
 +        //    put(", ")
 +        //    put(pPointRx[0].trsf.ry)
 +        //    put(", ")
 +        //    put(pPointRx[0].trsf.rz)
 +     
 +        putln(" ​      "​)
 +    ​
 +      endIf
 +      ​
 +    endWhile
 +  endIf
 +  ///////////////////////////////////////////​
 +  ​
 +  ​
 +    ​
 +  //test des sockets ​ UDP
 +  ​
 +  x_sMsg="​Bonjour de la part de RX60"
 +
 +  //"​endOfString"​ num (Pour ligne série, client et serveur TCP) Code ASCII pour le caractère de fin de chaîne à utiliser avec les opérateurs '​='​ (dans la plage [0, 255]) 
 +  if(sioCtrl(cUdpsock,​ "​endOfString",​ 13)!=0)
 +    putln("​probleme D")
 +  endIf
 +  ​
 +  if(sioCtrl(cUdpsock,​ "​port",​ 20000)!=0)
 +    putln("​probleme A")
 +  endIf
 +  ​
 +  if(sioCtrl(cUdpsock,​ "​target",​ "​192.168.1.49"​)!=0)
 +    putln("​probleme B")
 +  endIf
 + 
 +  //0 pour configurer les lectures sur socket bloquantes,
 +  //une autre valeur en seconde sinon
 +  if(sioCtrl(cUdpsock,​ "​timeout",​ 10)!=0 )
 +    putln("​probleme C")
 +  endIf
 +  ​
 +  ​
 +  if true
 +    while true
 +      put("​."​)
 +    ​
 +      //​sioSet(cUdpsock,​asc(x_sMsg) ) 
 +      nNum[0]=ioStatus(cUdpsock)
 +      //0 L'​entrée-sortie fonctionne. ​
 +      //1 L'​entrée-sortie fonctionne mais elle est verrouillée par l'​opérateur. Les entrées ont alors une valeur fixe (contrôlée par l'​opérateur) qui peut être différente de la valeur matérielle. Les sorties ont alors une valeur
 +      //fixe contrôlée par l'​opérateur : l'​écriture sur la sortie n'a aucun effet. Le mode de verrouillage est un moyen de débogage. ​
 +      //2 L'​entrée-sortie est simulée (entrée-sortie logicielle, sans effet sur le matériel). ​
 +      //-1 L'​entrée-sortie ne fonctionne pas parce que le lien (adresse physique) n'est pas défini. ​
 +      //-2 L'​entrée-sortie ne fonctionne pas parce que le lien (adresse physique) ne correspond à aucune entrée-sortie du système. Le matériel correspondant à l'​adresse physique n'est pas installé ou n'a pas pu être initialisé. ​
 +      //-3 L'​entrée-sortie ne fonctionne pas parce que le dispositif d'​entrée-sortie est en erreur. ​
 +
 +      //émission chaine complète
 +      cUdpsock="​requete0"​
 +    ​
 +      //émission chaine caractère par caractère
 +      //    for nNum[0]=0 to(len(x_sMsg)-1)
 +      //      sioSet(cUdpsock,​asc(x_sMsg, ​ nNum[0]))  ​
 +      //    endFor
 +      //    sioSet(cUdpsock,​13)
 +      //    sioSet(cUdpsock,​10)
 +    ​
 +      //tentative de reception d'un caractère, bloquant jusqu'​au timeout
 +      //    nNum[0]=sioGet(cUdpsock,​ nCarRecu[0])
 +      //    if nNum[0]>​0
 +      //      put(chr(nCarRecu[0])) ​     ​
 +      //    endIf
 +
 +      //reception d'une chaine de caractère d'un seul coup, devant se terminer par "​endOfString"​
 +    ​
 +      x_sMsg=cUdpsock
 +      put(x_sMsg)
 +      //delay(1)
 +    endWhile
 +  endIf
 +  ​
 +  putln("​doB_15"​)
 +  while true
 +    doB_15[0]=true
 +    put("​1"​)
 +    delay(1)
 +    ​
 +    doB_15[0]=false
 +    put("​0"​)
 +    delay(1)
 +    ​
 +  endWhile
 +  ​
 +  if(false)
 +    putln("​lecture capteur par socket"​)
 +    while true
 +      put("​."​)
 +      //émission chaine complète
 +      cUdpsock="​lecture capteur 1"
 +      x_sMsg=cUdpsock
 +      put(x_sMsg)
 +    endWhile
 +
 +  else 
 +    putln("​lecture capteur par IO TOR diB_13"​)
 +    while true
 +      put("​."​)
 +      ​
 +      nNum[0]=ioStatus(diB_13,​ x_sMsg, x_sMsg2)
 +      put( "​ioStatus= ")
 +      putln (nNum[0])
 +      if nNum[0]<​0
 +        putln("​Signal "​+x_sMsg2+ "en erreur"​) ​
 +        putln("​Description :"​+x_sMsg)
 +      endIf
 +        ​
 +        ​
 +      if(diB_13==true)
 +        x_sMsg="​1"​
 +        doB_15=true
 +      else
 +        x_sMsg="​0"​
 +        doB_15=false
 +      endIf
 +      ​
 +      ​
 +      ​
 +      put(x_sMsg)
 +      delay(1)
 +    endWhile
 +  endIf
 +  //fermer la connexion ​ ??? (vider les buffers
 +  nNum[0]=clearBuffer(cUdpsock)
 +end
 +</​file>​
 +
 +<file cpp initSocket.c>​
 +begin
 +  bServeurTrouve=false
 +  ​
 +  //nombre de serveurs définis
 +  nNum=3 ​
 +  ​
 +  while bServeurTrouve==false
 +    ​
 +    ​
 +  ​
 +    clearBuffer(cClient_socket)
 +    //"​endOfString"​ num (Pour ligne série, client et serveur TCP) Code ASCII pour le caractère de fin de chaîne à utiliser avec les opérateurs '​='​ (dans la plage [0, 255]) 
 +    if(sioCtrl(cClient_socket,​ "​endOfString",​ 13)!=0)
 +      putln("​probleme sioCtrl(cClient_socket,​ endOfString,​ 13)")
 +    endIf
 +    //port 30000 utilisé par socket UDP
 +    if(sioCtrl(cClient_socket,​ "​port",​ 30000)!=0)
 +      putln("​probleme sioCtrl(cClient_socket,​ port, 30000)"​)
 +    endIf
 +    //0 pour configurer les lectures sur socket bloquante,
 +    //une autre valeur en seconde sinon
 +    if(sioCtrl(cClient_socket,​ "​timeout",​1)!=0 )
 +      putln("​probleme sioCtrl(cClient_socket,​ timeout,​2)"​)
 +    endIf
 +  ​
 +    //  if(sioCtrl(cClient_socket,​ "​nagle",​false)!=0 )
 +    //    putln("​probleme sioCtrl(cClient_socket,​ nagle,​false)"​)
 +    // endIf
 +  ​
 +  ​
 +  ​
 +    if nNum==0
 +      putln("​Serveur NON TROUVE, on recommence le scan"​) ​       ​
 +      nNum=3
 +    endIf
 +    switch(nNum)
 +      //le scan fonctionne mais il faut que toutes les adresses soient joignables.
 +      //si une adresse balayée n'est pas joignable, une adresse suivante ne pourra pas être jointe
 +      //dans ce cas mettre manuellement l'​adresse du bon serveur en premier ​
 +      case 3
 +        //rapid en filaire à la maison et a l'aip (meme adresse)
 +        sAdrIPServeur="​192.168.1.49"  ​
 +        //​sAdrIPServeur="​192.168.1.254"  ​
 + 
 +        // sAdrIPServeur="​192.168.43.14" ​  
 +      break
 +      case 2
 +        //rapid en filaire ​
 +        //      sAdrIPServeur="​192.168.1.49"​
 +        //rapid en wifi à l'aip sur WIFI AIP ROBOT
 +        sAdrIPServeur="​192.168.3.5"​
 +     
 +
 +        //test bidon google
 +        //​sAdrIPServeur="​8.8.8.8"​
 +      break
 +   
 +      case 1
 +        //rapid en wifi via huawei GR5
 +        sAdrIPServeur="​192.168.43.14" ​  
 +      break
 +    endSwitch
 +    ​
 +    put("​essai serveur: ")
 +    putln(sAdrIPServeur)
 +    if(sioCtrl(cClient_socket,​ "​target",​ sAdrIPServeur)!=0)
 +      putln("​probleme sioCtrl(cClient_socket,​ target, sAdrIPServeur)"​)
 +    endIf
 +    ​
 +    delay(2)
 +    ​
 +    //nNum2=13
 +    //​if(sioSet(cClient_socket,​nNum2)==-1)
 +    //​if(sioSet(cClient_socket,​nNum2)<​1)
 +    ​
 +    //fait une requette bidon
 +    sEtat="​r 5 6 2"
 +    //​redimensionne nNum2 pour traduire la chaine vers un tableau de caractères
 +    resize(nNum2,​1,​len(sEtat)+1)
 +    for nNum3=0 to len(sEtat)
 +      nNum2[nNum3]=asc(sEtat,​nNum3)  ​
 +    endFor
 +    nNum2[len(sEtat)]=13
 +    // delay(1) ​
 +    ​
 +    ​
 +    //​resize(nNum2,​1,​128)
 +    nNum3=5
 +    //for nNum4=0 to 30
 +    while nNum3>0 and bServeurTrouve==false
 +      put("​tentative:​ ")
 +      putln(nNum3)
 +      if(sioSet(cClient_socket,​nNum2)!=-1)
 +        bServeurTrouve=true
 +        put("​serveur capteur trouve: ")
 +        putln(sAdrIPServeur)
 +        //delay(3)
 +      endIf
 +      nNum3=nNum3-1
 +    endWhile
 +    nNum=nNum-1
 +  endWhile
 +  ​
 +  ​
 +  //test des sockets ​ TCP
 +  ​
 +  x_sMsg="​Bonjour de la part de RX60"
 +
 +  /////// CONFIGURATION SOCKET UDP /////////
 +  ​
 +  ​
 +  //"​endOfString"​ num (Pour ligne série, client et serveur TCP) Code ASCII pour le caractère de fin de chaîne à utiliser avec les opérateurs '​='​ (dans la plage [0, 255]) 
 +  if(sioCtrl(cUdpsock,​ "​endOfString",​ 13)!=0)
 +    putln("​probleme D")
 +  endIf
 +  ​
 +  if(sioCtrl(cUdpsock,​ "​port",​ 10000)!=0)
 +    putln("​probleme A")
 +  endIf
 +  ​
 +  if(sioCtrl(cUdpsock,​ "​target",​ sAdrIPServeur)!=0)
 +    putln("​probleme B")
 +  endIf
 + 
 +  //0 pour configurer les lectures sur socket bloquantes,
 +  //une autre valeur en seconde sinon
 +  if(sioCtrl(cUdpsock,​ "​timeout",​ 10)!=0 )
 +    putln("​probleme C")
 +  endIf
 +  ​
 +  ​
 +  ​
 +  ////  FIN CONFIGURATION SOCKET UDP ///////
 +
 +
 +end
 +</​file>​
 +
 +<file cpp emissionEtat.c>​
 +begin
 +  while true
 +    pHereEtat=here(tTool,​world)
 +    jHereEtat=herej()
 +    //    putln(pHereEtat[0].trsf.x)
 +    ​
 +    //émission chaine complète
 +    //déclarer une variable string et utiliser la fonction tostring pour formater
 +    //adresse mac???
 +    //​cUdpsock="​DC:​4F:​22:​00:​00:​00 0 191.000000 6 0"
 +    sEtat="​DC:​4F:​22:​00:​00:​00 100 " +toString("​.6",​pHereEtat[0].trsf.x)
 +    sEtat=sEtat+"​ "​+toString("​.6",​pHereEtat[0].trsf.y)
 +    sEtat=sEtat+"​ "​+toString("​.6",​pHereEtat[0].trsf.z)
 +    sEtat=sEtat+"​ "​+toString("​.6",​pHereEtat[0].trsf.rx)
 +    sEtat=sEtat+"​ "​+toString("​.6",​pHereEtat[0].trsf.ry)
 +    sEtat=sEtat+"​ "​+toString("​.6",​pHereEtat[0].trsf.rz)
 +    //​sEtat=sEtat+"​ "​+toString("​.6",​pHereEtat[0].config.shoulder) ​
 +    //ce n'est pas un numero
 +    cUdpsock=sEtat
 +    ​
 +    //envoi en 2 temps de la config du robot, car sinon la chaine est tronquée car trop longue (>128 octets)
 +    //envoyer les paramètres suivants avec un offset par rapport aux précédents
 +    sEtat="​DC:​4F:​22:​00:​00:​00 106 " +toString("​.6",​jHereEtat[0].j1)
 +    sEtat=sEtat+"​ "​+toString("​.6",​jHereEtat[0].j2)
 +    sEtat=sEtat+"​ "​+toString("​.6",​jHereEtat[0].j3)
 +    sEtat=sEtat+"​ "​+toString("​.6",​jHereEtat[0].j4)
 +    sEtat=sEtat+"​ "​+toString("​.6",​jHereEtat[0].j5)
 +    sEtat=sEtat+"​ "​+toString("​.6",​jHereEtat[0].j6)
 +    cUdpsock=sEtat
 +    ​
 +    delay(0)
 +    ​
 +   
 +  endWhile
 +end
 +
 +</​file>​
  
  
 </​ifauth> ​ </​ifauth> ​
staubli.txt · Dernière modification: 2020/02/06 15:02 par bvandepo