Bug Fix: Switching extruder tool change leaves Z in wrong position
The tool_change function saves the current_position to the destination
array soon after starting. Later in the switching extruder section, the
destination array is modified when moving the Z axis up & down. A later
section of tool_change moves the head back to the “original location”
using the destination array. This later section assumes that the
destination array hasn’t been modified.
The fix is to save the destination Z position and then restore it after
the Z movements have completed.
Going back to using the current_position array for the switching
extruder Z axis moves (and leaving the destination array untouched)
doesn’t fix the problem.
This bug was introduced by the “Make tool_change kinematic compatible”
commit # 847429eff4
which was merged on 10
Oct 2016 as part of PR 4982.
This bug was discovered in Issue 5966.
This commit is contained in:
parent
51353f8fea
commit
685ed5393a
@ -7385,7 +7385,7 @@ inline void gcode_M503() {
|
|||||||
if (nozzle_timed_out)
|
if (nozzle_timed_out)
|
||||||
lcd_filament_change_show_message(FILAMENT_CHANGE_MESSAGE_CLICK_TO_HEAT_NOZZLE);
|
lcd_filament_change_show_message(FILAMENT_CHANGE_MESSAGE_CLICK_TO_HEAT_NOZZLE);
|
||||||
|
|
||||||
#if HAS_BUZZER
|
#if HAS_BUZZER
|
||||||
filament_change_beep();
|
filament_change_beep();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -7445,7 +7445,7 @@ inline void gcode_M503() {
|
|||||||
stepper.synchronize();
|
stepper.synchronize();
|
||||||
|
|
||||||
#if defined(FILAMENT_CHANGE_EXTRUDE_LENGTH) && FILAMENT_CHANGE_EXTRUDE_LENGTH > 0
|
#if defined(FILAMENT_CHANGE_EXTRUDE_LENGTH) && FILAMENT_CHANGE_EXTRUDE_LENGTH > 0
|
||||||
|
|
||||||
do {
|
do {
|
||||||
// "Wait for filament extrude"
|
// "Wait for filament extrude"
|
||||||
lcd_filament_change_show_message(FILAMENT_CHANGE_MESSAGE_EXTRUDE);
|
lcd_filament_change_show_message(FILAMENT_CHANGE_MESSAGE_EXTRUDE);
|
||||||
@ -8033,6 +8033,7 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
|
|||||||
z_raise = 0.3 + (z_diff > 0.0 ? z_diff : 0.0);
|
z_raise = 0.3 + (z_diff > 0.0 ? z_diff : 0.0);
|
||||||
|
|
||||||
// Always raise by some amount (destination copied from current_position earlier)
|
// Always raise by some amount (destination copied from current_position earlier)
|
||||||
|
float save_Z = destination[Z_AXIS]; // save Z for later on
|
||||||
destination[Z_AXIS] += z_raise;
|
destination[Z_AXIS] += z_raise;
|
||||||
planner.buffer_line_kinematic(destination, planner.max_feedrate_mm_s[Z_AXIS], active_extruder);
|
planner.buffer_line_kinematic(destination, planner.max_feedrate_mm_s[Z_AXIS], active_extruder);
|
||||||
stepper.synchronize();
|
stepper.synchronize();
|
||||||
@ -8046,6 +8047,7 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
|
|||||||
planner.buffer_line_kinematic(destination, planner.max_feedrate_mm_s[Z_AXIS], active_extruder);
|
planner.buffer_line_kinematic(destination, planner.max_feedrate_mm_s[Z_AXIS], active_extruder);
|
||||||
stepper.synchronize();
|
stepper.synchronize();
|
||||||
}
|
}
|
||||||
|
destination[Z_AXIS] = save_Z; // restore original Z position so the 'Move to the "old position"' is correct
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -10306,7 +10308,7 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) {
|
|||||||
#else
|
#else
|
||||||
#define M600_TEST true
|
#define M600_TEST true
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (M600_TEST && stepper_inactive_time && ELAPSED(ms, previous_cmd_ms + stepper_inactive_time)
|
if (M600_TEST && stepper_inactive_time && ELAPSED(ms, previous_cmd_ms + stepper_inactive_time)
|
||||||
&& !ignore_stepper_queue && !planner.blocks_queued()) {
|
&& !ignore_stepper_queue && !planner.blocks_queued()) {
|
||||||
#if ENABLED(DISABLE_INACTIVE_X)
|
#if ENABLED(DISABLE_INACTIVE_X)
|
||||||
|
Loading…
Reference in New Issue
Block a user