n
1概述n
在SIMOTION中,有一系列的命令可以用来控制Motion Tasks的启动、停止、继续运行,也可以查询某一个任务的运行状态。n
Motion Task的任务状态模型如图1所示,展示了执行系统中的任务(例如MotionTask)所处的各个运行状态之间的转换关系,以及该关系可以通过哪条指令进行跳转。n
图1.任务状态模型n
TS_INVALID:任务不存在于执行系统中,在执行系统的参数设置中未使用。n
TS_STOP_PENDIING:任务已经收到一个停止信号,但仍然处于RUNNING 和STOPPED状态之间。任务仍然可以执行动作直到被停止。n
TS_STOPPED:任务因调用功能 _resetTask()或SIMOTION SCOUT执行了停止而停止。n
TS_RUNNING:任务因下列功能而运行:n
• 调用功能 _startTask() (MotionTasks)n
• 相关事件已发生 (UserInterruptTask 等)n
TS_WAITING:任务因下列功能之一而处于等待状态:n
• _waitTime()n
• WAITFORCONDITION...n
TS_SUSPENDED:任务通过功能 _suspendTask()被暂停n
TS_WAIT_NEXT_CYCLE:TimerInterruptTask 正在等待其触发信号n
TS_WAIT_NEXT_INTERRUPT:SystemInterruptTask 正在等待触发报警或者UserInterruptTask 正在等待触发事件n
TS_LOCKED:任务通过功能 _disableScheduler()被锁定。n
2 Motion Task控制命令说明
可以使用MCC或ST编程语言编辑Motion Tasks的调用及处理程序。MCC编程语言中的任务处理命令如图2所示:n
图2. MCC中的任务处理命令n
而ST编程语言中的任务处理命令有_startTaskId ,_resetTaskId,_restartTaskId,_suspendTaskId,_resumeTaskId,_getStateOfTaskId。n
MCC命令说明:n
(1) Start task(对应于ST语言的_restartTaskId)n
该命令用于将一个处于TASK_STATE_STOPPED状态的Motion Task运行,对于处在TASK_STATE_WAITING,TASK_STATE_SUSPENED状态的Motion Task,该指令无效果。n
_restartTaskId命令从头启动一个MotionTask,也就是从最开始执行一个已停止的任务。如果任务已经激活,则停止该任务并从开始处重新处理,也就是说该命令只能在 BackgroundTask 中调用一次,否则被选择的任务在每次BackgroundTask循环中都会重新启动。该命令允许用于MotionTask。n
(2)Interrupt task(对应于ST语言的_suspendTaskId)n
该命令将一个任务中断在当前位置,任务状态变为TASK_STATE_SUSPENDED。该命令不停止先前已经从该任务启动的那些轴运动。停止所有当前激活的 UserInterruptTask,只有当启动条件再次满足时才启动它。该命令允许用于 MotionTask、BackgroundTask、UserInterruptTask、SystemInterruptTask 和 TimerInterruptTask。对于循环任务 (BackgroundTask、TimerInterruptTask)同时停止任务的时间监视。使用 _resumeTask Id()可继续任务执行及其时间监视。n
(3)Continue task(对应于ST语言的_resumeTaskId)n
该命令将从先前的断点位置继续处理中断的任务。中断的运动不会自动继续,必须通过编程继续才能执行中断的运动。该命令只能在 BackgroundTask 中调用一次,否则被选择的任务在每次BackgroundTask循环中都会从中断位置继续执行。该命令允许用于 MotionTask、BackgroundTask、UserInterruptTask、 SystemInterruptTask 和 TimerInterruptTask。n
(4)Reset task(对应于ST语言的_resetTaskId)n
该命令可以将一个MotionTask复位为TASK_STATE_STOPPED状态,若此时想要将MotionTask恢复运行状态,需要使用RestartTaskId命令。n
(5)Task state(对应于ST语言的_getStateOfTaskId)n
该命令可以用来查询相关任务的运行状态。n
(6)Determine taskId(对应于ST语言的_getTaskId )n
该命令根据任务名称生成一个项目范围内唯一的TaskId ,该任务标识必须分配给一个数据类型为StructTaskId 的变量。n
3 Motion Task控制命令调用
LAD编程方式如图3所示:n
图3.LAD编程n
在任务控制命令中,通过id指定唯一被调用的任务,可通过以下方法可以获得Mo tionTask的TaskId:n
(1) _task.<name>n
<name>为被调用任务的的任务名称,例如_task.MotionTask_1。n
(2) 通过_getStateOfTaskId指令,可以获得相关任务的的运行状态,该指令的的返回值为DWORD型数据,其含义如图4所示:n
图4 任务执行状态查询n
指令的运行状态可以是两个或多个代码值的相加之和,例如16#0014表示的状态就是,该任务正在运行,但是由于_waitTime或者waitforcondition指令处在等待的状态。n
当然也可以使用ST或MCC编程方式来实现Motion Task的控制,在此不再赘述。n
4示例
下面以SIMOTION D445-2为例,举一个简单的例子通过程序对MotionTask的状态模型进行控制。
首先,在MCCUnit_1中插入源程序MCC_1(),在其中编写循环计数程序,计数变量为counter,将MCC_1()插入到执行系统的MotionTask_1中。
图5 MCC_1()编程示例
然后,在LFunit_1中,插入源程序LADFBD_1(),在其中编写MotionTask_1的控制程序,将LADFBD_1()放入执行系统的BackgroundTask中循环执行。
图6 Motion Task控制程序示例
运行SIMOTION,使用Trace功能可以捕捉到Counter和Taskstate两个变量的状态,如图7所示:
图7. 变量Trace图
图中,黄色线为Taskstate的数值,其数值变化为16#0002->16#0004->16#0024->16#4,表示MotionTask_1的运行状态依次TASK_STATE_STOPPED->TASK_STATE_RUNNING-> TASK_ST ATE_RUNNING+TASK_STATE_SUSPENDED->TASK_STATE_RUNNING。橘红色为MotionTask_1中计数程序的计数值。
原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc328591.html