Il programma è stato allegato all’Appendice A allegata al testo. Nei prossimi paragrafi si analizzeranno alcune parti funzionali del programma necessarie per poter gestire al meglio la stazione e rendere completamente automatiche le varie procedure e i vari errori di sistema.
17 Per manipolabilità nulla
18 Per target vicini si intende che i volumi sferici si sovrappongono oppure che, a causa delle velocità e delle accelerazioni impostate, il controller non riesca a trovare una soluzione per la pianificazione delle legge di moto entro i limiti di movimentazione del motore.
65
3.5.1 La Procedura Main
La procedura Main è la prima procedura che il controller richiama: all’interno di questa è stato definito il ciclo che il controller deve gestire e far eseguire al cobot.
Il ciclo di lavoro è stato suddiviso in più procedure:
- le funzioni prelievo e deposito cioè la normale esecuzione del job del robot, definita all’interno della procedura chiamata CicloLavoro
- l’error handler, descritto più approfonditamente nel quinto capitolo, grazie al quale è possibile gestire tutta una serie di errori e dove si è sviluppato, in maniera semplice dato il caso di studio, la gestione degli errori
- le funzioni trap che intervengono nel momento in cui viene segnalato al robot un segnale interrupt Nei successivi paragrafi e capitoli verranno illustrate più approfonditamente le funzioni più interessanti che hanno permesso la realizzazione del programma del cobot: l’intero script è stato riportato nell’appendice A. L’errore handler verrà illustrato nel capitolo quinto mentre mentre si illustrerà la parte legata alla procedura definita CicloLavoro nel prossimo paragrafo e le routine trap con le quali è possibile ritentare il prelievo della confezione non presa. In questi sotto paragrafi vengono spiegate alcune istruzioni inserite per poter gestire al meglio il task associato ad ogni braccio del cobot.
3.5.1.1 Reset dei segnali e procedura di Home
Per garantire l’esatta funzionalità del tool e del cobot, nonché la logica implementata nel PLC per gestire i nastri trasportatori, si deve anzitutto inizializzare il programma con delle funzioni di reset dei segnali utili e una procedura che riporti il cobot in una posizione di Home, servono, quindi, per poter resettare il ciclo e poter ripartire in fase il cobot con tutto il sistema.
Una volta eseguito il reset dei segnali utili, raggruppati in una procedura a parte, che viene richiamata unicamente in questo punto, si passa alla movimentazione del robot. Non conoscendo la posizione effettiva del braccio del robot è bene recuperare la posizione attuale grazie alla chiamata CRobT, istruzione richiamata nella procedura di Svincola. Questa chiamata di sistema va a leggere, grazie agli encoder presenti sui giunti del robot la posizione che verrà in seguito convertita una posizione robtarget.
La procedura Gotohome ha lo scopo di riportare il cobot nella posizione di Home per ogni braccio che corrisponde alla posizione di attesa delle confezioni. Questa posizione è una posizione che possiamo definire “safe” in quanto non è di ingombro né per lo scatolone che può arrivare sotto ai bracci del cobot né per le confezioni.
3.5.1.2 Inizializzazione degli interrupt e trap routine
VAR intnum sig1int; definita nel modulo di sistema
IDelete sig1int; all’interno del Main
66
ISignalDI PLC_NonPrelevato, 1, sig1int;
Figura 30 - Inizializzazione di un segnale di interrupt e collegamento con trap routine
Con l’istruzione IDelete è possibile cancellare la memoria associata di una variabile definita all’interno del modulo di sistema Dati. La variabile di tipo Intnum, interrupt numeric, viene utilizzata per identificare un interrupt. Attraverso questo identificativo, tramite il comando CONNECT … WITH … è possibile associare la variabile alla funzione ad una trap routine.
Questi comandi servono per poter attivare la funzione, ma deve essere collegata ad un segnale fisico. È possibile collegarlo sia a segnali di input che di output: nel nostro caso il segnale sarà di tipo input. Infatti il PLC, dopo che il robot ha tentato il primo prelievo, controlla che effettivamente l’operazione abbia avuto successo. Nel caso in cui non abbia avuto successo il robot vede in ingresso il segnale. Attraverso la definizione ISignalDI si può collegare un segnale digitale d’ingresso ad un intnum e viene collegato nel caso in cui il valore del segnale sia alto, indicato con 1 nell’istruzione.
Nel Rapid l’interrupt può essere connesso una sola volta alla trap, mentre vari interrupt possono essere connessi alla stessa trap.
Sono state create tre routine trap, una nel caso in cui il robot non riesca a prelevare nessuna confezione, una che indica il prelievo della confezione che è rimasta in posizione, mentre l’altra rimane in attesa con la confezione in “mano”.
Per evitare di creare un’infinità di variabili da collegare alla trap, così da non appesantire il programma19 e mantenere spazio libero, si è costruita una sequenza di variabili, riportata di seguito.
In questo modo si risolve il limite imposto per definizione del kernel Rapid di ABB e si ottimizza il programma. Per poter resettare la variabile e riutilizzarla, per prima cosa controlliamo che il segnale proveniente dal PLC sia tornato a 0: limitando nel tempo il controllo. Se così non fosse il robot invia il segnale di svuotamento della linea di prelievo, andando a segnalare un errore all’operatore.
!RESET INTERRUPT PER POTER RIUTILIZZARLO
WaitDI PLC_NonPrelevatoDX,0\MaxTime:=1\TimeFlag:=bmaxtime{10}; IDelete sig2int;
CONNECT sig2int WITH RitentaPrelievoDX; ISignalDI PLC_NonPrelevatoDX, 1, sig2int;
Figura 31 - Reset segnale di inteerupt alla fine della trap routine associata per poterlo riutilizzare
Dopo l’IF viene reimpostato il segnale andando a ridefinire la connessione tra variabile e trap e tra input e variabile, come descritto precedentemente. Questo è possibile solo nel caso in cui il segnale è ritornato basso: Se non si aspetta che il segnale ritorni a livello 0, la variabile associata non può essere rilasciata e quindi non è possibile utilizzare l’istruzione IDelete per cancellarne il contenuto e così riassegnare alla variabile intnum il segnale di interrupt.
19 A livello di programmazione è sempre bene ripulire le zone di memoria in modo da alleggerire il software ed ottimizzarlo. Creare nuove variabili significa allocare spazio in memoria, appesantendo il programma.
67
3.5.1.3 Gestione informazioni e casi possibili
La main procedure prosegue con il passaggio di informazioni del tipo di scatolone e confezioni. La linea ha la possibilità di caricare su due tipi di scatoloni e ogni scatolone ha un tipo di confezione.
In particolare, la differenza principale è il numero di confezioni da depositare in altezza, che possono essere tre o quattro.
Il robot riceve dal PLC la tipologia di scatolone e, in base a quello, recupera le informazioni definite nel modulo di sistema Dati. Successivamente, richiede che venga posizionato uno scatolone e attende una risposta dal PLC che indica se effettivamente è presente. Se lo scatolone è effettivamente in posizione di carico, allora il robot può procedere con le istruzioni successive.
Iniziano poi due cicli for annidati per poter gestire le posizioni di deposito: in questi due cicli vengono fatti dei controlli continui, in particolare sul funzionamento della linea di confezionamento, sulle posizioni di prelievo delle confezioni e sulla presenza dello scatolone. Se queste informazioni sono vere il robot esegue il ciclo di carico.
Nel caso in cui le confezioni non siano presenti sulla linea lo YuMi rimane in attesa per un determinato tempo e se supera un tempo massimo, impostato con \MaxTime nella riga d’istruzione seguente, viene rimandato nella posizione del programma P1.
WaitDI PLC_ConfezioniInPosizione,high\MaxTime:=1\TimeFlag:=bmaxtime{2}; IF bmaxtime{2}=TRUE THEN
bmaxtime{2}:=FALSE; GOTO P1;
ENDIF
Figura 32 - Controllo del tempo di attesa di un segnale proveniente da PLC
In questo modo si evita che il robot possa rimanere in attesa di un segnale che non può arrivare e ricontrolla i vari casi.
Un altro caso che è stato scelto di inserire tra i possibili è quello riguardante l’assenza dello scatolone: in questo caso il cobot ritorna in home con una velocità ridotta e poi invia un segnale al PLC chiedendo una svuota linea scatolone. Quindi rimanda alla posizione P0 andando poi a richiedere uno scatolone sotto la posizione dello YuMi.
Ritornando alla situazione ottimale, una volta che il robot ha finito di caricare le confezioni invia il segnale di carico completato: dopo questo segnale il robot rimane in attesa, in posizione di home, dello scarico dello scatolone.
Essendoci un ciclo esterno a tutte le casistiche che è impostato sempre a true, cioè viene eseguito continuamente, il controller continua ad eseguire le istruzioni scritte all’interno, per cui ritornerà a richiedere uno scatolone per poter caricare le confezioni.
68
3.5.1.4 Error Handler
La gestione degli errori viene posizionata alla fine della procedura di main e viene impostata inserendo l’istruzione ERROR. In questo modo il controller sa che entrerà in questa parte della procedura solo nel caso in cui si verifichi un errore.
Per l’applicazione è stato pensato di gestire l’errore di collisione, che come descritto nei capitoli precedenti, può avvenire nel caso in cui il robot vada a scontrarsi con qualche operatore, così da non causare danni. Poiché i movimenti del robot sono eseguiti in modo sincrono, si è voluto separare la gestione dell’errore. Questo è stato possibile, come descritto nel capitolo 5, grazie alla definizione di un segnale di System Output, che il controller intercetta, legato ad entrambi i tasks.
Per poter discriminare il movimento, come verrà spiegato anche successivamente, è stato necessario creare un registro, legato all’ID di movimento. Attraverso queste due casistiche vengono eseguiti movimenti diversi a seconda del braccio.
Nel caso in cui il braccio non sia andato in collisione, rimarrà fermo in attesa che la condizione, definita tramite una variabile booleana ROBOT_Collisione_DX_ok venga posta a vera.