3.1 任务
3.1.1 任务类型
在CPU单元中,任务用来为一系列的过程,例如I/O刷新和用户程序,分配执行的条件和执行的顺序。I/O刷新是指CPU与CJ系列基本I/O单元、CJ系列特殊单元和EtherCAT从站交换I/O数据。任务总是周期性地循环执行。根据执行条件和执行优先级,任务分为两种类型:主周期任务和周期任务。CPU单元执行主周期任务或周期任务的时间称为任务周期。
1.主周期任务
具有最高的优先级。每次循环执行时,主周期任务总要执行一次。总是在设定的周期时间内执行。运动控制和EtherCAT通信在主周期任务里执行。
主周期任务的任务周期可以设定为500μs、1ms、2ms或4ms。
主周期任务只有一个,其执行优先级最高,固定为4。
2.周期任务
执行优先级比主周期任务低。周期任务是在主周期任务执行的间隔之间空余的时间内执行。周期任务周期性执行,其任务周期设定为主周期任务的整数倍。
周期任务有3个,优先级分别为16、17或18。
一个任务可以分配1~128个程序。程序按照分配的顺序执行。
主周期任务、周期任务执行时,处理的内容是有区别的,如下所示:
I/O刷新可分配给主周期任务或优先级16的周期任务,缺省情况下,I/O刷新分配给主周期任务。运动控制总是分配给主周期任务。优先级16的周期任务不能执行运动控制。优先级17或18的周期任务只能执行用户程序,不能进行I/O刷新和运动控制。
3.1.2 任务的基本操作
1.任务执行的优先级
CPU单元首先执行优先级最高的任务。主周期任务具有最高的执行优先级,CPU总是首先执行它。当一个任务正在执行时,另一个优先级高的任务的执行条件满足,则这个优先级高的任务被赋予了执行优先权。周期任务有3个执行优先级,如图3-1所示。
2.任务执行的时序
主周期任务的执行周期称为主周期。任务将主周期作为标准周期来运行。
图3-1 周期任务执行优先级
1)控制器在整数倍主周期的时间内执行一次周期任务。例如,如果主周期任务的任务周期设为1ms,优先级16的周期任务的任务周期设为4ms,则在主周期任务执行4次的时间内,优先级16的周期任务执行一次。
2)无论在运行模式还是编程模式,任务都会被处理执行。但用户程序不能在编程模式下执行,只在运行模式下执行。
3)I/O刷新根据任务周期被执行。
4)CPU单元在任务执行时未用的时间内执行系统服务,例如通信处理。
图3-2所示为周期任务执行的时序,其中,图3-2a仅有主周期任务,图3-2b有主周期任务、优先级16的周期任务和优先级17的周期任务。
图3-2 周期任务执行的时序
任务执行的顺序不仅依赖于执行优先级。低优先级任务有时在高优先级任务执行期间也能被执行。主周期任务不会被中断去执行其他任务。当主周期任务的执行完成后,优先级16的周期任务被启动执行。
3.任务和系统服务的处理
(1)主周期任务
主周期任务有最高的优先级,执行处理时具有高速度、高精度。
如图3-3所示,在每一个执行周期,主周期要完成系统公共处理、I/O刷新、用户程序执行和运动控制。与普通的周期任务不同,主周期任务要完成运动控制处理。
主周期任务处理的内容见表3-1。
图3-3 主周期任务的处理
表3-1 主周期任务处理的内容
当主周期任务的用户程序中有运动控制指令时,在随后的运动控制处理中,CPU单元马上执行来自这些指令的结果。在下一个主周期任务的I/O刷新期间,CPU单元将结果输出给伺服驱动器,如图3-4所示。
(2)周期任务
周期任务在每一个任务周期内执行自己的程序,它的任务周期是主周期的整数倍。可以使用0~3个周期任务。
优先级16的周期任务也可以刷新I/O。
不控制I/O周期任务的处理与控制I/O周期任务的处理是不同的。
图3-4 主周期任务对运动控制处理
1)无I/O的周期任务。
如图3-5所示,无I/O周期任务处理的内容有:系统公共处理1、用户程序执行、系统公共处理2。
图3-5 无I/O的周期任务
2)有I/O的周期任务。
如图3-6所示,有I/O周期任务处理的内容有:有I/O刷新、系统公共处理1、用户程序执行、系统公共处理2。
图3-6 有I/O的周期任务
(3)系统服务
系统服务在任务执行未用的时间被执行,如图3-7所示。
图3-7 系统服务的执行
系统服务的内容见表3-2。
表3-2 系统服务的内容
3.1.3 保证任务间变量取值的一致性
如果多个任务读写同一个全局变量,可以使用下面两种方法中的任一种来保证任务之间变量取值的一致性。
1.为任务中的变量设置排他控制功能
如图3-8所示,在任务中设置变量的排他控制功能,即可将任务设定为刷新一个全局变量或访问这个全局变量。变量只能由一个任务“写”,其他任务只能“读”,这就保证了全局变量取值的一致性。
图3-8 设置变量的排他控制
对于一个指定的全局变量,一个任务设定为其“写”值,这个任务称为刷新任务。如果设定了一个刷新任务,其他任务就不能“写”这个全局变量的值。
对于一个全局变量,如果没有设定刷新周期,则变量值可以被任何任务在任何时刻写,因此它的取值会改变,这取决于何时去读它。
如图3-9所示,刷新任务可以读写全局变量GVar1,访问任务只能读GVar1,保证了全局变量GVar1在任务间取值的一致性。
图3-9 变量的排他控制举例
如图3-10所示,如果为一个全局变量设置了一个刷新任务,访问任务则在访问任务执行开始时,读取由刷新任务执行完成后写入的变量最新的值,这就可以在任务内维持全局变量值的一致性,而且不需要特殊的编程。
图3-10 对设置排他控制的变量读写操作
如果在访问任务中用指令“写”一个全局变量的值,用Sysmac Studio检查程序时会出现错误。
对结构体或共用体变量设置刷新任务时,对于整个结构体或共用体变量只能设置一个刷新任务。不能对结构体或共用体不同的成员设置不同的刷新任务。
对数组变量设置刷新任务,对于整个数组变量只能设置一个刷新任务。不能对不同的数组元素设置不同的刷新任务。
对每一个全局变量只能设置一个刷新任务。如果需要在多个任务里写一个全局变量,使用下面介绍的任务排他控制指令来保证一致性。
2.使用任务排他控制指令
当需要从多个任务里对同一个变量“写”值时,使用任务排他控制指令,即LOCK和UNLOCK指令。
LOCK和UNLOCK指令阻止不同任务间的LOCK和UNLOCK程序区域的执行。
如图3-11所示,即使任务B比任务A的优先级高,如果任务A中的区域1正在执行,则任务B中的区域1不能执行,直到任务A中的区域1执行完毕才能执行。这里,任务A中的区域1的执行有特定的优先级。
图3-11 使用任务排他控制指令
如图3-12所示,当任务A中的区域1执行完成,任务B中的区域1才被执行。
图3-12 任务的排他控制
注意,不要使锁住的区域太长,否则会出现任务执行周期超出错误。
3.1.4 从控制器外部访问变量与任务执行的同步
如图3-13所示,为了达到从控制器外部访问变量与任务执行的同步,在任务设置里为任务中变量的排他控制做设置。同样,特别当使用标签数据链接时,在Sysmac Studio的任务设置里,设置变量访问时间。
使用下列方法从控制器外部访问全局变量。
1)EtherNet/IP标签数据链接。
图3-13 从控制器外部访问变量
2)从NS系列PT访问变量。
3)从Sysmac Studio访问变量(只对写操作实现与任务执行的同步)。
4)从上位计算机用CIP通信访问变量。
当从控制器外部访问全局变量时,为这些全局变量设置特定的任务作为刷新任务。特别当使用标签数据链接时,对在同一标签组(有网络公开属性的变量)的标签,一定要设置同一任务为刷新任务,以保证标签组中标签间的一致性。
不能对下列已分配的全局变量设置刷新任务,下面给出的任务自动设置为刷新任务。
1)EtherCAT从站的设备变量:设置为I/O控制任务的任务。
2)CJ系列I/O单元的设备变量:设置为I/O控制任务的任务。
3)CJ系列特殊单元的设备变量:主周期任务。
4)用于CJ系列单元内存具有AT规格的变量:主周期任务。
3.1.5 任务设置
1.任务设置
任务设置用来增加和建立任务,如图3-14所示。
图3-14 任务设置
主周期任务和周期任务的参数见表3-3。
表3-3 主周期任务和周期任务的参数
2.I/O控制任务设置
如图3-15所示,I/O控制任务设置用来为输入和输出刷新执行设置时序。
图3-15 I/O控制任务设置
为任务分配I/O刷新见表3-4。
表3-4 为任务分配I/O刷新
3.程序分配设置
如图3-16所示,程序分配设置用来为任务分配程序,并设置程序执行的顺序。可以为一个任务分配多达128个程序,不能将一个程序分配一个以上的任务。
图3-16 程序分配设置
在一个任务内,程序按照分配的顺序从上到下执行。
4.任务中变量的排他控制设置
任务中变量的排他控制设置如图3-17所示,用来设置刷新全局变量的任务和访问全局变量的任务。
图3-17 任务中变量的排他控制设置
任务中变量的排他控制设置参数见表3-5。
表3-5 任务中变量的排他控制设置参数
3.1.6 与任务相关的指令
与任务相关的指令见表3-6,这些指令支持读取当前任务的状态,确定其他任务是否在执行中,完成为保证任务间区域一致性的排他控制。
表3-6 与任务相关的指令
3.1.7 与任务相关的系统定义变量
与任务相关的系统定义变量见表3-7,可以显示每个任务的状态。例如,名称为TaskName的任务执行周期超出标志为TaskNameExceeded。不要在用户程序中使用这些变量,因为在更新它们的时候会有延迟,与功能模块的错误状态相关的一致性也存在问题。这些变量只用在从Sysmac Studio进行数据跟踪时,采样任务状态。
用户程序中也可以使用指令GetMyTaskStatus和TaskIsActive来读取任务状态。不能直接通过系统定义变量来访问这些变量。
表3-7 与任务相关的系统定义变量
图3-18所示为任务活动标志TaskNameActive的操作。
图3-18 任务活动标志操作
图3-19所示为任务周期超出标志TaskNameExceeded的操作。
图3-19 任务周期超出标志的操作
3.1.8 与任务相关的错误
与任务相关的错误如下:
1.任务周期超出错误
如图3-20所示,如果任务执行时间超出指定的任务周期,就会出现一个任务周期超出错误。这是一个轻微故障级的控制器错误,即使发生此错误,运行仍将继续。它可以发生在主周期任务和周期任务中。
图3-20 任务周期超出错误
可以在设置中将任务周期超出错误检测设为禁用。在Sysmac Studio的任务设置中,可设置使用任务周期超出检测,而默认设置为检测。
即使禁用检测任务周期超出错误,如果任务处理在指定周期内未完成,信息仍将输出到下面的标志:任务周期超出标志(TaskNameExceeded)、任务周期超出计数(TaskNameExceedCount)、控制器错误状态(ErrSta)和事件日志。
如果在任务周期内,任务处理未完成,I/O刷新如下操作。
输出:输出上一个周期的值。
输入:用户程序中不反映输入的刷新值。
如果出现任务周期超出错误,则缩短任务中的程序以适应任务周期,或增加任务周期的设定值。
2.运动控制周期超出错误
如果在主周期(即运动控制周期)内,连续两次没有完成运动控制处理(MC),则出现运动控制周期超出错误。在运动控制功能模块会出现局部故障级控制器错误。同时,出现任务周期超出错误。
出现运动控制周期超出错误时,减少程序中处理的数目,或在不影响正常运行的前提下,增加控制周期。
3.任务执行超时错误
如图3-21所示,如果在指定的任务执行超时时间内,未完成任务处理,则出现任务执行超时错误。
图3-21 任务执行超时错误
这是一个重大故障级的控制器错误,出现时,用户程序执行将停止。
由于程序逻辑错误,如无限循环,正常的任务操作无法进行时,会发生此错误。
出现任务执行超时错误时,检查任务设置,下载工程,电源需断电再重新上电或CPU单元复位。
4.I/O刷新超时错误
如图3-22所示,如果I/O刷新在指定的周期内连续两次未完成,则出现I/O刷新超时错误。
图3-22 I/O刷新超时错误
这是一个重大故障级的控制器错误,出现时,用户程序执行将停止。
这个错误只发生在主周期任务和设置了I/O刷新优先级16的周期任务。
出现I/O刷新超时错误时,检查任务设置,下载工程,电源需断电再重新上电或CPU单元复位。
5.系统服务时间不足错误
如果不能获得为系统服务监视设置而指定的时间,会出现系统服务时间不足的错误。
这是一个重大故障级的控制器错误,出现时,用户程序执行将停止。
出现系统服务时间不足错误时,检查任务设置和系统服务监视设置,下载工程,电源需断电再重新上电或CPU单元复位。
3.1.9 监视任务执行状态和任务执行时间
可以从Sysmac Studio监视所有任务中的程序的执行状态和任务执行时间。
在多视图浏览器中,双击“配置和设置”下的“任务设置”,在显示的编辑面板点击“任务执行状态监视”按钮,可以观察到所有正在执行的任务/程序的名称和执行状态;点击“任务执行时间监视”按钮,可以观察到所有正在执行的任务的执行时间。