G-Code Programmazione per macchine CNC
In questo articolo sono stati riportati una serie di programmini per realizzare figure elementari con una fresatrice CNC. La programmazione tramite G-code non è banale per vari motivi: la sintassi da rispettare nell’esecuzione dei cicli o delle procedure è per certi aspetti antiquata. Nonostante linuxcnc sia una buona piattaforma, la fase di Debug non è immediata. Per ora la strada seguita è questa: Simulare tutto tramite la programmazione in matlab e solo nella fase finale convertire il codice in linguaggio in G-code. La lavorazione di geometrie semplici è un ottimo spunto per insegnare le nozioni fondamentali di un linguaggio di programmazione: variabili, funzioni, cicli e condizioni.
Le complicazione più grande che si può riscontrare quando si prova a scrivere degli algoritmi di lavorazione è che il processo di sgrossatura può avere delle differenze (spesso anche di carattere tecnologico) rispetto alla fase finale di finitura.Cornice rettangolare
Questo programmino serve a realizzare una cornice di sezione rettangolare. La cornice viene raccordata lungo l’asse z con un raggio R. La variabile # può assumere due valori: -1 e 1, a seconda se si vuole un raccordo concavo o convesso. Il programma esegue tutte le fasi di lavorazione di una fresatrice a tre assi: sgrossatura e finitura. [cnccode] consiste nel realizzare il codice per eseguire una lavorazione di scavo di una forma ottagonale raccordata. Ogni lato dell’ottagono è raccordato con opzione di raccordo variabile in due modi: Nel caso della figura l’area della sagoma ottagonale è più grande a livello z = 0; tende invece a diminuire all’aumentare della profondità z% Autori
% Prof. Danilo Pasquini IPSIA Parodi Delfino, Colleferro (Roma)
% Prof. Paolo Sordi IPSIA A. Pacinotti, Pontedera (Pisa)
%
o200 sub
# = #<_raccordo>
# = #<_raggio>
# = #<_xx>
# = #<_yy>
# = #<_cick>
# = #<_latoy>
# = #<_latox>
# = #<_accuratezzafinitura>
# = #<_accuratezzasgrosso>
# = #<_sgrossaturamm>
(-------------------------------------------------------------------------------------)
# = [-#]
# = #
# = #
# = [2 * 3.14 * # / 4]
# = [FIX[[#-1] / #]]
(PRINT,value of variable 123 is: #)
(MSG, This is a message)
(DEBUG,value of variable numeropassate is: #)
# = -1
g00 z5
(pausa di 1 s)
g4 p1
g01 f1000
# = 1
o101 while [# LT #]
# = [# + 1]
# = #
(DEBUG,sgrosso: #)
# = [# / #]
#<i> = -1
o140 if [# EQ 1]
#<i> = [#]
o140 endif
o103 while [#<i> LT [#]]
o141 if [# EQ 1]
#<i> = [#<i> - 1]
o141 else
#<i> = [#<i> + 1]
o141 endif
# = [[# - #] * #]
# = [# * #<i> / #]
# = [# + # + # ]
o104 if [# EQ -1]
# = [# + #]
o104 endif
# = [# + [# + #] * 1]
# = [# + [# + #] * -1]
# = [# + [# + #] * 1]
# = [# + [# + #] * -1]
o120 if [# lt [# + #]]
# = [# + #]
o120 else
# = [#]
o120 endif
o105 if [# lt [#]]
o130 if [# EQ 1]
g01 x[# + # /2 ] y[# - # /2] z5
# = 0
o130 endif
g01 x[# + # /2 ] y[# - # /2] z[#]
g01 x[# + # /2] y[# - # /2]
g01 x[# - # /2] y[# - # /2]
g01 x[# - # /2] y[# - # /2]
g01 x[# - # /2] y[# + # /2]
g01 x[# - # /2] y[# + # /2]
g01 x[# + # /2] y[# + # /2]
g01 x[# + # /2] y[# + # /2]
g01 x[# + # /2 ] y[# - # /2]
g00 z0
o105 endif
o103 endwhile
o101 endwhile
# = #
(DEBUG,finitura: #)
# = [#/#]
#<i> = [# +1]
g01 f200
g00 z10
o108 while [#<i> GE 0]
#<i> = [#<i> - 1]
# = [# + # * #]
o109 if [# EQ -1]
# = [# + #]
o109 endif
# = [# * #<i> / #]
# = [# + [# + #] * 1]
# = [# + [# + #] * -1]
# = [# + [# + #] * 1]
# = [# + [# + #] * -1]
o121 if [# lt [# + #]]
# = [# + #]
o121 else
# = [#]
o121 endif
o110 if [# lt [#]]
g01 x[# + # /2] y[# - # /2] z[#]
g01 x[# + # /2] y[# - # /2]
g01 x[# - # /2] y[# - # /2]
g01 x[# - # /2] y[# - # /2]
g01 x[# - # /2] y[# + # /2]
g01 x[# - # /2] y[# + # /2]
g01 x[# + # /2] y[# + # /2]
g01 x[# + # /2] y[# + # /2]
g01 x[# + # /2] y[# - # /2]
o110 endif
o108 endwhile
o200 endsub
#<_raccordo> = 12
#<_raggio> = 12
#<_xx> = 0
#<_yy> = 0
#<_cick> = 1
#<_latoy> = 20
#<_latox> = 20
#<_accuratezzafinitura> = 1.5
#<_accuratezzasgrosso> = 12
#<_sgrossaturamm> = 120
o200 call
#<_raccordo> = 12
#<_raggio> = 12
#<_xx> = 0
#<_yy> = 0
#<_cick> = -1
#<_latoy> = 70
#<_latox> = 70
#<_accuratezzafinitura> = 1.5
#<_accuratezzasgrosso> = 12
#<_sgrossaturamm> = 12
o200 call
%
</i></i></i></i></i></i></i></i></i></i></i></i></i>
% Autori
% Prof. Danilo Pasquini IPSIA Parodi Delfino, Colleferro (Roma)
% Prof. Paolo Sordi IPSIA A. Pacinotti, Pontedera (Pisa)
%
o sub
# = #<_raggio>
# = #<_x1>
# = #<_y1>
# = #<_cick>
# = #<_lato_y>
# = #<_lato_x>
# = #<_accuratezza>
# = #<_accuratezza_finitura>
# = #<_accuratezza_sgrosso>
# = #<_sgrossatura_mm>
# = #<_zcentro> ;
# = # ;
# = # ;
# = [2 * 3.14159 * # / 4]
# = FIX[# / #]
# = -1
g01 f[#<_velocita_finitura>]
g00 z5
(pausa di 1 s)
g4 p1
o101 repeat [#+1]
# = [# + 1]
o102 if [# EQ #]
# = # ;
(DEBUG,finitura: #)
o102 else
# = # ;
(DEBUG,sgrosso: #)
o102 endif
# = FIX[# / #]
# = [#]
o130 if [# EQ 1]
# = 0
o130 endif
o104 repeat[#]
o131 if [# EQ 1]
# = [# + 1]
o131 else
# = [# - 1]
o131 endif
# = [[# - #] * #]
# = [# + # + # * # * SIN[180 * [1/2] * # / #]]
o105 if [# EQ -1]
# = [# + #]
o105 endif
# = [# * COS[180 * 0.5 * # / #]]
# = [# * COS[180 * [1/2] * [# - #] / #]]
# = [# + # * -1]
# = [# + # * -1]
# = [# + #]
# = [# + #]
o120 if [# lt [# + #]]
# = [# + #]
o120 else
# = [#]
o120 endif
o106 if [# LT #]
(o106 if [# LT 500])
g01 z[3]
g01 x[# + #/2 * -1] y[# + #/2 + #]
g01 z[#]
g01 x[# + #/2 * -1] y[# - #/2 - #]
g00 x[# - #/2 - #] y[# + #/2 * -1 ]
g01 x[# + #/2 + #] y[# + #/2 * -1 ]
g00 x[# + #/2 + #] y[# + #/2 * -1 ]
g01 x[# + #/2 + #] y[# + #/2 + # ]
g01 x[# + #/2 * -1] y[# + #/2 + #]
o106 endif
o104 endrepeat
o101 endrepeat
g00 z10
o endsub
% Autori
% Prof. Danilo Pasquini IPSIA Parodi Delfino, Colleferro (Roma)
% Prof. Paolo Sordi IPSIA A. Pacinotti, Pontedera (Pisa)
%
o200 sub
# = #<_raccordo>
# = #<_xx>
# = #<_yy>
# = #<_latoy>
# = #<_latox>
# = #<_sgrossaturamm>
(-------------------------------------------------------------------------------------)
# = [-#<_spessoretavola>]
# = #
# = #
# = [FIX[[#<_spessoretavola>-1] / #]]
(PRINT,value of variable 123 is: #)
(MSG, This is a message)
(DEBUG,value of variable numeropassate is: #)
# = -1
g00 z5
(pausa di 1 s)
g4 p1
g01 f1000
# = 1
o101 while [# LT #]
# = [# + 1]
(DEBUG,sgrosso: #)
# = [[# - #] * #]
# = [# + # ]
o130 if [# EQ 1]
g01 x[# + # /2 ] y[# - # /2] z5
# = 0
o130 endif
g01 x[# + # /2 ] y[# - # /2] z[#]
g01 x[# + # /2] y[# - # /2]
o131 if [# lt [#<_tassellinoz>-#<_spessoretavola>]]
g01 x[# + #<_tassellinox>] y[# - # /2]
g00 z5
g00 x[# - #<_tassellinox>] y[# - # /2]
g01 z[#]
o131 endif
g01 x[# - # /2] y[# - # /2]
o132 if [# lt [#<_tassellinoz>-#<_spessoretavola>]]
g01 x[# - # /2] y[# - #<_tassellinox>]
g00 z5
g00 x[# - # /2] y[# + #<_tassellinox>]
g01 z[#]
o132 endif
g01 x[# - # /2] y[# + # /2]
o133 if [# lt [#<_tassellinoz>-#<_spessoretavola>]]
g01 x[# - #<_tassellinox>] y[# + # /2]
g00 z5
g00 x[# + #<_tassellinox>] y[# + # /2]
g01 z[#]
o133 endif
g01 x[# + # /2] y[# + # /2]
o134 if [# lt [#<_tassellinoz>-#<_spessoretavola>]]
g01 x[# + # /2] y[# + #<_tassellinox> /2]
g00 z5
g00 x[# + # /2] y[# - #<_tassellinox> /2]
g01 z[#]
o134 endif
g01 x[# + # /2] y[# - # /2]
g00 z0
o101 endwhile
o200 endsub
#<_raccordo> = 0
#<_spessoretavola> = 10
#<_tassellinoz> = 3
#<_tassellinox> = 2
#<_xx> = 0
#<_yy> = 0
#<_latoy> = 70
#<_latox> = 70
#<_sgrossaturamm> = 1
o200 call
%