1概述
在西門(mén)子的SIMOTION中,有一系列的命令可以用來(lái)控制Motion Tasks的啟動(dòng)、停止、繼續(xù)運(yùn)行,也可以查詢某一個(gè)任務(wù)的運(yùn)行狀態(tài)。
Motion Task的任務(wù)狀態(tài)模型如圖1所示,展示了執(zhí)行系統(tǒng)中的任務(wù)(例如MotionTask)所處的各個(gè)運(yùn)行狀態(tài)之間的轉(zhuǎn)換關(guān)系,以及該關(guān)系可以通過(guò)哪條指令進(jìn)行跳轉(zhuǎn)。
圖1.任務(wù)狀態(tài)模型
TS_INVALID:任務(wù)不存在于執(zhí)行系統(tǒng)中,在執(zhí)行系統(tǒng)的參數(shù)設(shè)置中未使用。
TS_STOP_PENDIING:任務(wù)已經(jīng)收到一個(gè)停止信號(hào),但仍然處于RUNNING 和STOPPED狀態(tài)之間。任務(wù)仍然可以執(zhí)行動(dòng)作直到被停止。
TS_STOPPED:任務(wù)因調(diào)用功能 _resetTask()或SIMOTION SCOUT執(zhí)行了停止而停止。
TS_RUNNING:任務(wù)因下列功能而運(yùn)行:
? 調(diào)用功能 _startTask() (MotionTasks)
? 相關(guān)事件已發(fā)生 (UserInterruptTask 等)
TS_WAITING:任務(wù)因下列功能之一而處于等待狀態(tài):
? _waitTime()
? WAITFORCONDITION...
TS_SUSPENDED:任務(wù)通過(guò)功能 _suspendTask()被暫停
TS_WAIT_NEXT_CYCLE:TimerInterruptTask 正在等待其觸發(fā)信號(hào)
TS_WAIT_NEXT_INTERRUPT:SystemInterruptTask 正在等待觸發(fā)報(bào)警或者UserInterruptTask 正在等待觸發(fā)事件
TS_LOCKED:任務(wù)通過(guò)功能 _disableScheduler()被鎖定。
2 Motion Task控制命令說(shuō)明
可以使用MCC或ST編程語(yǔ)言編輯Motion Tasks的調(diào)用及處理程序。MCC編程語(yǔ)言中的任務(wù)處理命令如圖2所示:
圖2. MCC中的任務(wù)處理命令
而ST編程語(yǔ)言中的任務(wù)處理命令有_startTaskId,_resetTaskId,_restartTaskId,_suspendTaskId,_resumeTaskId,_getStateOfTaskId。
MCC命令說(shuō)明:
(1) Start task(對(duì)應(yīng)于ST語(yǔ)言的_restartTaskId)
該命令用于將一個(gè)處于TASK_STATE_STOPPED狀態(tài)的Motion Task運(yùn)行,對(duì)于處在TASK_STATE_WAITING,TASK_STATE_SUSPENED狀態(tài)的Motion Task,該指令無(wú)效果。
_restartTaskId命令從頭啟動(dòng)一個(gè)MotionTask,也就是從最開(kāi)始執(zhí)行一個(gè)已停止的任務(wù)。如果任務(wù)已經(jīng)激活,則停止該任務(wù)并從開(kāi)始處重新處理,也就是說(shuō)該命令只能在 BackgroundTask中調(diào)用一次,否則被選擇的任務(wù)在每次BackgroundTask循環(huán)中都會(huì)重新啟動(dòng)。該命令允許用于MotionTask。
(2)Interrupt task(對(duì)應(yīng)于ST語(yǔ)言的_suspendTaskId)
該命令將一個(gè)任務(wù)中斷在當(dāng)前位置,任務(wù)狀態(tài)變?yōu)門(mén)ASK_STATE_SUSPENDED。該命令不停止先前已經(jīng)從該任務(wù)啟動(dòng)的那些軸運(yùn)動(dòng)。停止所有當(dāng)前激活的 UserInterruptTask,只有當(dāng)啟動(dòng)條件再次滿足時(shí)才啟動(dòng)它。該命令允許用于MotionTask、BackgroundTask、UserInterruptTask、SystemInterruptTask 和TimerInterruptTask。對(duì)于循環(huán)任務(wù) (BackgroundTask、TimerInterruptTask)同時(shí)停止任務(wù)的時(shí)間監(jiān)視。使用 _resumeTask Id()可繼續(xù)任務(wù)執(zhí)行及其時(shí)間監(jiān)視。
(3)Continue task(對(duì)應(yīng)于ST語(yǔ)言的_resumeTaskId)
該命令將從先前的斷點(diǎn)位置繼續(xù)處理中斷的任務(wù)。中斷的運(yùn)動(dòng)不會(huì)自動(dòng)繼續(xù),必須通過(guò)編程繼續(xù)才能執(zhí)行中斷的運(yùn)動(dòng)。該命令只能在 BackgroundTask 中調(diào)用一次,否則被選擇的任務(wù)在每次BackgroundTask循環(huán)中都會(huì)從中斷位置繼續(xù)執(zhí)行。該命令允許用于MotionTask、BackgroundTask、UserInterruptTask、 SystemInterruptTask 和TimerInterruptTask。
(4)Reset task(對(duì)應(yīng)于ST語(yǔ)言的_resetTaskId)
該命令可以將一個(gè)MotionTask復(fù)位為T(mén)ASK_STATE_STOPPED狀態(tài),若此時(shí)想要將MotionTask恢復(fù)運(yùn)行狀態(tài),需要使用RestartTaskId命令。
(5)Task state(對(duì)應(yīng)于ST語(yǔ)言的_getStateOfTaskId)
該命令可以用來(lái)查詢相關(guān)任務(wù)的運(yùn)行狀態(tài)。
(6)Determine taskId(對(duì)應(yīng)于ST語(yǔ)言的_getTaskId )
該命令根據(jù)任務(wù)名稱(chēng)生成一個(gè)項(xiàng)目范圍內(nèi)唯一的TaskId ,該任務(wù)標(biāo)識(shí)必須分配給一個(gè)數(shù)據(jù)類(lèi)型為StructTaskId 的變量。
3 Motion Task控制命令調(diào)用
LAD編程方式如圖3所示:
圖編程
在任務(wù)控制命令中,通過(guò)id指定唯一被調(diào)用的任務(wù),可通過(guò)以下方法可以獲得Mo tionTask的TaskId:
(1) _task.
為被調(diào)用任務(wù)的的任務(wù)名稱(chēng),例如Task_1。
(2) 通過(guò)_getStateOfTaskId指令,可以獲得相關(guān)任務(wù)的的運(yùn)行狀態(tài),該指令的的返回值為DWORD型數(shù)據(jù),其含義如圖4所示:
圖4 任務(wù)執(zhí)行狀態(tài)查詢
指令的運(yùn)行狀態(tài)可以是兩個(gè)或多個(gè)代碼值的相加之和,例如16#0014表示的狀態(tài)就是,該任務(wù)正在運(yùn)行,但是由于_waitTime或者waitforcondition指令處在等待的狀態(tài)。
當(dāng)然也可以使用ST或MCC編程方式來(lái)實(shí)現(xiàn)Motion Task的控制,在此不再贅述。
4示例
下面以SIMOTION D445-2為例,舉一個(gè)簡(jiǎn)單的例子通過(guò)程序?qū)otionTask的狀態(tài)模型進(jìn)行控制。
首先,在MCCUnit_1中插入源程序MCC_1(),在其中編寫(xiě)循環(huán)計(jì)數(shù)程序,計(jì)數(shù)變量為counter,將MCC_1()插入到執(zhí)行系統(tǒng)的MotionTask_1中。
圖5 MCC_1()編程示例
然后,在LFunit_1中,插入源程序LADFBD_1(),在其中編寫(xiě)MotionTask_1的控制程序,將LADFBD_1()放入執(zhí)行系統(tǒng)的BackgroundTask中循環(huán)執(zhí)行。
圖6 Motion Task控制程序示例
運(yùn)行SIMOTION,使用Trace功能可以捕捉到Counter和Taskstate兩個(gè)變量的狀態(tài),如圖7所示:
圖7. 變量Trace圖
圖中,黃色線為T(mén)askstate的數(shù)值,其數(shù)值變化為16#0002->16#0004->16#0024->16#4,表示MotionTask_1的運(yùn)行狀態(tài)依次TASK_STATE_STOPPED->TASK_STATE_RUNNING-> TASK_ST ATE_RUNNING+TASK_STATE_SUSPENDED->TASK_STATE_RUNNING。橘紅色為MotionTask_1中計(jì)數(shù)程序的計(jì)數(shù)值。
(轉(zhuǎn)載)