單片機(jī)工控通常有延時(shí),電機(jī)狀態(tài),傳感器狀態(tài)等通用耗時(shí)操作,業(yè)務(wù)程序查詢(xún)這些狀態(tài),就會(huì)產(chǎn)生大量的冗余代碼,不簡(jiǎn)潔.使用事件則是把這些通用操作丟給系統(tǒng)去處理,系統(tǒng)操作完成后,則運(yùn)行業(yè)務(wù)程序的下一個(gè)Step.
** 延時(shí)不使用事件**
switch(step)
{
case STEP1:
baseTime = systemTime;
step= STEP2;
break;
case STEP2:
if(systemTime>(baseTime+500))
{
..
}
break;
}
延時(shí)使用事件:
switch(step)
{
case STEP1:
WaitTime(500,STEP2); //向系統(tǒng)請(qǐng)求延時(shí)500ms,讓出程序運(yùn)行權(quán)限,500ms后運(yùn)行到STEP2
break;
case STEP2:
break;
}
不使用事件查詢(xún)傳感器狀態(tài)
switch(step)
{
case STEP1:
if(IsSensorOn(X01))
{
StopSM(SM101);
}
break;
}
使用事件的查詢(xún)傳感器狀態(tài)
switch(step)
{
case STEP1:
//向系統(tǒng)請(qǐng)求查詢(xún)傳感器X101,傳感器感應(yīng)后跳到STEP2
WaitSensorOn(X101,STEP2);
break;
}
不使用事件的電機(jī)運(yùn)動(dòng)
switch(step)
{
case STEP1:
RunSM(SM101,2000); //SM101運(yùn)行2000步
step = STEP2;
break;
case STEP2:
if(IsSMStop(SM101))
{
}
}
使用事件的電機(jī)運(yùn)動(dòng)
switch(step)
{
case STEP1:
RunSM(SM101,2000);
//請(qǐng)求系統(tǒng)查詢(xún)電機(jī)狀態(tài)
WaitSM(SM101,STEP2);
break;
}
沒(méi)有使用事件的找傳感器的電機(jī)運(yùn)動(dòng)
switch(step)
{
case STEP1:
RunSM(SM101,2000);
step = STEP2;
break;
case STEP2:
if(IsSensorOn(X101))
{
StopSM(SM101);
return 1;
}
else if(IsSMStop(SM101))
{
return -1;
}
}
使用事件的找傳感器電機(jī)運(yùn)動(dòng)
switch(step)
{
case STEP1:
//電機(jī)運(yùn)動(dòng)2000步,請(qǐng)求傳感器狀態(tài) 電機(jī)事件
FindSensor(SM101,2000,X101,STEP2,STEP_ERROR);
break;
case STEP2:
SetActionOk();
break;
case STEP_ERROR:
SetError("SM101電機(jī)丟步-SM101/X101");
break;
}
從上面的案例可以看出使用事件的程序幾乎沒(méi)有if else 程序更加口語(yǔ)化.事件實(shí)現(xiàn)的基本原理為:
- 把事件的參數(shù)(事件類(lèi)型,延時(shí)時(shí)間,電機(jī)編號(hào),電機(jī)步數(shù),傳感器編號(hào))壓入任務(wù)棧,下一步驟也就是PC指針也壓入任務(wù)棧。
- 讓出業(yè)務(wù)程序的運(yùn)行權(quán)限到系統(tǒng)的通用事件運(yùn)行,實(shí)現(xiàn)方式運(yùn)行的函數(shù)指針指向事件處理的函數(shù)
- 事件處理程序查詢(xún)相應(yīng)的狀態(tài)變化
- 運(yùn)行權(quán)限重新切回業(yè)務(wù)程序,運(yùn)行函數(shù)指針指向業(yè)務(wù)函數(shù)指針,Step出棧.
//切換到事件處理函數(shù)
CurrentAction->ActionCallback = CurrentAction->EventCallback;
//系統(tǒng)循環(huán)
while(CurrentAction!=NULL)
{
CurrentAction->ActionCallback();
DelFinishAction();
CurrentAction = CurrentAction->NextAction;
}
//切回業(yè)務(wù)App
ThisAction->nStep = nStep;
ThisAction->ActionCallback = ThisAction->AppCallBack
-
傳感器
+關(guān)注
關(guān)注
2567文章
53252瀏覽量
769812 -
單片機(jī)
+關(guān)注
關(guān)注
6069文章
45070瀏覽量
653680 -
代碼
+關(guān)注
關(guān)注
30文章
4907瀏覽量
71209 -
step
+關(guān)注
關(guān)注
0文章
43瀏覽量
20906
發(fā)布評(píng)論請(qǐng)先 登錄

專(zhuān)注單片機(jī)工控編程開(kāi)發(fā)#步控電子#步驟編程#單片機(jī) #單片機(jī)開(kāi)發(fā)
單片機(jī)工控板
從單片機(jī)初學(xué)者邁向單片機(jī)工程師
實(shí)用單片機(jī)工具應(yīng)用程序合集免費(fèi)下載

單片機(jī)工控應(yīng)用
單片機(jī)工控實(shí)現(xiàn)任務(wù)執(zhí)行管理
單片機(jī)工控的電機(jī)減速算法是什么?

單片機(jī)工控的工程分離是什么?

51單片機(jī)工程模板創(chuàng)建方法

評(píng)論