根据任务单元所要完成功能,本系统定义了多种任务单元类,如图3。
(1)运动任务单元对应于输入轴组模块的数据FSM,分为直线、圆弧运动任务单元等。除了具有基本的FSM管理和参数化方法之外,运动任务单元还包括速率、待加工的几何信息等以及负责刀具轨迹规划的速度轮廓生成器。它们在轴组模块内按照图2规划的FSM运行,通过执行动作initilization()和runningAc—tion()分别完成插补的初始化和插补计算任务。
(2)离散逻辑任务单元对应于输入离散逻辑模块的数据FSM。离散逻辑单元负责对外部输人输出单元的协调和控制。如主轴的启停、冷却液的开关等。
(3)执行步任务单元在任务协调器内的FSM对象,包括运动任务执行步和离散逻辑任务执行步,分别负责监控和管理运动任务单元和离散逻辑任务单元的执行。例如直线运动任务单元就是在运动执行步的监控下运行的,具体实现过程将在下文详细解释。对于图3中的各种任务单元,采用面向对象编程技术,以基类任务单元模板来抽象表示它们的共性,则每一种具体类型的任务单元都通过从任务模板基类派生定制实现。
3 控制信息的传递与系统模块的协作
任务单元是可以嵌套的,一个任务单元能够包含其它的任务单元。当外层任务单元的有限状态机被激活时,它能够向下层模块发送其内嵌的任务单元。这样,就可以将数控程序包含的控制信息以任务单元的形式在模块间传送,被传送的任务单元成为下层模块内活动的状态机,从而控制下层模块的行为。外层任务通过对嵌套任务的管理就可以实现对下层逻辑和运动控制模块的协调调度。在本系统中,执行步任务单元属于外层任务,它负责嵌套包含运动任务单元和离散逻辑任务单元。通过下面的例子来说明当数控系统执行一个加工程序时,模块间的协作关系与数据流的传递过程,如图4所示。执行步骤如下:
步骤1 加工程序在任务生成器中被翻泽为一系列执行步任务单元,以链表的形式存在;每个执行步任务单元都是嵌套的,内部包含有等待执行的运动任务单元或逻辑控制单元。
步骤2 任务协调器通过调用getTasks()获取执行步单元。在本系统中,任务生成器是一个COM组件,在Windows环境下运行;任务协调器是一个实时动态链接库,在实时操作系统RTX环境下运行。两个模块通过共享内存传递具有嵌套结构的执行步任务单元。
步骤3 任务协调器调用执行步单元提供的exe—cuteUnit()激活其包含的状态机。步骤3会重复执行多次,因为它要与下层模块保持同步(例如,等待当前嵌套的运动任务单元被完成)。
步骤4 在任务协调器内处于活动状态的执行步任务单元将内嵌的运动任务单元发送到轴组模块的运动队列中,通过调用setNextMotionSegment()实现。运动任务单元被加载到轴组队列后等待被激活。
步骤5 加载到轴组队列首位的运动单元首先被激活,轴组模块周期性调用该运动任务单元的exe-cuteUnit()方法,运动任务单元依照它的有限状态机规划开始运行。此时外层执行步的状态机在任务协调器内同步运行,并不断查询运动任务单元的状态,直至运动任务单元转变为“结束”状态为止。
图5给出了上述任务单元在控制系统内的被传递和执行过程中自身状态所发生的转变,同时可以看出它们的管理对象也发生了变化。首先,嵌套任务单元由任务生成器译码得到,任务协调器调用外层执行步任务单元的executeUnit()方法激活其有限状态机进行一系列更新操作,执行步由“未初始化”转变为“已初始化”状态,同时完成动作initiationAction(),把内嵌的运动任务单元发送到轴组的运动队列中。轴组调用运动任务单元的executeUnit()方法,使运动任务单元在轴组内被激活,周期性刷新,依次处理“初始化”、“执行”事件,完成动作“runningAction()”进行插补计算直至插补结束。在此过程中,位于上层任务协调器中的执行步进入“运行”状态,它也通过自身的“runningAction()”动作不断查询其内嵌运动任务单元是否为“结束”状态。当运动任务单元结束时,轴组将其从运动队列中删除;任务协调器中的执行步继续监控它所包含的下一任务单元或者将控制权移交给下一个执行步。图中两侧所示为执行步任务单元与运动任务单元在不同时刻所对应的管理对象。
通过上面的例子可以看出,利用有限状态机,任务单元通过在其内部封装一系列状态变化,进而实现了系统预期完成的操作和功能;更重要的是,任务单元的嵌套结构设计就象是一棵树上的主干和分支,实现了信息在系统内的有序流动和传递,而且这种嵌套设计使任务单元具有智能特征,具备了协调下层运动模块和逻辑控制模块的能力。