Gcode bizarre

  • Auteur de la discussion xaetva
  • Date de début
X

xaetva

Nouveau
Bonjour,

j'ai généré un Gcode à partir d'inkscape et de deux plugins: Laser Tools pour dessiner des boites en mode fénéant et Gcode tools pour générer le Gcode.
Et je n'arrive pas à l'interpréter dans les visualisateurs de Gcode en ligne.

Il semble qu'il y ait des variables dans le code avec des #

Voici un extrait. Qu'en pensez vous? Comment procéder pour avoir un Gcode comestible :wink:


%
(Header)
(Generated by gcodetools from Inkscape.)
(Using default header. To add your own header create file "header" in the output dir.)
M3
(Header end.)
G21 (All units in mm)
#8 = 0 (Z axis offset)
#6 = 0 (X axis offset)
#7 = 0 (Y axis offset)
#10 = 1 (XY Scale factor)
#11 = 1 (Z Scale factor)
#21 = 400.000000 (Feed definition)
#20 = 100.000000 (Feed definition)

(Start cutting path id: path8016)
(Change tool to Default tool)

G00 Z[5.000000*#11+#8]
G00 X[119.250000*#10+#6] Y[468.437500*#10+#7]

G01 Z[-1.000000*#11+#8] F [#20](Penetrate)
G01 X[119.250000*#10+#6] Y[478.839640*#10+#7] Z[-1.000000*#11+#8] F [#21]
G01 X[124.750000*#10+#6] Y[478.839640*#10+#7] Z[-1.000000*#11+#8]
G01 X[124.750000*#10+#6] Y[494.606786*#10+#7] Z[-1.000000*#11+#8]
G01 X[119.250000*#10+#6] Y[494.606786*#10+#7] Z[-1.000000*#11+#8]
G01 X[119.250000*#10+#6] Y[510.553929*#10+#7] Z[-1.000000*#11+#8]
G01 X[124.750000*#10+#6] Y[510.553929*#10+#7] Z[-1.000000*#11+#8]
G01 X[124.750000*#10+#6] Y[526.321071*#10+#7] Z[-1.000000*#11+#8]
G01 X[119.250000*#10+#6] Y[526.321071*#10+#7] Z[-1.000000*#11+#8]
G01 X[119.250000*#10+#6] Y[542.268214*#10+#7] Z[-1.000000*#11+#8]
G01 X[124.750000*#10+#6] Y[542.268214*#10+#7] Z[-1.000000*#11+#8]
G01 X[124.750000*#10+#6] Y[558.035357*#10+#7] Z[-1.000000*#11+#8]
G01 X[119.250000*#10+#6] Y[558.035357*#10+#7] Z[-1.000000*#11+#8]
G01 X[119.250000*#10+#6] Y[568.437500*#10+#7] Z[-1.000000*#11+#8]
G00 Z[5.000000*#11+#8]

(End cutting path id: path8016)


(Start cutting path id: path8016)
(Change tool to Default tool)

G00 Z[5.000000*#11+#8]
G00 X[119.250000*#10+#6] Y[468.437500*#10+#7]

G01 Z[-2.000000*#11+#8] F [#20](Penetrate)
G01 X[119.250000*#10+#6] Y[478.839640*#10+#7] Z[-2.000000*#11+#8] F [#21]
G01 X[124.750000*#10+#6] Y[478.839640*#10+#7] Z[-2.000000*#11+#8]
G01 X[124.750000*#10+#6] Y[494.606786*#10+#7] Z[-2.000000*#11+#8]
G01 X[119.250000*#10+#6] Y[494.606786*#10+#7] Z[-2.000000*#11+#8]
G01 X[119.250000*#10+#6] Y[510.553929*#10+#7] Z[-2.000000*#11+#8]
G01 X[124.750000*#10+#6] Y[510.553929*#10+#7] Z[-2.000000*#11+#8]
G01 X[124.750000*#10+#6] Y[526.321071*#10+#7] Z[-2.000000*#11+#8]
G01 X[119.250000*#10+#6] Y[526.321071*#10+#7] Z[-2.000000*#11+#8]
G01 X[119.250000*#10+#6] Y[542.268214*#10+#7] Z[-2.000000*#11+#8]
G01 X[124.750000*#10+#6] Y[542.268214*#10+#7] Z[-2.000000*#11+#8]
G01 X[124.750000*#10+#6] Y[558.035357*#10+#7] Z[-2.000000*#11+#8]
G01 X[119.250000*#10+#6] Y[558.035357*#10+#7] Z[-2.000000*#11+#8]
G01 X[119.250000*#10+#6] Y[568.437500*#10+#7] Z[-2.000000*#11+#8]
G00 Z[5.000000*#11+#8]

(End cutting path id: path8016)
 
J

JLuc69

Compagnon
Ce code te permet juste de modifier l'echelle de ta forme en XY avec #10 et/ou en Z avec #11.
Ensuite tu peux le décalé en X avec #6, en Y avec #7 et/ou en Z avec #8
 
C

Castor24

Compagnon
Il semble qu'il y ait des variables dans le code avec des #
%
(Header)
(Generated by gcodetools from Inkscape.)
(Using default header. To add your own header create file "header" in the output dir.)
M3
(Header end.)
G21 (All units in mm)
#8 = 0 (Z axis offset)
#6 = 0 (X axis offset)
#7 = 0 (Y axis offset)
#10 = 1 (XY Scale factor)
#11 = 1 (Z Scale factor)
#21 = 400.000000 (Feed definition)
#20 = 100.000000 (Feed definition)

Pour moi le symbole # ici permet de définir des constantes et non des variables.
Je ne connais pas ton IDE, mais il est possible qu'il y ait des options sur les constantes, par exemple de type signée ou non.
Ce qui gênerait ton interpréteur...

D'autre part, le code avec toutes ces constantes qui ne servent à rien serait plus lisible en les supprimant, car par exemple:
G00 X[119.250000*#10+#6] Y[468.437500*#10+#7]
puisque #10 vaut 1
et
#6 vaut 0
et
#7 vaut 0
on a
G00 X[119.250000*1+0] Y[468.437500*1+0]
soit à écrire
G00 X[119.250000] Y[468.437500]

ce qui donnerait une fois épuré:



(Start cutting path id: path8016)
(Change tool to Default tool)

G00 Z[5.000000]
G00 X[119.250000] Y[468.437500]

G01 Z[-1.000000] F [#20](Penetrate)
G01 X[119.250000] Y[478.839640] Z[-1.000000] F [#21]
G01 X[124.750000] Y[478.839640] Z[-1.000000]
G01 X[124.750000] Y[494.606786] Z[-1.000000]
G01 X[119.250000] Y[494.606786] Z[-1.000000]
G01 X[119.250000] Y[510.553929] Z[-1.000000]
G01 X[124.750000] Y[510.553929] Z[-1.000000]
G01 X[124.750000] Y[526.321071] Z[-1.000000]
G01 X[119.250000] Y[526.321071] Z[-1.000000]
G01 X[119.250000] Y[542.268214] Z[-1.000000]
G01 X[124.750000] Y[542.268214] Z[-1.000000]
G01 X[124.750000] Y[558.035357] Z[-1.000000]
G01 X[119.250000] Y[558.035357] Z[-1.000000]
G01 X[119.250000] Y[568.437500] Z[-1.000000]
G00 Z[5.000000]

(End cutting path id: path8016)


(Start cutting path id: path8016)
(Change tool to Default tool)

G00 Z[5.000000]
G00 X[119.250000] Y[468.437500]

G01 Z[-2.000000] F [#20](Penetrate)
G01 X[119.250000] Y[478.839640] Z[-2.000000] F [#21]
G01 X[124.750000] Y[478.839640] Z[-2.000000]
G01 X[124.750000] Y[494.606786] Z[-2.000000]
G01 X[119.250000] Y[494.606786] Z[-2.000000]
G01 X[119.250000] Y[510.553929] Z[-2.000000]
G01 X[124.750000] Y[510.553929] Z[-2.000000]
G01 X[124.750000] Y[526.321071] Z[-2.000000]
G01 X[119.250000] Y[526.321071] Z[-2.000000]
G01 X[119.250000] Y[542.268214] Z[-2.000000]
G01 X[124.750000] Y[542.268214] Z[-2.000000]
G01 X[124.750000] Y[558.035357] Z[-2.000000]
G01 X[119.250000] Y[558.035357] Z[-2.000000]
G01 X[119.250000] Y[568.437500] Z[-2.000000]
G00 Z[5.000000]

(End cutting path id: path8016)


Il y a moyen d'améliorer encore la lisibilité et la vitesse d'interprétation, mais comme ce n'est pas la question je te laisse le loisir
 
Dernière édition:
J

JLuc69

Compagnon
D'autre part, le code avec toutes ces constantes qui ne servent à rien serait plus lisible en les supprimant, car par exemple:
G00 X[119.250000*#10+#6] Y[468.437500*#10+#7]
puisque #10 vaut 1
et
#6 vaut 0
et
#7 vaut 0
on a
G00 X[119.250000*1+0] Y[468.437500*1+0]
soit à écrire
G00 X[119.250000] Y[468.437500]

ce qui donnerait une fois épuré:
Oui mais justement, c'est l'interet de ces variables (car ce sont bien des variables). Elles permettent de définir une échelle sur XY, sur Z et un décalage possible sur XYZ
 
C

Castor24

Compagnon
Si ce sont des variables, où sont elles réaffectées ?
 
J

JLuc69

Compagnon
En début de programme !
Une constante est, par définition, constante. C'est à dire que tu ne peux pas changer sa valeur : Pi est une constante (3.14159...). Ici, tu peux leurs donner la valeur que tu veux, les réutiliser plus loin avec d'autres valeurs et/ou pour autre chose...
 
C

Castor24

Compagnon
Elles sont définies au début du programme, mais elle ne sont pas réaffectés.
Tu peux les redéfinir plus loin, dans une séquence, mais elles gardent leur valeur tout au long du déroulement du programme et tant qu'elles ne sont pas redéfinies. Elles restent donc constantes. Tu ne peux leur redonner une autre valeur par programme, sur une fonction ou une opération.

De plus tel que le bout de code est fait, les définir au début et les utiliser nuit à la lecture, puisque leur résolution n'apporte rien et pire ralenti le système.
 
H

Hubert86

Compagnon
Bien évidemment que ce sont des constantes, mais aussi des variables , si dans le programme je fais #1=#1+2 la constante change, et je suis d'accord pour ce cas précis ces constantes ne servent pas a grand chose, sinon alourdir le programme. Mais ce n'est pas toujours le cas. Tout dépend du Gcode de ta cnc, si tu utilise GRBL, ben ce programme ne fonctionnera pas, les constantes(variables) n'étant pas reconnues. Il Existe des addons pour inskape qui permetent de choisir le post processeur, et dans ce cas ton Gcode sera créé en fonction de ce post processeur (fanuc, mach3, grbl, linuxcnc et bien d'autre)
 
X

xaetva

Nouveau
Merci pour vos réponses.

J'ai regardé les postprocessors compatibles GRBL pour inkscape mais je vois pas. Vous avez pas un lien?

La seule recommandation que je vois est :
When creating G-code to use with GRBL, always choose the "Round all values to 4 digits" Post-processor in the "Preferences" tab! Without this option selected, codes will often exceed the 50- or 70-character-per-line limit present in GRBL, resulting in deformed shapes on the machine.

Je vais essayer cette option dans Gcodetools

thanks!!!
 
Dernière édition:
J

JLuc69

Compagnon
Et bien je vois qu'on est et qu'on restera sur un désaccord, tant pis
 
S

speedjf37

Compagnon
Si ce sont des variables, où sont elles réaffectées ?
Bonjour,

Une variable est par définition modifiable, le fait de ne la modifier qu'une fois ne change rien à son status !

Une constante n'est pas modifiable mais elle disparait souvent après la compilation ou le traitement du programme. (éventuellement sa valeur est encore présente).

Pour essayer de mettre tout le monde d'accord voici la définition dans LinuxCNC:

http://linuxcnc.org/docs/html/gcode/overview.html
The RS274/NGC language supports parameters - what in other programming languages would be called variables. There are several types of parameter of different purpose and appearance, each described in the following sections. The only value type supported by parameters is floating-point; there are no string, boolean or integer types in G-code like in other programming languages. However, logic expressions can be formulated with boolean operators ( AND, OR, XOR, and the comparison operators EQ,NE,GT,GE,LT,LE), and the MOD, ROUND, FUP and FIX operators support integer arithmetic.

Parameters differ in syntax, scope, behavior when not yet initialized, mode, persistence and intended use.

Syntax
There are three kinds of syntactic appearance:
  • numbered - #4711
  • named local - #<localvalue>
  • named global - #<_globalvalue>

JF
 
C

Castor24

Compagnon
speedjf37,

Je ne sais si tu programmes depuis longtemps et dans différents langage, mais les constantes sont affectables, que ce soit en C++, en sharp, en pascal ou même en VB etc...
Tu confonds avec les constantes system comme PI ou autre valeur utilisée par les IDE.


Par exemple en C++ qui est le langage qui a été utilisé pour développer l'IDE de G-code, on défini les constantes tel que:
#define MaConstante 12.5
#define ISC_TRUE 1
#define ISC_FALSE 0
etc...

Une variable sera déclaré avec son type, mais sans valeur stockée par exemple:
short version;
char sqldaid [8];

autre exemple en Pascal Object:

//déclaration de constante
Const
MAX_VALUE = 255;
MIN_VALUE = 1;
Month1 = "Janvier";

//déclaration de variable
VAR
iValue: integer;
nValue: float;
sChaine: PAnsiChar;

dans ces langages, on peu effectivement réaffecter le contenu d'une constante, comme l'indique Hubert86, de cette manière:
MAX_VALUE = MAX_VALUE + 1024.

Dans certain IDE, ont peu l'interdire ou l'autoriser, mais ça ne change rien au fait que ce soit des constantes.

Je ne vois d'ailleurs aucune variable de déclarée dans le bout de G-code soumis, j'ai regardé pas mal d'exemple sur le net et seuls les paramètres semblent être utilisés en variables.

L'avantage des constantes par rapport aux variables, c'est qu'elles ont une étendue dans toutes l'unité dans laquelle elles sont déclarées. On peut aussi en déclarer au niveau programme dans certain IDE.
Les variables, peuvent elles aussi avoir des portées globales, mais utilises beaucoup plus de mémoire pour stocker leur valeur, ce qui fait que généralement, on fait en sorte de ne les déclarer et utiliser que dans les fonctions et procédures locales, pour ne consommer de la mémoire que le temps d'exécution de ces proc. ou func.

Voilà, si tu as besoin d'autres éclaircissement sur la programmation, n’hésite pas
 
S

speedjf37

Compagnon
Je ne sais si tu programmes depuis longtemps et dans différents langage, mais les constantes sont affectables, que ce soit en C++, en sharp, en pascal ou même en VB etc...
Tu confonds avec les constantes system comme PI ou autre valeur utilisée par les IDE.


Par exemple en C++ qui est le langage qui a été utilisé pour développer l'IDE de G-code, on défini les constantes tel que:
#define MaConstante 12.5
#define ISC_TRUE 1
#define ISC_FALSE 0
etc...

j'ai commencé l'info hier ! ( 1984 )

le #define en 'C' est une substitution de symbole destinée au préprocesseur !

http://195.83.155.159/C_facile/co/ch3_p2_2.html

edit ma référence:
https://fr.wikipedia.org/wiki/The_C_Programming_Language

Le préprocesseur C exécute des directives contenues dans les fichiers sources. Il les reconnaît au fait qu'elles sont en début de ligne, et commencent toutes avec le caractère croisillon #. Parmi les directives les plus courantes, il y a :


  • #include pour l'inclusion ;
  • #define pour la définition de macro ;
  • #if pour commencer la compilation conditionnelle ;
  • #ifdef et ifndef, équivalents à #if defined et #if ! defined;
  • #endif pour clore la compilation conditionnelle.

Outre l'exécution des directives, le préprocesseur remplace les commentaires par un espace blanc, et procède au remplacement des macros. Pour le reste, le code source est transmis tel quel au compilateur pour la phase suivante. Il faut toutefois que chaque #include dans le code source soit récursivement remplacé par le code source inclus. Ainsi, le compilateur reçoit un seul source du préprocesseur, qui constitue l'unité de compilation.



JF
 
J

JLuc69

Compagnon
Je crois que, là, vous allez chercher beaucoup trop loin pour un code juste interprété par une CN.
Aprés, que vous appeliez ça constante, variable on paramètre (ces deux derniers sont les noms utilisés dans les bouquins de programmation CNC, mais jamais le premier) on s'en fout, l'important étant juste de comprendre en quoi on peut les utiliser et en quoi ils/elles peuvent nous simplifier la tâche fastidieuse de programmer, puis reprogrammer la même chose à coté ou refaire la même pièce un peu plus grosse ou un peu plus petite.

Si vous allez sur mon site, il y a quelques exemples concret de leurs utilisations
 
D

dh42

Compagnon
Salut,

Du point de vue de Mach3, les #xx sont bien des variables et non des constantes et elles ne sont pas seulement accessibles via le Gcode, mais aussi via le Vb et à la volée. Ce sont des variables pour la simple raison que leur valeur peut être modifiée par programmation contrairement au constantes qui ne sont que des "textes de remplacement" pour la compilation (et il n'y en a pas sur Mach3)

L'état des variables peut être contrôlé directement depuis l'UI de Mach3 (Menu operator/Gcode var monitor) ; par exemple si je tape:

#1 = 10 dans l’interface MDI, j'obtiendrais 10 dans la ligne 1 de la fenêtre des variables.

variable_mach3.jpg


Elle sont aussi utilisées pour créer l'équivalent d'un passage/retour d'argument entre du Gcode et du Visual basic (une macro en VB).

Un exemple permettant de simuler un If/Then/Else avec Mach3 en passant les infos via les variables 500 et 502

Le Gcode:

#500 = 5 (définition d'une variable n° 500 et affectation d'une valeur)
O20 (routine n°20)

G code routine 1

#500 = #500-1 (décrémentation de la variable 500)
M500 (appel de la routine en VB)
M98 P#502 (502 contient la réponse de la routine en VB ; c.a.d le n° de routine à utiliser 20 ou 30)
O30 (routine n°30)

G code routine 2

le fichier en VB doit avoir ce nom "M500.m1s", il doit se trouver dans le dossier de profil de la machine utilisée

Le fichier en VB: ("M500.m1s")

Sub main ()
a = GetVar (500) ' lire la valeur de la variable 500 du Gcode et l'affecter à "a"
If a > 0 Then GoTo set20
SetVar(502,30) 'affecter la valeur 30 à la variable 502 du Gcode si "a" est <= à 0
GoTo set30 'sauter à set30:
set20:
SetVar(502,20) 'affecter la valeur 20 à la variable 502 du Gcode si "a" est > à 0
set30:
End If
End Sub

Tu ne peux leur redonner une autre valeur par programme, sur une fonction ou une opération.

Si, bien sûr qu'on peux modifier leur valeur par programme. Par contre ce sont toutes des variables globales, donc valables dans toutes les éventuelles sous routines (donc dans le programme entier en fait), d'autre part, elles sont également persistantes même une fois le programme terminé et ne sont remises à 0 qu'au lancement de Mach3. (ou par programme)

++
David
 
Dernière édition:
X

xaetva

Nouveau
Merci pour vos réponses.

J'ai regardé les postprocessors compatibles GRBL pour inkscape mais je vois pas. Vous avez pas un lien?

La seule recommandation que je vois est :
When creating G-code to use with GRBL, always choose the "Round all values to 4 digits" Post-processor in the "Preferences" tab! Without this option selected, codes will often exceed the 50- or 70-character-per-line limit present in GRBL, resulting in deformed shapes on the machine.

Je vais essayer cette option dans Gcodetools

thanks!!!
 
D

dh42

Compagnon
Salut,

Je ne connais pas InkScape, mais sur CamBam le PP pour GRBL sort un GCode très simple car GRBL ne reconnais pas autant de commandes que la plupart des systèmes de pilotage ; de plus suivant la version de GRBL qui se trouve dans ton contrôleur, ça peut aussi poser problème.

Ici, les commandes reconnues par la version 1.1 (la dernière je pense)
https://github.com/gnea/grbl/wiki/Grbl-v1.1-Commands

Je ne vois nul part que GRBL est capable de reconnaitre les variables # ... peut être à tu choisis un PP pour Mach3 au lieu de GRBL ?

++
David

Edit: je viens d'essayer ton GCode du 1ier message, et il fonctionne parfaitement sur Mach3, donc à mon avis, c'est bien une erreur de choix du post processeur si ta machine GRBL ne le comprends pas, le GCode, lui, est juste ; ça fait une sorte de créneau comme pour ce style de boites.
http://www.atelier-des-fougeres.fr/Cambam/Aide/Plugins/BoxAuto_FR.html
 
Dernière édition:

Sujets similaires

G
Réponses
1
Affichages
1 300
Greg de Nîmes
G
lolo
Réponses
1
Affichages
836
lolo
A
Réponses
8
Affichages
1 997
Albinos38150
A
N
Réponses
5
Affichages
636
Nabduf
N
V
Réponses
66
Affichages
6 875
Régule
Régule
U
Réponses
85
Affichages
7 215
Hubert86
H
T
Réponses
40
Affichages
4 081
Thrite
T
A
Réponses
5
Affichages
1 730
Antoine Chapon
A
Haut