Sei sulla pagina 1di 50

VARIABILI E MACRO PROGRAMMI

spunti di riflessione
per CNC FANUC

INTRODUZIONE

G00, G01, G02, G03, ed il gioco è fatto!


Con queste funzioni è possibile scrivere qualsiasi programma per
macchine a controllo numerico.
Volendo eseguire una foratura, questa verrebbe scritta come una
successione di spostamenti in G01.

Esempio

G01 F100 Z-2


G0 Z2
Z-1.9
G01 Z-4
G0 Z2
Z-3.9
G01 Z-6
...
...

Sarebbe una noia e una grande perdita di tempo eseguire i programmi


in questo modo.
Gli ingegneri del software hanno provveduto ad introdurre delle frasi
per facilitare il lavoro del programmatore.
L’esempio riportato sopra viene ridefinito con la frase G83

G83 Z R F Q

G83 è chiamato ciclo di foratura o funzione di foratura.

Gli stessi ingegneri, hanno dato l’opportunità al programmatore di


interagire in modo più profondo con la macchina, permettendogli di
“creare nuove funzioni” o semplicemente di utilizzare determinate
variabili.

A torto questo genere di programmazione viene ritenuta complicata e


astratta, capibile da pochi ed attuabile da ancor meno.

Questo manuale scritto per programmatori CNC, è una introduzione alla


programmazione attraverso l'uso di variabili e di programmi macro.

Si è cercato di proporre, con esempi e spiegazioni, i concetti di


variabile, operatori logici, parametri, macro programmi...

Programmi specializzati che possono agevolare la programmazione,


funzioni predefinite di calcolo algebrico, o dei macro programmi
capaci di svolgere col minimo sforzo lavorazioni anche complesse o
calcoli matematici rilevanti sono diventati un'esigenza quasi
irrinunciabile, un aiuto all'operatore programmatore che vuole
gestire maggiormente la macchina su cui lavora, che vuole essere più
produttivo semplificando la programmazione, migliorando la
possibilità di interventi o modifiche, diminuendo i tempi esecutivi
e di preparazione alle lavorazioni.

L'operatore verrà accompagnato per gradi dai concetti più semplici,


come quello di variabile, fino alla scrittura di macro programmi
specializzati.

Il manuale è suddiviso in più parti, farà largo uso di esempi e di


esercizi allo scopo di ampliare maggiormente le nuove conoscenze.

Parte uno

** Introduzione alle variabili.


** Operazioni matematiche e logiche.
** Salti, ripetizione, e operatori logici.
** Esempi
** Esercizi
** Riepilogo

Al termine l'operatore sarà in grado di scrivere un programma usando


le variabili, potrà decidere se e quando applicarle e saprà valutare
le conseguenze dirette del proprio lavoro.

Parte due

** Significato di programma macro


** Metodi per richiamare un programma macro
** Concetto di argomento
** Variabili locali e variabili di sistema
** Esempi di programmi macro
** Esercizi
** Tecniche di debug
** Riepilogo

Il manuale descrive le tecniche d'uso di questa programmazione senza


prendere in considerazione la macchina specifica: è indirizzato a
tornitori e fresatori indifferentemente.

L'operatore deve far riferimento al manuale dei parametri della


propria macchina.
Le variabili qui descritte sono state tratte dal manuale dei
parametri B-63090IT/01 FANUC serie 21i

Gli esercizi proposti, saranno affiancati dalla lettera F o T se


concepiti rispettivamente per operazioni di fresatura o di tornitura.

Si suppone che il lettore sappia programmare in ISO, o perlomeno


abbia dimestichezza con i concetti di funzione.

La programmazione verrà sconvolta?


Pensiamo proprio di no, al contrario, cercheremo di dare una nuova
strutturazione ai nostri programmi, un nuovo modo di esprimerci per
aiutarci ad ottenere programmi più portabili e maggiormente
flessibili.

Il CNC ha delle funzioni che non possono essere stravolte, cosi come
i programmi che scriveremo.
Possiamo però dedicare maggior attenzione alla strutturazione degli
stessi al fine di ottenere dei miglioramenti a livello qualitativo e
produttivo.

I programmatori che volessero usufruire degli esempi riportati in


questo manuale devono fare molta attenzione.
Volutamente questi non sempre sono compiuti, ma privi di alcune parti
spesso fondamentali.
Vogliamo apprendere la logica di programmare, non dare tutte le
soluzioni.
Solo quando sarete in grado di padroneggiare questa tecnica potrete
usufruire degli esempi, modificandoli ed ampliandoli .

Si potrebbe pensare che i macro programmi sono orma inutili con


l'elevata potenza di calcolo delle macchine moderne e la grande
capacita di memoria che queste possiedono...
Ma vi assicuro che ciò è assolutamente falso dato che tutte le
macchine, vecchie e giovani, ne fanno uso. Personalmente lavoro
tutt'ora con variabili e macro programmi ..... nonostante la mia
macchina faccia uso di un controllo Fanuc serie 310i... che non è
poco.

L'ultima generazione di controlli Fanuc pur mantenendo inalterata la


programmazione e la struttura logica sintattica delle variabili e dei
PR_MACRO ha introdotto nuove opportunità, nuove modalita di
scrittura....
E' un argomento che riguarda esclusivamente le nuove macchine e non
preoccupatevi di conoscere tuttto e subito.
In un prossimo articolo parleremo di tutto cio; ma siate coscienti
che leggendo queste righe potrete programmare qualsiasi macchina cnc
che usa il controlo Fanuc(con i dovuti accorgimenti chiaro).

Conoscere è l'esigenza di chi vuole migliorarsi, di chi ama il


proprio lavoro, di chi non si accontenta, di chi cerca nuove strade
per non rimanere fossilizzato, per offrire al lavoro che svolge e a
se stesso nuova linfa vitale: lavorare crescendo non è facoltativo, è
quasi obbligo.

Questo manuale è scritto da un programmatore per programmatori,


saremo grati anche a te
se con suggerimenti, contestazioni, inventiva,
aiuterai a migliorare questo scritto.

BUON LAVORO

PARTE PRIMA
Variabili

In un normale programma i codici G e le coordinate sono specificati


direttamente con un valore numerico;
per esempio G01, G02, G74, G83, X300, Z-90, Y30.
In situazioni particolari, i valori numerici possono essere
specificati usando il numero di una variabile, il cui valore può
essere modificato dal programma o manualmente o da MDI.

G#5; G01 X#1 F300; G#6 F#8; G83 Z-#10 F#11 Q2 R2

significato: (# leggi variabile)

* se alla #5 è assegnato il valore 0 l'espressione G#5 varrà G0

* se alla #1 è assegnato il valore 12 l'espressione

G01 X#1 F300 varrà G01 X12 F300

* se alla #6 è assegnato il valore 2 e alla #8 è assegnato il valore


100 l'espressione

G#6 F#8 varrà G2 F100

* se alla #10 è assegnato il valore 40 e alla #11 è assegnato il


valore 100 l'espressione

G83 Z-#10 F#11 Q2 R2 varrà G83 Z-40 F100 Q2 R2

Le variabili si specificano con il simbolo # seguito da un numero

#1, #10, #100

Per specificare il numero di una variabile si può usare anche una


espressione cioè una relazione tra numeri e variabili

#4; #[#1+#2+#3]; #[100+[#2*#5]]

in questo caso si devono usare le parentesi quadre per modificare


l'ordine delle operazioni.

Tecnicamente una variabile rappresenta una cella di memoria.


Questa è messa a disposizione dell’operatore perché possa inserirvi
un dato qualsiasi o modificarne il valore.

Se scriviamo #100 = 1000 indichiamo al CN di mettere il valore 1000


nella cella di memoria che corrisponde alla #100.
Modificando la #100 con #100 = 2000 indichiamo al CN di mettere il
valore 2000 nella cella corrispondente alla #100, quindi
modificandone il valore.

Pensiamo alle variabili come a delle scatole dove porre un numero


qualsiasi, che può essere usato e quindi modificato a nostro
piacimento.

Le variabili sono classificate in quattro tipi diversi in base al


numero di variabile:

** [1] variabile nulla #0


Questa variabile è sempre nulla, è senza valore non può esserle
assegnato alcun valore, non è definita ma può essere letta.

** [2] variabili locali Dalla #1 alla #33

Le variabili locali possono essere usate solo all'interno di una


macro.
All'accensione, le variabili locali sono nulle. Quando viene
richiamata una macro, gli argomenti sono assegnati alle variabili
locali.

** [3] variabili comuni

dalla #100 alla #149 (dalla #150 alla #199 opzionali)


dalla #500 alla #531 (dalla #532 alla #999 opzionali)

Le variabili comuni possono essere condivise fra più macro.


All'accensione, le variabili #100-#149 sono nulle.
Le variabili #500-#531 contengono i valori precedenti allo
spegnimento.
Come opzione sono disponibili anche le variabili dalla #150 alla #199
e dalla #532 alla #999.

** [4] variabili di sistema dalla #1000 in poi

Le variabili di sistema si usano per leggere e scrivere vari dati del


CNC, come la posizione corrente, i valori delle correzioni utensili,
i valori di F, S, M ecc...

* Le variabili possono essere definite (un valore o una espressione)


o non definite, cioè nulle ( o anche vacanti).
Le variabili non definite non hanno valore.

* In una espressione contenente una variabile nulla, la stessa, e


l'indirizzo associato verranno ignorati

G00 X#1 Y#2 se #2 è nulla l'espressione varrà G00 X#1

* In una operazione "nullo" è uguale a 0 salvo che nell'assegnazione


supponiamo che #1 sia nulla

#2=#1 --->> #2=nulla


#2=#1*10 --->> #2=0
#2=#1+#1 --->> #2=0

* Nelle espressioni condizionali nullo è diverso da 0 solo per le


istruzioni EQ e NE (uguale e differente).

#1 = nulla #1=0

#1 EQ #0 stabilita #1 EQ #0 non stabilita


#1 NE 0 stabilita #1 NE 0 non stabilita
#1 GE #0 stabilita #1 GE #0 stabilita
#1 GT 0 non stabilita #1 GT 0 non stabilita

Per questo motivo è importante non fare assunzioni errate sul valore
o stato di una variabile, ma definirla sempre.

* Il valore di una variabile viene sempre automaticamente arrotondato


all'incremento minimo di immissione dell'indirizzo

G00 X#1 con #1 = 15.3656


se l'incremento minimo di immissione è 1/1000 il comando viene
interpretato come

G00 X 15.366

E’ importante tenere sempre in considerazione questo meccanismo di


arrotondamento che in determinate situazioni potrebbe portare a
calcoli errati, o ad assunzioni sbagliate su determinati valori.

* Per invertire il segno del valore di una variabile, anteporre il


segno - a #

G00 x-#1

* I numeri di programma, i numeri di sequenza e i numeri di salto


blocco opzionale non possono essere specificati usando le variabili

esempi errati O#1


/#2 G00 X100
N#5 Y344

* Sulle variabili possono essere eseguite le seguenti operazioni

** definizione o assegnamento #i=#j

L'espressione #1=#2 è da leggere nel seguente modo: il valore della


variabile due è posto nella variabile uno.
E' errato pensare che le due variabili siano uguali: il loro valore è
identico, le variabili sono due cose differenti.
E' una sottigliezza che può ingannare e portare a risultati errati.

** somma #i=#j+#k
** differenza #i=#j-#k
** prodotto #i=#j*#k
** quoziente #i=#j/#
** seno #i=SIN[#j]
** coseno #i=COS[#j]
** arcoseno #i=ASIN[#j]
** arcocoseno #i=ACOS[#j]
** tangente #i=TAN[#j]
** arcotangente #i=ATAN[#j]/[#k]
** radice quadrata #i=SQRT[#j]
** valore assoluto #i=ABS[#j]
** arrotondamento #i=ROUND[#j]

Quando è inclusa in un comando aritmetico o logico, in una frase IF o


WHILE la funzione ROUND arrotonda alla prima posizione decimale

se #2=1.3452
allora il valore #1=ROUND[#2] è 1

Quando è usata in un comando NC la funzione ROUND arrotonda in base


all'incremento minimo di immissione.
Se l'incremento minimo di immissione è 1/1000 e #1 =1.3452

allora #1=1.345

** arrotondamento per difetto #i=FIX[#j]


** arrotondamento per eccesso #i=FUP[#j]

Quando il valore assoluto dell'intero prodotto da una funzione è


maggiore del valore assoluto del numero originale, si ha
l'arrotondamento per eccesso.
Al contrario, se il valore dell'intero è minore del valore assoluto
del numero originale si ha l'arrotondamento per difetto.
Bisogna fare molta attenzione ai numeri negativi.

#1=1.2 #2=-1.2
#3=Fup[#1] #3 è 2.0
#3=FIX[#1] #3 è 1.0
#3=FUP[#2] #3 è -2.0
#3=FIX[#2] #3 è -1.0

** logaritmo naturale #i=LN[#j]


** funzione esponenziale #i=EXP[#j]
** operazione logica OR #i = #j OR #k
** operazione logica XOR #i = #j XOR #k
** operazione logica AND #i = #j AND #k
** conversione da BCD a binario #i=BIN[#j]
** conversione da binario a BCD #i=BCD[#j]

dove #j e #k sono da intendersi come semplici variabili o espressioni


composte.

esempio

#j = [SIN[#k]*[#5+TAN[#H]]]

* In una espressione la priorità di esecuzione è la seguente

[1] Funzioni
[2] operazioni come *, /, AND, MOD
[3] operazioni come +, -, OR, XOR

E' comunque sempre possibile modificare la priorità usando le


parentesi quadre, il cui annidamento può arrivare fino a 5 livelli.

Quando si usa o è possibile usare una variabile?

Si usa una variabile, definita da un numero o da una espressione,


quando non si conosce a priori il numero di una funzione o di una
coordinata.

Questo significa che il programma, pur essendo definito logicamente,


solo al momento dell'esecuzione assumerà un significato reale
dipendente dai valori delle variabili.
Le variabili inoltre possono essere usate a proprio piacere per
definire cicli, contattori, salti di blocco e in tutti i modi che il
programmatore ritiene opportuno.

Infine le variabili sono fondamentali per la scrittura di programmi


macro, che altro non sono che dei sottoprogrammi che accettano dei
parametri, cioè valori mutevoli.

Salti e ripetizioni

Il flusso di un programma può essere controllato usando particolari


frasi capaci di eseguire salti o ripetizioni

GOTO salto incondizionato

IF salto condizionato, se.... allora


WHILE ripetere finche....

GOTO

Si può comandare un salto ad uno specifico blocco usando


l'espressione GOTO, definita salto incondizionato poiché il salto
avviene sempre ed in qualsiasi condizione

GOTOn

esempio:

GOTO100 Salta al blocco numero 100

GOTO#100 Salta al blocco assegnato alla variabile


100(se #100 = 10 salta al blocco numero 10)

IF

IF è definito salto condizionato poiché è necessario definire una


condizione affinché avvenga il salto

IF[ espressione condizionale]GOTOn

leggere in questo modo

se la condizione è soddisfatta, allora salta a n

esempio

IF[#100 EQ 0 ] GOTO100 (dove EQ significa uguale)

se #100 è uguale a 0 allora salta al blocco N100,


altrimenti c'è il proseguimento lineare del programma.

Un altro modo di specificare la frase IF è il seguente

IF[espressione condizionale]THEN[espressione]

dove espressione indica una qualsiasi condizione ottenuta in modo


valido.

esempio

IF[ROUND[ABS[#3+#4]] LT SQR[ABS[#10]]] THEN #110=1000

leggere in questo modo:


se l'arrotondamento del valore assoluto della somma di #3 + #4
è minore della radice quadrata del valore assoluto di #10
allora alla #110 è assegnatoil valore 1000

Il CNC accetta entrambe le specifiche, anche insieme

IF[#100 EQ0]THEN GOTO 100

L'espressione condizionale deve includere un operatore logico


inserito tra due variabili, o tra una variabile e una costante, e
deve essere chiusa dalle parentesi quadre (si ricordi che una
variabile è intesa come variabile semplice o composta da una
espressione).
WHILE

Il ciclo WHILE definisce la ripetizione di una porzione di programma


(sottoprogramma), fino a che è verificata una condizione

WHILE[espressione condizionale]DOm
N10 porzione di programma
-----
-----
N20 ENDm

Fino a che l'espressione condizionale è soddisfatta, verrà ripetuta


la porzione di programma da N10 a N20 (le lettere N sono state
introdotte esclusivamente per specificare la porzione di programma
ripetitiva, e non sono necessarie al programma).

esempio

WHILE[#100 NE 0] DO1
G91 G01 F500 Z-2
-----
-----
#100=#100-1
END1

NOTARE LA CORRISPONDENZA TRA IL DO1 E END1.

La lettera m può assumere i valori 1,2,3.


I cicli WHILE possono essere annidati tra loro (uno dentro l'altro),
ma in nessun caso si devono incrociare altrimenti il CNC non troverà
più corrispondenza tra DO e END.
Usando solo DOn senza specificare WHILE si avrà un ciclo infinito.

Operatori logici

Gli operatori logici sono costituiti da due lettere e si usano per


confrontare due valori; maggiore, minore o uguale.

Elenco degli operatori logici

operatore significato

EQ uguale
NE non uguale
GT maggiore
GE maggiore o uguale
LT minore
LE minore o uguale

Nelle espressioni condizionali nullo è visto come zero.

Esempi

#100 NE 0 [#1+#2] LT [SQRT[ABS[#100-#120]]]

Bisogna prestare la massima attenzione agli errori che possono


verificarsi per le espressioni condizionali che usano gli operatori
logici.
esempio:

IF [#1 EQ #2] è influenzata dall'errore di #1 e #2 e può dar luogo ad


una decisione errata. Quindi, invece di confrontare le due variabili
sarebbe meglio testare la differenza fra le stesse con IF[ABS[#1-#2]
LT 0.001, assumendo che il valore delle variabili sia lo stesso se la
differenza è minore di un valore limite (in questo caso 1/1000).

Fare anche attenzione nell'arrotondare un valore per difetto.

Esempi e spunti di riflessione

Gli esempi proposti volutamente possono presentarsi come irreali,


questo perché si cerca di apprendere la logica legata alle variabili
e le tecniche eventualmente applicabili senza badare alle effettive e
concrete esigenze lavorative.
Sarà l'operatore, una volta in grado di padroneggiare i nuovi
concetti ad applicarli alla realtà; dovrà decidere quando e se
utilizzare una variabile, le operazioni svolte, le logiche più
adatte.....

Le variabili usate in questi esempi sono tutte variabili comuni #


100->#149, liberamente utilizzabili dall'operatore e prive di
manifestazioni collaterali.

L'uso di variabili che non siano quelle comuni è da considerarsi


oggetto di approfondimento futuro, poiché esse hanno un significato
proprio, non modificabile o interpretabile dall'operatore.

Sentitevi liberi di usare le variabili comuni dandole il significato


che preferite eventualmente commentandole, ma attenzione alle
variabili di sistema o a quelle locali: ci vuole prima una
spiegazione appropriata, poi saremo in grado di usarle.

esempio

#1001 non usare (variabile di sistema #1000->)


#120 è usabile (variabile comune #100->#149)
#5001 non usare (variabile di sistema #1000->)
#110 usabile (variabile comune #100->#149)
#1 non usare (variabile locale, usata nelle
macro)
#26 non usare (variabile locale, usata nelle
macro)

Si raccomanda di eseguire gli esempi proposti con il proprio modo di


programmazione; quindi riscrivere usando le variabili.

* Cercare di capire le differenze in termini procedurali.


* Domandarsi sempre se ciò che si è scritto non solo è corretto
sintatticamente ma segue la logica del vecchio programma.

Le variabili non devono stravolgere la programmazione


ma al contrario devono aiutare gli operatori ad essere
più flessibili, a scrivere programmi più semplici e
modificabili in tempi ridotti.
* Quali vantaggi si sono ottenuti con le variabili?
* E' possibile migliorarne la leggibilità? (altri operatori devono
all'istante capirne il significato)
* E' possibile migliorarne l'efficienza?
* E' spiegato o interpretabile il significato di ogni variabile?

Sempre fatevi tante domande quando vi apprestate ad usare le


variabili poiché il nostro compito è si di imparare ad usarle, ma
definirne anche i vantaggi reali.

[1]
Come primo esempio verrà utilizzata una variabile per eseguire la
ripetizione ciclica di una porzione di programma, cioè un
sottoprogramma.

-----
N8 #100 = 10 contattore
N10 G91 G01 F500 Z-1 sottoprogramma
N12 -----
N -----
N48 -----
N50 #100 = #100-1 decremento del contattore
N52 IF[#100 NE 0] GOTO 10 confronto con il valore 0
N54 ----- continuazione del programma

Spiegazione..

La variabile 100 è impostata al valore delle ripetizioni(10).


Viene eseguito il sottoprogramma dal blocco N10 al blocco N48.
La variabili 100 viene decrementata, questo vuol dire che è stata
effettuata una ripetizione.
Il valore di #100 è confrontato con lo 0, poiché se #100 è uguale a 0
significa che abbiamo effettuato 10 ripetizioni(che era quello che
volevamo).
Se il valore di #100 è differente da 0 il programma ritorna al blocco
10 (GOTO10) perché non abbiamo raggiunto il numero delle ripetizioni
volute.
Se il valore di #100 è uguale a 0 il salto non viene effettuato ed il
programma continua linearmente con il blocco N54.

* I passi da compiere per eseguire una ripetizione ciclica di una


porzione di programma sono:

* impostare una variabile al valore richiesto dalle ripetizioni


(contattore)
* scrivere la porzione di programma ripetitiva
* eseguire il decremento della variabile contattore
* eseguire un confronto

NB!! Non necessariamente questi passi devono rispettare l'ordine


elencato!
E’ possibile per esempio eseguire il confronto prima dell'inizio
della ripetizione o decrementare prima dell'inizio del ciclo, oppure
aumentare invece che decrementare...

E’ il concetto logico, se pur mutevole che dobbiamo capire,


quindi agiremo come meglio crederemo!

esempi,
(1) N8 #100 = 0 contattore
N10 G91 G01 F500 Z-1 sottoprogramma
N12 -----
N -----
N48 -----
N50 #100 = #100+1 decremento del contattore
N52 IF[#100 NE 10] GOTO 10 confronto con il valore 10
N54 ----- continuazione del programma

(2) #100=10 contattore


N10 IF[#100 LT #110] GOTO 20 confronto
----- programma da ripetere
-------
-------
#100=#100-5 decremento
GOTO 10
N20 ------ continuazione del programma

Va da sé, che il programmatore è libero di scegliere di volta in


volta, secondo le esigenze lavorative l'ordine voluto, mantenendo
comunque la logica sopra elencata.

UN BUON PROGRAMMATORE SARA' CAPACE DI SCRIVERE QUALSIASI PROGRAMMA


CON VARIABILI.
UN OTTIMO PROGRAMMATORE SAPRA' ANCHE COMMENTARNE IL SIGNIFICATO.

Quindi nei programmi complessi è buona norma dare una spiegazione


succinta del significato delle variabili usando le parentesi tonde.
Si raccomanda di non esagerare con le spiegazioni poiché
allungherebbero a dismisura il programma rallentandolo e facendone
talvolta perdere il significato.

programma non spiegato programma spiegato

----- -----
----- -----
#100=20 #100=20 (contattore)
#101=0 #101=0 (sgrossatura./finitura)
#102=-30 #102=-30 (profondità di lavoro)
#103=1000 #103=1000 (avanzamento)
#104=0 #104=0 (variabile di controllo)
---- -----
---- -----

Il secondo esempio è chiaramente leggibile, non necessita


ricerche all'interno del programma per capirne il significato.

I programmi più semplici non necessitano di spiegazione solo se verrà


mantenuta una uniformità lavorativa, vale a dire si cercherà di
utilizzare il nome di una variabile sempre con lo stesso significato.
Per esempio in una ripetizione ciclica di un sottoprogramma si userà
sempre la variabile 120 come contattore.

Limitazioni...

Gli esempi sopra scritti sono perfettamente funzionanti e


sintatticamente corretti.
Bisogna però considerare alcuni aspetti legati ai tempi di
elaborazione del CNC.
Quando viene eseguita una frase GOTO, viene cercato il numero di
sequenza specificato. Per questa ragione il salto all'indietro
richiede più tempo del salto in avanti(va letto l’intero programma).
Per quanto possibile l'uso del GOTO dovrebbe essere sempre diretto in
avanti, e possibilmente non molto lontano dal salto stesso.
In programmi molto lunghi è sensibile il tempo richiesto a cercare il
numero di sequenza.

Esiste un modo più efficace per eseguire la ripetizione di porzioni


di programmi?
Si, utilizzando l'istruzione WHILE

Come esercizio riscrivere il primo programma utilizzando WHILE.

(Ogni qualvolta verrà proposto un esercizio è preferibile fermarsi, e


cercare la soluzione!!)

Il ciclo WHILE riduce notevolmente il tempo di esecuzione del


programma dato che il CNC non deve continuamente cercare i numeri di
sequenza, ma blocca la ricerca al ciclo ripetitivo.

La scrittura di un programma può essere eseguita in svariati modi;


bisogna sempre valutare con molta attenzione (soprattutto le prime
volte) l'operazione logica migliore o il ciclo di salto più consono
(l'esperienza e l'applicazione, ancora una volta, saranno di grande
aiuto).

Un esempio poco concreto di uso di variabili

Creare un programma capace di eseguire dei fori equidistanti da M10


su una circonferenza. Eseguire la centratura, la foratura, la
maschiatura e svasatura utilizzando lo stesso sottoprogramma e una
variabile di controllo.
(Per esempio 8 fori su D100 prof. 40)

Verrà sviluppato il programma per una lavorazione su fresa.

Seguiamo i passi sopra descritti!

* Scrittura del profilo o lavorazione -- 8 fori su D100 ---

L'origine pezzo è al centro.


8 fori su D100 vuol dire che i fori saranno posti a 45 gradi.
Il valore di x e di y saranno x = R*COS(a) y = R*SIN(a)
x =(100/2)*(COS 45°) y =(100/2)*(SIN 45°) pari a 35.355
I fori a 0° 90° 180° 270° sono gia definiti x50 y50 x-50 y-50

Supponendo di eseguire la lavorazione nel modo assoluto, il


sottoprogramma sarà

G90 X50 y0
X35.355 Y35.355
X0 Y50
X-35.355 Y35.355
X-50 Y0
X-35.355 Y-35.355
X0 y-50
X35.355 Y-35.355

Questa porzione di programma esegue degli spostamenti(il nostro


sottoprogramma).
Definito il sottoprogramma si presentano due questioni:

* come possiamo a richiamarlo?


* come farlo ritornare alla posizione desiderata?

La chiamata (M98) non dovrebbe essere un grande problema definito il


numero di blocco del sottoprogramma: per esempio definiamo N100
l'inizio del sottoprogramma

N100 G90 X50 Y0

Il ritorno da sottoprogramma che di solito si esegue con M99 è


fondamentalmente lo stesso, si deve dire di saltare ad un blocco
specifico: ma quale?
Avendo più utensili non conosceremo a priori il blocco specifico....

Ecco che interviene una variabile, cioè il famoso numerino magico che
ci permette di saltare ad un blocco di cui ancora non conosciamo il
numero.
Per esempio GOTO #100 salta al blocco il cui valore è posto nella #
100

Riproponiamo il programma con le nuove specifiche

N100 G90 X50 y0


X35.355 Y35.355
x0 y50
X-35.355 y35.355
x-50 y0
x-35.355 Y-35.355
x0 y-50
X35.355 y-35.355
GOTO #100

Il programma partirà sempre dal blocco 100 e ritornerà sempre


all'impostazione della #100. Quindi ogni utensile chiamerà il blocco
100 ed il sottoprogramma dovrà ritornare al blocco impostato alla
variabile 100.
Va da se che ogni utensile dovrà impostare questo valore.

Riepilogando

T.. M.. utensile 1, impostazioni di lavoro


#100 = 10 impostazione di #100
GOTO 100 richiamo sottoprogramma

N10 T.. M.. utensile 2, impostazioni di lavoro


#100 = 20 impostazione di #100
GOTO 100 richiamo sottoprogramma

N20 T.. M.. utensile 3, impostazioni di lavoro


#100 = 30 impostazione di #100
GOTO 100 richiamo sottoprogramma

N30 T.. M.. utensile 4, impostazioni di lavoro


#100 = 200 impostazione di #100

N100 G90 X50 Y0 sottoprogramma


-------
-------
GOTO #100 ritorno dal sottoprogramma
N200 fine
Ogni utensile imposterà la #100 per il ritorno dal sottoprogramma,
quindi salterà allo stesso ad eccezione dell'ultimo che esegue
direttamente il sottoprogramma.

Facendo partire ogni utensile dal centro, e cercando di porre nel


sottoprogramma il maggior numero di funzioni, tentiamo di scrivere il
codice necessario a far funzionare l'esempio

O1(PROGR. DI ESEMPIO);
G90 G0 G54
T1 M16 (PUNTA DA CENTRO)
G0 X0 Y0 S1200 M3 T2
G43 H1 Z2
M8
#100 =10 (il sottoprogramma ritornerà al blocco N10)
G81 Z-2 F100 K0 (K0, non viene eseguita la centratura al centro)
GOTO 100 (richiamo sottoprogramma)
N10 T2 M6(PUNTA D8.5)
G0 X0 Y0 S930 M3 T3
G43 H2 Z2
M8
#100 =20 (il sottoprogramma ritornerà al blocco N20)
G83 Z-40 F195 K0 (K0, non viene eseguita la foratura al centro)
GOTO 100 (richiamo sottoprogramma)
N20 T3 M6 (SVASATURA D16.5)
G0 X0 Y0 S300 M3 T4
G43 H3 Z2
M8
#100 =30 (il sottoprogramma ritornerà al blocco N30)
G81 Z-6 F100 R-4 K0 (K0, non viene eseguita la svasatura al centro)
GOTO 100 (richiamo sottoprogramma)
N30 T4 M6 (MASCHIO M10C)
G0 X0 Y0 S200 M3 T1
G43 H4 Z2
M8
#100 =200 (il sottoprogramma ritornerà al blocco N200)
M29 S200
G84 Z-35 F300 K0 (K0, non esegue la maschiatura al centro)
N100 G90 X50 Y0 (sottoprogramma)
X35.355 Y35.355
x0 y50
X-35.355 y35.355
x-50 y0
x-35.355 Y-35.355
x0 y-50
X35.355 y-35.355
G90 G0 Z100 M9 (fine del ciclo, alzata, stop mandrino)
M5
GOTO #100 (ritorna al valore di #100)
N200 G91 G28 Y0 Z0 (FINE PROGRAMMA)
M30

Eliminando i commenti il programma risulterà strutturalmente ben


definito e corretto: eseguiamo un confronto!

Programma Programma con Programma con


con variabili sottoprogramma ext sottoprogramma int

O1(ESEMPIO); O1(ESEMPIO); O1(ESEMPIO);


G90 G0 G54 G90 G0 G54 G90 G0 G54
T1 M6 T1 M6 T1 M6
G0 X0 Y0 S1200 M3 T2 G0 X0 Y0 S1200 M3 T2 G0 X0 Y0 S1200 M3 T2
G43 H1 Z2 G43 H1 Z2 G43 H1 Z2
M8 M8 M8
#100 =10 G81 Z-2 F100 K0 G81 Z-2 F100 K0
G81 Z-2 F100 K0 M98 P1000 M98 P100
GOTO 100 T2 M6 T2 M6
N10 T2 M6 G0 X0 Y0 S930 M3 T3 G0 X0 Y0 S930 M3 T3
G0 X0 Y0 S930 M3 T3 G43 H12Z2 G43 H12Z2
G43 H12Z2 M8 M8
M8 G83 Z-40 F195 K0 G83 Z-40 F195 K0
#100 =20 M98 P1000 M98 P100
G83 Z-40 F195 K0 T3 M6 T3 M6
GOTO 100 G0 X0 Y0 S300 M3 T4 G0 X0 Y0 S300 M3 T4
N20 T3 M6 G43 H3 Z2 G43 H3 Z2
G0 X0 Y0 S300 M3 T4 M8 M8
G43 H3 Z2 G81 Z-6 F100 R-4 K0 G81 Z-6 F100 R-4 K0
M8 M98 P1000 M98 P100
#100 =30 T4 M6 T4 M6
G81 Z-6 F100 R-4 K0 G0 X0 Y0 S200 M3 T1 G0 X0 Y0 S200 M3 T1
GOTO 100 G43 H4 Z2 G43 H4 Z2
N30 T4 M6 M8 M8
G0 X0 Y0 S200 M3 T1 M29 S200 M29 S200
G43 H4 Z2 G84 Z-35 F300 K0 G84 Z-35 F300 K0
M8 M98 P1000 M98 P100
#100 =200 G91 G28 Y0 Z0 G91 G28 Y0 Z0
M29 S200 M30 M30
G84 Z-35 F300 K0 N100 G90 X50 Y0
N100 G90 X50 Y0 PROGR O1000 X35.355 Y35.355
X35.355 Y35.355 G90 X50 Y0 x0 y50
x0 y50 X35.355 Y35.355 X-35.355 y35.355
X-35.355 y35.355 x0 y50 x-50 y0
x-50 y0 X-35.355 y35.355 x-35.355 Y-35.355
x-35.355 Y-35.355 x-50 y0 x0 y-50
x0 y-50 x-35.355 Y-35.355 X35.355 y-35.355
X35.355 y-35.355 x0 y-50 G90 G0 Z100 M9
G90 G0 Z100 M9 X35.355 y-35.355 M5
M5 G90 G0 Z100 M9 M99
GOTO #100 M5
N200 G91 G28 Y0 Z0 M99
M30

Notiamo che il programma con variabili è esattamente un comune


programma scritto facendo uso di M98/M99.

Quest'esempio puramente accademico risalta il concetto che usare le


variabili non è stravolgere la programmazione e che la scrittura può
essere effettuaata in diversi modi.
Ribadiamo il concetto che stiamo cercando di imparare la logica
dell'utilizzo delle variabili, quindi non ci interessa minimamente
della concretezza del programma: l'applicazione concreta arriverà con
l'apprendimento.

Diamo una serie di esercizi di applicazione delle nozioni apprese

[2.a F/T]
Creare un programma in grado di effettuare il richiamo ciclico di
tutti gli utensili che non abbia mai fine.

[2.b F/T]
Creare un programma in grado di effettuare il richiamo ciclico degli
utensili capace di fermarsi quando ha trovato l'utensile desiderato
(per esempio T7).
[2.c F/T] E' proponibile nella realtà l'esercizio 2.a? Quale problema
si verrebbe a creare? Come ovviare? Concretizzare per una procedura
reale.

[2.c F]
Creare un programma capace di eseguire un foro filettato M76 passo 2,
profondo 100 mm.

Gli esempi precedentemente esaminati utilizzavano le variabili nel


modo più intuitivo e semplice:
una variabile come contattore per la ripetizione di porzioni di
programma.

* Quali considerazioni possiamo trarre da questi esempi?


* Hanno aiutato a risolvere aspetti ridondanti della programmazione?
* Cosa non è ancora chiaro?
* Pensiamo ci siano metodiche migliori di attuare gli stessi
concetti?
* Domandiamoci infine quali possono essere le applicazioni pratiche
che potremmo utilizzare quotidianamente al fine di ottenere dei
miglioramenti produttivi in termini di tempo e di qualità.

[3]
E’ possibile ripetere una porzione di programma senza l'ausilio di un
contattore?

[3.a F]
Eseguire la contornitura fino ad una profondità di 30 mm, di un pezzo
100*100 raggiando gli spigoli con R5. Il sovra metallo laterale è di
10 mm. E' prevista una operazione di finitura.
In che modo sarebbe vantaggioso l'utilizzo di variabili?
Tentare di abbozzare un programma con più variabili.

Fermarsi senza proseguire e tentare di risolvere il problema.

Spiegazione

La ripetizione di porzioni di programma in alcune situazioni può


essere effettuata senza l'ausilio di un contattore laddove non è
richiesto un conteggio ma una semplice ripetizione.
L'esempio proposto prende in considerazione due operazioni
fondamentalmente identiche: una operazione di sgrossatura ed una di
finitura.
Indipendentemente dal numero di ripetizioni che ciascuna operazione
effettua il profilo da lavorare rimane lo stesso, quindi è inutile
ripetere due volte la scrittura dello stesso, ma è proponibile la
ripetizione utilizzando una variabile di controllo la quale definirà
il ciclo.

Per esempio la #100 assumerà un valore uguale a 0 in sgrossatura


mentre in finitura porremo un valore differente.

Avere una variabile di controllo ci permetterà di eseguire le due


lavorazioni in modo indipendente, usando velocità consone alla
lavorazione, il numero di passate desiderabile, e quanto altro si
voglia.

Questo tipo di ripetizione prevede i seguenti passi:

* Scrittura del profilo facendo attenzione ad usare delle variabili


per quei codici che assumono valori mutevoli.

* Richiamo degli utensili ed impostazione delle variabili di


controllo
All'opera raga!!!

[3.b]

Cercare di applicare ad un esempio concreto il nuovo concetto,


valutare attentamente la necessità di questa procedura, e ricordarsi
delle note procedurali sopra esposte (scrivere il programma nel
vecchio modo e capire dove intervenire).

Infine confrontarsi con altre persone, verificare i diversi approcci


lavorativi e programmativi, applicare le diversità concettuali al
fine di ottenere un risultato il più semplice possibile, maneggiabile
e modificabile.

[4]

La definizione di variabile è insito nella parola stessa: qualcosa


che non ha valore costante ma che può essere cambiato secondo le
esigenze. Questo è il concetto fondamentale che mai dobbiamo
dimenticare!

Non è necessario scrivere programmi complicati per usare le


variabili, al contrario, queste possono e devono aiutarci anche in
quelle lavorazioni apparentemente semplici come una foratura.

[4.a F]

Eseguire due forature M6 su un parallelepipedo di lunghezza 100, a


distanza 70, centrate al pezzo.
Supponendo di avere un parallelepipedo di lato 20 ed uno di lato 30,
scrivere un programma che permetta di eseguire la lavorazione
indipendentemente dalle dimensioni del pezzo

Esercitiamoci ancora!!

**F/T Scrivere un programma capace di sommare i numeri da 1 a 10

**F/T Scrivere un programma capace di spostare un asse macchina in


base alla somma sequenziale dei numeri da 1 a 20, fermandosi prima di
avere superato il 100.

(((((1+2)+3)+4)+5)+6).. se maggiore di 100 -> STOP

**F/T E' possibile riscrivere il programma precedente con un ciclo


differente? Se affermativo eseguire, altrimenti spiegare il perché.

**F Eseguire tre asole di dimensione differente.


E' possibile definire un sottoprogramma? E' conveniente?

asola 1: L50/R8/P20 (lunghezza, raggio, profondità)


asola 2: L50/R10/P25
asola 3: L60/R12/P30

**T Scrivere un programma capace di effettuare la rotazione completa


dell'asse C, fermandosi 3 secondi ad ogni grado multiplo di tre o in
quei gradi che contengono il numero 3.

**F Scrivere un programma di spianatura di una flangia messa in


posizione verticale al fine di eliminare i tempi morti. Flangia D=400
mm, profondità di fresatura uguale a 50mm. Trovare almeno 3
soluzioni differenti.

Riepilogo

L’uso di una variabile è richiesto quando non si conosce a priori un


valore o una funzione, vale a dire quando esiste una situazione
mutevole che impedisce di determinare direttamente questi valori.

Una variabile può essere utile come contattore, si può usare come
fattore di controllo, oppure può essere usata come valore di
avanzamento o funzione G...

Ogni qualvolta si ha l’esigenza di scrivere o leggere un valore


mutevole, risulta utile una variabile!

Nei normali programmi si possono usare le variabili da 100 a 149


e dalla variabile 500 alla variabile 549 (opzionalmente anche altre
variabili), dandole il significato che preferiamo, ma cercando sempre
di commentarle per renderle interpretabili anche dagli altri.

Sulle variabili possiamo usare determinate frasi capaci di effettuare


dei salti: possiamo quindi avere un controllo attraverso il valore
che assumono(GOTO, IF, WHILE).

Questi cicli sono affiancati dagli operatori logici che permettono


il confronto tra variabili o tra variabile e costante(numero).

E’ l’operatore che usa e abusa delle variabili;


significati, operazioni matematiche e logiche, salti condizionati o
no...

La variabile è un foglio in bianco potete scriverci ciò che volete!!

PARTE SECONDA
Programmi macro

I sottoprogrammi sono utili per ripetere la stessa operazione.


Le macro istruzioni, invece, permettono di usare variabili,
istruzioni logiche e aritmetiche, salti e cicli ripetitivi;
consentono cioè di sviluppare programmi di uso generale o
specializzati.
Un programma macro (MPR) è dunque un sottoprogramma capace di
accettare degli argomenti cioè variabili definite da chi scrive il
MPR.

Un programma macro può essere richiamato usando uno dei seguenti


metodi:

richiamo semplice G65 G65 P6054 L3 ...


richiamo modale G66 G67 G66 P6325 L4 ...
richiamo macro con codice G G356 ...
richiamo macro con codice M M50 ...
richiamo sottoprogramma con codice M M100
richiamo sottoprogramma con codice T T44

dove i puntini ... indicano una serie di argomenti (valori passati


alla macro).

Le differenze fondamentali tra un sottoprogramma (M98) e il richiamo


macro (G65) sono le seguenti:

* M98 non può includere argomenti, G65 si


* Quando un blocco M98 contiene altri comandi NC (G01 X10 M98Pp),
il sottoprogramma viene richiamato dopo l'esecuzione degli altri
comandi. G65 richiama incondizionatamente la macchina.
* Con G65, il livello delle variabili locali cambia, con M98 non
cambia.

** Richiamo semplice

Quando viene specificato G65, viene richiamata la macro specificata


con l'indirizzo P. E' possibile passare dei dati(argomenti) alla
macro.

G65 Pp Ll <argomenti>

P numero del programma da richiamare


l numero di ripetizioni
argomento: dato passato alla macro

E' possibile il richiamo fino alla profondità di quattro livelli,


inclusi i richiami semplici, modali.
Non è possibile il richiamo con M98.

** Richiamo modale

Dopo il comando di richiamo modale G66, la macro specificata viene


richiamata alla fine di tutti i blocchi che specificano un movimento
asse. Questo continua finche non viene programmato G67, che cancella
il richiamo macro modale.

G66 Pp Ll <argomenti>

P numero del programma da richiamare


l numero di ripetizioni
argomento: dato passato alla macro
In un blocco G66 non possono essere richiamate macro.

** Richiamo di macro tramite codici G

Tramite parametri è possibile specificare il richiamo non modale di


specifiche macro tramite codici G

G233 X10 Y20 Z-20;

I codici G possono assumere valori compresi tra 1 e 9999.

Si rimanda alla lettura del manuale specifico della macchina al fine


di determinare i parametri relativi al richiamo macro con codici G.
In un programma macro richiamato con un codice G, non è possibile
richiamare altre macro con codici G. In un sottoprogramma richiamato
con i codici M o T, non è possibile richiamare altre macro con i
codici G.

** Richiamo di macro tramite codici M

Tramite parametri è possibile specificare il richiamo non modale di


specifiche macro tramite codice M

M4567 A1 B4 C6

Si rimanda alla lettura del manuale specifico della macchina al fine


di determinare i parametri relativi al richiamo macro con codici M.
In un programma macro richiamato con un codice G o in un
sottoprogramma richiamato con i codici M o T, non è possibile
richiamare altre macro con i codici M.

** Richiamo di sottoprogrammi tramite codici M

Tramite parametri è possibile specificare il richiamo di un


sottoprogramma (programma macro) tramite codici M. Il programma macro
può essere richiamato con le stesse modalità del richiamo di
sottoprogrammi con M98.

M37

Si rimanda alla lettura del manuale specifico della macchina al fine


di determinare i parametri relativi al richiamo macro con codici M.

Non è ammessa la specifica degli argomenti. In un programma


richiamato con un codice G o in un sottoprogramma richiamato con i
codici M o T, non è possibile richiamare altri sottoprogrammi con i
codici M.

** Richiamo di sottoprogrammi tramite codici T

Tramite un parametro è possibile abilitare il richiamo di


sottoprogrammi (programmi macro) tramite codici T . Il programma
macro è richiamato ogni volta che nel programma pezzo è specificato
un codice T .

T55

Si rimanda alla lettura del manuale specifico della macchina al fine


di determinare i parametri relativi al richiamo macro con codici T .
In un programma macro richiamato con un codice G o in un
sottoprogramma richiamato con i codici M o T, non è possibile
richiamare altri sottoprogrammi con i codici T .

Prima di intraprendere lo studio di un macro programma è necessario


affrontare e chiarire alcuni aspetti legati alle macro:

* argomenti e variabili locali


* variabili di sistema

** argomenti

Con il termine argomenti è indicato un dato(lettera), un valore cioè


che viene passato alla macro. Supponiamo di avere la macro G200, che
accetta diversi argomenti tra cui X, Y, Z...

G200 X100 Y100 Z-20 ...

Gli argomenti sono proprio X, Y, Z ai quali noi passiamo i valori

100, 100, -20

Una macro può avere un numero qualsiasi di argomenti ai quali si può


passare (leggi dare) un qualsiasi valore.
Nella realtà il numero degli argomenti è limitato alla specifica
usata(si vedrà più avanti)

Per quanto possibile la scelta degli argomenti dovrebbe rispecchiare


il significato che normalmente usiamo.

Supponiamo di inventare la macro G83 simile alla funzione NC, G83.


Nessuno proibisce di scrivere la macro come

G83 A B C D piuttosto che G83 Z F Q R

Naturalmente per il programmatore è più familiare comprendere la


seconda scrittura, poiché è quella che usa quotidianamente.

IL SIGNIFICATO DEGLI ARGOMENTI E' DEFINITO DA CHI SCRIVE LA MACRO!!


X, Y, Z, POTREBBERO NON ESSERE RIFERITI ALLE QUOTE DEGLI ASSI, MA
ASSUMERE IL NUOVO SIGNIFICATO DATO DAL REALIZZATORE DELLA MACRO. NON
CONFONDETE IL SIGNIFICATO DELLE LETTERE DI UN PROGRAMMA SCRITTO PER
CNC CON QUELLO DI UNA MACRO. E' IMPORTANTISSIMO CAPIRE BENE IL
SIGNIFICATO DI QUESTA DIFFERENZA PER NON ENTRARE IN CONFUSIONE!!!

G83 Z-30 F100 Q2 R2 il significato di

Z è valore della profondità del ciclo G83


F è l'avanzamento di lavoro del ciclo G83
Q è lo scarico del ciclo G83
R è la discesa in rapido al punto di attacco/distacco ciclo

G200 X199 Y45 Z45 F44 Q22 A22 B33

il significato degli argomenti X, Y, Z, F, Q, A, B è assegnato da chi


ha scritto la macro, Z potrebbe non essere riferito ad una
profondità.

E' quindi saggio mantenere il significato originale delle lettere di


un programma CNC

Z valore riferito all'asse z


y valore riferito all'asse y

Nota

Non sempre è possibile mantenere il significato delle lettere di un


programma macro uguale a quelle di un programma CNC! L’accortezza sta
nel mantenere paritetiche quelle variabili fondamentali, e usare
altre variabili a scopi secondari.

esempio

G83 Z-40 R0 F1000 Q0.4

Z è valore della profondità del ciclo G83


F è l'avanzamento di lavoro del ciclo G83
Q è lo scarico del ciclo G83
R è la discesa in rapido al punto di attacco/distacco ciclo

Una ipotetica macro che utilizza il ciclo G83

G230 Z-40 R0 F1000 Q0.4 A1 B2 M83 J0

Z è valore della profondità del ciclo M83(G83)


F è l'avanzamento di lavoro del ciclo M83
Q è lo scarico del ciclo M83
R è la discesa in rapido al punto di attacco/distacco ciclo

Le altre variabili potranno assumere un significato generale, non


alterando il significato originale delle precedenti.

** variabili locali

Le variabili adottate fin qui, volutamente erano di tipo comune, cioè


variabili utilizzabili in qualsiasi programma, prive di significato
proprio, adattabili alle nostre esigenze.

Lo ricordiamo dalla #100 alla 149 dalla #500 alla #531


opzionalmente dalla #150 alla 199 dalla #532 alla #999

Le variabili locali vanno dalla #1 alla #33 e possono essere usate


solo all'interno di una macro e sono direttamente collegate agli
argomenti: quando una macro è richiamata, gli argomenti sono
assegnati alle variabili locali.

Sono disponibili due tipi di specifica degli argomenti:

* specifica di tipo I
* specifica di tipo II

** specifica di tipo I

La specifica di tipo I usa le lettere dell'alfabeto diverse da G, L,


O, N, P una volta ciascuna. L'associazione lettera variabile è la
seguente

A #1 I #4 T #20
B #2 J #5 U #21
C #3 K #6 V #22
D #7 M #13 W #23
E #8 Q #17 X #24
F #9 R #18 Y #25
H #11 S #19 Z #26

Gli indirizzi I J K devono essere specificati in ordine alfabetico,


gli altri possono seguire l’ordine desiderato.

** specifica di tipo II

La specifica di tipo II usa le lettere A, B, C una volta ciascuna e


usa le lettere I, J, K fino a 10 volte. L'associazione lettera
variabile è la seguente

A #1 K3 #12 J7 #23
B #2 I4 #13 K7 #24
C #3 J4 #14 I8 #25
I1 #4 K4 #15 J8 #26
J1 #5 I5 #16 K8 #27
K1 #6 J5 #17 I9 #28
I2 #7 K5 #18 J9 #29
J2 #8 I6 #19 K9 #30
K2 #9 J6 #20 I10 #31
I3 #10 K6 #21 J10 #32
J3 #11 I7 #22 K10 #33

Il CNC identifica internamente la specifica adottata, e se usate


insieme (che è possibile), il tipo di specifica richiamato per ultimo
ha la precedenza.

Per chiarire i due concetti sopra esposti faremo un esempio

G260 Z-30 R0 F1000 Q0.3 I20 D36

La macro G260 accetta diversi argomenti Z, R, F, Q, I, D (specifica


I) ai quali sono stati associati determinati valori:

Z=-30 R=0 F=1000 Q=0.3 I=20 D=36

Essendo gli argomenti associati ad una variabile, i valori che questi


ricevono sono associati alla stessa

Z -> #26=-30 R -> #18=0 F -> #9=1000


Q -> #17=0.3 I -> #4=20 D -> #7=36

Quindi G260 Z-30 R0 F1000 Q0.3 I20 D36

Può essere interpretata

G260 #26[-30] #18[0] #9[1000] #17[0.3] #4[20] #7[36]

** Variabili di sistema

L'operatore deve far riferimento al manuale parametri della propria


macchina.
Le variabili qui descritte sono state tratte dal manuale dei
parametri B-63090IT/01 FANUC serie 21i

Le variabili di sistema si usano per leggere e scrivere alcuni dati


del CNC, come la posizione corrente, le correzioni utensili, i dati
modali, ecc...

Queste variabili hanno un loro significato ben preciso che non può
essere alterato. Sono un numero considerevole e non tutte
direttamente utili al programmatore: sono essenziali per lo sviluppo
di programmi per l'automazione per uso generale.

Elenchiamo le variabili più comunemente usate dal programmatore

* dalla #10001 alla #13999 valori delle correzioni utensili


* #3000 allarmi macro
* #3001 #3002 #3011 #3012 dati relativi al tempo
* #3003 #3004 controllo del funzionamento automatico
* #3901 #3902 numero di pezzi
* dalla #4001 alla #4130 dati modali
* dalla #5001 alla #5104 posizione corrente
* dalla #5201 alla #5324 offset zero pezzo
dalla #2500 alla #2806
dalla #7001 alla #7944
dalla #14001 alla #19984

** Valori delle correzioni utensili

I valori delle correzioni utensili possono essere letti e scritti. Le


variabili utilizzabili dipendono dal numero di coppie di correttori,
dalla distinzione fra le correzioni geometria e le correzioni usura e
dalla distinzione fra la compensazione lunghezza utensile e la
compensazione raggio utensile.
Se il numero di coppie di correttori non è maggiore di 200, possono
essere usate anche le variabili da #2001 a #2400

Variabili di sistema per la memoria A delle correzioni utensili

Numero correttore Variabile di sistema

1 #10001 (#2001)
2 #10002 (#2002)
. .
. .
200 #10200 (#2200)
201 #10201
. .
. .
999 #10999

Variabili di sistema per la memoria B delle correzioni utensili

Numero Correzione Correzione


Correttore geometria usura

1 #11001 (#2201) #10001 (#2001)


2 #11002 (#2202) #10002 (2002)
. . .
. . .
200 #11200 (#2400) #10200 (#2200)
. . .
. . .
999 #11999 #10999

Variabili di sistema per la memoria C delle correzioni utensili

Numero Lunghezza utensile Raggio utensile


Correttore Geometria usura geometria
usura
----------- ------- -------- ---------------

1 #11001(#2201) #10001(#2001) #13001 #12001


2 #11002(#2202) #10002(#2002) #13002 #12002
. . . . .
200 #11200(#2400) #10200(#2200) . .
. . . . .
999 #11999 #10999 #13999 #12999
** Allarmi delle macro

#3000

Quando alla variabile #3000 viene assegnato un valore da 0 a 200, il


CNC si ferma in allarme.
Dopo il valore numerico, può essere scritto un messaggio di allarme
non più lungo di 26 caratteri.
Lo schermo visualizza il numero di allarme sommando 3000 al valore
della variabile #3000 e il messaggio di allarme.

Esempio

#3000=10(interferenza raggio utensile)

sullo schermo degli allarmi comparirà


"3010 interferenza raggio utensile"

** Dati relativi al tempo

#3001

E’ un temporizzatore che conta continuamente con incrementi di 1


millisecondo.
All'accensione ha valore 0 dopo 2147483648 millisecondi ritorna a 0.

#3002

E’ un temporizzatore che conta con incrementi di 1 ora quando la spia


di cycle start è accesa. Preserva il suo valore anche a macchina
spenta. Dopo 9544.371767 ore ritorna a 0.

#3011

E’ utilizzata per leggere la data corrente. Il dato anno/mese/giorno


è convertito in un numero decimale apparente.
Per esempio, 15 ottobre 2006 è rappresentato come 20061015.

#3012

E’ usata per leggere l'ora corrente. Il dato ore/minuti/secondi è


convertito in un numero decimale apparente. Per esempio ore 20 e 28
minuti 50 secondi è rappresentato come 202850.

** Controllo del funzionamento automatico

Lo stato di controllo del funzionamento automatico può essere


cambiato

#3003

valore blocco singolo completamento delle


funzioni ausiliarie

0 abilitato atteso
1 disabilitato atteso
2 abilitato non atteso
3 disabilitato non atteso
#3004

valore Feed hold Regolazione Arresto


esatto avanzamento

0 abilitato abilitato abilitato


1 disabilitato abilitato abilitato
2 abilitato disabilitato abilitato
3 disabilitato disabilitato abilitato
4 abilitato abilitato disabilitato
5 disabilitato abilitato disabilitato
6 abilitato disabilitato disabilitato
7 disabilitato disabilitato disabilitato

Il valore delle #3003 e #3004 all'accensione è 0.

** Numero di pezzi

#3901 numero di pezzi lavorati

#3902 numero di pezzi richiesti

Queste variabili possono essere scritte e lette, ma attenzione a non


assegnare valori negativi!

** Dati modali

Possono essere letti i valori dei dati modali specificati fino al


blocco immediatamente precedente.

Variabile Funzione

#4001 G00,G01, G02, G03, G33


#4002 G17, G18, G19
#4003 G90, G91
#4004
#4005 G94, G95
#4006 G20, G21
#4007 G40, G41, G42
#4008 G43, G44, G49
#4010 G98, G99
#4011 G50, G51
#4012 G65, G66, G67
#4013 G96, G97
#4014 G54-G59
#4015 G61-G64
#4016 G68, G69
. .
#4022 gruppo 22
#4102 codice B
#4107 codice D
#4109 codice F
#4111 codice H
#4113 codice M
#4114 numero di sequenza
#4115 numero di programma
#4119 codice S
#4120 codice T
#4130 codice P(numero del sistema di
coordinate del pezzo addizionale
attualmente selezionato)

Il risultato dell’istruzione #10=#4001, potrà essere 0, 1, 2, 3,


oppure 33.

** Posizione corrente

I dati di posizione non possono essere scritti ma solamente letti

Variabile tipo sistema di correzioni lettura durante


dato coordinate utensili il movimento

#5001-#5004 punto pezzo non incluse abilitata


finale
blocco

#5021-#5024 posizione macchina incluse disabilitata


corrente

#5041-#5041 posizione pezzo incluse disabilitata


corrente

#5061-#5064 posizione pezzo incluse abilitata


segnale di
salto

#5081-#5084 entità disabilitata


compensazione
lunghezza utensile

#5101-5104 errore di posizione disabilitata


del servosistema

La prima cifra rappresenta il numero dell'asse X, Y, Z, A.


Le variabili da #5061 a #5064 contengono le coordinate della
posizione del segnale di salto in un blocco G31. Se non si è avuto
segnale di salto, queste contengono le coordinate del punto finale
del blocco.
Le variabili da #5081 a #5084 contengono il valore delle correzioni
utensili attualmente utilizzate.

** Offset dello zero pezzo

Gli offset dello zero pezzo possono essere letti e scritti.


L'elenco di queste variabili è troppo lungo per essere riportato in
questo manuale, si farà una breve introduzione rimandando al manuale
macchina per la lettura completa

dalla #5201 alla #5324 offset zero pezzo sistemi G54-G59

dalla #2500 alla #2806 offset zero pezzo sistemi G54-G59

dalla #7001 alla #7944 offset zero pezzo sistemi


G54.1 P1 G54.1 P48

dalla #14001 alla #19984 offset zero pezzo sistemi


G54.1 P1 G54.1 P300
L’uso delle variabili di sistema pur trovando la sua collocazione
migliore nelle macro non è da considerarsi uso esclusivo di queste.
Qualsiasi programma può liberamente farne uso con l’accortezza di
conoscerne il significato.

Mostriamo un esempio di utilizzo di variabili di sistema.

Creare un sottoprogramma per il controllo delle ripetizioni, capace


di verificare il valore di Z.
Dato un profilo, impostata la profondità di lavoro e il numero di
passate, il sottoprogramma dovrà verificare che le ripetizioni non
eccedano la profondità impostata qualsiasi sia il valore della
passata scelta.

Decido di chiamare il programma O8000.

Non sapendo a priori la profondità di passata e la profondità finale


di lavoro, imposto due variabili per questi valori

#120 = profondità finale


#121 = profondità di passata

quindi il sottoprogramma O8000 dovrà essere richiamato durante


l'esecuzione del profilo per determinarvi la conclusione, la
continuazione o eventuali modifiche.

Scrittura del programma O8000

O8000(Control Z)
(#120 profondità di lavoro)
(#121 profondità di passata)
(#122 calcolo prossimo valore)
(#123 quota mancante)
#122 = #5003 - #121
#123 = ABS[#120 - #5003]
IF[#122 LT #120] THEN #121 = #123
M99

Le prime quattro righe enunciano il significato delle variabili usate


nel programma.

O8000(Control Z)
(#120 profondità di lavoro)
(#121 profondità di passata)
(#122 calcolo prossimo valore)
(#123 quota mancante)

Le altre righe definiscono il sottoprogramma vero e proprio

#122 = #5003- # 121

La #122 calcola il prossimo valore di Z, sottraendo il valore di


passata (#121) al valore attuale di posizione asse Z (#5003)

#123 = ABS[#120 - #5003]

La #123 esegue il calcolo del valore assoluto della quota mancante,


cioè la differenza tra il valore della posizione attuale e la
profondità di lavoro finale.
Usiamo il valore assoluto (ABS) poiché ci interessa la distanza
mancante che non sempre è rappresentata dalla differenza dei due
valori ma dalla loro distanza.
Dobbiamo sempre fare attenzione ai segni delle quote interessate, vi
accorgerete che non sempre le due cose coincidono!

IF[#122 LT #120] THEN #121 = #123

Se #122 è minore di #120 allora #121 = #123.


Se il prossimo valore calcolato (posizione asse) supera la profondità
impostata da programma (#120), allora la prossima passata non sarà
più uguale a #121 (il valore impostato da programma) ma a #123 che
rappresenta la distanza mancante.

Abbiamo ottenuto un sottoprogramma capace di controllare la


profondità di lavoro, non molto lungo, che richiamato non avrà
perdite di tempo lavorativo.

Naturalmente questo può essere la base per miglioramenti, ma il


sottoprogramma cosi come è scritto funziona egregiamente....
provatelo!

Come dovrò usare il programma O8000?

Supponiamo di dover contornare un profilo qualsiasi di profondità


34.7 con profondità di passata di 1.5 mm.
Abbiamo imparato ad usare le variabili e non dovrebbe essere
difficile scrivere il programma.

N10 G91 G01 F500 Z-#121


.... profilo
....
.... fine profilo
IF[ #5003 GT #100 ] GOTO 10

Nel caso specifico non dobbiamo controllare la ripetizione ciclica ma


solo che venga raggiunto il valore di Z finale. Il programma O8000
esegue con accuratezza questo compito, l'ultima riga quindi serve
esclusivamente per uscire dal ciclo e non tanto per eseguire un
controllo del valore finale(E' doveroso comunque effettuare un doppio
controllo, e mai fare assunzioni ipotetiche).

Ora inseriamo al punto giusto il programma O8000 e le variabili di


controllo Z finale e passata.

-----
-----
#120 = -30.7 (profondità finale)
#121 = 1 (profondità di passata)
N10 M98 P8000 (controllo Z)
G91 G01 F500 Z#-121 (profilo)
....
....
.... (fine profilo)
IF[ #5003 GT #100 ] GOTO 10
-----
-----

Il programma O8000 viene richiamato ad ogni ripetizione del ciclo di


fresatura profilo per il calcolo della passata. Se la distanza
mancante è superiore allo scarico, il sottoprogramma non interverrà
lasciando che il ciclo continui. Qualora la distanza mancante risulti
minore dello scarico il programma O8000 interverrà riducendo
automaticamente la passata finale.
Il programma principale con l'istruzione IF[ #5003 GT #100 ] GOTO 10
deciderà se richiamare il sottoprogramma o terminare il ciclo.

E' necessario che le variabili associate alla profondità di lavoro e


alla passata siano rispettivamente #120 e #121 altrimenti O8000 non
funzionerebbe o peggio ancora funzionerebbe con i valori attualmente
scritti nelle rispettive variabili.

Analizzare attentamente il programma, cercare di capire ogni singola


riga...

* Domandarsi perché sono state effettuate delle sottrazioni al posto


di addizioni, cercare pregi e difetti.
* Chiedersi se è possibile scrivere una versione differente, provare
ad attuarla.
* E' possibile creare un ciclo infinito capace di ottenere i medesimi
risultati? E' conveniente?
* E' possibile realizzare un programma che non sia dipendente dalle #
120 e #121?

L'esempio proposto mostra come è possibile usare le variabili di


sistema in un programma che non sia una macro. Se ci troviamo a dover
scrivere programmi artificiosi o complessi, risolvibili in modo
migliore con l'uso delle variabili di sistema nessuno ce lo vieta:
sono variabili come le altre, ma attenzione il loro significato è
univoco non potete cambiarlo. La #5003 è il punto finale del blocco
nel sistema di coordinate usato attualmente, e sempre avrà questo
significato. Tentare di darle un significato diverso, come si fa con
le variabili comuni, non è possibile.
Usate tutte le variabili di sistema che volete assecondando il loro
significato!

**F Riscrivere il programma di spianatura di una flangia messa in


posizione verticale presentato negli esercizi della prime parte del
manuale, facendo uso delle variabili di sistema.

Sapreste fare una valutazione comparativa?


Quale vi sembra il migliore e perché?
Sapreste trovare una terza soluzione?

Le variabili di sistema possono essere usate in una miriade di modi.


Il calcolo della posizione corrente nel sistema di riferimento
attuale a volte è più conveniente estrapolarlo con una variabile
piuttosto che eseguire spostamenti in G91.
Le variabili di sistema permettono di eseguire programmi
intelligenti, capaci di adattarsi a situazioni differenti(per esempio
la rottura di un utensile o la variazione di un ciclo di lavoro in
base al sovrametallo presente oppure il controllo dei limiti di
lavoro).
Queste variabili hanno il pieno controllo della macchina!

**T Realizzare un programma capace di avvisare se un utensile in


fase di lavorazione potrebbe andare a sbattere sulla torretta.

FINALMENTE!!!!!!!!!!!

Fatte le dovute precisazioni possiamo introdurci nel mondo delle


macro!

La realizzazione di un programma macro nasce sempre da una esigenza


concreta:
la necessità di un programma di uso generale o più specifico capace
di adattarsi alle esigenze più varie o di eliminare la ripetitività.

Un simile programma non lo si scrive per pura follia, perché siamo


bravi o perché semplicemente funziona. Deve sempre esserci una
esigenza concreta.

Un programma macro deve liberarci da noiosi calcoli, oppure può


aiutarci nei calcoli più complessi, o ancora può evitare la scrittura
di sottoprogrammi complessi o di programmi ripetitivi.
(essendo questo un piccolo manuale di studio che cerca di insegnare
l'uso delle variabili e delle macro a volte gli esempi possono essere
non troppo realistici, ma è solo per scopo didattico).

Non è semplice scrivere un ottima macro; perciò prima di mettervi a


tavolino ed incominciare a scrivere pensateci tre volte.

Passi per costruire un macro programma

* Definizione generale della macro.


* Scelta degli argomenti.
* Scrittura con eventuale nuova definizione e modifica argomenti.
* Verifica macro ed eventuale nuova definizione con modifica
argomenti.
* Divulgazione.

[1]
Cercheremo di creare una macro che esegua le stesse operazioni del
ciclo fisso di foratura G81.

* Definizione generale della macro

Realizzazione di una macro capace di eseguire il ciclo di foratura


G81 (si suppone che questo non esista). Chiamerò la macro O9500.

Scelta degli argomenti

Decido di usare i seguenti argomenti Z, R, F,

Z per la profondità di foratura


R per la discesa in rapido
F per l'avanzamento in lavoro

La macro avrà l'aspetto iniziale seguente [ O9500 Z R F ]

Vengono quindi usate le variabili Z->#26 R->#18 F->#9 le quali


naturalmente essendo occupate non potranno essere usate per altri
scopi.

* Scrittura macro con eventuale nuova definizione

In una macro come prima cosa bisogna salvare tutti i dati modali,
questo perché gli stessi dovranno essere riposti alla loro origine
dopo che la macro avrà terminato.
L'operatore che si appresta ad usare una macro non deve preoccuparsi
di determinare se questa per esempio lascia la macchina in G90 o
G91, oppure se la macro introduce un offset o qualsiasi altra cosa.
L'operatore si aspetta che le condizioni di lavoro siano quelle in
cui lui lavora e pertanto la macro deve sempre restituire i dati
modali che ha incontrato al suo richiamo: ve lo immaginate una macro
che sconvolge le correzioni utensili o modifichi a proprio piacere
avanzamenti, giri mandrino... senza restituire le impostazioni
precedenti?

Salviamo i seguenti dati

salva G00/G01 #1 = #4001


salva G90/G91 #3 = #4003
salva valore Z #5 = #5003

Le variabili sopra elencate dovranno essere usate con molta


attenzione (se possibile non dovrebbero essere modificate ma solo
lette), poiché la loro modifica implica quel famoso cambiamento di
cui si accennava prima.

Salvati i dati modali dobbiamo scrivere la nostra macro!!


Cosa deve fare questo programma?? Dobbiamo eseguire una foratura ad
una certa profondità e con un certo avanzamento. Questi valori li
troviamo negli argomenti Z, R, F

Incominciamo un passo alla volta.

1 Discesa in rapido al valore di R (#18) G90 G0 Z#18

2 Avanzamento in lavoro(#9) fino al punto Z(#26) G01 Z#26 F#9

3 Controllo punto di ritorno (G98/G99 #4010)

IF[#4010 EQ 98] GOTO n ritorno al punto iniziale


G00 z#18 ritorno al punto di rapido
GOTO m esci dal controllo
n G00 z#5 punto iniziale

4 ripristino dati modali G#1 G#3

5 chiusura macro M99

* Verifica macro

La verifica della macro appena scritta viene effettuata anzitutto a


tavolino, ripercorrendo il cammino fatto, poi dovrà essere
sperimentata in macchina. La verifica quasi sempre porta a modifiche
le quali si ripercuotono sulla macro mutandola anche
considerevolmente. Il ciclo va avanti fino a che la macro potrà dirsi
funzionante. Spesso per provare una nuova macro conviene forzare la
stessa, cioè provocare appositamente gli errori per valutare il
comportamento della stessa: non sempre si valuta con attenzione ogni
possibile errore, ma questo modo di procedere può aiutare molto.

* Divulgazione macro

Definita e verificata, la macro può essere liberamente utilizzata da


qualsiasi operatore al quale si è preventivamente spiegato il
funzionamento.
Attenzione, l'operatore deve conoscere come la macro agisce e a cosa
serve, non deve conoscere come lo fa!
In altre parole io so cosa fa la funzione G81 e non mi interessa come
la stessa riesca ad ottenerlo: la macro O9500 esegue una foratura
alla profondità Z, alla velocità F, e scendendo in rapido alla quota
R.
Cosa c'è nel programma O9500 rimarrà un mistero!

Come si è visto un programma macro è un normale sottoprogramma,


capace però di accogliere degli argomenti, e quindi potersi adattare
a qualsiasi situazione

Ecco la nostra macro completa

O9500 (Programma macro simile alla funzione G81)


#1 = #4001 salva G00/G01
#3 = #4003 salva G90/G91
#5 = #5003 salva valore Z
G00 G90 Z#18 posizionamento al punto R
G01 Z#26 F#9 avanzamento in lavoro a Z
IF[#4010 EQ 98] GOTO 10 ritorno al punto iniziale (#5)
G00 Z#18 posizionamento a R
GOTO 20
N10 G00 Z#5 posizionamento al punto iniziale
N20 G#1 G#3 ripristina i dati modali
M99 fine macro, ritorno

Quindi abbiamo una macro capace di effettuare una foratura, possiamo


usarla!

Esempio di richiamo modale della macro O9500

O1
G90 G0 G54 X0 Y0 Z50 posizionamento
G66 P9500 Z-25 R2 F100 foratura in X0 Y0 (G81)
X30 foratura in X30 Y0
Y70 foratura in X30 Y70
X0 foratura in X0 Y70
G67 toglie G66
M30

Il programma O1 esegue quattro forature sfruttando la macro O9500


(sono state trascurate tutte le funzioni ausiliarie).

Notare che è possibile sostituire G66 P9500 con G81.

Prima di procedere verificare che la macro scritta sia corretta!!


Sapreste dire in cosa pecca?
Avete suggerimenti da fare, opinioni da contrastare?
Come modifichereste la macro per migliorarla?
Tentare di scrivere la macro con le modifiche apportate.

[2]
Come esercizio scrivere le macro per eseguire la foratura profonda
G83 e G73. I tornitori eseguiranno la scrittura delle macro simili a
G83 e G74.

Riprendiamo i concetti generali per la scrittura di una macro:

Definizione, salvataggio dei dati modali, scrittura della macro,


ripristino dati modali, verifica ed eventuali modifiche... il ciclo
viene ripetuto al fine di ottenere i risultati voluti. Per collaudare
la macro forzare gli errori possibili.

Questi esempi, che mai nessuno penserebbe di realizzare, mostrano


come è possibile eseguire dei cicli di lavoro facendo uso di
programmi macro.
Le funzioni che noi comunemente usiamo, come G73, sono funzioni NC
cioè macro. Gli sviluppatori del software hanno pensato bene di
includere queste funzioni per agevolare i programmatori. Pensate a
dover lavorare senza questi cicli; si potrebbe.. ma il tutto sarebbe
più complicato.

[3]
Tenteremo ora il ragionamento inverso: data una macro cercheremo di
capirne il significato.
Eseguiamo questo tipo di ragionamento per ragioni di apprendimento.
Spesso è utile anche in fase di scrittura di una macro, partire dalla
fine e percorrere i passi a ritroso.
Proponiamo la lettura di una macro alla quale volutamente è stata
tolta l'intestazione.
Eseguiamo il richiamo tramite codice G.

Leggere molto attentamente, cercare di capire ogni singola riga,


eventualmente rileggere il significato delle variabili di sistema,
valutare le operazioni logiche e aritmetiche; provare ad applicare la
macro ad un esempio concreto e verificare con molta attenzione cosa
succede.

La macro è richiamata nel seguente modo

G260 Z-60 R0 F400 Q2 I30.3 D42

Ecco la macro O9016

O9016( )
(G260 Z R F Q I D)
(Z #26 PROFONDITA')
((R #18 DISCESA RAPIDO)
(F #9 AVANZAMENTO)
(Q #17 PASSO)
(I #4 DIAMETRO FRESA)
(D #7 DIAMETRO FORO)
(SALVA G00/G01)
#1=#4001
(SALVA G90/G91)
#2=#4003
(SALVA VALORE Z)
#3##5003
(SALVA G40/G41/G42)
#8=#4007
(NUMERO RIPETIZIONI)
IF[#18EQ0] GOTO10
IF[#18GT0]GOTO8
IF[#18LT0]THEN #26=#26-#18
GOTO10
N8 #26=ABS[#26]+ABS[#18]
N10 #6=ROUND[[ABS[#26]]/#17]
(RAGGIO FRESA)
#4=#4/2
(RAGGIO FORO)
#7=#7/2
(INSERISCI RAGGIO)
#10032=#4
(POSIZIONAMENTO RAPIDO)
G90G0G40Z[#18+1]
(POSIZIONAMENTO IN LAVORO)
G01F500Z#18
(CICLO DI INTERPOLAZIONE)
G91G41D32X#7F#9
WHILE[#6NE0]DO1
G03I-#7Z-#17
#6=#6-1
End1
G03I-#7
G01G40x-#7
(RIPRISTINA VECCHI VALORI)
G90GOZ#3
G#1G#2G#8
M99

FERMATI! Studia attentamente la macro prima di proseguire.


NON FARE IL FURBO, FERMATI! OCCHIO CHE TI VEDO!

Bene, vediamo come procedere alla lettura di questo programma.

** Commenti

Le prime righe della macro sono dei commenti, i quali spiegano il


significato delle variabili.

(G260 Z R F Q I D)
(Z #26 PROFONDITA')
((R #18 DISCESA RAPIDO)
(F #9 AVANZAMENTO)
(Q #17 PASSO)
(I #4 DIAMETRO FRESA)
(D #7 DIAMETRO FORO)

** Salvataggio dati modali

Il passo successivo è il salvataggio dei dati modali che possono


direttamente interessarci o che in qualche modo verranno modificati
(non ha senso salvare la #4002 (piano di lavoro) perché questo non
verrà mutato)

(SALVA G00/G01)
#1=#4001
(SALVA G90/G91)
#2=#4003
(SALVA VALORE Z)
#3##5003
(SALVA G40/G41/G42)
#8=#4007

** Il programma prosegue con un commento che è davvero esplicativo e


senza il quale si farebbe fatica a comprendere velocemente lo stesso.

(NUMERO RIPETIZIONI)

quindi come prima operazione verrà calcolato un numero da usare per


una qualche ripetizione.

** Le successive righe indicano che questo numero è calcolato in base


al valore della #18, cioè la discesa in rapido

IF[#18EQ0] GOTO10
IF[#18GT0]GOTO8
IF[#18LT0]THEN #26=#26-#18
GOTO10
N8 #26=ABS[#26]+ABS[#18]
N10 #6=ROUND[[ABS[#26]]/#17]

Da programma si nota che la #6 rappresenterà il numero delle


ripetizioni.
Trascuriamo per il momento il calcolo delle stesse, poiché stiamo
cercando di dare una fisionomia compiuta al programma tralasciando i
particolari.

Ancora non sappiamo che tipo di ripetizione verrà eseguita, ma ciò


non è importante ai nostri fini.

** Seguono tre operazioni per il calcolo del raggio fresa, del raggio
foro e l'inserzione automatica del raggio utensile (G10 L11 P32 R).

(RAGGIO FRESA) #4=#4/2

(RAGGIO FORO) #7=#7/2

(INSERISCI RAGGIO) #10032=#4

Nota importante!! In questo programma la riga #10032=#4 indica che il


raggio fresa sarà inserito come correttore numero 32, qualsiasi sia
l'utensile usato.

** Dopo i calcoli necessari al programma inizia il lavoro vero e


proprio.

(POSIZIONAMENTO RAPIDO) G90G0G40Z[#18+1]

(POSIZIONAMENTO IN LAVORO) G01F500Z#18

** Ora un ciclo di interpolazione, come il commento enuncia che sarà


ripetuto tante volte in base al valore della #6.

Leggendo il programma si nota che l'interpolazione è di tipo


elicoidale, e che alla fine verrà effettuata una passata a livello z
finale in interpolazione circolare. Quindi l'utensile ritornerà al
centro del foro.

(CICLO DI INTERPOLAZIONE)

G91G41D32X#7F#9 attacco lineare


WHILE[#6NE0]DO1 numero di ripetizioni
G03I-#7Z-#17 interpolazione elicoidale
#6=#6-1 decremento delle ripetizioni
End1 fine ciclo
G03I-#7 interpolazione circolare
G01G40x-#7 allontanamento

** Il programma termina ripristinando i valori modali salvati in


precedenza lasciando la macchina nello stato iniziale.

(RIPRISTINA VECCHI VALORI)


G90GOZ#3
G#1G#2G#8
M99

Possiamo affermare che si tratta di una macro capace di effettuare


l'interpolazione elicoidale essenzialmente per eseguire una
operazione di taglio interno di una circonferenza.

Supponendo di dover eseguire il taglio interno di una circonferenza


di diametro 120 e profondo 150, la macro studiata offre una
alternativa molto valida alle operazioni che andrebbero eseguite con
una programmazione priva di variabili.
Lascio a voi lo studio del calcolo del numero di passate!

Ora che la macro è comprensibile si ritorni per un attimo indietro,


si rilegga il programma e come sempre riflettete, riflettete...

Riflessioni

* Ci sono alcuni punti che potrebbero essere migliorati...


- il calcolo delle ripetizioni

N10 #6=ROUND[[ABS[#26]]/#17]

- l'eventualità di poter usare qualsiasi utensile


- calcolo di eventuali passate in orizzontale...
- possibilità di usare una asportazione a spirale...
e altro ancora.

* Apriamo una parentesi per analizzare la scelta degli argomenti.

La macro O9016 viene richiamata nel seguente modo

G260 Z-60 R0 F400 Q2 I30.3 D36

Z rappresenta il punto finale di lavoro in z


R rappresenta la discesa in rapido
F rappresenta l'avanzamento in lavoro
Q rappresenta il passo o scarico
I rappresenta il diametro fresa
D rappresenta il diametro foro

Dall’elenco possiamo notare che si è cercato di mantenere il


significato originale delle lettere di un programma CN; ciò rende più
semplice ricordarsi come lavora la macro e quindi il richiamo sarà
implicito.

Se si fosse scritta la macro nel seguente modo

G260 A-60 B0 C400 D2 E30.3 F36

sarebbe stato molto difficile ricordarsi il significato di ogni


argomento con l'eventualità di commettere degli errori.

Ricordatevi quindi di usare come nome per i vostri argomenti gli


stessi che usate in programmazione procedurale (sempre che sia
possibile).

[4]
Vogliamo ora riprendere un esercizio precedente al fine di mostrare
come un macro programma può essere di grande aiuto e di concreta
utilità.

Cercheremo di dare largo spazio alla formulazione del problema, che


poi è il primo passo per costruire una qualsiasi macro.

Chi si trova in difficoltà nell'intendere o formulare una macro


dovrebbe leggere attentamente queste righe.
Mostreremo che in realtà scrivere una macro è un aspetto essenziale
ma non il più importante.
Dobbiamo prima formulare un concetto, descrivere una azione, poi
applicando le nozioni di programmazione che conosciamo procederemo
allo sviluppo della stessa con più facilità.
La soluzione di un problema quasi sempre si trova nella corretta
lettura che si fa dello stesso.

Riportiamo in queste righe l'esercizio precedentemente proposto con


qualche leggera modifica tanto per complicarci la vita.
L’esempio verrà analizzato per una operazione di tornitura.

Creare un programma capace di eseguire dei fori su una circonferenza.


Eseguire la centratura, la foratura, lamatura, maschiatura e
svasatura.

- 8 fori su diametro 100 profondità 40, primo angolo 0 gradi, da M12


- 8 fori su diametro 100 profondità 40, primo angolo 22.5 gradi,
VTCE 10

* Analisi del problema

Consideriamo l'operazione di centratura. Sembra una cosa semplice,


una punta da centro che lavora con il motorizzato: conoscendo il
diametro la lavorazione si riduce ad una rotazione dell'asse C.

Tutte le altre operazioni si riconducono alla stessa: rotazione


dell'asse C e relativa funzione CN (G74, G83).

Esaminiamo un tipico programma per eseguire la centratura del pezzo

T0101 (richiamo utensile)


M10 (attivazione asse C)
G28 H0 (origine macchina asse C)
G0 C0 (asse C assoluto a 0)
G97 M13 B1.2 (attivazione motorizzato, giri
fissi)
G0 X100 Z3 M8 (posizionamento)
G98 G74 Z-2 F100 Q5000 (avanzamento al minuto,
funzione G)
H22.5 K13 Q5000 (ripetizione)
G0 G96 X400 Z400 M9 (allontanamento dal pezzo)
M15 (disattivazione motorizzato)
M11 (disattivazione asse C)

Eseguita la centratura dobbiamo ripetere la stessa procedura più


volte: due volte per la foratura, una per la maschiatura, un'altra
per la lamatura ed ancora per la svasatura.

Il programmatore tornitore converrà che si tratta di scrivere


essenzialmente lo stesso programma sei volte. Diventa noioso e
ripetitivo con elevate probabilità di errore.

E' qui che dobbiamo porci la domanda:

Non esiste la possibilità di creare una procedura che mi semplifichi


la vita, che automatizzi l'intero discorso, che mi liberi per esempio
dalle attivazioni e disattivazioni(che dopo tutto dovrebbero essere
implicite), che mi calcoli gli angoli automaticamente....

E' in queste occasioni, che l'operatore si deve domandare: è il caso


di creare una macro o no!?

Ma come procedere??

Il metodo più semplice consiste nell'analizzare l'intero programma e


notare quali funzioni sono costanti e quali no.

Diamo una occhiata al programma sopra scritto


M10
G28 H0
G0 C0

* questa porzione di programma verrà sempre richiamata e non subirà


modifiche

G97 M13 B1.2

* G97 M13 è un richiamo fisso potrà variare B1.2

G0 X100 Z3 M8

* i valori di X e Z sono mutevoli

G98 G74 Z-2 F100 Q5000


H22.5 K13 Q5000

* la funzione G e gli spostamenti dipendono dalla lavorazione


richiesta

G0 G96 X400 Z400 M9


M15
M11

* infine c'è la chiusura, che può essere considerata univoca.

Il discorso sembra più chiaro: ciò che cambia è la funzione di ciclo


o il posizionamento; viceversa le attivazioni e disattivazioni sono
fisse.
Siamo a buon punto! La nostra macro dovrà automaticamente attivare e
disattivare tutte quelle funzioni che ricorreranno sempre in un
simile programma, mentre attraverso argomenti riceverà i valori per
quelle funzioni variabili.

Riepiloghiamo:

** cosa ci sarà sempre??

Sempre avremo l'attivazione del motorizzato, dell'asse C, i giri


fissi, l'avanzamento al minuto, l'allontanamento dal pezzo, la
disattivazione asse C e motorizzato, ripristino avanzamento al giro.

** cosa potrà variare

varierà il numero di giri del motorizzato, il posizionamento, la


funzione da compiere, la rotazione asse C(ripetizioni).

Ripetiamolo: tutte le funzioni che non cambiano verranno gestite


dalla macro, mentre quelle mutevoli dovranno essere ricevute tramite
argomenti.

La nostra macro quindi dovrà ricevere i valori di posizionamento, i


giri del motorizzato, la funzione G da svolgere, ed il numero di
ripetizioni da compiere, infine l'angolo primario quello secondario e
il numero di ripetizioni.

(Questa macro è concepita per gestire incrementi angolari costanti)

Per esempio G210 D Z R F Q I J k M S


D diametro di foratura
Z profondità foratura
R attacco rapido
F avanzamento
Q scarico
I angolo primario(primo angolo riferito allo 0)
J angolo secondario
K ripetizioni
M funzione G
S giri motorizzato

Potrebbe funzionare!

Confrontate i due programmi

T0101 T0101
M10 G210 D Z R F Q I J k M S
G28 H0 G0 X400 Z400 M9
G0 C0
G97 M13 B1.2
G0 X100 Z3 M8
G98 G74 Z-2 F100 Q5000
H22.5 K13 Q5000
G0 G96 X300 Z300 M9
M15
M11

E' un passo notevole; mi sono svincolato dalle operazioni secondarie,


concentrandomi solo sull'operazione da eseguire.

Con la riga G210 D Z R F Q I J k M S ho detto alla macchina di


eseguire per esempio una foratura(M74) alle quote D, Z, R, alla
velocità F e con scarico uguale a Q, usando un numero di giri
appropriato(S), un certo numero di ripetizioni(K) ed infine partendo
con un angolo(I) ad incrementi angolari fissi(J).

Notare che non si fa menzione di asse C o motorizzato, la macchina


gestirà automaticamente le funzioni nascoste.

Se dovessimo effettivamente scrivere l'intero programma, questo si


tradurrebbe in 66 righe di codice per il primo esempio, mentre il
programma macro ne richiederà 18.
La lunghezza di un programma non sempre è indice di pessima qualità,
come un programma cortissimo può non essere interpretabile o
modificabile velocemente.
Bisogna comunque che un programma sia il più corto possibile e nello
stesso tempo interpretabile, modificabile, facile da maneggiare.
L'esempio proposto attua tutte queste caratteristiche: è corto, è
facilmente interpretabile, è modificabile molto rapidamente e
soprattutto ha basse possibilità di errore.

Adesso sappiamo come trasformare il nostro programma classico con


l'uso di una macro.
Ma questa dov'è?
Naturalmente ora bisogna intraprendere il secondo passo:
la scrittura della macro.

Questa viene lasciata come esercizio al programmatore (avete tutto


ciò che serve).
Rileggete attentamente queste righe la soluzione è li.

Gli esempi precedenti di creazione di una macro dovrebbero aver messo


in luce che questa essenzialmente non fa altro che automatizzare una
azione, una funzione, un ciclo.

La macro non può inventare niente di nuovo, può aiutare a


velocizzare, a calcolare, eseguire operazioni ripetitive, a
svincolare l'operatore da tutte quelle azioni secondarie...

Le funzioni NC sono un certo numero e la macro non può che usare


queste. La potenza delle macro si trova nel fatto che è possibile
applicarla a qualsiasi forma o dimensione.
La funzione G210 funzionerà per qualsiasi diametro cosi come tute le
macro funzioneranno per qualsiasi argomento valido a loro passato.

Per questo motivo non bisogna aver paura ad usare variabili o macro
programmi; questi ci aiutano nei compiti più onerosi lasciandoci il
tempo di dedicarci alla qualità del prodotto.

E' possibile scrivere un programma esclusivamente con macro;


ecco un esempio.

O1
G90 G0 G54 G40
T1 M6
S1000 M3 T2
G43 H1 Z50 M8
(SPIANATURA 400*500*10)
G270 X0 Y0 Z0 R10 F1000 Q2 A400 B500 I80
T2 M6
S1000 M3 T3
G43 H1 Z50 M8
(FORO D90*90)
G260 X-350 Y-100 Z-90 R0 F3000 Q0.5 I50 D90
(FORO D75*80)
G260 X-150 Y100 Z-80 R0 F3000 Q0.5 I50 D75
T3 M6
S1500 M3 T4
G43 H3 Z50 M88
(16 FORI SU D120 prof. 35)
G210 X-350 Y-100 Z-35 R2 F150 Q2 D120 I0 J22.5 K0 M83
(5 FORI SU D95 prof. 35)
G210 X-150 Y100 Z-35 R2 F150 Q2 D95 I15 J255 K5 M83
(MASCHIATURA)
T4M6
S300 M3 T5
G43 H3 Z50 M8
G210 X-350 Y-100 Z-30 R3 F1 Q2 D120 I0 J22.5 K0 M84.175
G210 X-150 Y100 Z-30 R2 F1 Q2 D95 I15 J255 K5 M84.175
M30

E' un esempio chiaro: poche righe, una mole notevole di lavoro, un


programma facilmente leggibile e con poche probabilità di errore.

Riportiamo la macro G210


è capace di effettuare le funzioni di foratura e barenatura su una
circonferenza di diametro qualsiasi per distanze angolari costanti

I fresatori come esercizio dovranno introdurre le funzioni G82, G85.

O9011(G8.. IN CIRCONFERENZA)
(EQUIDISTANZA DELLE LAVORAZIONI)
(G210 Z R F Q D I J K M)
(ESEGUE G73/G81/G83/G84/G86)
(Z #26=PROFONDITA)
(R #18=DISCESA IN RAPIDO)
(F #9=AVANZAMENTO)
(Q #17=SCARICO)
(D #7=DIAMETRO)
(I #4=ANGOLO PRIMARIO)
(J #5= ANGOLO SECONDARIO)
(J NEGATIVO, SENSO ORARIO)
(J POSITIVO, SENSO ANTIORARIO)
(K #6=RIPETIZIONI)
(NB,,, SE K=0 ALLORA K=360/J)
(M #13=FUNZIONE G)
(NB,,, M84.175 MASCHIATURA + PASSO)
(84=G84, 0.175 -> PASSO 1.75)
(SALVA I DATI MODALI)
#1=#4001
#2=#4003
#3=#5003
#24=#5001
#25=#5002
(CONTROLLO RIPETIZIONI)
IF[#6 EQ 0] THEN #6=360/[ABS[#5]]
IF[[#6-[ROUND[#6]]] GT 0.001] THEN #3000=1(CERCHIO NON DIVISIBILE)
IF[[#13 EQ 81] OR [#13 EQ 86]] GOTO10
IF[[#13 EQ 73] OR [#13 EQ 83]] GOTO20
IF[[ROUND[#13]] NE 84] THEN #3000=2 (FUNZIONE NON ACCETTATA)
(CALCOLO PASSO)
#8=ROUND[13]
#8=[#13-#8]*10
(CALCOLA AVANZAMENTO)
#9=#8*#4119
(ESTRAPOLA FUNZIONE)
#13=ROUND#13]
N10 G#13F#9Z#26R#18K0
GOTO30
N20 G#13F#9Z#26R#18Q#17K0
(RAGGIO)
N30 #7=#7/2
(CICLO IN CIRCONFERENZA)
WHILE[#6NE0]DO1
(ASSOLUTO X)
#19=#24+[#7*[COS[#4]]]
(ASSOLUTO Y)
#20=#25+[#7*[SIN[#4]]]
(POSIZIONAMENTO)
G90X#19Y#20
(NUOVO ANGOLO)
#4=#4+#5
(CONTATTORE)
#6=#6-1
(FINE CICLO)
END1
(RIPRISTINA VALORI MODALI)
G90G0Z#3
X#24Y#25
G#1G#2
M99

Leggere attentamente ed introdurre le nuove funzioni.

* Sapreste trovare un metodo diverso di implementare la macro?


* Quali problemi potrebbero insorgere nell'utilizzo di questo
programma?
* Come ovviare?

T4M6
S300 M3 T5
G43 H3 Z50 M8
G210 X-350 Y-100 Z-30 R3 F1 Q2 D120 I0 J22.5 K0 M84.175
G210 X-150 Y100 Z-30 R2 F1 Q2 D95 I15 J255 K5 M84.175
M30

La macro G210 funzionerà o.... trova gli errori.

Vi ricordate l’esercizio:

Creare un programma capace di eseguire un foro filettato M76 passo 2,


profondo 100 mm.

La soluzione dell’esercizio consisteva in una ripetizione ciclica di


interpolazione elicoidale.
Se volessimo effettuare un foro filettato di passo differente
dovremmo cambiare alcuni dati quali il diametro utensile, il diametro
del filetto, il passo...
Vogliamo mostrare come una macro sia molto più flessibile nel gestire
tutti quei parametri variabili permettendo all’operatore di
modificare in pochi secondi la lavorazione.

Il cuore della macro per la filettatura sarà naturalmente


l’interpolazione elicoidale.

Per una filettatura destrosa avremo G02 I Z

La funzione andrà ripetuta un certo numero di volte dipendendo dalla


profondità del filetto.

Quindi domandiamoci quali argomenti intervengono nella filettatura di


un foro:

* il valore della profondità Z


* l’eventuale discesa in rapido R
* l’ avanzamento in lavoro F
* il passo Q
* il diametro dell’utensile I
* il diametro del filetto D

Come al solito si è cercato di mantenere una corrispondenza tra gli


argomenti della macro e quelli CN.

Il nostro programma agirà nel seguente modo:

* commenti alla macro


* salvataggio dei dati modali
* eventuali calcoli ad uso della macro
* posizionamento alla quota di inizio lavoro
* ciclo di interpolazione
* ripristino dei dati modali

Vediamoli uno per uno

* Commenti alla macro

I commenti servono a stabilire senza equivoci il significato di ogni


argomento

O9015(filettatura destrosa)
(G250 Z R F Q I D)
(posizionare l’utensile al centro foro)
(#26 Z profondità del filetto)
(#18 R discesa in rapido)
(#9 F avanzamento)
(#17 Q passo)
(#4 I diametro fresa)
(#7 D diametro filetto esterno)

* salvataggio dei dati modali

I dati modali sono quelle funzioni o posizioni o altro che se


modificati dalla macro devono ritornare allo stato precedente la
chiamata

(salva G0/G01) #1=#4001

(salva G90/G91) #2=#4002

(salva valore Z attuale) #3=#5003

* eventuali calcoli ad uso della macro

Per effettuare l’interpolazione elicoidale dobbiamo conoscere il


raggio dell’utensile, il raggio del filetto e dobbiamo calcolare il
numero delle ripetizioni

(raggio fresa)
#4=#4/2

(inserzione automatica raggio)


#10032=#4

(raggio filetto)
#7=#7/2

(numero ripetizioni)
#6=1+[ROUND[[ABS[#26]/#17]]]

Se dividiamo il valore assoluto della profondità del filetto(#26) per


il passo(#17) e arrotondiamo il tutto(ROUND) sommando 1, (per tener
conto della cifra decimale eliminata e per effettuare una passata
ulteriore), otteniamo il numero delle ripetizioni che assoceremo alla
#6.
* posizionamento alla quota di inizio lavoro

(posizionamento rapido) G90G0Z[#18+1]


(posizionamento in lavoro) G01F500Z#18

* ciclo di interpolazione

(ciclo di filettatura)
G91G42D32X#7F500
WHILE[#6NE0]DO1
G02I-#7Z-#17F#9
#6=#6-1
END1
G01G40X-#7

* ripristino dei dati modali

(ripristino de vecchi valori modali)


G90G0Z#3
G#1G#2
M99

La macro è stata scritta! Vediamola in forma completa.

O9015(filettatura destrosa)
(G250 Z R F Q I D)
(posizionare l’utensile al centro foro)
(#26 Z profondità del filetto)
(#18 R discesa in rapido)
(#9 F avanzamento)
(#17 Q passo)
(#4 I diametro fresa)
(#7 D diametro filetto esterno)
(salva G0/G01)
#1=#4001
(salva G90/G91)
#2=#4002
(salva valore Z attuale)
#3=#5003
(raggio fresa)
#4=#4/2
(inserzione automatica raggio)
#10032=#4
(raggio filetto)
#7=#7/2
(numero ripetizioni)
#6=1+[ROUND[[ABS[#26]/#17]]]
(posizionamento rapido)
G90G0Z[#18+1]
(posizionamento in lavoro)
G01F500Z#18
(ciclo di filettatura)
G91G42D32X#7F500
WHILE[#6NE0]DO1
G02I-#7Z-#17F#9
#6=#6-1
END1
G01G40X-#7
(ripristino de vecchi valori modali)
G90G0Z#3
G#1G#2
M99

La macro G250 permetterà di effettuare qualsiasi filettatura.

Esempio G250 Z-100 R0 F500 Q2 I30.2 D76 (M76*2 prof. 100)

Se per caso dovesse cambiare il tipo di filettatura, vuoi per la


profondità, o il passo, o un utensile differente...
la macro sarà facilmente adattabile.

Esempio G250 Z-60 R0 F500 Q3 I30.2 D200 (M200*3 prof. 60)

Attenzione, non fermatevi mai a contemplare il vostro lavoro


(un pochino si...) ma cercate di capire se ciò che avete creato
può essere migliorato, modificato:
la macro scritta è migliorabile in diversi aspetti. Trovateli!

Riflessioni

Un aspetto davvero interessante e molto potente è la relazione tra un


centro di lavoro ed un tornio(le macchine moderne non fanno più
distinzione).

Consideriamo nuovamente la macro G210 capace di effettuare una


qualsiasi funzione G7.. G8.. su una circonferenza.

La riproponiamo
G210 D Z R F Q I J k M S per tornio

G210 D Z R F Q I J k M S per fresa

Scriviamo un esempio di programma per ambedue le macchine utilizzando


questa macro.

Programma per tornio Programma per fresa

O1(esempio richiamo G210) O1(esempio richiamo G210)


T1M6 T1M6
D1 G0 X0 Y0
G0 X0 Z50 G43 H1 Z50
G210 D Z R F Q I J k M S G210 D Z R F Q I J k M S
----- -----
----- -----

L’esempio mostra chiaramente che non sussiste alcuna differenza tra i


due programmi. Sia il tornio che la fresa richiamano la stessa macro.

Questo è un aspetto davvero interessante delle macro. Possiamo


passare da una macchina all’altra utilizzando lo stesso programma.

Definite le singole macro (una per il tornio e l’altra per la fresa)


non ci sarà più differenza tra le macchine.

E’ possibile realizzare(se necessario) un programma di conversione


tra le varie macchine e quindi passare dall’una all’altra senza dover
alterare una sola riga!

Esercizi

Creare le seguenti macro

[1-F] Esecuzione di un asola

[2-F] Taglio interno di una tasca rettangolare

[3-F] Taglio interno di una tasca circolare

[1-T] Ciclo di filettatura sia destra che sinistra

[2-T] Foratura universale

[5-F] Taglio interno del cerchio

[6-F] Taglio esterno del cerchio

[3-T] Esecuzione di una gola

[4-T] Esecuzione di un quadro

[5-T] Esecuzione di un esagono

[7-F] Forature su circonferenza ad intervalli irregolari

[8-F] Modificare la macro G250 per ottenere una partenza angolare


qualsiasi cosi come una fine angolare.

Programmi macro
Tecniche di debug

In fase di progettazione di una macro, ma ancor più nel suo utilizzo,


potrebbero generarsi diverse problematiche.

Se richiamando una macro mi dimentico un parametro o scrivo qualcosa


di errato come si comporterà questa?

Non esiste una risposta univoca, la macro potrebbe avvisare, oppure


potrebbe utilizzare i valori che ha gia in macchina, potrebbe
comportarsi normalmente e tutto ad un tratto... rivelarsi qualche
errore.

E' l'operatore che deve prevedere ogni possibile situazione!


Non lasciare mai nulla incompiuto, non sperare nella fortuna o fare
ipotesi azzardate.

Quando precedentemente si è detto di sottoporre la macro ad errori ci


si riferiva proprio a questo concetto.

Vediamo un esempio utilizzando la funzione CN G83 come se fosse una


macro scritta da noi.

G83 Z F Q R

esaminiamo caso per caso

* manca la R

Non è un grande problema, la macchina non richiede espressamente


questo valore, inizia a lavorare dalla quota in cui si trova. Se la
nostra macro richiede l'argomento R dovremo scrivere la procedura in
modo tale che questo possa essere omesso.

* manca la Q

La macchina si comporta come se effettuasse la funzione G01, la


discesa sarà continua e senza interruzioni. Dipendendo dalla funzione
che la nostra macro attua bisognerà verificare se la mancanza del Q
creerà un problema.
Se la risposta è affermativa bisognerà controllare che l'argomento Q
non sia omesso.

* manca la F

Il controllo assumerà per default l'ultima velocità di lavoro


impostata.
Vale il discorso fatto precedentemente sull’impostazione
dell’argomento.

* manca la Z

Il CN entrerà in allarme dato che il valore di Z è una componente


essenziale della funzione G83. La nostra macro dovrà valutare
attentamente questa situazione.

Le macro che ci accingiamo a creare dovranno adottare sempre la


logica di non lasciare nulla al fato, niente deve essere scontato.
Quindi analizzare ogni singolo argomento, ogni operazione(anche
queste possono dar luogo a valori errati o incongruenti), per
definire le procedure più adatte.

* Come è possibile controllare un argomento?

Le metodologie sono differenti e dipendono anche dallo stato attuale


della macchina.

** Vi ricordate della #0 ? Non è mai stata usata.


La #0 è una variabile nulla, vacante, senza valore. Si può
confrontare un qualsiasi argomento con questa variabile e determinare
l'equivalenza. Va da se che un argomento simile alla variabile nulla
è un argomento non definito(vuoi per dimenticanza, vuoi perché non è
usata).
E' un espediente utile ai fini di determinare lo stato di una
variabile!
Questo può essere effettuato poichè le variabili locali assumono
valore solo quando lo ricevono tramite gli argomenti. Sono sempre
nulle e al ritorno dalla macro ritornano ad essere nulle.
Se ci dimentichiamo un argomento, lo stesso non sarà associato alla
propria variabile che continuerà ad essere nulla. Possiamo
determinare la presenza dell'argomento o meno confrontando la
variabile con la #0 che è sempre nulla.

** L’utilizzo di variabili statiche, cioè che non perdono il loro


valore anche dopo un reset o lo spegnimento della macchina.
Ricordiamolo: si possono utilizzare anche le variabili da #500 a #
531, le quali come dovremmo sapere non perdono il loro valore anche a
macchina spenta. Impostando adeguatamente alcune di queste variabili
ed eseguendo confronti appropriati si possono ottenere controlli
mirati. (sfortunatamente molti costruttori impediscono l'utilizzo di
alcune variabili dato che creano macro che ne fanno uso. Bisogna
sempre stare attenti all'utilizzo di queste variabili perchè
potrebbero già essere impegnate; per questo motivo non le abbiamo mai
usate anche se a volte sarebbe necessario).

** L’utilizzo di programmi specializzati atti al controllo degli


argomenti potrebbe essere un ulteriore metodo.

Possiamo utilizzare molti e differenti metodi, anche usandoli


congiuntamente.

Riepilogo

Le macro istruzioni permettono di usare variabili, istruzioni logiche


e aritmetiche, salti e cicli ripetitivi; consentono cioè di
sviluppare programmi di uso generale o specializzati.

Un programma macro è un normale sottoprogramma, capace però di


accogliere degli argomenti, e quindi potersi adattare a qualsiasi
situazione

Con il termine argomenti è indicato un dato(lettera), un valore cioè


che viene passato alla macro.

IL SIGNIFICATO DEGLI ARGOMENTI E' DEFINITO DA CHI SCRIVE LA MACRO

Le variabili locali vanno dalla #1 alla #33 e possono essere usate


solo all'interno di una macro e sono direttamente collegate agli
argomenti: quando una macro è richiamata, gli argomenti sono
assegnati alle variabili locali.

Le variabili di sistema si usano per leggere e scrivere alcuni dati


del CNC, come la posizione corrente, le correzioni utensili, i dati
modali, ecc...

Un programma macro deve liberarci da noiosi calcoli, oppure aiutarci


nei calcoli più complessi, o ancora può evitare la scrittura di
sottoprogrammi complessi o di programmi ripetitivi.

Passi per costruire un macro programma

* Definizione generale della macro.


* Scelta degli argomenti.
* Scrittura con eventuale nuova definizione e modifica argomenti.
* Verifica macro ed eventuale nuova definizione con modifica
argomenti.
* Divulgazione.

In una macro come prima cosa bisogna salvare tutti i dati modali

Una macro essenzialmente non fa altro che automatizzare una azione,


una funzione, un ciclo.

La macro non può inventare niente di nuovo, può aiutare a


velocizzare, a calcolare, eseguire operazioni ripetitive, a
svincolare l'operatore da tutte quelle azioni secondarie...

Le funzioni NC sono un certo numero e la macro non può che usare


queste. La potenza delle macro si manifesta nella possibilità di
applicarla a qualsiasi forma o dimensione.

Le macro che ci accingiamo a creare dovranno adottare sempre la


logica di non lasciare nulla al fato, niente deve essere scontato.
Quindi analizzare ogni singolo argomento, ogni operazione(anche le
operazioni possono dar luogo a valori errati o incongruenti), per
definire le procedure più adatte, gli eventuali potenziali errori...

Note

Bene siamo giunti alla fine!


Poche ultime raccomandazioni:
- Siate sempre prudenti quando provate i vostri lavori ma abbiate
fiducia in cio che fate.
- Leggete sempre il vostro manuale dei parametri prima di utilizzare
una qualsiasi variabile.
- Confrontatevi con altre persone prima di scrivere una nuova macro
forse qualcuno ha gia avuto una idea..
- Ascoltate gli altri ma abbiate fiducia nelle vostre capacità e
ingegnosità.
Scrivetemi (badade010@alice.it)
sono a vostra disposizione.

Buon lavoro
badade10@libero.it

Potrebbero piacerti anche