Generating G Code from MDI history log
29 Mar 2012 11:12 #18846
by ArcEye
Generating G Code from MDI history log was created by ArcEye
Hi,
If like me, you spent a long time using manual mills and lathes before going to CNC, your work practices probably reflect this.
I tend to make simple parts just using MDI. Commands replacing hand wheel movements.
This is often far more time effective than writing a program.
The effectiveness reduces when you have to repeat sequences.
For instance recently, when drilling and tapping a series of unequally spaced holes,
first using centre drill, then first diameter drill bit, then second diameter bit then finally tapping clearance bit.
This does not easily lend itself to a G81 cycle.
I wrote this script to generate a program for the successive drilling stages from the commands I had entered for the first stage. You could do the same cutting and pasting directly from the MDI history, but this saves a lot of time.
To use, prior to commencement clear the MDI history (Ctrl M)
Then just enter the commands necessary for the first run through.
Then in a terminal, $ mdi2ngc /path/filename.ngc which will produce a .ngc file
If necessary edit the file to change values
(For instance I changed all lines G01 Z-5 F12 for G01 Z-20 F12 after centre drilling, so that the drill now broke through)
Then load the file and continue.
Does not do anything new, just makes life easier, adapt and enjoy.
If like me, you spent a long time using manual mills and lathes before going to CNC, your work practices probably reflect this.
I tend to make simple parts just using MDI. Commands replacing hand wheel movements.
This is often far more time effective than writing a program.
The effectiveness reduces when you have to repeat sequences.
For instance recently, when drilling and tapping a series of unequally spaced holes,
first using centre drill, then first diameter drill bit, then second diameter bit then finally tapping clearance bit.
This does not easily lend itself to a G81 cycle.
I wrote this script to generate a program for the successive drilling stages from the commands I had entered for the first stage. You could do the same cutting and pasting directly from the MDI history, but this saves a lot of time.
To use, prior to commencement clear the MDI history (Ctrl M)
Then just enter the commands necessary for the first run through.
Then in a terminal, $ mdi2ngc /path/filename.ngc which will produce a .ngc file
If necessary edit the file to change values
(For instance I changed all lines G01 Z-5 F12 for G01 Z-20 F12 after centre drilling, so that the drill now broke through)
Then load the file and continue.
#!/bin/bash
if [ ! $# -ge 1 ]; then
echo "Usage: mdi2ngc [output file]"
exit 1
fi
# edit this to reflect the header block you want to insert
header="G80 G90 G94 G21 G17 G40 G8"
# edit this to reflect the footer block you want to insert
footer="M5 M9 M2 M30"
echo $header > $1
for LINE in `cat ~/.axis_mdi_history`; do
echo $LINE >> $1
done
echo $footer >> $1
exit 0
Does not do anything new, just makes life easier, adapt and enjoy.
Please Log in or Create an account to join the conversation.
29 Mar 2012 12:54 #18847
by BigJohnT
Replied by BigJohnT on topic Re:Generating G Code from MDI history log
ArcEye,
That's a pretty neat way to do that. It makes me wonder if a little code changing on my counterbore g code generator would be a slick way to generate multi operations on a series of holes that are not grid like.
wiki.linuxcnc.org/cgi-bin/wiki.pl?Simple...Counterbore_Software
John
That's a pretty neat way to do that. It makes me wonder if a little code changing on my counterbore g code generator would be a slick way to generate multi operations on a series of holes that are not grid like.
wiki.linuxcnc.org/cgi-bin/wiki.pl?Simple...Counterbore_Software
John
Please Log in or Create an account to join the conversation.
29 Mar 2012 16:39 - 29 Mar 2012 16:40 #18851
by ArcEye
Replied by ArcEye on topic Re:Generating G Code from MDI history log
Hi John
Yeah it could be a good way of doing it.
This job was making a reinforcing plate for an existing part, with hole centres transfer punched through.
I had to visually align a 60 degree centre with each centre pop to get the co-ordinates exact.
If there had not been so many holes, I could have just 'touched off' each hole in a different co-ordinate system as I have done in the past, which makes things ridiculously easy to code eg.
G54 G0 X0 YO
DRILL
G55 G0 X0 Y0
DRILL
G56 G0 X0 Y0
DRILL
..etc etc
I like 'one offs' , but they are real time consumers.
regards
Yeah it could be a good way of doing it.
This job was making a reinforcing plate for an existing part, with hole centres transfer punched through.
I had to visually align a 60 degree centre with each centre pop to get the co-ordinates exact.
If there had not been so many holes, I could have just 'touched off' each hole in a different co-ordinate system as I have done in the past, which makes things ridiculously easy to code eg.
G54 G0 X0 YO
DRILL
G55 G0 X0 Y0
DRILL
G56 G0 X0 Y0
DRILL
..etc etc
I like 'one offs' , but they are real time consumers.
regards
Last edit: 29 Mar 2012 16:40 by ArcEye.
Please Log in or Create an account to join the conversation.
29 Mar 2012 18:44 #18856
by BigJohnT
Replied by BigJohnT on topic Re:Generating G Code from MDI history log
Yea, about all I do is one offs. So if you had a way to jog over to each position then store that into the table used by the counterbore program somehow then define the ops to do at each position... that would be cool.
John
John
Please Log in or Create an account to join the conversation.
30 Mar 2012 02:02 - 30 Mar 2012 02:37 #18863
by dgarrett
Replied by dgarrett on topic Re:Generating G Code from MDI history log
An example of how to do something similar with axis, ngcgui, and a simple subroutine:
0) specify a subroutine in the ini file or load it from a "Custom"
tab (example attached for position.ngc)
1) Navigate to the position subroutine tab page and
enter "howmany" positions, and other routine entry values
2) Jog to the first position (having a pendant is useful)
3) On the "position" tab page:
put keyboard cursor in the x1 entry box
type "x" (enters current x position)
tab to y1 entry box
type ":y" (enters current y position)
(note: typing x,y,z,a,b,c,d enters the current coordinate value,
d means 2*x=current_diameter (eg for a lathe))
repeat 2) and 3) for remaining positions x2,y2, etc.
4) "Create Feature"
5) repeat 2-4 for additional features if needed
6a) "Finalize"
run the generated program
OR
6b) type Ctrl-a (toggle autosend)
"MakeFile"
save file with a unique name in a location of your choice to run later
The generated program will move to each position and pause (m0) I use this with a quill to manually drill holes at the positions.
With simple modifications, you could modify the subroutine to do anything else instead of pausing, like calling another subroutine.
0) specify a subroutine in the ini file or load it from a "Custom"
tab (example attached for position.ngc)
1) Navigate to the position subroutine tab page and
enter "howmany" positions, and other routine entry values
2) Jog to the first position (having a pendant is useful)
3) On the "position" tab page:
put keyboard cursor in the x1 entry box
type "x" (enters current x position)
tab to y1 entry box
type ":y" (enters current y position)
(note: typing x,y,z,a,b,c,d enters the current coordinate value,
d means 2*x=current_diameter (eg for a lathe))
repeat 2) and 3) for remaining positions x2,y2, etc.
4) "Create Feature"
5) repeat 2-4 for additional features if needed
6a) "Finalize"
run the generated program
OR
6b) type Ctrl-a (toggle autosend)
"MakeFile"
save file with a unique name in a location of your choice to run later
The generated program will move to each position and pause (m0) I use this with a quill to manually drill holes at the positions.
With simple modifications, you could modify the subroutine to do anything else instead of pausing, like calling another subroutine.
Last edit: 30 Mar 2012 02:37 by dgarrett. Reason: see next post for correct position.ngc file
Please Log in or Create an account to join the conversation.
30 Mar 2012 02:36 #18864
by dgarrett
Replied by dgarrett on topic Re:Generating G Code from MDI history log
oops, attached is the correct file for position.ngc
Notes, as written:
1) requires linuxcnc2.5
2) uses nc_files/ngcgui_lib/utilitysubs/move.ngcjj
3) uses nc_files/ngcgui_lib/mfiles/M110
4) scaling and rotating the points about the origin are simple modifications
Notes, as written:
1) requires linuxcnc2.5
2) uses nc_files/ngcgui_lib/utilitysubs/move.ngcjj
3) uses nc_files/ngcgui_lib/mfiles/M110
4) scaling and rotating the points about the origin are simple modifications
Please Log in or Create an account to join the conversation.
30 Mar 2012 09:09 #18869
by ArcEye
Replied by ArcEye on topic Re:Generating G Code from MDI history log
Nice one Dewey,
The #<x1> = #<_move:x> threw me at first until I realised that #<_move:x> was a global declared in move.ngc and not a referencing notation I was unaware of !!
I think you might have prompted a 'build a better mousetrap' competition.
I'll have to give this some serious thought.
regards
The #<x1> = #<_move:x> threw me at first until I realised that #<_move:x> was a global declared in move.ngc and not a referencing notation I was unaware of !!
I think you might have prompted a 'build a better mousetrap' competition.
I'll have to give this some serious thought.
regards
Please Log in or Create an account to join the conversation.
30 Mar 2012 10:50 #18871
by Rick G
I will try that this weekend.
Thanks for sharing.
Rick G
Replied by Rick G on topic Re:Generating G Code from MDI history log
O.K. Dewey that is cool, everytime I turn around that ngcgui makes things faster and easier!An example of how to do something similar with axis, ngcgui, and a simple subroutine:
I will try that this weekend.
Thanks for sharing.
Rick G
Please Log in or Create an account to join the conversation.
30 Mar 2012 12:28 #18872
by BigJohnT
Replied by BigJohnT on topic Re:Generating G Code from MDI history log
Dewey, That is Neat! I can't wait to get my BP converted to EMC...
John
John
Please Log in or Create an account to join the conversation.
30 Mar 2012 14:27 #18875
by dgarrett
Replied by dgarrett on topic Re:Generating G Code from MDI history log
"The #<x1> = #<_move:x> threw me at first until I realised that #<_move:x> was a global declared in move.ngc and not a referencing notation I was unaware of !!"
Yes, the general pattern for returning values from subroutines called by ngcgui subfiles is to return them as globals with a colon somewhere in the name. It is convenient to format the names as:
#<_nameofsubroutine:item_value>
as in:
#<_move:x>
It is good practice to immediately localize the return value, as in:
#<x1>=#<_move:x>
The only way to return multiple items from a subroutine is with globals. (I think the git-master version supports a return statement that can return a single item).
Using the colon in the name is important, it prevents ngcgui from interpreting the variable as a user input -- using globals as inputs to ngcgui is deprecated.
Yes, the general pattern for returning values from subroutines called by ngcgui subfiles is to return them as globals with a colon somewhere in the name. It is convenient to format the names as:
#<_nameofsubroutine:item_value>
as in:
#<_move:x>
It is good practice to immediately localize the return value, as in:
#<x1>=#<_move:x>
The only way to return multiple items from a subroutine is with globals. (I think the git-master version supports a return statement that can return a single item).
Using the colon in the name is important, it prevents ngcgui from interpreting the variable as a user input -- using globals as inputs to ngcgui is deprecated.
Please Log in or Create an account to join the conversation.
Time to create page: 0.097 seconds