Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions docs/src/gcode/g-code.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -1485,8 +1485,10 @@ G43 <H->

'G43 Hn' uses the offset for tool n.

The active tool length compensation values are stored in the numbered
parameters '5401-5409'.
The tool length compensation values actually applied to motion are stored
in the numbered parameters '5081-5089'. The numbered parameters
'5401-5409' instead hold the loaded tool's stored offset, refreshed on tool
change ('M6') and 'G10 L1'/'L10'/'L11'.

[NOTE]
'G43 H0' is a little special. Its behavior is different on random
Expand Down
12 changes: 10 additions & 2 deletions docs/src/gcode/overview.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,11 @@ example '##2' means the value of the parameter whose index is the
which the G38 took place. Volatile.
* '5070' - <<gcode:g38,G38>> probe result: 1 if success, 0 if probe
failed to close. Used with G38.3 and G38.5. Volatile.
* '5081-5089' - Tool length offset currently applied to motion for X, Y,
Z, A, B, C, U, V & W, in the current program units. Set by
`G43`/`G43.1`/`G43.2`, and 0 when `G49` is in effect. These report the
offset actually in effect, which differs from the loaded tool's stored
offset in '5401-5409'. Volatile.
* '5161-5169' - "G28" Home for X, Y, Z, A, B, C, U, V & W. Persistent.
* '5181-5189' - "G30" Home for X, Y, Z, A, B, C, U, V & W. Persistent.
* '5210' - 1 if "G52" or "G92" offset is currently applied, 0
Expand Down Expand Up @@ -344,8 +349,11 @@ example '##2' means the value of the parameter whose index is the
Persistent.
* '5399' - Result of M66 - Check or wait for input. Volatile.
* '5400' - Tool Number. Volatile.
* '5401-5409' - Currently applied tool length offset for X, Y, Z, A, B, C,
U, V & W. Set by `G43`/`G43.1`/`G43.2`, cleared by `G49`. Volatile.
* '5401-5409' - The loaded tool's stored offset for X, Y, Z, A, B, C, U, V
& W. Refreshed from the tool table on tool change (`M6`), at startup, and
by `G10 L1`/`L10`/`L11`. These are not affected by `G43`/`G43.1`/`G43.2`
or `G49`; for the offset actually applied to motion see '5081-5089'.
Volatile.
* '5410' - Tool Diameter. Volatile.
* '5411' - Tool Front Angle. Volatile.
* '5412' - Tool Back Angle. Volatile.
Expand Down
46 changes: 29 additions & 17 deletions src/emc/rs274ngc/interp_convert.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4149,9 +4149,19 @@ int Interp::convert_setup_tool(block_pointer block, setup_pointer settings) {
}
}

// #5401-#5409 reflect the applied tool length offset (G43-family).
// G10 L1/L10/L11 modify the tool table but do not apply offsets to
// motion, so do not update them here. See #2994.
// #5401-#5409 hold the loaded tool's stored offset, refreshed here so
// G10 L1/L10/L11 edits to the loaded tool are reflected. The offset
// actually applied to motion (G43/G43.1/G43.2) is reported by
// #5081-#5089.
settings->parameters[5401] = settings->tool_table[0].offset.tran.x;
settings->parameters[5402] = settings->tool_table[0].offset.tran.y;
settings->parameters[5403] = settings->tool_table[0].offset.tran.z;
settings->parameters[5404] = settings->tool_table[0].offset.a;
settings->parameters[5405] = settings->tool_table[0].offset.b;
settings->parameters[5406] = settings->tool_table[0].offset.c;
settings->parameters[5407] = settings->tool_table[0].offset.u;
settings->parameters[5408] = settings->tool_table[0].offset.v;
settings->parameters[5409] = settings->tool_table[0].offset.w;
settings->parameters[5410] = settings->tool_table[0].diameter;
settings->parameters[5411] = settings->tool_table[0].frontangle;
settings->parameters[5412] = settings->tool_table[0].backangle;
Expand Down Expand Up @@ -5786,21 +5796,23 @@ int Interp::convert_tool_length_offset(int g_code, //!< g_code being execu

settings->tool_offset = tool_offset;

// Update parameters #5401-#5409 to reflect the actually applied tool
// length offset (covers G43Hn with n != loaded tool, G43.1 dynamic
// offsets, and G43.2 additive offsets). Without this, params lag the
// applied offset and only refresh on M6 / G10 L1. See issue #2994.
// Update parameters #5081-#5089 to reflect the tool length offset
// actually applied to motion (covers G43, G43Hn with n != loaded tool,
// G43.1 dynamic offsets, G43.2 additive offsets, and G49 which zeroes
// them). This mirrors the Fanuc #5081-#5088 semantic. #5401-#5409, by
// contrast, track the loaded tool's stored offset and refresh on M6 /
// G10 L1. See issue #2994.
// tool_offset here is in program units; params follow the user-unit
// convention used elsewhere when populating #5401-#5409.
settings->parameters[5401] = PROGRAM_TO_USER_LEN(tool_offset.tran.x);
settings->parameters[5402] = PROGRAM_TO_USER_LEN(tool_offset.tran.y);
settings->parameters[5403] = PROGRAM_TO_USER_LEN(tool_offset.tran.z);
settings->parameters[5404] = PROGRAM_TO_USER_ANG(tool_offset.a);
settings->parameters[5405] = PROGRAM_TO_USER_ANG(tool_offset.b);
settings->parameters[5406] = PROGRAM_TO_USER_ANG(tool_offset.c);
settings->parameters[5407] = PROGRAM_TO_USER_LEN(tool_offset.u);
settings->parameters[5408] = PROGRAM_TO_USER_LEN(tool_offset.v);
settings->parameters[5409] = PROGRAM_TO_USER_LEN(tool_offset.w);
// convention used elsewhere.
settings->parameters[5081] = PROGRAM_TO_USER_LEN(tool_offset.tran.x);
settings->parameters[5082] = PROGRAM_TO_USER_LEN(tool_offset.tran.y);
settings->parameters[5083] = PROGRAM_TO_USER_LEN(tool_offset.tran.z);
settings->parameters[5084] = PROGRAM_TO_USER_ANG(tool_offset.a);
settings->parameters[5085] = PROGRAM_TO_USER_ANG(tool_offset.b);
settings->parameters[5086] = PROGRAM_TO_USER_ANG(tool_offset.c);
settings->parameters[5087] = PROGRAM_TO_USER_LEN(tool_offset.u);
settings->parameters[5088] = PROGRAM_TO_USER_LEN(tool_offset.v);
settings->parameters[5089] = PROGRAM_TO_USER_LEN(tool_offset.w);

return INTERP_OK;
}
Expand Down
12 changes: 11 additions & 1 deletion src/emc/rs274ngc/interp_parameter_def.hh
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,16 @@ enum InterpParameterIndex {
G38_W,
// 5070 - G38 probe result: 1 if success, 0 if probe failed to close. Used with G38.3 and G38.5. Volatile.
G38_TRIPPED=5070,
// 5081-5089 - Tool length offset actually applied to motion for X, Y, Z, A, B, C, U, V & W (Fanuc #5081-#5088 semantic). Set by G43/G43.1/G43.2, cleared by G49. Volatile.
APPLIED_TOOL_OFFSET_X=5081,
APPLIED_TOOL_OFFSET_Y,
APPLIED_TOOL_OFFSET_Z,
APPLIED_TOOL_OFFSET_A,
APPLIED_TOOL_OFFSET_B,
APPLIED_TOOL_OFFSET_C,
APPLIED_TOOL_OFFSET_U,
APPLIED_TOOL_OFFSET_V,
APPLIED_TOOL_OFFSET_W,
// 5161-5169 - "G28" Home for X, Y, Z, A, B, C, U, V & W. Persistent.
G28_X=5161,
G28_Y,
Expand Down Expand Up @@ -167,7 +177,7 @@ enum InterpParameterIndex {
// 5399 - Result of M66 - Check or wait for input. Volatile.
M66_RESULT=5399,
// 5400 - Tool Number. Volatile.
// 5401-5409 - Tool Offsets for X, Y, Z, A, B, C, U, V & W. Volatile.
// 5401-5409 - Loaded tool's stored offset for X, Y, Z, A, B, C, U, V & W. Set on tool change (M6), startup, and G10 L1/L10/L11. See #5081-#5089 for the offset actually applied to motion. Volatile.
TOOL_NUMBER=5400,
TOOL_OFFSET_X=5401,
TOOL_OFFSET_Y,
Expand Down
41 changes: 33 additions & 8 deletions src/emc/rs274ngc/rs274ngc_pre.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2531,9 +2531,18 @@ int Interp::init_tool_parameters()
if (_setup.random_toolchanger) {
// random_toolchanger: tool at startup expected
_setup.parameters[5400] = _setup.tool_table[0].toolno;
// #5401-#5409 reflect the applied tool length offset (Fanuc #5081-#5088
// semantic). Written only by G43/G43.1/G43.2/G49. At startup no G43
// has been issued, so leave them at their default zero. See #2994.
// #5401-#5409 hold the loaded tool's stored offset, applied on tool
// change (M6), on startup, and by G10 L1/L10/L11. The offset actually
// in effect on motion (G43/G43.1/G43.2) is reported by #5081-#5089.
_setup.parameters[5401] = _setup.tool_table[0].offset.tran.x;
_setup.parameters[5402] = _setup.tool_table[0].offset.tran.y;
_setup.parameters[5403] = _setup.tool_table[0].offset.tran.z;
_setup.parameters[5404] = _setup.tool_table[0].offset.a;
_setup.parameters[5405] = _setup.tool_table[0].offset.b;
_setup.parameters[5406] = _setup.tool_table[0].offset.c;
_setup.parameters[5407] = _setup.tool_table[0].offset.u;
_setup.parameters[5408] = _setup.tool_table[0].offset.v;
_setup.parameters[5409] = _setup.tool_table[0].offset.w;
_setup.parameters[5410] = _setup.tool_table[0].diameter;
_setup.parameters[5411] = _setup.tool_table[0].frontangle;
_setup.parameters[5412] = _setup.tool_table[0].backangle;
Expand All @@ -2550,8 +2559,15 @@ int Interp::init_tool_parameters()
int Interp::default_tool_parameters()
{
_setup.parameters[5400] = 0; // toolno
// #5401-#5409 reflect the applied tool length offset (G43-family).
// Not touched here; managed by convert_tool_length_offset. See #2994.
_setup.parameters[5401] = 0; // x offset
_setup.parameters[5402] = 0; // y offset RESERVED
_setup.parameters[5403] = 0; // z offset
_setup.parameters[5404] = 0; // a offset RESERVED
_setup.parameters[5405] = 0; // b offset RESERVED
_setup.parameters[5406] = 0; // c offset RESERVED
_setup.parameters[5407] = 0; // u offset RESERVED
_setup.parameters[5408] = 0; // v offset RESERVED
_setup.parameters[5409] = 0; // w offset RESERVED
_setup.parameters[5410] = 0; // diameter
_setup.parameters[5411] = 0; // frontangle
_setup.parameters[5412] = 0; // backangle
Expand All @@ -2569,9 +2585,18 @@ int Interp::set_tool_parameters()
return 0;
}
_setup.parameters[5400] = _setup.tool_table[0].toolno;
// #5401-#5409 reflect the applied tool length offset (G43-family) and
// are deliberately not updated by M6: M6 changes the loaded tool but
// does not by itself apply its offset to motion. See #2994.
// #5401-#5409 hold the loaded tool's stored offset, refreshed on tool
// change (M6). The offset actually applied to motion (G43/G43.1/G43.2)
// is reported by #5081-#5089.
_setup.parameters[5401] = _setup.tool_table[0].offset.tran.x;
_setup.parameters[5402] = _setup.tool_table[0].offset.tran.y;
_setup.parameters[5403] = _setup.tool_table[0].offset.tran.z;
_setup.parameters[5404] = _setup.tool_table[0].offset.a;
_setup.parameters[5405] = _setup.tool_table[0].offset.b;
_setup.parameters[5406] = _setup.tool_table[0].offset.c;
_setup.parameters[5407] = _setup.tool_table[0].offset.u;
_setup.parameters[5408] = _setup.tool_table[0].offset.v;
_setup.parameters[5409] = _setup.tool_table[0].offset.w;
_setup.parameters[5410] = _setup.tool_table[0].diameter;
_setup.parameters[5411] = _setup.tool_table[0].frontangle;
_setup.parameters[5412] = _setup.tool_table[0].backangle;
Expand Down
Loading