先看一个没有做任务调度的XY轴复位的程序A:
//XY轴复位
unsigned int XYReset(unsigned char reset)
{
static unsigned char operation = STEP1;
static unsigned int baseTime;
if(reset == TRUE)
{
operation = STEP1;
}
switch(operation){
case STEP1:
sm_run(SM101,3200); //步进电机SM101运动3200步
operation = STEP2;
break;
case STEP2:
if(sm_state[SM101]==SM_STOP)
{ //3200步运动完成
baseTime = systemTime; //开始延时
operation = STEP3;
}
break;
case STEP3:
if(Timer(baseTime,500)==TRUE)
{ //延时500ms完成
sm_run(SM102,3200); //步进电机SM102运动3200步
operation = STEP4;
}
break;
case STEP4:
if(IsSensorOn(X101))
{
sm_stop(SM102);
return TRUE;
}
else if(sm_state[SM102] == SM_STOP)
{
return -2; //动作报错
}
break;
default:break;
}
return 0; //动作正在运行
}
下面增加任务调度的XY轴复位的程序B:
//XY轴复位
void XYReset()
{
switch(GetStep())
{
case STEP1:
sm_run(SM101,3200);
wait_sm_stop(SM101,STEP2);//任务切换,让出当前的运行权限,直到SM101电机停止后切换回来
break;
case STEP2:
wait_time(500,STEP3);//任务切换 500ms后切换回来
break;
STEP3:
find_sensor(SM102,3200,X101,STEP4,STEP_ERROR);//任务切换,传感器感应 电机停止后回来
break;
STEP4:
set_ation_ok(); //正确结束当前的动作任务,退出就绪队列
break;
STEP_ERROR:
set_error("SM102电机丢步");//错误结束当前动作任务,退出就绪队列
break;
}
}
程序A和程序B的共同点:
程序A程序B的不同点:
全部0条评论
快来发表一下你的评论吧 !