CNCjs newbie questions

The CNCjs User Guide ( lacks a lot of detail, so I thought I’d ask my questions here.

Why does the M6 tool change notification not show which tool to change to (like Carbide Motion does)? The gcode shows “M6 T201”.

The Remaining Time in the G-code widget is very sporadic and does not count down steadily. Does this time not mean what I think it means? Where can I find an estimate of how long my cut will take?

1 Like

You are more likely to get answers to those questions on the CNCjs site itself (, but here are my guesses:

  • I suppose the tool number is normally not very useful as a hint, because other CAM software typically only put a tool index there, that has no direct meaning (i.e. the same tool could be indexed “1” for someone, and “2” for someone else). While when using the C3D ecosystem (CC/CM/C3D endmills), it makes more sense to refer to the tool by their usual reference/“callname” (e.g. “201”)
  • it’s hard to have a very regular time counting down, because the info CNCjs (or any other G-code sender) has access to are the G-code commands in the loaded file, and while it can determine how long each particular move will take, it cannot (easily) know about the time the rapids will take, since the feedrate for rapid is set by GRBL parameters $110/111/$112 independently of the loaded file.

I tend to use an online G-code viewer that will give me an estimate. I use this one for example (but again, it doesn’t know about the specific rapid feedrate values on my machine)

1 Like

Well, if we wanted to be seriously pedantic, in standard G-code T201 actually means “make the automatic tool changer select tool from carousel slot 201 and prepare it for tool change” while M6 means “change selected tool now”. So, strictly speaking, C3D using T with a tool name is a mis-use of the command, which is probably why CNCjs can’t follow that convention.


So Carbide Motion has this advantage over CNCjs then? i.e. being able to provide an relatively accurate time remaining. It seems like all the information you need is there, CNCjs just needs to crunch the numbers, right?

Are you finding it to be really inaccurate?

Are you using a tool change macro? You can display the tool in the console. Let me know what macro you’re using, and I can help. I’ve never had a reason as I always know what tools I’m using, and on jobs with many tools I just name the files in a helpful way.

I don’t have any macros running during the cut (is that even possible?). The “remaining time” value in the G-code widget will count down at a non-steady pace, pause, increase, and is just overall sporadic such that it seems meaningless to even show.

How is Carbide Motion able to provide an intuitive Time Remaining value but CNCjs cannot seem to?

I should’ve been more clear. The macro question was related to the tool change. I can get a tool number to show, but only in the console.
The time issue to me seems like the same thing you’ll get with Google maps. It makes assumptions and then adjusts. I would never set my watch by it. I’ve never compared the expected to actual.
Carbide Motion services one controller… Maybe that helps the calculations?

I’m discovering more questions as I continue playing around with CNCjs. Let me know if it’s more appropriate to create new threads for each question, or to just add them here.

Why do my work positions zero to +/- 0.012 and never 0?
Screen Shot 2020-11-10 at 5.09.03 PM

Is it common for the CNCjs workflow to prompt and show the user what tool and RPM to use? (assuming I have a router and not spindle) Or should the user just know, without explicit notifications? It would be nicer for these prompts to show in a UI window, but the console is fine too.

Your zero was set in a location that is less than a step away.


That’s how we do it.

It’s been on the todo list for a while.

What macro are you using? I can tell you what to change.


So far I’ve only used your C3D_3axis_probe macro, a modified version of that just for the Z-axis, and made my own “move router out of the way” macro (G53 Z-3; G53 X-650 Y-5).

I’m not sure yet if/when I would need your Initial & New Tool macros.

1 Like

Any time you want to change tools and maintain an accurate Z offset.

I just re-run my Z-probe macro during tool changes. Is there any significant difference between that and your macro?

Essentially it’s a precision Z-probe, but it will move to a predefined area, for when you carve your Z-probing location away, to do the probe. Also, although Z0 is adjusted, it really is about comparing the endmill to the previous one. It was the BitSetter before there was the BitSetter (also works with the BitSetter).


I understand now, thanks!

1 Like

Another question since it falls under the topic:

Is there a way for me to view the current/last gcode command that was sent?

My runs always stop right before the end without any prompts, forcing me to manually Pause then Stop the run in order to finish it. It would be nice to see which command it seems to hang at.

The job finishes, but CNCjs hangs?

You can see the number of lines sent. That’ll give you a good range.

It hangs in this state. Note:

  • The Pause button is active
  • The status is Idle
  • 93/93 sent, but 92/93 received

At this point I always have to Pause then Stop the run.

Here is the .nc file: (1.4 KB)

I suspect this is because CarbideCopper includes a final “M30” command in the G-code, that’s the code for “exchange pallet shuttles and end the program”, while the G-code files generated by e.g. Carbide Create have a final “M2” (end the program) command instead, and maybe CNCjs reacts differently (do you get any pop-up window/notification from CNCjs at the end?)

You could edit that file, replace the final M30 by M2 (harmless), and see if that works better for you. If it does, then we could submit a request for modifying carbide copper post-processor (unless there was a good reason for using that M30 command, that I may not be aware of)