Strumenti Utente

Strumenti Sito


riservata:pw3a2025

Differenze

Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.

Link a questa pagina di confronto

Entrambe le parti precedenti la revisioneRevisione precedente
Prossima revisione
Revisione precedente
riservata:pw3a2025 [2025/04/20 09:06] – [La parte del robot] adminriservata:pw3a2025 [2025/05/27 07:48] (versione attuale) – [Cose minori] admin
Linea 10: Linea 10:
   * coloro le caselle bianche e le raggruppo tutte per fare l'oggetto scacchiera   * coloro le caselle bianche e le raggruppo tutte per fare l'oggetto scacchiera
   * creo il work object wobj_scacchiera_a1 poi lo attacco (attach) a scacchiera, in modo che sia legato alla posizione della scacchiera (-600, -160, 0)   * creo il work object wobj_scacchiera_a1 poi lo attacco (attach) a scacchiera, in modo che sia legato alla posizione della scacchiera (-600, -160, 0)
-  * imposto MoveAbsJ, v500, z10, Servo e insegno una istruzione col robot sollevato allineato rispetto alla posizione Home (target //sollevato// in Jointtargets+  * imposto MoveAbsJ, v500, z10, Servo e insegno una istruzione col robot sollevatoallineato e col gripper orientato correttamente per prendere il pezzo (target //sollevato// in Jointtargets
   * testo il movimento con //Move Along Path// sulla procedura //main//   * testo il movimento con //Move Along Path// sulla procedura //main//
   * sincronizzo con RAPID poi //New Vertical Tab// e simulo dopo aver riportato il robot alla Home (Layout|Move To Pose|Jump Home); c'è un //Corner Path Failure// ma la simulazione termina correttamente; lo stesso warning compare simulando dalla Tab Simulation (NB in questo caso la simulazione non termina e va arrestata)   * sincronizzo con RAPID poi //New Vertical Tab// e simulo dopo aver riportato il robot alla Home (Layout|Move To Pose|Jump Home); c'è un //Corner Path Failure// ma la simulazione termina correttamente; lo stesso warning compare simulando dalla Tab Simulation (NB in questo caso la simulazione non termina e va arrestata)
   * imposto MoveJ, 500, z10, Servo poi con //Move and Rotate// provo a raggiungere il centro (snap su corpo e centro) delle 64 case della scacchiera per vedere se spostare la scacchiera o cambiare configurazione del robot -> mi accorgo che non arriva alla fila più lontana e devo spostare la scacchiera a (-500,160,0)((nel programma del 2024 era -530))   * imposto MoveJ, 500, z10, Servo poi con //Move and Rotate// provo a raggiungere il centro (snap su corpo e centro) delle 64 case della scacchiera per vedere se spostare la scacchiera o cambiare configurazione del robot -> mi accorgo che non arriva alla fila più lontana e devo spostare la scacchiera a (-500,160,0)((nel programma del 2024 era -530))
-  * creo il pezzo con le dimensioni del mattoncino jenga (15-25-75)+  * rendo invisibile il robot, creo il pezzo con le dimensioni del mattoncino jenga (15-25-75), uso //Attach to// per collegarlo alla scacchiera; con //Position|Place|Two Points// lo sposto al centro della casa a1 (snap sui due centri) 
 +  * dalla tab Simulation scelgo //Reset|Save Current State// e salvo lo stato iniziale //partenza// mettendo la spunta per includere tutto 
 +  * porto il TCP sul pezzo con //Move and Rotate// e, controllando di aver selezionato il workobject wobj_scacchiera_a1 e Servo come tool, salvo il target come //presa_a1//; controllo con //View Robot At Target// che l'orientamento dell'asse z del target sia giusto 
 +  * sposto il TCP 100mm in alto e salvo un nuovo target come //sopra_a1// 
 +  * con MoveJ, v500, z10, Servo creo l'istruzione di movimento per andare a sopra_a1 trascinando il target nel main 
 +  * con MoveL, v500, fine, Servo creo l'istruzione di movimento per andare a presa_a1 
 +  * con MoveL, v500, fine, Servo creo l'istruzione di movimento per andare a sopra_a1 
 +  * testo il movimento con //Move Along Path// poi sincronizzo con RAPID e eseguo il programma 
 +  * dentro MainModule creo le procedure apriPinza() e chiudiPinza() con le istruzioni g_MoveTo(15) e g_GripIn che posso chiamare anche in ambiente grafico dopo aver sincronizzato alla stazione; ricordarsi //Apply// (e volendo //Check Program//) per applicare le modifiche al codice 
 +  * creo le variabili tipo num colonna e traversa e la costante tipo num delta 
 +  * creo la procedura preleva con due parametri (c,t) che usa la funzione Offs per portare il TCP nel punto di prelievo in base alle coordinate c e t della notazione algebrica 
 +  * chiamo la funzione (no parentesi!) 
 +  * testo la funzione  
 +  * **NB spesso bisogna re-inizializzare il Virtual SmartGripper che ogni tanto impazzisce da Proprietà mettendo ReInizialization_Enabled a 1 e cliccando su ReInitialize_SmartGripper** 
 +  * **resettare la simulazione dopo ogni esecuzione del programma e riportare il program pointer a main dalla scheda Rapid|Program Pointer** 
 + 
 + 
 +==== Cose minori ==== 
 + 
 +  * non si riesce a rinominare la stazione se non salvando il progetto con un altro nome; anche in quel caso la vista principale mantiene il vecchio nome (modello:Visualizza1) ma si può rinominare la tab 
 +  * non si capisce come funzioni il suggerimento colorato che a volte compare nella barra del titolo sopra la ribbon: non è cliccabile e, il colore non è riconducibile a qualcosa, il nome a volte corrisponde a un pulsante sulla ribbon ma non sempre 
 +  * riguardo i concetti di programmazione da operating manual omnicore (guida completa ma pensata per flexpendant):  
 +    * programmi, moduli, routine (procedure sono sottoprogrammi, funzioni restituiscono un valore, trap gestiscono gli interrupt) 
 +    * variabili: scope (local, global, task) storage (persistent, variable, constant) 
 +  * proseguo con rapid overview: 
 +    * RAPID non è case sensitive 
 +    * placeholder <> consentono di caricare un programma anche se alcune parti non sono ancora definite 
 +    * 1.1.2 sintassi e tipi di dati 
 +    * 1.1.3 struttura del programma, moduli, routine, parametri 
 +    * tipi di dati: atomic, record, alias 
 +    * array (1.2.2); record sono un'altra cosa (1.2.1) 
 +    * 1.3 espressioni, argomenti e parametri 
 +    * 1.4 istruzioni (anche il concetto di label) 
 +    * 1.5 controllo del flusso 
 +    * 1.6 istruzioni varie (generiche?) e dati di base (finalmente!) 
 +    * 2.x movimento, sistemi di riferimento, superamento dei percorsi ad angolo (2.2.3), 2.4 configurazioni del robot e istruzione ConfL\On((dal testo // Nel caso in cui la supervisione della configurazione non è 
 +attiva, il robot si sposta verso la posizione e l'orientamento specificati secondo la 
 +configurazione con valori di giunto più prossimi rispetto al punto iniziale.//)) 
 +    * 2.7 singolarità; due in più per i robot a 7 assi, nessun problema con MoveJ 
 + 
 +===== Programma per il robot ===== 
 + 
 +<code> 
 + 
 +MODULE MainModule 
 +    PERS tooldata Servo:=[TRUE,[[0,0,114.2],[1,0,0,0]],[0.24,[8.2,12.5,48.1],[1,0,0,0],0.00022,0.00024,0.00009]]; 
 +    PERS tooldata VaccumOne:=[TRUE,[[63.5,18.5,37.5],[0.707107,0,0.707107,0]],[0.24,[8.2,12.5,48.1],[1,0,0,0],0.00022,0.00024,9E-5]]; 
 +    PERS tooldata Camera:=[TRUE,[[-7.3,28.3,35.1],[0.5,-0.5,0.5,0.5]],[0.24,[8.2,12.5,48.1],[1,0,0,0],0.00022,0.00024,0.00009]]; 
 +    TASK PERS wobjdata wobj_scacchiera_a1:=[FALSE,TRUE,"",[[-500,-160,0],[1,0,0,0]],[[0,0,0],[1,0,0,0]]]; 
 +    CONST jointtarget sollevato:=[[8.27479467,-55.149085208,-30.437467621,-39.964939475,80.81227792,-129.284033591],[-129.406526204,9E+09,9E+09,9E+09,9E+09,9E+09]]; 
 +    CONST robtarget sopra_a1:=[[20.000045174,19.999986455,174.999892058],[0.000000042,-0.000000014,1,0.000000086],[0,0,-2,4],[40.568814509,9E+09,9E+09,9E+09,9E+09,9E+09]]; 
 +    CONST robtarget presa_a1:=[[20.0000107,20.000045104,74.999976278],[0.000000003,0.000000011,1,0.000000087],[0,-1,-2,4],[40.568807487,9E+09,9E+09,9E+09,9E+09,9E+09]]; 
 + 
 +    ! definizioni sulla scacchiera https://it.wikipedia.org/wiki/Notazione_algebrica 
 +     
 +    ! distanza tra una casa e l'altra (lato della casella) 
 +    CONST num delta:=40; 
 +    ! stringa di testo con le coordinate di prelievo e deposito del pezzo inviata dal PC 
 +    VAR string sFrom:="11"; 
 +    VAR string sTo:="53"; 
 +    ! valore numerico corrispondente alle due stringhe 
 +    VAR num numFrom; 
 +    VAR num numTo; 
 +    ! coordinate x e y dei punti di prelievo e deposito (x = colonna, y = traversa) 
 +    VAR num x1; 
 +    VAR num y1; 
 +    VAR num x2; 
 +    VAR num y2; 
 + 
 +    PROC main() 
 +        ! NB bisogna calibrare la pinza da Impostazioni|SmartGripper|modulo servoassistito  
 +        ! cliccare su grip+ poi grip- e infine Calibrate 
 +         
 +        !sollevo il robot 
 +        MoveAbsJ sollevato,v500,z10,Servo\WObj:=wobj_scacchiera_a1; 
 +         
 +        ! converte la stringa in un valore numerico e segnala eventuali errori di conversione 
 +        IF StrToVal(sFrom,numFrom)=FALSE THEN 
 +            TPWrite "Conversion Failed!"; 
 +            Stop; 
 +        ENDIF 
 +        IF StrToVal(sTo,numTo)=FALSE THEN 
 +            TPWrite "Conversion Failed!"; 
 +            Stop; 
 +        ENDIF 
 + 
 +        ! ricava le coordinate dal valore numerico (yx -> x, y) 
 +        x1:=numFrom MOD 10; 
 +        ! cifra meno significativa 
 +        y1:=numFrom DIV 10; 
 +        ! cifra più significativa 
 +        x2:=numTo MOD 10; 
 +        ! cifra meno significativa 
 +        y2:=numTo DIV 10; 
 +        ! cifra più significativa 
 + 
 +        ! sposto il pezzo da x1,y1 a x2,y2 
 +        preleva x1,y1; 
 +        deposita x2,y2; 
 + 
 +        ! sollevo il robot 
 +        MoveAbsJ sollevato,v500,z10,Servo\WObj:=wobj_scacchiera_a1; 
 + 
 +    ENDPROC 
 + 
 +    PROC preleva(num c,num t) 
 +        ! sposta il braccio sopra il punto di prelievo 
 +        apriPinza; 
 +        MoveJ Offs(sopra_a1,delta*(c-1),delta*(t-1),0),v500,z10,Servo\wobj:=wobj_scacchiera_a1; 
 +        MoveL Offs(presa_a1,delta*(c-1),delta*(t-1),0),v500,fine,Servo\wobj:=wobj_scacchiera_a1; 
 +        chiudiPinza; 
 +        MoveL Offs(sopra_a1,delta*(c-1),delta*(t-1),0),v500,z10,Servo\wobj:=wobj_scacchiera_a1; 
 +    ENDPROC 
 + 
 +    PROC deposita(num c,num t) 
 +        ! sposta il braccio sopra il punto di prelievo 
 +        MoveJ Offs(sopra_a1,delta*(c-1),delta*(t-1),0),v500,z10,Servo\wobj:=wobj_scacchiera_a1; 
 +        MoveL Offs(presa_a1,delta*(c-1),delta*(t-1),0),v500,fine,Servo\wobj:=wobj_scacchiera_a1; 
 +        apriPinza; 
 +        MoveL Offs(sopra_a1,delta*(c-1),delta*(t-1),0),v500,z10,Servo\wobj:=wobj_scacchiera_a1; 
 +    ENDPROC 
 + 
 +    ! per aprire e chiudere la pinza anche dall'ambiente grafico 
 +    PROC apriPinza() 
 +        g_MoveTo(15); 
 +    ENDPROC 
 + 
 +    PROC chiudiPinza() 
 +        g_GripIn; 
 +    ENDPROC 
 + 
 +ENDMODULE 
 +</code>
  
  
riservata/pw3a2025.1745139963.txt.gz · Ultima modifica: da admin