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