Università degli Studi di Catania Corso di Laurea in Ingegneria dell’Automazione e Controllo dei Sistemi Complessi
Robotica Industriale Anno 2009/210
Di Mauro Gianluca Patti Giuseppe Romeo Marcello Saglimbene Silvana
Prof. Ing. G. Muscato Ing. C. Bruno
Introduzione
Scopo della tesina è stato quello di sviluppare un tool software che permette al robot KUKA di effettuare delle operazioni di fresatura. Generalmente i robot KUKA, costruiti dalla KUKA Robot società tedesca che costituisce uno dei produttori leader sul mercato internazionale di robot industriali, vengono utilizzati in vari settori industriali come quello automobilistico o della lavorazione dei metalli. Un sistema robot è costituito dai seguenti componenti: • • • • • •
1 Robot
Robot Controllo robot Programmatore portatile KCP Linee di collegamento Software Opzioni, accessori
2 Controllo robot
3 Programmatore portatile KCP
4 Linee di collegamento
IL KUKA
Il robot da noi utilizzato è il KR5
Tale robot è un robot antropomorfo a 6 assi, realizzato in metallo leggero. Tutti i gruppi degli azionamenti e le linee di corrente sono alloggiati sotto delle coperture chiuse mediante viti e sono quindi protetti dallo sporco e dall'umidità. Il robot è costituito dai seguenti gruppi costruttivi principali: • Polso centrale • Braccio • Culla • Giostra • Basamento • Installazione elettrica
1 Braccio
2 Polso centrale
3 Culla
4 Giostra
5 Basamento
6 Installazione elettrica
Polso centrale Il robot è dotato di un polso centrale a 3 assi che viene azionato dai motori alloggiati
nel braccio (asse 4) e nel polso centrale stesso. Il motore dell'asse 4 ingrana direttamente nella trasmissione, mentre per gli assi 5 e 6 l'azionamento funziona attraverso una cinghia dentata. Il polso centrale esegue i movimenti attorno agli assi 4, 5 e 6. Nel polso centrale sono collocate tre valvole a impulsi 5/2 che possono essere utilizzate per il comando degli utensili. Braccio Il braccio è l'anello di connessione fra il polso centrale e la culla. Esso alloggia il motore dell'asse del polso 4. Culla Fra il braccio e la giostra è inserita la culla. Essa alloggia i motori e le trasmissioni degli assi 2 e 3. All'interno della culla passano le linee dell'alimentazione energetica e del fascio di cablaggio per gli assi da 1 a 4. La culla è disponibile in 2 varianti. Giostra I movimenti rotatori dell'asse 1 vengono eseguiti attraverso la giostra. La giostra è avvitata al basamento attraverso la trasmissione dell'asse 1 e viene azionata da un motore alloggiato nel basamento. Nella giostra si trovano anche le batterie tampone per la protezione dei dati degli assi del sistema di calcolo dei percorsi. Basamento Il basamento è la base del robot. Costituisce l'interfaccia per le linee di collegamento fra la meccanica del robot e il controllo e l'alimentazione di energia.
La programmazione - il Krl
Esistono sostanzialmente due modi per programmare il KUKA : la programmazione offline e quella online. La prima grazie all’utilizzo di ambienti software appositamente dedicati come l’Office Lite permette: una maggiore velocità di debugging, simulando il programma direttamente sul simulatore invece che sul KUKA e una riduzione dei costi dovuta al materiale di utilizzo. Per quanto riguarda gli svantaggi, essi risiedono in un iniziale investimento di costi e tempo per l’acquisto del software ed il suo apprendimento. Mentre in quella online le istruzioni vengono direttamente eseguite dal KUKA con tutto ciò che ne comporta.
Il control panel Il kuka control panel denominato KCP costituisce l’interfaccia tra uomo e macchina per il comando semplice del controllo del robot. Come si evince dalla figura sottostante il KCP racchiude tutte le funzioni necessarie per utilizzare e programmare il sistema robot.
1 Selettore del modo operativo
2 Azionamenti ON
3 Azionamenti OFF / SBBGUI
4 Pulsante di ARRESTO D'EMERGENZA
5 Space Mouse
6 Tasti stato a destra
7 Tasto Enter
8 Tasti cursore
9 Tastiera
10 Blocco numerico
11 Softkey
12 Tasto Start indietro
13 Tasto Start
14 Tasto STOP
15 Tasto di selezione finestra
16 Tasto ESC
17 Tasti stato a sinistra
18 Tasti men첫
1 Targhetta d'identificazione
2 Tasto Start
3 Tasto di consenso
4 Tasto di consenso
5 Tasto di consenso
1 Tasti stato a sinistra
2 Tasti stato a sinistra (icone)
3 Tasti menù
4 Tasti menù (icone)
5 Tasti stato a destra
6 Tasti stato a destra (icone)
7 Softkey
8 Softkey (icone)
IL KRL KRL (Kuka Robotic Language) è il linguaggio di programmazione tramite cui sono sviluppati tutti i programmi.Implementa al suo interno tutti i più comuni operatori aritmetici, logici e algebrici nonché le più diffuse istruzioni (If, cicli For o While, Wait etc.).Ogni programma è costituito da due file le cui estensioni sono rispettivamente SRC e Dat.Il file SRC contiene il codice del programma mentre il file DAT contiene i dati specifici dello stesso.Ogni file comincia con la riga: DEF nome file e termina con END E' possibile modificare il codice o dal KCP o aprendo i file tramite un qualsiasi editor di testo (Note Pad,Word Pad etc.)
Le istruzioni di movimento si possono dividere in due categorie: spostamenti punto-punto percorsi continui (Continuos Path). Ciò che differenzia le due categorie è che con le istruzione di movimento per percorsi continui l'endeffector descrive una traiettoria ben precisa nello spazio (linee rette o archi) mentre con le istruzioni puntopunto la traiettoria descritta è legata alla cinematica del robot e non è esattamente predicibile. Quello che invece accomuna i due tipi di movimento è il fatto che è sufficiente specificare la posizione di destinazione perché come posizione di partenza sarà considerata la posizione attuale del robot nel momento in cui l'istruzione viene eseguita. In particolare nelle operazioni di fresatura le istruzioni utilizzate sono di tipo: PTP cioè movimenti point to point che rappresentano la via più veloce per giungere alla posizione programmata, per fare ciò il controller calcola per ogni asse la differenza tra l'angolo del punto di arrivo e l'angolo del punto di partenza(spesso non coincide con la via più breve).
Il movimento degli assi è sincronizzato in maniera tale che l’inizio e la fine del movimento sia contemporaneo. Per ottenere questo scopo soltanto l'asse che deve percorrere la traiettoria più lunga (asse dominante) si muoverà con la velocità e l'accelerazione predefinite mentre gli altri adotteranno le velocità e le accelerazioni che gli permetteranno di giungere contemporaneamente a destinazione indipendentemente dai valori fissati. Sono inoltre possibili moti PTP:
Asincroni: ogni motore raggiunge il più velocemente possibile l’angolo desiderato,in questa maniera alcuni assi raggiungeranno l’angolo desiderato prima di altri. La posizione e l’orientamento finali saranno ottenuti quando tutti gli assi avranno raggiunto la posizione desiderata.
Sincroni : Viene calcolato il tempo necessario al raggiungimento della posizione desiderata su un asse detto leading asse, asse che richiede il maggior tempo,e si sincronizza il tempo facendo andare a velocità massima l’asse di leading e a velocità inferiore gli altri assi,in maniera tale da sincronizzare il tempo necessario al posizionamento.
Pienamente sincrono : Oltre al tempo necessario al posizionamento vengono sincronizzate le accelerazioni e le velocità;
In particolare la sintassi dei comandi di spostamento sono: PTP Posizione_Destinazione [C_PTP Posizionamento_approssimato]; PTP_REL Posizione_Destinazione [ C_PTP Posizionamento_approssimato]
Argomento
Tipo Dati
Commenti
Posizione_Destinazione
POS , E6POS, AXIS, E6AXIS, FRAME
Posizione di arrivo,è relativa al sistema di riferimento adottato. (Oppure relativa al punto di partenza nel caso di REL)
C_PTP
Parola chiave
Il robot si porterà in una posizione approssimata rispetto a quella di destinazione.
Posizionamento_approssimato
Parola chiave
Questa opzione è utilizzata per specificare un criterio di posizionamento approssimato. Può essere usato solamente insieme al parametro C_PTP. Le possibili opzioni sono: ·
C_DIS
·
C_ORI
·
C_VEL
$APO.CDIS (attivato da C_DIS) Il posizionamento approssimato comincerà nel momento in cui l'asse dominante è ad una distanza specificata dal punto di destinazione. $APO.CORI (attivato da C_ORI) Il posizionamento approssimato comincerà non appena la differenza tra l'angolo dell'asse dominante attuale e quello di destinazione sarà minore di un certo valore. $APO.CVEL (attivato da C_VEL) Il posizionamento approssimato comincerà quando viene raggiunta la percentuale (definita in $APO.CVEL) della velocità definita in $VEL.CP. Un esempio di spostamento approssimato ottenuto con l’utilizzo di C_DIS è PTP XP1 C_PTP C_DIS
Movimento continuo E’ necessario l'orientamento del tool che può essere controllato settando opportunamente la variabile di sistema $ORI_TYPE (di tipo ENUM) contenuta nel file $operate.dat. Questa variabile ammette tre valori: •
COSTANT
•
VAR
•
JOINT
$ORI_TYPE = #COSTANT $ORI_TYPE = #VAR (Impostazione di default) BAS ( #INITMOV ) $ORI_TYPE = #JOINT Nel caso in cui ci si trovi vicino ad una singolarità l'impostazione #VAR non consente di mantenere la velocità programmata, per ovviare a questo problema si assegna alla variabile $ORI_TYPE il valore JOINT. In questo caso l'orientamento del tool varierà comunque lungo tutto il percorso ma la singolarità sarà evitata in quanto non c'è controllo di orientamento sulle rotazioni del tool. Argomento Posizione_destinazione
Tipo Dati
Commenti
POS, E6POS, FRAME
Punto di destinazione (relativa al punto di partenza nel caso di REL), i parametri S e T non sono mai presi in considerazione
Posizionamento approssimato
Parola chiave
Questa opzione consente il posizionamento approssimato Può assumere i seguenti valori: ·
C_DIS
·
C_ORI
·
C_VEL
LIN Posizione_destinazione [Posizionamento approssimato] LIN_REL Posizione_Destinazione [Posizionamento approssimato] Un esempio di spostamento approssimato ottenuto con l’utilizzo di C_DIS è LIN XP1 C_DIS
CIRC Posizione_ Ausiliaria Posizione_Destinazione [ CA Angolo_Circolare Posizionamento approssimato] CIRC_REL Posizione_ Ausiliaria Posizione_Destinazione [ CA Angolo_Circolare Posizionamento approssimato] Per ottenere una circonferenza o un arco nello spazio sono necessari tre punti non coincidenti e non disposti lungo una linea retta. Il punto di partenza coincide con la posizione attuale del robot, per cui sarĂ necessario fornire solamente gli altri due punti (punto ausiliario e punto di destinazione). Argomento
Tipo Dato
Commenti
Posizione_ Ausiliaria
POS, E6POS, FRAME
Punto ausiliario, possono essere usate solo coordinate cartesiane. I parametri S e T non saranno valutati.
Posizione_Destinazione
POS, E6POS, FRAME
Punto destinazione, possono essere usate solo coordinate cartesiane. I parametri S e T non saranno valutati.
Angolo_Circolare
REAL
Espressione aritmetica dell'angolo circolare, può essere usata solo in congiunzione col parametro CA. Possono essere assegnati anche angoli maggiori di 360°.
Posizionamento approssimato
Parola chiave
Questa opzione consente il posizionamento approssimato Può assumere i seguenti valori: ·
C_DIS
·
C_ORI
·
C_VEL
CA Questa opzione permette di ottenere angoli circolari, in cui la geometria dell'arco è definita sempre dai punti di partenza, ausiliario e di arrivo, tuttavia la traiettoria percorsa potrà essere allungata o accorciata in funzione del valore dell'argomento di CA. Il punto finale effettivo coinciderà con quello in cui l'angolo previsto sarà coperto.
CIRC P_AUX P_END CA 90
Tool software
Il presente tool sviluppato con l’ausilio di Matlab, rappresenta il fulcro del nostro lavoro, in quanto rende possibile l’operazione di fresatura di un profilo terrestre a partire da dati georeferenziali, grazie alla generazione dinamica di codice krl pronto per essere utilizzato dal kuka. Il tool si presenta con un’interfaccia grafica a finestre il cui scopo è rendere agevole la modalità d’uso.
Per poter iniziare la simulazione e quindi generare il suddetto codice basta premere il pulsante start avendo prima settato opportunamente i parametri comprendenti : • • • • • • • • •
Punto iniziale in cui far posizionare il robot La dimensione del blocco su cui si lavorerà Numero di iterazioni ( corrisponde al numero di passate e quindi al grado fedeltà che si avrà alla fine ) Spessore della punta del trapano TOOL_DATA e DASE_DATA Velocità Nome del file Opzioni di posizionamento approssimato C_DIS, C_ORI, C_VEL Modalità di stampa del codice ( è infatti possibile provare metodi alternativi di algoritmi krl)
Fatto ciò se si volesse visualizzare il codice krl generato basta premere il pulsante visualizza codice.
Per quanto riguarda l’output video dalla figura soprastante è possibile notare che nella parte centrale sono presenti due grafici raffiguranti rispettivamente il profilo da generare nella sua interezza (in alto) e una sezione del suddetto (in basso) che funge da feedback per poter determinare il grado di approssimazione che si vuole ottenere nella fresatura. Sulla destra infine sono riportati i valori numerici che vengono utilizzati dal software e che provengono dall’elaborazione dei dati georeferenziali.
Codice Matlab
Di seguito le parti di codice più significative, che compongono il tool.
% ottiene le variabili dal form Xbase=str2num(get(handles.edit1,'string')); Ybase=str2num(get(handles.edit2,'string')); Zbase=str2num(get(handles.edit3,'string')); passo=str2num(get(handles.edit4,'string')); ZZ=str2num(get(handles.edit17,'string')); nITER=str2num(get(handles.edit23,'string')); punta=str2num(get(handles.edit19,'string')); XX=str2num(get(handles.edit18,'string')); nome=get(handles.edit5,'string'); … … [matrice,cmap] = geotiffread('srtm_39_05'); %carica l'immagine geotiff ottenedo così una matrice matrice1=matrice(4131:4144,1:14); %individuo una sottomatrice di interesse matrice1=cast(matrice1,'double') ;
A=size(matrice1);%estraggo il numero di righe e colonne num_r=A(1); num_c=A(2);
… … %crerazione file .dat a1=strcat(nome,'.dat'); a2=strcat(nome,'.src'); fid = fopen(a1,'w'); %stampa file .dat fid2=fopen(a2,'w'); %stampa file .src c0=strcat('&ACCESS RVP \n &REL 143 \n ','&PARAM TEMPLATE = C:\\KRC\\Roboter\\Template\\vorgabe \n','&PARAM EDITMASK = *\n'); c1=strcat('DEFDAT\t',nome,'\n',';FOLD EXTERNAL DECLARATIONS;%%{PE}%%MKUKATPBASIS,%%CEXT,%%VCOMMON,%%P \n',... 'EXT BAS (BAS_COMMAND :IN,REAL :IN ) \n',';DECL INT SUCCESS \n',';ENDFOLD (BASISTECH EXT)\n',... ';FOLD USER EXT;%%{E}%%MKUKATPUSER,%%CEXT,%%VEXT,%%P \n',';Make here your modifications \n\n\n\n\n','DECL AXIS HOME;\n',... 'DECL INT ITER;\n','DECL POS VAR;\n');
… … %procedura di normalizzazione matrice2=matrice1; massimo=max(matrice2); massimo=max(massimo); % %deterimino il num di iterazioni …. … A=size(matrice2); num_r=A(1); num_c=A(2); matrice_norm=zeros(num_r,num_c);
matrice_norm2=zeros(num_r,num_c); for l=1:num_r for m= 1:num_c matrice_norm(l,m)=nITER*matrice2(l,m)/massimo; end end
%procedura per la raffinazione for l=1:num_r for m= 1:num_c matrice_norm2(l,m)=matrice_norm(l,m)/passo; end end A = cast(matrice_norm2,'int16'); X=zeros(num_c,2); r=zeros(num_r,1); s2=struct('X', {}, 'Z', {},'Y',{}); s=struct('X', X); SS=struct('s',s); num_r=4; jj=1; % se posizionato qui rende i punti incrementali massi=max(matrice_norm); mass=max(massi); m=mass; %tolgo passaggi a vuoto per 100 iter m=m-12; %stampa della dichiarazione delle pos del file .dat for k= 1:num_r for i=1:m for j=1:num_c s52=num2str(k); % profili s5=num2str(i); %curve di livello s6=num2str(jj);% num dei punti che usciranno s9=(';'); s11=(','); s8=strcat('DECL POS XP',s6,s9,'\n'); % stampa i pos senza [] [] fprintf(fid,s8); jj=jj+1; end end end fprintf(fid,'\n\n\n'); %stampa delle matrici normalizzate t = uitable('Position',[1030 600 350 280]); set(t,'Data',matrice_norm); % algoritmo per creare le curve di livello rappresentati le iterazioni del % kuka I=1; % per rendere i punti incrementali J=1; for k=1:num_r Jk=1; for i=m:-1:1 for j= 1:num_c
if ((A(k,j)<i)) % se l'elemento della kesima riga e jesima colonna è < non viene considerato jj=XX*j/num_c; %normalizzo nella direzione di X jj=Xbase+jj; %normalizzo rispetto alla posizione del tool X(j,1)=jj; X(j,2)=i; %per la direzione Z non ho problemi in quanto è stata gia fatta prima X(j,3)=k;%metto il num del profilo che mi servirà per le Y elseif((A(k,j)>=i)) % se è > viene preso in considerazione e salvato jj=XX*j/num_c; jj=Xbase+jj; X(j,1)=jj; X(j,2)=A(k,j); X(j,3)=k; end s(J).X=X; end SS(k).s(Jk)=s(J) ; % immagazino tutto in una struttura di struttura!!! J=J+1; Jk=Jk+1; end %lo sposto alla fine end %invertendo gli elementi pari della struttura si rende possibile eseguire %le stesse ooperazioni a ritroso cont=1; for J=1:m if(~(rem(J,2))) %se la curva di livello è pari si torna indietro (da 4-> 4) for i=1:2:num_r % le curve di livello pari cambiano a 1 e 3 SS(i).s(J).X=flipdim(SS(i).s(J).X,1); end for i=num_r:-1:1 zm=max(SS(i).s(J).X(:,2));%poi provo a mettere 4 a k xm=max(SS(i).s(J).X(:,1)); for j=1:num_c x1=SS(i).s(J).X(j,1); z1=SS(i).s(J).X(j,2); z1=Zbase+z1; y1=SS(i).s(J).X(j,3); z1=z1-zm; %normalizzo rispetto alla profondità di scavo x1=num2str(x1); z1=num2str(z1); s5=num2str(J); kk=y1*punta; %ottengo la profondità in relazione alla dimensione della punta del trapano s52=num2str(kk); s6=num2str(I); s1=('XP'); s22=('={'); s3=(','); meno=('-'); if(get(handles.radiobutton1,'value')==1) s7=strcat(s1,s6,s22,'X\t',x1,s3,'\t','Y\t',s52,s3,'\t','Z\t',z1,'}',' \n ','LIN XP',s6,'\tC_DIS\n'); elseif(get(handles.radiobutton2,'value')==1) s7=strcat(s1,s6,s22,'X\t',x1,s3,'\t','Y\t',s52,s3,'\t','Z\t',z1,'};',' \n'); end fprintf(fid2,s7); I=I+1;
end end elseif (rem(J,2))% se la curva di livello è dispari si passa da 1->1 …. … %Plotta i grafici per ottenere un feedback visivo m=max(A(5,:)); for i=m:-1:1 for j= 1:num_c if ((A(k,j)<i)) s2(1).X(j)=j; s2(1).Z(j)=i; elseif((A(k,j)>=i)) s2(1).X(i)=j; s2(1).Z(j)=A(k,j); end end x=1:num_c; hold on ax(1) = subplot(2,1,1); mesh((matrice_norm),'parent',ax(1)); colormap(hsv); axis square ax(2) = subplot(2,1,2); plot(x,s2(1).Z(:),'Parent',ax(2)); axis([0 num_c+3 0 m+5]) axis square end
… … %FINE FILE DAT % stampa del codice operativo f0=('; CODICE OPERATIVO\n\n\n\n\n'); fprintf(fid2,f0); if(get(handles.radiobutton2,'value')==1) f=strcat(';ENDFOLD (USER INI)\n',';ENDFOLD (INI)\n',... ';FOLD PTP HOME Vel= 100 %% DEFAULT;%%{PE}%%MKUKATPBASIS,%%CMOVE,%%VPTP,%%P 1:PTP, 2:HOME, 3:, 5:100, 7:DEFAULT\n',... '$BWDSTART = FALSE\n','PDAT_ACT=PDEFAULT\n','FDAT_ACT=FHOME\n','BAS (#PTP_PARAMS,100 )\n','$H_POS=XHOME\n','PTP XHOME\n',';ENDFOLD\n\n\n',... '$BASE=BASE_DATA[',BASE,']\n','$IPO_MODE=#BASE\n','$TOOL= TOOL_DATA[',TOOL,']\n\n\n','PTP { X\t',c11,c14,'Y\t',c12,c14,'Z\t',c13,'\t',c14,'A0, B0,C0}\n\n'); fprintf(fid2,f); end % trovo il numero totale di punti che andrò a stampare l=0; for i=1:num_r m=max(A(i,:)); t=m*14; l=l+t; end f2=num2str(l); popup_sel_index = get(handles.popupmenu1, 'Value'); switch popup_sel_index case 1 % C_DIS
f1=strcat('LDAT_ACTLPCDAT1\n','XP1=VAR;\n',' FOR ITER =1 TO\t',f2,'\n','LIN XP1 C_DIS;\n','XP1=VAR+1;\n','END FOR\n\n\n'); case 2 %C_ORI f1=strcat('LDAT_ACTLPCDAT1\n','XP1=VAR;\n',' FOR ITER =1 TO\t',f2,'\n','LIN XP1 C_ORI;\n','XP1=VAR+1;\n','END FOR\n\n\n'); case 3 %C_VEL f1=strcat('LDAT_ACTLPCDAT1\n','XP1=VAR;\n',' FOR ITER =1 TO\t',f2,'\n','LIN XP1 C_VEL;\n','XP1=VAR+1;\n','END FOR\n\n\n'); end if(get(handles.radiobutton2,'value')==1) fprintf(fid2,f1); end f5=strcat('$H_POS=XHOME\n','PTP fprintf(fid2,f5);
XHOME\n','END\n');
Codice Krl
Di seguito un esempio del codice krl generato FILE .DAT
&ACCESS RVP &REL 143 &PARAM TEMPLATE = C:\KRC\Roboter\Template\vorgabe &PARAM EDITMASK = * DEFDAT Fresatura ;FOLD EXTERNAL DECLARATIONS;%{PE}%MKUKATPBASIS,%CEXT,%VCOMMON,%P EXT BAS (BAS_COMMAND :IN,REAL :IN ) ;DECL INT SUCCESS ;ENDFOLD (BASISTECH EXT) ;FOLD USER EXT;%{E}%MKUKATPUSER,%CEXT,%VEXT,%P ;Make here your modifications
DECL DECL DECL DECL DECL DECL DECL DECL DECL
… …
AXIS HOME; INT ITER; POS VAR; POS XP1; POS XP2; POS XP3; POS XP4; POS XP5; POS XP6;
… DECL DECL DECL DECL
POS POS POS POS
XP249; XP250; XP251; XP252;
;DECL LDAT #VAR};DECL #VAR} ;DECL LDAT ;DECL LDAT ;DECL LDAT
LCPDAT1={VEL20,ACC 100.0,APO_DIST 100.0,APO_FAC 50.0,ORI_TYP LDAT LCPDAT2={VEL20,ACC 100.0,APO_DIST 100.0,APO_FAC 50.0,ORI_TYP LCPDAT3={VEL20,ACC 100.0,APO_DIST 100.0,APO_FAC 50.0,ORI_TYP #VAR} LCPDAT4={VEL20,ACC 100.0,APO_DIST 100.0,APO_FAC 50.0,ORI_TYP #VAR} LCPDAT5={VEL20ACC 100.0,APO_DIST 100.0,APO_FAC 50.0,ORI_TYP #VAR}
;ENDFOLD (USER EXT) ;ENDFOLD (EXTERNAL DECLERATIONS) ENDDAT
FILE.SRC &ACCESS RVP &REL 143 &PARAM TEMPLATE = C:\KRC\Roboter\Template\vorgabe &PARAM EDITMASK = * DEF Fresatura( ) ;FOLD INI ;FOLD BASISTECH INI GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM ( ) INTERRUPT ON 3 BAS (#INITMOV,0 ) ;ENDFOLD (BASISTECH INI) ;FOLD USER INI ;Make your modifications here
;ENDFOLD (USER INI) ;ENDFOLD (INI) ;FOLD PTP HOME Vel= 100 % DEFAULT;%{PE}%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:HOME, 3:, 5:100, 7:DEFAULT $BWDSTART = FALSE PDAT_ACT=PDEFAULT FDAT_ACT=FHOME BAS (#PTP_PARAMS,100 ) $H_POS=XHOME PTP XHOME ;ENDFOLD
$BASE=BASE_DATA[1] $IPO_MODE=#BASE $TOOL= TOOL_DATA[8]
PTP{X -216,Y XP1={X LIN XP1 XP2={X LIN XP2 XP3={X LIN XP3 XP4={X LIN XP4 XP5={X LIN XP5 XP6={X LIN XP6 XP7={X LIN XP7 XP8={X LIN XP8 XP9={X LIN XP9 XP10={X LIN XP10 XP11={X LIN XP11 XP12={X LIN XP12 XP13={X
0,Z
-26}
-201.7143, C_DIS -187.4286, C_DIS -173.1429, C_DIS -158.8571, C_DIS -144.5714, C_DIS -130.2857, C_DIS -116, Y C_DIS -101.7143, C_DIS -87.4286, C_DIS -73.1429, C_DIS -58.8571, C_DIS -44.5714, C_DIS -30.2857,
Y
1,
Z
-27}
Y
1,
Z
-27}
Y
1,
Z
-26}
Y
1,
Z
-26}
Y
1,
Z
-27}
Y
1,
Z
-27}
1,
Z
-29}
Y
1,
Z
-29}
Y
1,
Z
-29}
Y
1,
Z
-30}
Y
1,
Z
-31}
Y
1,
Z
-31}
Y
1,
Z
-31}
XP447={X -187.4286, LIN XP447 C_DIS XP448={X -201.7143, LIN XP448 C_DIS ; CODICE OPERATIVO
Y
1,
Z
-27}
Y
1,
Z
-27}
… …
$H_POS=XHOME PTP XHOME END