G-Code Programmazione per macchine CNC

Percorso utensile lavorazione CNC. Cornice ottagonale con lati obliqui G01, G02, G03

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
  1. % Autori
  2. % Prof. Danilo Pasquini IPSIA Parodi Delfino, Colleferro (Roma)
  3. % Prof. Paolo Sordi IPSIA A. Pacinotti, Pontedera (Pisa) 
  4. %
  5. o200 sub
  6. 	# = #<_raccordo>
  7. 	# = #<_raggio>
  8. 	# = #<_xx>
  9. 	# = #<_yy>
  10. 	# = #<_cick>
  11. 	# = #<_latoy>
  12. 	# = #<_latox>
  13. 	# = #<_accuratezzafinitura>
  14. 	# = #<_accuratezzasgrosso>
  15. 	# = #<_sgrossaturamm>
  16.  
  17. (-------------------------------------------------------------------------------------)
  18. 	# = [-#]
  19. 	# = #
  20. 	# = #
  21. 	# = [2 * 3.14 * # / 4]
  22. 	# = [FIX[[#-1] / #]]
  23.       		           (PRINT,value of variable 123 is: #)
  24. 		           (MSG, This is a message)
  25.  			   (DEBUG,value of variable numeropassate is: #)
  26. 	# =  -1
  27. 	g00 z5
  28. 	(pausa di 1 s)
  29. 	g4 p1
  30. 	g01 f1000
  31. 	# = 1 
  32. 	o101 while [# LT #]
  33.  
  34. 	     # = [# + 1]
  35. 	     # = #
  36. 	     (DEBUG,sgrosso: #)
  37. 	     # = [# / #] 
  38. 	     #<i> = -1  
  39.  
  40. 	     o140 if [# EQ 1]
  41. 		 #<i> = [#] 
  42. 	     o140 endif
  43.  
  44. 	     o103 while [#<i> LT [#]]
  45.  
  46. 			o141 if [# EQ 1]
  47. 				#<i> = [#<i> - 1]
  48. 			o141 else
  49. 				#<i> = [#<i> + 1]
  50. 			o141 endif
  51. 			# = [[# - #] * #]
  52. 			# = [# *  #<i> / #]
  53. 			# = [# + # + # ]	 
  54. 		        o104 if [# EQ -1]
  55. 			   # = [#  + #]
  56. 			o104 endif
  57. 			# = [# + [# + #] *  1]
  58. 			# = [# + [# + #] * -1]
  59. 			# = [# + [# + #] *  1]
  60. 			# = [# + [# + #] * -1] 
  61. 			o120 if [# lt [# + #]]
  62. 			   # = [# + #]
  63. 		        o120 else
  64. 		           # = [#]
  65. 		        o120 endif
  66.  
  67. 			o105 if [# lt [#]]
  68. 				o130 if [# EQ 1]
  69. 					g01 x[# + # /2 ] y[# - # /2] z5
  70. 					# = 0
  71. 				o130 endif
  72. 				g01 x[# + # /2 ] y[# - # /2] z[#]
  73. 				g01 x[# + # /2] y[# - # /2] 
  74. 				g01 x[# - # /2] y[# - # /2] 
  75. 				g01 x[# - # /2] y[# - # /2] 
  76. 				g01 x[# - # /2] y[# + # /2] 
  77. 				g01 x[# - # /2] y[# + # /2] 
  78. 				g01 x[# + # /2] y[# + # /2] 
  79. 				g01 x[# + # /2] y[# + # /2] 
  80. 				g01 x[# + # /2 ] y[# - # /2] 
  81. 		                g00 z0
  82. 			o105 endif
  83. 	     o103 endwhile
  84. 	o101 endwhile
  85. 	# = #
  86. 	(DEBUG,finitura: #)
  87. 	# = [#/#] 
  88. 	#<i> = [# +1]
  89. 	g01 f200
  90. 	g00 z10
  91. 	o108 while [#<i> GE 0]
  92. 		#<i> = [#<i> - 1]
  93. 		# = [# + # * #]	 
  94. 		o109 if [# EQ -1]
  95. 		   # = [#  + #]
  96. 		o109 endif
  97. 		# = [# *  #<i> / #]
  98. 		# = [# + [# + #] *  1]
  99. 		# = [# + [# + #] * -1]
  100. 		# = [# + [# + #] *  1]
  101. 		# = [# + [# + #] * -1]
  102. 		o121 if [# lt [# + #]]
  103. 		   # = [# + #]
  104. 		o121 else
  105. 		   # = [#]
  106. 		o121 endif
  107. 		o110 if [# lt [#]]
  108. 			g01 x[# + # /2] y[# - # /2] z[#]
  109. 			g01 x[# + # /2] y[# - # /2] 
  110. 			g01 x[# - # /2] y[# - # /2] 
  111. 			g01 x[# - # /2] y[# - # /2] 
  112. 			g01 x[# - # /2] y[# + # /2] 
  113. 			g01 x[# - # /2] y[# + # /2] 
  114. 			g01 x[# + # /2] y[# + # /2] 
  115. 			g01 x[# + # /2] y[# + # /2] 
  116. 			g01 x[# + # /2] y[# - # /2] 
  117. 		o110 endif
  118. 	o108 endwhile
  119. o200 endsub
  120.  
  121. #&lt;_raccordo&gt; = 12
  122. #&lt;_raggio&gt; = 12
  123. #&lt;_xx&gt; = 0
  124. #&lt;_yy&gt; = 0
  125. #&lt;_cick&gt; = 1
  126. #&lt;_latoy&gt; = 20
  127. #&lt;_latox&gt; = 20
  128. #&lt;_accuratezzafinitura&gt; = 1.5
  129. #&lt;_accuratezzasgrosso&gt; = 12
  130. #&lt;_sgrossaturamm&gt; = 120
  131. o200 call 
  132.  
  133. #&lt;_raccordo&gt; = 12
  134. #&lt;_raggio&gt; = 12
  135. #&lt;_xx&gt; = 0
  136. #&lt;_yy&gt; = 0
  137. #&lt;_cick&gt; = -1
  138. #&lt;_latoy&gt; = 70
  139. #&lt;_latox&gt; = 70
  140. #&lt;_accuratezzafinitura&gt; = 1.5
  141. #&lt;_accuratezzasgrosso&gt; = 12
  142. #&lt;_sgrossaturamm&gt; = 12
  143. o200 call 
  144.  
  145. %
  146. </i></i></i></i></i></i></i></i></i></i></i></i></i>
Il codice seguente serve a realizzare una superficie di tipo rettangolare raccordata in modo concavo o convesso.
  1. % Autori
  2. % Prof. Danilo Pasquini IPSIA Parodi Delfino, Colleferro (Roma)
  3. % Prof. Paolo Sordi IPSIA A. Pacinotti, Pontedera (Pisa) 
  4. %
  5. o sub
  6.  
  7. # = #&lt;_raggio&gt;
  8. # = #&lt;_x1&gt;
  9. # = #&lt;_y1&gt;
  10. # = #&lt;_cick&gt; 
  11. # = #&lt;_lato_y&gt;
  12. # = #&lt;_lato_x&gt;
  13. # = #&lt;_accuratezza&gt;
  14. # = #&lt;_accuratezza_finitura&gt;
  15. # = #&lt;_accuratezza_sgrosso&gt;
  16. # = #&lt;_sgrossatura_mm&gt;
  17.  
  18. # = #&lt;_zcentro&gt; ;
  19. # = # ;
  20. # = # ;
  21. # = [2 * 3.14159 * # / 4]
  22. # = FIX[# / #]
  23.  
  24. # = -1
  25. g01 f[#&lt;_velocita_finitura&gt;]
  26. g00 z5
  27.  
  28. (pausa di 1 s)
  29. g4 p1
  30. o101 repeat [#+1]
  31.     # = [# + 1]
  32.     o102 if [# EQ #]
  33.         # = # ;
  34.         (DEBUG,finitura: #)
  35.     o102 else
  36.         # = # ;
  37.         (DEBUG,sgrosso: #)
  38.     o102 endif
  39.     # = FIX[# / #]
  40.     # = [#] 
  41.     o130 if [# EQ 1]
  42. 	 # = 0
  43.     o130 endif
  44.     o104 repeat[#]	
  45. 	o131 if [# EQ 1]
  46. 		# = [# + 1]
  47. 	o131 else
  48. 		# = [# - 1]
  49.  
  50. 	o131 endif
  51. 	# = [[# - #] * #]
  52. 	# = [# + # + # * # * SIN[180 * [1/2] * # / #]]
  53. 	o105 if [# EQ -1]
  54. 		# = [# + #]
  55. 	o105 endif
  56. 	# = [# * COS[180 * 0.5 * # / #]]
  57. 	# = [# * COS[180 * [1/2] * [# - #] / #]]
  58. 	# = [# + # * -1]
  59. 	# = [# + # * -1]
  60. 	# = [# + #]
  61. 	# = [# + #]
  62. 	o120 if [# lt [# + #]]
  63. 		   # = [# + #]
  64. 	o120 else
  65. 		   # = [#]
  66. 	o120 endif  
  67. 	o106 if [# LT #]
  68. 	(o106 if [# LT 500])
  69.  
  70.                  g01 z[3]
  71. 		 g01 x[# + #/2 * -1]                y[# + #/2 + #] 
  72. 		 g01 z[#]
  73. 		 g01 x[# + #/2 * -1]                y[# - #/2 - #]
  74. 		 g00 x[# - #/2 - #] y[# + #/2 * -1  ] 
  75. 		 g01 x[# + #/2 + #] y[# + #/2 * -1  ] 
  76. 		 g00 x[# + #/2 + #] y[# + #/2 * -1  ] 
  77. 		 g01 x[# + #/2 + #] y[# + #/2 + # ] 
  78. 		 g01 x[# + #/2 * -1]                y[# + #/2 + #] 
  79.  
  80.  
  81. 	o106 endif
  82.     o104 endrepeat 
  83. o101 endrepeat 
  84. g00 z10
  85. o endsub
Al termine di un lavoro sorge spesso il problema di ritagliare la tavola a misura. Per non avere collisioni dopo il distacco del pezzo finito dalla cornice avanzata conviene lasciare un piccolo tassello sui quattro lati che saranno tagliati successivamente a mano
  1. % Autori
  2. % Prof. Danilo Pasquini IPSIA Parodi Delfino, Colleferro (Roma)
  3. % Prof. Paolo Sordi IPSIA A. Pacinotti, Pontedera (Pisa) 
  4. %
  5. o200 sub
  6. 	# = #&lt;_raccordo&gt;
  7. 	# = #&lt;_xx&gt;
  8. 	# = #&lt;_yy&gt;
  9. 	# = #&lt;_latoy&gt;
  10. 	# = #&lt;_latox&gt;
  11.  
  12. 	# = #&lt;_sgrossaturamm&gt;
  13.  
  14. (-------------------------------------------------------------------------------------)
  15. 	# = [-#&lt;_spessoretavola&gt;]
  16. 	# = #
  17. 	# = #
  18.  
  19. 	# = [FIX[[#&lt;_spessoretavola&gt;-1] / #]]
  20.       		           (PRINT,value of variable 123 is: #)
  21. 		           (MSG, This is a message)
  22.  			   (DEBUG,value of variable numeropassate is: #)
  23. 	# =  -1
  24. 	g00 z5
  25. 	(pausa di 1 s)
  26. 	g4 p1
  27. 	g01 f1000
  28. 	# = 1 
  29. 	o101 while [# LT #]
  30.  
  31. 	     # = [# + 1]
  32.  
  33. 	     (DEBUG,sgrosso: #)
  34.  
  35. 			# = [[# - #] * #]
  36. 			# = [# + #  ]	 
  37.  
  38. 			o130 if [# EQ 1]
  39. 				g01 x[# + # /2 ] y[# - # /2] z5
  40. 				# = 0
  41. 			o130 endif
  42. 			g01 x[# + # /2 ] y[# - # /2] z[#]
  43.  
  44.  
  45. 			g01 x[# + # /2] y[# - # /2] 
  46. 			o131 if [# lt [#&lt;_tassellinoz&gt;-#&lt;_spessoretavola&gt;]]
  47. 				g01 x[# + #&lt;_tassellinox&gt;] y[# - # /2] 
  48. 				g00 z5 
  49. 				g00 x[# - #&lt;_tassellinox&gt;] y[# - # /2] 
  50. 				g01 z[#] 
  51.  
  52. 			o131 endif
  53.  
  54. 			g01 x[# - # /2] y[# - # /2]
  55. 			o132 if [# lt [#&lt;_tassellinoz&gt;-#&lt;_spessoretavola&gt;]]
  56. 				g01 x[# - # /2] y[# - #&lt;_tassellinox&gt;]
  57. 				g00 z5 
  58. 				g00 x[# - # /2] y[# + #&lt;_tassellinox&gt;]
  59. 				g01 z[#] 
  60. 			o132 endif
  61.  
  62. 			g01 x[# - # /2] y[# + # /2]
  63. 			o133 if [# lt [#&lt;_tassellinoz&gt;-#&lt;_spessoretavola&gt;]]
  64. 				g01 x[# - #&lt;_tassellinox&gt;] y[# + # /2]
  65.  
  66. 				g00 z5 
  67. 				g00 x[# + #&lt;_tassellinox&gt;] y[# + # /2]
  68.  
  69. 				g01 z[#] 
  70. 			o133 endif 
  71. 			g01 x[# + # /2] y[# + # /2]
  72. 			o134 if [# lt [#&lt;_tassellinoz&gt;-#&lt;_spessoretavola&gt;]]
  73. 				g01 x[# + # /2] y[# + #&lt;_tassellinox&gt; /2]
  74.  
  75. 				g00 z5 
  76. 				g00 x[# + # /2] y[# - #&lt;_tassellinox&gt; /2]
  77.  
  78. 				g01 z[#]
  79. 			o134 endif 
  80.  
  81. 			g01 x[# + # /2] y[# - # /2] 
  82. 	                g00 z0
  83. 	o101 endwhile
  84. o200 endsub
  85.  
  86. #&lt;_raccordo&gt; = 0
  87. #&lt;_spessoretavola&gt; = 10
  88. #&lt;_tassellinoz&gt; = 3
  89. #&lt;_tassellinox&gt; = 2
  90.  
  91. #&lt;_xx&gt; = 0
  92. #&lt;_yy&gt; = 0
  93. #&lt;_latoy&gt; = 70
  94. #&lt;_latox&gt; = 70
  95. #&lt;_sgrossaturamm&gt; = 1
  96. o200 call 
  97.  
  98. %