Parking motion bug fix.

- Parking motion would intermittently complete the queued tool path
upon resuming in certain scenarios. Now fixed.
This commit is contained in:
Sonny Jeon 2015-09-05 13:34:40 -06:00
parent 9575199183
commit 965e337405
5 changed files with 84 additions and 71 deletions

View File

@ -1,3 +1,12 @@
----------------
Date: 2015-08-29
Author: Sonny Jeon
Subject: Optional line number reporting bug fix.
- Fixed a bug where it would not compile when USE_LINE_NUMBERS was
enabled.
---------------- ----------------
Date: 2015-08-27 Date: 2015-08-27
Author: Sonny Jeon Author: Sonny Jeon

View File

@ -1034,37 +1034,37 @@ uint8_t gc_execute_line(char *line)
// refill and can only be resumed by the cycle start run-time command. // refill and can only be resumed by the cycle start run-time command.
gc_state.modal.program_flow = gc_block.modal.program_flow; gc_state.modal.program_flow = gc_block.modal.program_flow;
if (gc_state.modal.program_flow) { if (gc_state.modal.program_flow) {
protocol_buffer_synchronize(); // Sync and finish all remaining buffered motions before moving on. protocol_buffer_synchronize(); // Sync and finish all remaining buffered motions before moving on.
if (gc_state.modal.program_flow == PROGRAM_FLOW_PAUSED) { if (gc_state.modal.program_flow == PROGRAM_FLOW_PAUSED) {
if (sys.state != STATE_CHECK_MODE) { if (sys.state != STATE_CHECK_MODE) {
bit_true_atomic(sys.rt_exec_state, EXEC_FEED_HOLD); // Use feed hold for program pause. bit_true_atomic(sys.rt_exec_state, EXEC_FEED_HOLD); // Use feed hold for program pause.
protocol_execute_realtime(); // Execute suspend. protocol_execute_realtime(); // Execute suspend.
} }
} else { // == PROGRAM_FLOW_COMPLETED } else { // == PROGRAM_FLOW_COMPLETED
// Upon program complete, only a subset of g-codes reset to certain defaults, according to // Upon program complete, only a subset of g-codes reset to certain defaults, according to
// LinuxCNC's program end descriptions and testing. Only modal groups [G-code 1,2,3,5,7,12] // LinuxCNC's program end descriptions and testing. Only modal groups [G-code 1,2,3,5,7,12]
// and [M-code 7,8,9] reset to [G1,G17,G90,G94,G40,G54,M5,M9,M48]. The remaining modal groups // and [M-code 7,8,9] reset to [G1,G17,G90,G94,G40,G54,M5,M9,M48]. The remaining modal groups
// [G-code 4,6,8,10,13,14,15] and [M-code 4,5,6] and the modal words [F,S,T,H] do not reset. // [G-code 4,6,8,10,13,14,15] and [M-code 4,5,6] and the modal words [F,S,T,H] do not reset.
gc_state.modal.motion = MOTION_MODE_LINEAR; gc_state.modal.motion = MOTION_MODE_LINEAR;
gc_state.modal.plane_select = PLANE_SELECT_XY; gc_state.modal.plane_select = PLANE_SELECT_XY;
gc_state.modal.distance = DISTANCE_MODE_ABSOLUTE; gc_state.modal.distance = DISTANCE_MODE_ABSOLUTE;
gc_state.modal.feed_rate = FEED_RATE_MODE_UNITS_PER_MIN; gc_state.modal.feed_rate = FEED_RATE_MODE_UNITS_PER_MIN;
// gc_state.modal.cutter_comp = CUTTER_COMP_DISABLE; // Not supported. // gc_state.modal.cutter_comp = CUTTER_COMP_DISABLE; // Not supported.
gc_state.modal.coord_select = 0; // G54 gc_state.modal.coord_select = 0; // G54
gc_state.modal.spindle = SPINDLE_DISABLE; gc_state.modal.spindle = SPINDLE_DISABLE;
gc_state.modal.coolant = COOLANT_DISABLE; gc_state.modal.coolant = COOLANT_DISABLE;
// gc_state.modal.override = OVERRIDE_DISABLE; // Not supported. // gc_state.modal.override = OVERRIDE_DISABLE; // Not supported.
// Execute coordinate change and spindle/coolant stop. // Execute coordinate change and spindle/coolant stop.
if (sys.state != STATE_CHECK_MODE) { if (sys.state != STATE_CHECK_MODE) {
if (!(settings_read_coord_data(gc_state.modal.coord_select,coordinate_data))) { FAIL(STATUS_SETTING_READ_FAIL); } if (!(settings_read_coord_data(gc_state.modal.coord_select,coordinate_data))) { FAIL(STATUS_SETTING_READ_FAIL); }
memcpy(gc_state.coord_system,coordinate_data,sizeof(coordinate_data)); memcpy(gc_state.coord_system,coordinate_data,sizeof(coordinate_data));
spindle_stop(); spindle_stop();
coolant_stop(); coolant_stop();
} }
report_feedback_message(MESSAGE_PROGRAM_END); report_feedback_message(MESSAGE_PROGRAM_END);
} }
gc_state.modal.program_flow = PROGRAM_FLOW_RUNNING; // Reset program flow. gc_state.modal.program_flow = PROGRAM_FLOW_RUNNING; // Reset program flow.
} }

View File

@ -23,7 +23,7 @@
// Grbl versioning system // Grbl versioning system
#define GRBL_VERSION "1.0b" #define GRBL_VERSION "1.0b"
#define GRBL_VERSION_BUILD "20150829" #define GRBL_VERSION_BUILD "20150902"
// Define standard libraries used by Grbl. // Define standard libraries used by Grbl.
#include <avr/io.h> #include <avr/io.h>

View File

@ -72,10 +72,10 @@ uint8_t limits_get_state()
uint8_t pin = (LIMIT_PIN & LIMIT_MASK); uint8_t pin = (LIMIT_PIN & LIMIT_MASK);
if (bit_isfalse(settings.flags,BITFLAG_INVERT_LIMIT_PINS)) { pin ^= LIMIT_MASK; } if (bit_isfalse(settings.flags,BITFLAG_INVERT_LIMIT_PINS)) { pin ^= LIMIT_MASK; }
if (pin) { if (pin) {
uint8_t idx; uint8_t idx;
for (idx=0; idx<N_AXIS; idx++) { for (idx=0; idx<N_AXIS; idx++) {
if (pin & get_limit_pin_mask(idx)) { limit_state |= (1 << idx); } if (pin & get_limit_pin_mask(idx)) { limit_state |= (1 << idx); }
} }
} }
return(limit_state); return(limit_state);
} }
@ -210,37 +210,37 @@ void limits_go_home(uint8_t cycle_mask)
st_prep_buffer(); // Prep and fill segment buffer from newly planned block. st_prep_buffer(); // Prep and fill segment buffer from newly planned block.
st_wake_up(); // Initiate motion st_wake_up(); // Initiate motion
do { do {
if (approach) { if (approach) {
// Check limit state. Lock out cycle axes when they change. // Check limit state. Lock out cycle axes when they change.
limit_state = limits_get_state(); limit_state = limits_get_state();
for (idx=0; idx<N_AXIS; idx++) { for (idx=0; idx<N_AXIS; idx++) {
if (axislock & step_pin[idx]) { if (axislock & step_pin[idx]) {
if (limit_state & (1 << idx)) { axislock &= ~(step_pin[idx]); } if (limit_state & (1 << idx)) { axislock &= ~(step_pin[idx]); }
} }
} }
sys.homing_axis_lock = axislock; sys.homing_axis_lock = axislock;
} }
st_prep_buffer(); // Check and prep segment buffer. NOTE: Should take no longer than 200us. st_prep_buffer(); // Check and prep segment buffer. NOTE: Should take no longer than 200us.
// Exit routines: No time to run protocol_execute_realtime() in this loop. // Exit routines: No time to run protocol_execute_realtime() in this loop.
if (sys.rt_exec_state & (EXEC_SAFETY_DOOR | EXEC_RESET | EXEC_CYCLE_STOP)) { if (sys.rt_exec_state & (EXEC_SAFETY_DOOR | EXEC_RESET | EXEC_CYCLE_STOP)) {
// Homing failure: Limit switches are still engaged after pull-off motion // Homing failure: Limit switches are still engaged after pull-off motion
if ( (sys.rt_exec_state & (EXEC_SAFETY_DOOR | EXEC_RESET)) || // Safety door or reset issued if ( (sys.rt_exec_state & (EXEC_SAFETY_DOOR | EXEC_RESET)) || // Safety door or reset issued
(!approach && (limits_get_state() & cycle_mask)) || // Limit switch still engaged after pull-off motion (!approach && (limits_get_state() & cycle_mask)) || // Limit switch still engaged after pull-off motion
( approach && (sys.rt_exec_state & EXEC_CYCLE_STOP)) ) { // Limit switch not found during approach. ( approach && (sys.rt_exec_state & EXEC_CYCLE_STOP)) ) { // Limit switch not found during approach.
mc_reset(); // Stop motors, if they are running. mc_reset(); // Stop motors, if they are running.
protocol_execute_realtime(); protocol_execute_realtime();
return; return;
} else { } else {
// Pull-off motion complete. Disable CYCLE_STOP from executing. // Pull-off motion complete. Disable CYCLE_STOP from executing.
bit_false_atomic(sys.rt_exec_state,EXEC_CYCLE_STOP); bit_false_atomic(sys.rt_exec_state,EXEC_CYCLE_STOP);
break; break;
} }
} }
} while (STEP_MASK & axislock); } while (STEP_MASK & axislock);
st_reset(); // Immediately force kill steppers and reset step segment buffer. st_reset(); // Immediately force kill steppers and reset step segment buffer.
plan_reset(); // Reset planner buffer to zero planner current position and to clear previous motions. plan_reset(); // Reset planner buffer to zero planner current position and to clear previous motions.

View File

@ -135,7 +135,6 @@ typedef struct {
uint8_t last_st_block_index; uint8_t last_st_block_index;
float last_steps_remaining; float last_steps_remaining;
float last_step_per_mm; float last_step_per_mm;
float last_req_mm_increment;
float last_dt_remainder; float last_dt_remainder;
#endif #endif
@ -551,12 +550,13 @@ static uint8_t st_next_block_index(uint8_t block_index)
{ {
// Restore step execution data and flags of partially completed block, if necessary. // Restore step execution data and flags of partially completed block, if necessary.
if (prep.recalculate_flag & PREP_FLAG_HOLD_PARTIAL_BLOCK) { if (prep.recalculate_flag & PREP_FLAG_HOLD_PARTIAL_BLOCK) {
st_prep_block = &st_block_buffer[prep.last_st_block_index];
prep.st_block_index = prep.last_st_block_index; prep.st_block_index = prep.last_st_block_index;
prep.steps_remaining = prep.last_steps_remaining; prep.steps_remaining = prep.last_steps_remaining;
prep.dt_remainder = prep.last_dt_remainder; prep.dt_remainder = prep.last_dt_remainder;
prep.step_per_mm = prep.last_step_per_mm; prep.step_per_mm = prep.last_step_per_mm;
st_prep_block = &st_block_buffer[prep.st_block_index];
prep.recalculate_flag = (PREP_FLAG_HOLD_PARTIAL_BLOCK | PREP_FLAG_RECALCULATE); prep.recalculate_flag = (PREP_FLAG_HOLD_PARTIAL_BLOCK | PREP_FLAG_RECALCULATE);
prep.req_mm_increment = REQ_MM_INCREMENT_SCALAR/prep.step_per_mm; // Recompute this value.
} else { } else {
prep.recalculate_flag = false; prep.recalculate_flag = false;
} }
@ -594,12 +594,15 @@ void st_prep_buffer()
if (sys.step_control & STEP_CONTROL_EXECUTE_PARK) { pl_block = plan_get_parking_block(); } if (sys.step_control & STEP_CONTROL_EXECUTE_PARK) { pl_block = plan_get_parking_block(); }
else { pl_block = plan_get_current_block(); } else { pl_block = plan_get_current_block(); }
if (pl_block == NULL) { return; } // No planner blocks. Exit. if (pl_block == NULL) { return; } // No planner blocks. Exit.
// Check if we need to only recompute the velocity profile or load a new block. // Check if we need to only recompute the velocity profile or load a new block.
if (prep.recalculate_flag & PREP_FLAG_RECALCULATE) { if (prep.recalculate_flag & PREP_FLAG_RECALCULATE) {
if (prep.recalculate_flag & PREP_FLAG_PARKING) { prep.recalculate_flag &= ~(PREP_FLAG_RECALCULATE); } if (prep.recalculate_flag & PREP_FLAG_PARKING) { prep.recalculate_flag &= ~(PREP_FLAG_RECALCULATE); }
else { prep.recalculate_flag = false; } else { prep.recalculate_flag = false; }
} else {
#else #else
// Query planner for a queued block // Query planner for a queued block
@ -608,11 +611,12 @@ void st_prep_buffer()
// Check if we need to only recompute the velocity profile or load a new block. // Check if we need to only recompute the velocity profile or load a new block.
if (prep.recalculate_flag & PREP_FLAG_RECALCULATE) { if (prep.recalculate_flag & PREP_FLAG_RECALCULATE) {
prep.recalculate_flag = false; prep.recalculate_flag = false;
} else {
#endif #endif
} else {
// Load the Bresenham stepping data for the block. // Load the Bresenham stepping data for the block.
prep.st_block_index = st_next_block_index(prep.st_block_index); prep.st_block_index = st_next_block_index(prep.st_block_index);
@ -639,7 +643,7 @@ void st_prep_buffer()
prep.step_per_mm = prep.steps_remaining/pl_block->millimeters; prep.step_per_mm = prep.steps_remaining/pl_block->millimeters;
prep.req_mm_increment = REQ_MM_INCREMENT_SCALAR/prep.step_per_mm; prep.req_mm_increment = REQ_MM_INCREMENT_SCALAR/prep.step_per_mm;
prep.dt_remainder = 0.0; // Reset for new segment block prep.dt_remainder = 0.0; // Reset for new segment block
if (sys.step_control & STEP_CONTROL_EXECUTE_HOLD) { if (sys.step_control & STEP_CONTROL_EXECUTE_HOLD) {
// New block loaded mid-hold. Override planner block entry speed to enforce deceleration. // New block loaded mid-hold. Override planner block entry speed to enforce deceleration.
prep.current_speed = prep.exit_speed; prep.current_speed = prep.exit_speed;
@ -648,7 +652,7 @@ void st_prep_buffer()
prep.current_speed = sqrt(pl_block->entry_speed_sqr); prep.current_speed = sqrt(pl_block->entry_speed_sqr);
} }
} }
/* --------------------------------------------------------------------------------- /* ---------------------------------------------------------------------------------
Compute the velocity profile of a new planner block based on its entry and exit Compute the velocity profile of a new planner block based on its entry and exit
speeds, or recompute the profile of a partially-completed planner block if the speeds, or recompute the profile of a partially-completed planner block if the