riservata:pw3a2025
Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
| Entrambe le parti precedenti la revisioneRevisione precedenteProssima revisione | Revisione precedente | ||
| riservata:pw3a2025 [2025/04/20 09:40] – [La parte del robot] admin | riservata: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' | * coloro le caselle bianche e le raggruppo tutte per fare l' | ||
| * 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 | + | * imposto MoveAbsJ, v500, z10, Servo e insegno una istruzione col robot sollevato, allineato |
| * 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; | * 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; | ||
| * 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, | * 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, | ||
| - | * creo il pezzo con le dimensioni del mattoncino jenga (15-25-75) | + | * rendo invisibile il robot, |
| + | * dalla tab Simulation scelgo // | ||
| + | * 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 // | ||
| + | * sposto il TCP 100mm in alto e salvo un nuovo target come // | ||
| + | * con MoveJ, v500, z10, Servo creo l' | ||
| + | * con MoveL, v500, fine, Servo creo l' | ||
| + | * con MoveL, v500, fine, Servo creo l' | ||
| + | * 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 ==== | ==== Cose minori ==== | ||
| Linea 20: | Linea 35: | ||
| * 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: | * 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: | ||
| * 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 | * 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, | ||
| + | * variabili: scope (local, global, task) storage (persistent, | ||
| + | * 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' | ||
| + | * 1.3 espressioni, | ||
| + | * 1.4 istruzioni (anche il concetto di label) | ||
| + | * 1.5 controllo del flusso | ||
| + | * 1.6 istruzioni varie (generiche? | ||
| + | * 2.x movimento, sistemi di riferimento, | ||
| + | attiva, il robot si sposta verso la posizione e l' | ||
| + | configurazione con valori di giunto più prossimi rispetto al punto iniziale.// | ||
| + | * 2.7 singolarità; | ||
| + | |||
| + | ===== Programma per il robot ===== | ||
| + | |||
| + | < | ||
| + | |||
| + | MODULE MainModule | ||
| + | PERS tooldata Servo: | ||
| + | PERS tooldata VaccumOne: | ||
| + | PERS tooldata Camera: | ||
| + | TASK PERS wobjdata wobj_scacchiera_a1: | ||
| + | CONST jointtarget sollevato: | ||
| + | CONST robtarget sopra_a1: | ||
| + | CONST robtarget presa_a1: | ||
| + | |||
| + | ! definizioni sulla scacchiera https:// | ||
| + | | ||
| + | ! distanza tra una casa e l' | ||
| + | CONST num delta:=40; | ||
| + | ! stringa di testo con le coordinate di prelievo e deposito del pezzo inviata dal PC | ||
| + | VAR string sFrom: | ||
| + | VAR string sTo: | ||
| + | ! 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, | ||
| + | | ||
| + | ! converte la stringa in un valore numerico e segnala eventuali errori di conversione | ||
| + | IF StrToVal(sFrom, | ||
| + | TPWrite " | ||
| + | Stop; | ||
| + | ENDIF | ||
| + | IF StrToVal(sTo, | ||
| + | TPWrite " | ||
| + | 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, | ||
| + | |||
| + | ENDPROC | ||
| + | |||
| + | PROC preleva(num c,num t) | ||
| + | ! sposta il braccio sopra il punto di prelievo | ||
| + | apriPinza; | ||
| + | MoveJ Offs(sopra_a1, | ||
| + | MoveL Offs(presa_a1, | ||
| + | chiudiPinza; | ||
| + | MoveL Offs(sopra_a1, | ||
| + | ENDPROC | ||
| + | |||
| + | PROC deposita(num c,num t) | ||
| + | ! sposta il braccio sopra il punto di prelievo | ||
| + | MoveJ Offs(sopra_a1, | ||
| + | MoveL Offs(presa_a1, | ||
| + | apriPinza; | ||
| + | MoveL Offs(sopra_a1, | ||
| + | ENDPROC | ||
| + | |||
| + | ! per aprire e chiudere la pinza anche dall' | ||
| + | PROC apriPinza() | ||
| + | g_MoveTo(15); | ||
| + | ENDPROC | ||
| + | |||
| + | PROC chiudiPinza() | ||
| + | g_GripIn; | ||
| + | ENDPROC | ||
| + | |||
| + | ENDMODULE | ||
| + | </ | ||
| + | |||
riservata/pw3a2025.1745142028.txt.gz · Ultima modifica: da admin
