📄 emctaskmain.cc
字号:
default: break; } } return 0; // get rid of the compile-time cast shortcuts#undef circular_move_msg#undef linear_move_msg#undef operator_error_msg}/* emcTaskPlan() Planner for NC code or manual mode operations */static int emcTaskPlan(void){ NMLTYPE type; static char errstring[200]; int retval = 0; int readRetval; int execRetval; // check for new command if (emcCommand->serial_number != emcStatus->echo_serial_number) { // flag it here locally as a new command type = emcCommand->type; } else { // no new command-- reset local flag type = 0; } // handle any new command switch (emcStatus->task.state) { case EMC_TASK_STATE_OFF: case EMC_TASK_STATE_ESTOP: case EMC_TASK_STATE_ESTOP_RESET: // now switch on the mode switch (emcStatus->task.mode) { case EMC_TASK_MODE_MANUAL: case EMC_TASK_MODE_AUTO: case EMC_TASK_MODE_MDI: // now switch on the command switch (type) { case 0: case EMC_NULL_TYPE: // no command break; // immediate commands case EMC_AXIS_SET_CYCLE_TIME_TYPE: case EMC_AXIS_SET_GAINS_TYPE: case EMC_AXIS_SET_BACKLASH_TYPE: case EMC_AXIS_SET_HOMING_PARAMS_TYPE: case EMC_AXIS_DISABLE_TYPE: case EMC_AXIS_ENABLE_TYPE: case EMC_AXIS_SET_OUTPUT_SCALE_TYPE: case EMC_AXIS_SET_FERROR_TYPE: case EMC_AXIS_SET_MIN_FERROR_TYPE: case EMC_AXIS_ABORT_TYPE: case EMC_AXIS_SET_OUTPUT_TYPE: case EMC_AXIS_LOAD_COMP_TYPE: case EMC_AXIS_ALTER_TYPE: case EMC_AXIS_SET_STEP_PARAMS_TYPE: case EMC_TRAJ_SET_SCALE_TYPE: case EMC_TRAJ_SET_VELOCITY_TYPE: case EMC_TRAJ_SET_ACCELERATION_TYPE: case EMC_TASK_INIT_TYPE: case EMC_TASK_SET_MODE_TYPE: case EMC_TASK_SET_STATE_TYPE: case EMC_TASK_PLAN_INIT_TYPE: case EMC_TASK_PLAN_OPEN_TYPE: case EMC_TASK_ABORT_TYPE: case EMC_TRAJ_SET_PROBE_INDEX_TYPE: case EMC_TRAJ_SET_PROBE_POLARITY_TYPE: case EMC_TRAJ_CLEAR_PROBE_TRIPPED_FLAG_TYPE: case EMC_TRAJ_PROBE_TYPE: case EMC_TRAJ_SET_TELEOP_ENABLE_TYPE: case EMC_SET_DEBUG_TYPE: retval = emcTaskIssueCommand(emcCommand); break; // one case where we need to be in manual mode case EMC_AXIS_OVERRIDE_LIMITS_TYPE: retval = 0; if (emcStatus->task.mode == EMC_TASK_MODE_MANUAL) { retval = emcTaskIssueCommand(emcCommand); } break; // queued commands case EMC_TASK_PLAN_EXECUTE_TYPE: // resynch the interpreter, since we may have moved // externally emcTaskIssueCommand(&taskPlanSynchCmd); // and now call for interpreter execute retval = emcTaskIssueCommand(emcCommand); break; case EMC_TOOL_LOAD_TOOL_TABLE_TYPE: case EMC_TOOL_SET_OFFSET_TYPE: // send to IO emcTaskQueueCommand(emcCommand); // signify no more reading emcTaskPlanSetWait(); if (EMC_DEBUG & EMC_DEBUG_INTERP) { rcs_print("emcTaskPlanSetWait() called\n"); } // then resynch interpreter emcTaskQueueCommand(&taskPlanSynchCmd); break; default: emcOperatorError(0, _ ("command (%s) cannot be executed until the machine is out of E-stop and turned on"), emc_symbol_lookup(type)); retval = -1; break; } // switch (type) default: // invalid mode break; } // switch (mode) break; // case EMC_TASK_STATE_OFF,ESTOP,ESTOP_RESET case EMC_TASK_STATE_ON: /* we can do everything (almost) when the machine is on, so let's switch on the execution mode */ switch (emcStatus->task.mode) { case EMC_TASK_MODE_MANUAL: // ON, MANUAL switch (type) { case 0: case EMC_NULL_TYPE: // no command break; // immediate commands case EMC_AXIS_DISABLE_TYPE: case EMC_AXIS_ENABLE_TYPE: case EMC_AXIS_SET_CYCLE_TIME_TYPE: case EMC_AXIS_SET_GAINS_TYPE: case EMC_AXIS_SET_BACKLASH_TYPE: case EMC_AXIS_SET_HOMING_PARAMS_TYPE: case EMC_AXIS_SET_INPUT_SCALE_TYPE: case EMC_AXIS_SET_OUTPUT_SCALE_TYPE: case EMC_AXIS_SET_FERROR_TYPE: case EMC_AXIS_SET_MIN_FERROR_TYPE: case EMC_AXIS_SET_MAX_POSITION_LIMIT_TYPE: case EMC_AXIS_SET_MIN_POSITION_LIMIT_TYPE: case EMC_AXIS_SET_STEP_PARAMS_TYPE: case EMC_AXIS_ABORT_TYPE: case EMC_AXIS_HALT_TYPE: case EMC_AXIS_HOME_TYPE: case EMC_AXIS_JOG_TYPE: case EMC_AXIS_INCR_JOG_TYPE: case EMC_AXIS_ABS_JOG_TYPE: case EMC_AXIS_OVERRIDE_LIMITS_TYPE: case EMC_AXIS_SET_OUTPUT_TYPE: case EMC_AXIS_ALTER_TYPE: case EMC_TRAJ_PAUSE_TYPE: case EMC_TRAJ_RESUME_TYPE: case EMC_TRAJ_ABORT_TYPE: case EMC_TRAJ_SET_SCALE_TYPE: case EMC_SPINDLE_ON_TYPE: case EMC_SPINDLE_OFF_TYPE: case EMC_SPINDLE_BRAKE_RELEASE_TYPE: case EMC_SPINDLE_BRAKE_ENGAGE_TYPE: case EMC_SPINDLE_INCREASE_TYPE: case EMC_SPINDLE_DECREASE_TYPE: case EMC_SPINDLE_CONSTANT_TYPE: case EMC_COOLANT_MIST_ON_TYPE: case EMC_COOLANT_MIST_OFF_TYPE: case EMC_COOLANT_FLOOD_ON_TYPE: case EMC_COOLANT_FLOOD_OFF_TYPE: case EMC_LUBE_ON_TYPE: case EMC_LUBE_OFF_TYPE: case EMC_TASK_SET_MODE_TYPE: case EMC_TASK_SET_STATE_TYPE: case EMC_TASK_ABORT_TYPE: case EMC_TASK_PLAN_PAUSE_TYPE: case EMC_TASK_PLAN_RESUME_TYPE: case EMC_TASK_PLAN_INIT_TYPE: case EMC_TASK_PLAN_SYNCH_TYPE: case EMC_TRAJ_SET_PROBE_INDEX_TYPE: case EMC_TRAJ_SET_PROBE_POLARITY_TYPE: case EMC_TRAJ_CLEAR_PROBE_TRIPPED_FLAG_TYPE: case EMC_TRAJ_PROBE_TYPE: case EMC_TRAJ_SET_TELEOP_ENABLE_TYPE: case EMC_TRAJ_SET_TELEOP_VECTOR_TYPE: case EMC_SET_DEBUG_TYPE: retval = emcTaskIssueCommand(emcCommand); break; // queued commands case EMC_TASK_PLAN_EXECUTE_TYPE: // resynch the interpreter, since we may have moved // externally emcTaskIssueCommand(&taskPlanSynchCmd); // and now call for interpreter execute retval = emcTaskIssueCommand(emcCommand); break; case EMC_TOOL_LOAD_TOOL_TABLE_TYPE: case EMC_TOOL_SET_OFFSET_TYPE: // send to IO emcTaskQueueCommand(emcCommand); // signify no more reading emcTaskPlanSetWait(); if (EMC_DEBUG & EMC_DEBUG_INTERP) { rcs_print("emcTaskPlanSetWait() called\n"); } // then resynch interpreter emcTaskQueueCommand(&taskPlanSynchCmd); break; // otherwise we can't handle it default: sprintf(errstring, _("can't do that (%s) in manual mode"), emc_symbol_lookup(type)); emcOperatorError(0, errstring); retval = -1; break; } // switch (type) in ON, MANUAL break; // case EMC_TASK_MODE_MANUAL case EMC_TASK_MODE_AUTO: // ON, AUTO switch (emcStatus->task.interpState) { case EMC_TASK_INTERP_IDLE: // ON, AUTO, IDLE switch (type) { case 0: case EMC_NULL_TYPE: // no command break; // immediate commands case EMC_AXIS_SET_CYCLE_TIME_TYPE: case EMC_AXIS_SET_GAINS_TYPE: case EMC_AXIS_SET_BACKLASH_TYPE: case EMC_AXIS_SET_HOMING_PARAMS_TYPE: case EMC_AXIS_SET_OUTPUT_SCALE_TYPE: case EMC_AXIS_SET_FERROR_TYPE: case EMC_AXIS_SET_MIN_FERROR_TYPE: case EMC_AXIS_SET_OUTPUT_TYPE: case EMC_AXIS_ALTER_TYPE: case EMC_AXIS_SET_STEP_PARAMS_TYPE: case EMC_TRAJ_PAUSE_TYPE: case EMC_TRAJ_RESUME_TYPE: case EMC_TRAJ_ABORT_TYPE: case EMC_TRAJ_SET_SCALE_TYPE: case EMC_SPINDLE_ON_TYPE: case EMC_SPINDLE_OFF_TYPE: case EMC_SPINDLE_BRAKE_RELEASE_TYPE: case EMC_SPINDLE_BRAKE_ENGAGE_TYPE: case EMC_SPINDLE_INCREASE_TYPE: case EMC_SPINDLE_DECREASE_TYPE: case EMC_SPINDLE_CONSTANT_TYPE: case EMC_COOLANT_MIST_ON_TYPE: case EMC_COOLANT_MIST_OFF_TYPE: case EMC_COOLANT_FLOOD_ON_TYPE: case EMC_COOLANT_FLOOD_OFF_TYPE: case EMC_LUBE_ON_TYPE: case EMC_LUBE_OFF_TYPE: case EMC_TASK_SET_MODE_TYPE: case EMC_TASK_SET_STATE_TYPE: case EMC_TASK_ABORT_TYPE: case EMC_TASK_PLAN_INIT_TYPE: case EMC_TASK_PLAN_OPEN_TYPE: case EMC_TASK_PLAN_RUN_TYPE: case EMC_TASK_PLAN_EXECUTE_TYPE: case EMC_TASK_PLAN_PAUSE_TYPE: case EMC_TASK_PLAN_RESUME_TYPE: case EMC_TRAJ_SET_PROBE_INDEX_TYPE: case EMC_TRAJ_SET_PROBE_POLARITY_TYPE: case EMC_TRAJ_CLEAR_PROBE_TRIPPED_FLAG_TYPE: case EMC_TRAJ_PROBE_TYPE: case EMC_SET_DEBUG_TYPE: retval = emcTaskIssueCommand(emcCommand); break; case EMC_TASK_PLAN_STEP_TYPE: // handles case where first action is to step the program taskPlanRunCmd.line = 1; // run from start /*! \todo FIXME-- can have GUI set this; send a run instead of a step */ retval = emcTaskIssueCommand(&taskPlanRunCmd); // issuing an EMC_TASK_PLAN_RUN message clears the // stepping // flag-- reset it here stepping = 1; // set step flag steppingWait = 0; // don't wait for first one break; case EMC_TOOL_LOAD_TOOL_TABLE_TYPE: case EMC_TOOL_SET_OFFSET_TYPE: // send to IO emcTaskQueueCommand(emcCommand); // signify no more reading emcTaskPlanSetWait(); if (EMC_DEBUG & EMC_DEBUG_INTERP) { rcs_print("emcTaskPlanSetWait() called\n"); } // then resynch interpreter emcTaskQueueCommand(&taskPlanSynchCmd); break; // otherwise we can't handle it default: sprintf(errstring, _ ("can't do that (%s) in auto mode with the interpreter idle"), emc_symbol_lookup(type)); emcOperatorError(0, errstring); retval = -1; break; } // switch (type) in ON, AUTO, IDLE break; // EMC_TASK_INTERP_IDLE case EMC_TASK_INTERP_READING: // ON, AUTO, READING switch (type) { case 0: case EMC_NULL_TYPE: // no command break; // immediate commands case EMC_AXIS_SET_CYCLE_TIME_TYPE: case EMC_AXIS_SET_GAINS_TYPE: case EMC_AXIS_SET_BACKLASH_TYPE: case EMC_AXIS_SET_HOMING_PARAMS_TYPE: case EMC_AXIS_SET_OUTPUT_SCALE_TYPE: case EMC_AXIS_SET_FERROR_TYPE: case EMC_AXIS_SET_MIN_FERROR_TYPE: case EMC_AXIS_SET_OUTPUT_TYPE: case EMC_AXIS_ALTER_TYPE: case EMC_AXIS_SET_STEP_PARAMS_TYPE: case EMC_TRAJ_PAUSE_TYPE: case EMC_TRAJ_RESUME_TYPE: case EMC_TRAJ_ABORT_TYPE: case EMC_TRAJ_SET_SCALE_TYPE: case EMC_SPINDLE_INCREASE_TYPE: case EMC_SPINDLE_DECREASE_TYPE: case EMC_SPINDLE_CONSTANT_TYPE: case EMC_TASK_PLAN_PAUSE_TYPE: case EMC_TASK_PLAN_RESUME_TYPE: case EMC_TASK_SET_MODE_TYPE: case EMC_TASK_SET_STATE_TYPE: case EMC_TASK_ABORT_TYPE: case EMC_TRAJ_SET_PROBE_INDEX_TYPE: case EMC_TRAJ_SET_PROBE_POLARITY_TYPE: case EMC_TRAJ_CLEAR_PROBE_TRIPPED_FLAG_TYPE: case EMC_TRAJ_PROBE_TYPE: case EMC_SET_DEBUG_TYPE: retval = emcTaskIssueCommand(emcCommand); return retval; break; case EMC_TASK_PLAN_STEP_TYPE: stepping = 1; // set stepping mode in case it's not steppingWait = 0; // clear the wait break; // otherwise we can't handle it default: sprintf(errstring, _ ("can't do that (%s) in auto mode with the interpreter reading"), emc_symbol_lookup(type)); emcOperatorError(0, errstring); retval = -1; break; } // switch (type) in ON, AUTO, READING // now handle interpreter call logic if (interp_list.len() <= EMC_TASK_INTERP_MAX_LEN) { if (emcTaskPlanIsWait()) { // delay reading of next line until all is done if (interp_list.len() == 0 && emcTaskCommand == 0 && emcStatus->task.execState == EMC_TASK_EXEC_DONE) { emcTaskPlanClearWait(); if (EMC_DEBUG & EMC_DEBUG_INTERP) { rcs_print ("emcTaskPlanClearWait() called\n"); } } } else { readRetval = emcTaskPlanRead(); if (EMC_DEBUG & EMC_DEBUG_INTERP) { rcs_print("emcTaskPlanRead() returned %d\n", readRetval); } /*! \todo MGS FIXME This next bit of code is goofy for the following reasons: 1. It uses numbers when these values are #defined in interp_return.hh... 2. This if() actually evaluates to if (readRetval != INTERP_OK)... 3. The "end of file" comment is inaccurate... *** Need to look at all calls to things that return INTERP_xxx values! *** MGS */ if (readRetval > INTERP_MIN_ERROR || readRetval == 3 /* INTERP_ENDFILE */ || readRetval == 1 /* INTERP_EXIT */ || readRetval == 2 /* INTERP_ENDFILE, INTERP_EXECUTE_FINISH */ ) { /* emcTaskPlanRead retval != INTERP_OK Signal to the rest of the system that that the interp is now in a paused state. */ /*! \todo FIXME The above test *should* be reduced to: readRetVal != INTERP_OK (N.B. Watch for negative error codes.) */ emcStatus->task.interpState = EMC_TASK_INTERP_WAITING; } else { // got a good line // record the line number and command emcStatus->task.readLine = emcTaskPlanLine(); if (EMC_DEBUG & EMC_DEBUG_INTERP) { rcs_print ("emcTaskPlanLine() returned %d\n", emcStatus->task.readLine); } interp_list.set_line_number(emcStatus->task. readLine); emcTaskPlanCommand((char *) &emcStatus->task. command); if (EMC_DEBUG & EMC_DEBUG_INTERP) { rcs_print ("emcTaskPlanCommand(%s) called. (line_number=%d)\n", ((char *) &emcStatus->task.command), emcStatus->task.readLine); } // and execute it execRetval = emcTaskPlanExecute(0); if (EMC_DEBUG & EMC_DEBUG_INTERP) { rcs_print ("emcTaskPlanExecute(0) return %d\n", execRetval); } if (execRetval == -1 /* INTERP_ERROR */ || execRetval > INTERP_MIN_ERROR || execRetval == 1 /* INTERP_EXIT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -