Introduzione
In questo thread vengono illustrate le operazioni necessarie per la costruzione di un nuovo codice G/M utente.
I codici G, ed M utente, sono estensioni al linguaggio nativo di RosettaCNC ottenibili tramite l'utilizzo di macro esterne.
A questo scopo RosettaCNC ha riservato i codicI G da G200 a G499 e i codici M da M200 a M299,
Ogni machine ha una propria cartella macros ove porre i file delle macro generiche e delle macro G/M per quella macchina. Prendendo per esempio la machine di default RosettaCNC la cartella si troverà nel percorso:
%USERPROFILE%/Documents/RosettaCNC-1/machines/RosettaCNC/macros
Descrizione esempio
Come esempio implementeremo il nuovo codice G300 per la generazione di un percorso utensile usando una curva di Bézier cubica bidimensionale (WIKIPEDIA LINK).
Implementazione
Tralasciando la spiegazione matematica della funzione stessa porteremo ora l'attenzione ai passi necessari per poterla scrivere, eseguirne il collaudo e trasformarla in un codice G funzionale.
Quando si scrive una nuova macro è sempre preferibile farlo direttamente nel pannello editor di RosettaCNC rendendo più veloce ed agevole la fase di collaudo.
Sebbene le macro possano utilizzare qualsiasi parametro # come argomento è preferibile utilizzare la convezione della chiamata G65 e limitarsi agli argomenti associati ad una lettera delle variabili locali cosicché tutti i parametri di una chiamata G300 potranno essere messi direttamente nello stesso blocco (linea di codice).
Le variabili locali sono variabili di argomento di una macro chiamata con G65 P"nome_macro" <argomenti> o di un codice G/M utente (G300 A10 D7 ...). Nel caso una macro chiami al suo interno un'altra macro quest'ultima avrà le proprie variabili locali (annidamento di macro).
Lista variabili locali macro (ROSETTACNC DOCUMENTATION LINK):
Codice: Seleziona tutto
^ Argument List ^ Local Variable in a Macro ^
| A | #1 |
| B | #2 |
| C | #3 |
| D | #7 |
| E | #8 |
| F | #9 |
| H | #11 |
| I | #4 |
| J | #5 |
| K | #6 |
| M | #13 |
| Q | #17 |
| R | #18 |
| S | #19 |
| T | #20 |
| U | #21 |
| V | #22 |
| W | #23 |
| X | #24 |
| Y | #25 |
| Z | #26 |
Di norma la macro dovrà avere in testa un numero sub pari al codice G utente che andrà ad implementare e in questo caso O300. Per la chiamata della macro si userà il comando G65 e quindi G65 P300.
Ecco il codice esempio di come dovrebbe avvenire lo sviluppo di una macro:
Codice: Seleziona tutto
;
; Sample of Bezier curve using macro G300
;
; PS: used imperial metric system
;
G17 G20 G40 G49 G80 G90
G54 F100
; move local UCS
G52 X1 Y1
G0 X0 Y0
; define continous mode and related parameters
G64 Q.01 P.01
; select T1 color
M61 Q1
; bezier curve
;
; dt p1.X p1.Y p2.X p2.Y p3.X p3.Y p4.X p4.Y
; ===== ==== ==== ==== ==== ==== ==== ==== ====
G65 P300 T0.01 A0 B0 C.1 D.5 E1 K.6 I1 J0
M2
; Name : g300.ngc
; Sub UID : 300
; Version : 1
; Description : create a degree 3 Bezier curve
; Reference : https://en.wikipedia.org/wiki/B%C3%A9zier_curve
;
; Inputs:
;
; Symbolic G65 G65/M98 Description
; ======== === ======= ===========
; dt T #20
; p0.x A #1 start point X
; p0.y B #2 start point Y
; p1.x C #3 control point 1 X
; p1.y D #7 control point 1 Y
; p2.x E #8 control point 2 X
; p2.y K #6 control point 2 Y
; p3.x I #4 end point X
; p3.y J #5 end point Y
;
; Local Variables:
;
; #1000 = t
; #1001 = x0
; #1002 = y0
; #1003 = x1
; #1004 = y1
O300
#1000 = 0.0
; calc x1 & y1
G65 P1001 T#1000 A#1 B#3 C#8 D#4
#1003 = #100
G65 P1001 T#1000 A#2 B#7 C#6 D#5
#1004 = #100
; t = t + dt
#1000 = [#1000 + #20]
WHILE [#1000 LT 1] DO01
; x0 = x1
#1001 = #1003
; y0 = y1
#1002 = #1004
; calc x1 & y1
G65 P1001 T#1000 A#1 B#3 C#8 D#4
#1003 = #100
G65 P1001 T#1000 A#2 B#7 C#6 D#5
#1004 = #100
G1 X#1001 Y#1002
X#1003 Y#1004
; t = t + dt
#1000 = [#1000 + #20]
END01
; connect final point
#1000 = 1
; x0 = x1
#1001 = #1003
; y0 = y1
#1002 = #1004
; calc x1 & y1
G65 P1001 T#1000 A#1 B#3 C#8 D#4
#1003 = #100
G65 P1001 T#1000 A#2 B#7 C#6 D#5
#1004 = #100
G1 X#1001 Y#1002
X#1003 Y#1004
M99
; function for a degree 3 Bezier curve
;
; t T #20
; v0 A #1
; v1 B #2
; v2 C #3
; v3 D #7
;
; #100 = v0 * (1 - t) ^ 3 +
; v1 * 3 * t * (1 - t) ^ 2 +
; v2 * 3 * t ^ 2 * (1 - t) +
; v3 * t ^ 3
O1001
#100 = [ 0 + [#1 * [[1 - #20] ** 3]] ]
#100 = [ #100 + [#2 * 3 * #20 * [[1 - #20] ** 2]] ]
#100 = [ #100 + [#3 * 3 * [#20 ** 2] * [1 - #20]] ]
#100 = [ #100 + [#7 * [#20 ** 3]] ]
M99
A questo punto, una volta sviluppata e fatto il debug è possibile prendere il codice macro creato e prorlo nel file G300.ngc nella cartella macros prima descritta.
La chiamata nel codice potrà sempre essere fatta usando direttamente sia G300 <parametri> che con G65 P"G300.ngc" <parametri>.
Codice macro G300 (G300.NGC) finale:
Codice: Seleziona tutto
; Name : g300.ngc
; Sub UID : 300
; Version : 1
; Description : create a degree 3 Bezier curve
; Reference : https://en.wikipedia.org/wiki/B%C3%A9zier_curve
;
; Inputs:
;
; Symbolic G65 G65/M98 Description
; ======== === ======= ===========
; dt T #20
; p0.x A #1 start point X
; p0.y B #2 start point Y
; p1.x C #3 control point 1 X
; p1.y D #7 control point 1 Y
; p2.x E #8 control point 2 X
; p2.y K #6 control point 2 Y
; p3.x I #4 end point X
; p3.y J #5 end point Y
;
; Local Variables:
;
; #1000 = t
; #1001 = x0
; #1002 = y0
; #1003 = x1
; #1004 = y1
O300
#1000 = 0.0
; calc x1 & y1
G65 P1001 T#1000 A#1 B#3 C#8 D#4
#1003 = #100
G65 P1001 T#1000 A#2 B#7 C#6 D#5
#1004 = #100
; t = t + dt
#1000 = [#1000 + #20]
WHILE [#1000 LT 1] DO01
; x0 = x1
#1001 = #1003
; y0 = y1
#1002 = #1004
; calc x1 & y1
G65 P1001 T#1000 A#1 B#3 C#8 D#4
#1003 = #100
G65 P1001 T#1000 A#2 B#7 C#6 D#5
#1004 = #100
G1 X#1001 Y#1002
X#1003 Y#1004
; t = t + dt
#1000 = [#1000 + #20]
END01
; connect final point
#1000 = 1
; x0 = x1
#1001 = #1003
; y0 = y1
#1002 = #1004
; calc x1 & y1
G65 P1001 T#1000 A#1 B#3 C#8 D#4
#1003 = #100
G65 P1001 T#1000 A#2 B#7 C#6 D#5
#1004 = #100
G1 X#1001 Y#1002
X#1003 Y#1004
M99
; function for a degree 3 Bezier curve
;
; t T #20
; v0 A #1
; v1 B #2
; v2 C #3
; v3 D #7
;
; #100 = v0 * (1 - t) ^ 3 +
; v1 * 3 * t * (1 - t) ^ 2 +
; v2 * 3 * t ^ 2 * (1 - t) +
; v3 * t ^ 3
O1001
#100 = [ 0 + [#1 * [[1 - #20] ** 3]] ]
#100 = [ #100 + [#2 * 3 * #20 * [[1 - #20] ** 2]] ]
#100 = [ #100 + [#3 * 3 * [#20 ** 2] * [1 - #20]] ]
#100 = [ #100 + [#7 * [#20 ** 3]] ]
M99
Esempio 1
Esempio chiamata macro G300 per la realizzazione della curva visuallizzata nell'immagine di sopra:
Codice: Seleziona tutto
;
; Sample of Bezier curve using macro G300
;
; PS: used imperial metric system
;
G17 G20 G40 G49 G80 G90
G54 F100
; move local UCS
G52 X1 Y1
G0 X0 Y0
; define continous mode and related parameters
G64 Q.01 P.01
; select T1 color
M61 Q1
; bezier curve
;
; dt p1.X p1.Y p2.X p2.Y p3.X p3.Y p4.X p4.Y
; ===== ==== ==== ==== ==== ==== ==== ==== ====
G300 T0.01 A0 B0 C.1 D.5 E1 K.6 I1 J0
M2
Esempio chiamata macro G300 per la realizzazione di un cerchio e relativa comparazione con la realizzazione di un cerchio usando la funzione nativa della CNC G2 (imperial metric system):
Codice: Seleziona tutto
;
; Sample of circle creation with Bezier using
; macro G300 compared with CNC native arc G2
;
; PS: used imperial metric system
;
G17 G20 G40 G49 G80 G90
G54 F100
; move local UCS
G52 X2 Y2
G0 X0 Y1
; define continous mode and related parameters
G64 Q.01 P.01
; select T1 color
M61 Q1
; control point for 1 inch radius
#1=0.55191502449
; circle of 1 inch with bezier curve
;
; dt p1.X p1.Y p2.X p2.Y p3.X p3.Y p4.X p4.Y
; ===== ==== ==== ==== ==== ==== ==== ==== ====
G300 T0.01 A0 B1 C#1 D1 E1 K#1 I1 J0
G300 T0.01 A1 B0 C1 D-#1 E#1 K-1 I0 J-1
G300 T0.01 A0 B-1 C-#1 D-1 E-1 K-#1 I-1 J0
G300 T0.01 A-1 B0 C-1 D#1 E-#1 K1 I0 J1
; select T2 color
M61 Q2
; move local UCS
G52 Y4.5
; circle of 1 inch with g2
G0 X0 Y1
G2 X0 Y1 I0 J-1
M2