朱华炳 罗祖平 董伯麟 王治森
合肥工业大学,合肥,230009
数控系统是现代制造装备的核心。可重构数控系统具有在一定范围内迅速调整其结构和功能的能力,能够快速适应市场的迅猛变化和系统自身的改变,从20世纪90年代开始已成为数控技术研究的一个热点[1-2]。!
数控系统的重构包括硬件可重构和软件可重构。目前对数控系统软件可重构的研究主要有:①将数控软件的功能封装并抽象成标准“软件芯片”,以“软件芯片”库为基础,通过库中的“软件芯片”组合实现系统可重构[3];②以开放式体系结构为基础,将功能模块设计成标准组件,组件通过标准接口通信实现系统的可重构[4];③以标准总线为基础,通过总线的易扩展性实现系统的可重构[5-6]。
以上研究的特点是,采用将功能和数据封装成一个对象,通过对象的复用实现系统的重构。但是这些对象均为被动对象,每次重构都需要设计所有对象的调用才能运行。数控系统是个行为复杂的系统,当对象的数目增多时,调用方法和顺序将会变得十分复杂,从而导致数控系统的重构变得繁琐和低效。
本文提出面向活动对象的可重构数控系统软件设计。活动对象之间无需设计相互的调用。通过“订阅”外部事件,以事件驱动其执行。通过“出版”事件,以事件同外部进行通信。在该模式下,活动对象耦合性小、可复用程度高,系统集成简单、重构能力强。
活动对象(active object)是“一个拥有其自己的控制线程的对象”[7],它不被外部的对象所调用,通过异步事件交换的方式同其他活动对象通信,以RTC(run-to-completion)的方式执行事件处理。图1所示是一个活动对象,它包含一个控制线程(事件循环)、一个事件队列和一个状态机,即“活动对象=(控制线程+事件队列+状态机)”[8]。
图1 活动对象及其事件循环
在图1右侧显示了事件循环的流程。queue.get()从事件队列中取出事件,通过dispatch()派送到状态机进行处理。在处理完成后返回queue.get(),并从事件队列中取出下一个事件,重复上面的过程,如此循环。事件循环保证了每个活动对象处理事件的RTC形式。RTC形式固有地排除了内部并发问题,在第二个事件被处理前,dispatch()操作必须完成并且返回到事件循环。这里的RTC指的是单个活动对象内部的事件处理。在优先级抢占的多任务系统中,当高优先级的活动对象有事件需要处理时,低优先级的活动对象会被挂起,将CPU的控制权让给高优先级的对象。在高优先级的活动对象处理完后,CPU控制权重新归还当前悬挂对象,使其继续执行。
RTC形式可以进行有效堵塞。当事件队列为空时,活动对象会堵塞在queue.get()上(此时不占有CPU),直到有新事件出现,才会继续执行,从而提高了CPU的利用率。
活动对象与其他对等实体的事件交换采用异步方式。每个活动对象拥有一个自己的事件队列,所有的事件异步地投递到事件队列中,活动对象通过事件队列唯一地接收事件。一方面,当活动对象在忙碌时,可以自动地对输入事件进行排队。另一方面,事件生产者仅需将事件投递到活动对象的事件队列中,而不必一直等待其处理完成。除此,活动对象可以不区分事件来源地接收事件并统一处理。事件可以是其他活动对象产生,也可以是中断产生,还可以是自身产生。
数控系统根据输入的信息(如数控程序、操作面板的输入、传感器的反馈信息)控制机床移动,实现加工操作(如轴运动、换刀、停止机床等),属于典型的反应式系统[9]。反应式系统(reactive system)是一个对外部和内部刺激做出响应的事件驱动系统(event-driven system)。在确定性的反应式系统中,系统输入的顺序和数值决定了系统的响应顺序和数值[10]。因此,需要专门的方法来描述系统的行为。状态机(state machines)是说明和实施事件驱动系统最有名的形式,先进的UML状态机代表着状态机理论和表示法的当前艺术状态[8]。本文以UML状态机(Statecharts,也称状态图)来表示并规划活动对象的行为。
图2所示是一个简单的状态图,图中包含A、B、C、D 4个状态,处于某一状态意味着系统只响应所有允许输入的一个子集(如处于D状态只响应a输入和c输入),只产生可能响应的一个子集(转移到A状态或转移到B状态),并且改变状态也只是可能状态的一个子集(对于输入事件除了可以发生状态改变还可以有其他的输出)。C状态是一个父状态,包含A和B两个子状态,子状态可以继承父状态的响应(如在A状态遇到d输入会转移到D状态)。Statecharts相关信息及优点请参考文献[7,11]。
图2 一个简单的Statecharts
面向活动对象的设计将应用分解成若干功能专一的活动对象,它们通过异步事件交换进行通信。因此,如何将事件投递到目标对象至关重要。
最简单的方法是活动对象彼此直接发送事件。然而,它们要求活动对象密切“知道”彼此。不仅需要拥有一个指向对应实体对象的指针或引用,而且还必须知道对方可能感兴趣的事件类型。这种密切的“知识”存在于所有参与的活动对象之间,使得系统难以改变和扩展。例如,加入一个新的活动对象是困难的,因为已经存在的活动对象不了解新来的对象,并且不会向其发送事件。
观察者(OBSERVER)模式(又称出版-订阅(publish-subscribe)模式)定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。中介者(MEDIATOR)模式用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
图3所示的“出版-订阅”框架结合了观察者和中介者两种设计模式。“出版社”是一个观察者,同时又是一个中介者,活动对象是观察者。活动对象从“出版社”订阅自己感兴趣的事件,并将自己要出版的事件投递到“出版社”。“出版社”收到事件后按照订阅列表一一投递给所有的订阅者(活动对象)。“出版社”除了接收活动对象投递的事件外,同时还接收中断投递的事件。
图3 “出版-订阅”框架
在这种方式下,所有事件被公众所知,活动对象无需相互“知道”,只向“出版社”“订阅”自己想要的事件。系统内部活动对象之间具有松的耦合性。一个活动对象可以不用知道其他活动对象是如何运行的,而只需知道系统中具有哪些事件,根据这些事件,自己该如何运行。一个活动对象的行为逻辑发生了改变,不会影响到其他活动对象的运行。一个新活动对象的加入可以很好地融入系统,又不影响系统其他部分的运行。
图4所示为活动对象的实现类图。活动对象继承基类CActive,CActive联合了3个基本要素:状态机(来自CHsm类)、事件队列和执行线程。
图4 活动对象类图
执行线程具有平台依赖性,不同的操作系统具有不同的执行方式。图5所示为创建及执行线程的伪代码。首先在CActive::Start()内创建好事件队列及执行线程,在CActive::run()内通过for(;;)循环从事件队列中获取事件,并将其投递到状态机进行处理。
很多实时操作系统天生具有自己的消息队列(有时称为邮箱或消息邮箱),此时可以将消息队列映射成所需要的事件队列,从而实现对事件的排队和堵塞。对于不具备消息队列的操作系统,需要设计自己的事件队列来处理事件排队、回收、堵塞等机制。事件队列的实现可参考文献[8]。
图5 活动对象的执行线程
活动对象的状态机是通过继承CHsm类实现的。CHsm类是一个能够处理层次状态转移的状态机抽象类,它封装了状态机的状态转移机制等。通过这种方式,活动对象对状态机的实现只需编写所有状态的状态处理函数。图6所示为一段事件处理代码,在状态处理函数内,根据事件类型进行状态转移或进行相应的事件处理。
图6 活动对象的状态处理函数
图7所示为事件的“出版-订阅”订阅者列表,在该列表中,每个事件对应一个清单,清单中保存着订阅该事件的所有活动对象的优先级编号(每个活动对象对应唯一的一个优先级编号)。当有事件出版时,根据该事件的清单对订阅者一一进行投递。通常活动对象在初始化内部状态机时通过PB::subscribe(CActive*a,Signal sig)接口订阅该活动对象感兴趣的事件,在运行的任何时候通过接口PB::publish(Event*e)出版自己的事件。
图7 订阅者列表
D-Max ENC是以 Windows CE6.0为软件平台的可重构嵌入式数控系统,按照设计要求它需具有快速重构能力,可以根据客户需求重构出具有不同联动轴数,或不同刀库,或不同用户界面,或增加其他功能(如,增加机械手或增加远程监控)的数控系统。
图8所示为D-Max ENC M3铣削加工中心的硬件结构。该系统具备三轴联动,自动换刀等功能。系统采用主从式多CPU结构,X86工业主板具有主CPU,通过PC/104总线分别与FPGA运动控制卡及PC/104数据采集卡相连,通过串口总线与刀库PLC相连。
图8 D-Max ENC M3硬件结构
D-Max ENC M3系统共包含IO活动对象、TC活动对象、MC活动对象、Core活动对象和HMI活动对象5个活动对象(图4)。
IO活动对象:主要检测I/O信号,管理MDI键盘的按键输入。该对象的状态机只有一个状态,其简化状态图如图9所示。在该状态下,活动对象不断检查是否有键按下。当有键按下时,创建一个该按键的事件,并将该事件出版。
TC活动对象:负责与刀库的PLC通信,从而控制刀库选择相应的刀具。该活动对象简化状态图如图10所示,活动对象有Idle和Busy两个状态。在Idle状态,可以接收选择刀具的事件(SELECT_TOOL),并进入Busy。此时,若再收到选择刀具的事件,将不会进行处理(可以有效防止破坏换刀的控制逻辑),直到收到刀库处理完成事件(TM_PROCESSED)后,重新转移到Idle状态。MC活动对象:管理运动控制卡的行为。根据所控制的运动控制卡有批处理和立即处理两种模式,且在批处理模式有数据缓存区、允许暂停和取消功能,其简化状态图如图11所示。在Idle状态和Hungry状态可以接收插补指令事件,而在Full状态不会处理接收的插补指令。进入Suspend状态后,插补会暂停,在收到START事件后,又会恢复到上一个状态。
图9 IO活动对象简化状态图
图10 TC活动对象简化状态图
Core活动对象:编译程序,并将编译后的指令通过事件出版出去。由于指令具有多种类型以及单次处理的指令长度有限,为了保证事件出版后其他活动对象能够进行处理,需要将编译后的指令按类型及长度分成多个指令段,并订阅运动控制卡数据处理完成事件(MC_PROCESSED)、运动控制卡数据饥渴事件(MC_HUNGRY)和刀库处理完成事件(TM_PROCESSED)。在这些事件的驱动下,将分段指令出版。除此,该活动对象还订阅了插补、急停、复位、进给保持、启动等事件,从而控制整个过程的执行。其简化状态图如图12所示。
图12 Core活动对象简化状态图
HMI活动对象:负责程序的编辑、参数设置、显示以及自动或手动的数据准备等。其简化状态图如图13所示。该活动对象订阅了所有的按键事件,通过模式选择事件进入不同状态,不同的状态只处理固定的按键事件。如,在Auto状态收到START按键事件后会出版带有零件程序参数的编译事件,在JOG状态会处理X+等轴控制按键事件,而不会处理START按键事件。
图13 HMI活动对象简化状态图
图14所示为面向活动对象软件设计的重构流程。
图14 面向活动对象的软件重构流程
首先,根据新的系统需求,分析判断已有活动对象的行为是否发生了改变,包括其状态图及事件的处理方式是否需要发生改变;其次,在已有活动对象修改完成后,对比新系统,查看已有活动对象无法完成的功能,设计并添加新的活动对象;然后,重新对所有活动对象检查,检查是否有出版的事件漏处理或未出版等;最后,整合所有活动对象进行验证、仿真、测试等,最终得到新的系统。
D-Max ENC M5E系统是一五轴联动数控系统,该系统除具有五轴联动外,还具有网络监控功能。通过互联网可以远程监视其运行状况,或传送数据控制机床运行(在Online模式)。表1及图15、图16所示为D-Max ENC M3重构为D-Max ENC M5E系统的软件重构内容。
表1 D-Max ENC M5E软件重构内容
图15 重构后HMI活动对象简化状态图
图16 Monitor活动对象简化状态图
从上述重构过程可以看出:
(1)活动对象通过事件出版进行通信,没有相互的调用,避免了重构过程“牵一发而动全身”。如,IO的改变并没有影响到TC活动和MC活动对象的行为;加入Monitor活动对象,并没有干涉到IO活动对象、TC活动对象、MC活动对象、Core活动对象的活动。通过减小相互间的耦合,从而可以降低重构难度,提高活动对象的复用程度。
(2)活动对象以一状态机来控制其行为,通过状态图将控制逻辑图形化。使得重构的分析和设计更加便捷和清晰。避免了阅读控制逻辑复杂代码和大量描述文档的繁复和耗时,从而可以节省时间,提升效率。
(3)活动对象的实现采用了抽象和继承(图4),复杂的逻辑运算均已被抽象的CActive类实现,活动对象只实现通过状态处理函数实现对事件的处理(图6)。从而使得重构后创建新的活动对象和修改已有活动对象更加容易。
[1]Koren Y,Heisel U,Jovane F,et al.Reconfigurable Manufacturing Systems[J].Annals of the CIRP,1999,48(2):527-540.
[2]王涛,刘清建,王太勇,等.具有3层重构能力的可重构数控系统[J].中国机械工程,2011,22(2):197-201.
Wang Tao,Liu Qingjian,Wang Taiyong,et al.Research on Three-ply Reconfigurable CNC System[J].China Mechanical Engineering,2011,22(2):197-201.
[3]魏仁选,周祖德,陈幼平,等.可重用面向对象数控软件及其开发环境研究[J].华中理工大学学报,1999(3):19-21.
Wei Renxuan,Zhou Zude,Chen Youping,et al.Study on Reusable Object-oriented CNC Software and Its Development Environment[J].Journal of Huazhong University of Science and Technology,1999(3):19-21.
[4]文立伟,王永章,路华,等.基于开放结构控制器的可重构数控系统[J].计算机集成制造系统-CIMS,2003,9(11):1483-1489.
Wen Liwei,Wang Yongzhang,Lu Hua,et al.Recon Figurable CNC System Based on Open Architecture Controller[J].Computer Integrated Manufacturing Systems,2003,9(11):1483-1489.
[5]齐继阳,竺长安,王欢.基于USB和组件技术的可重构数控系统的研制[J].制造技术与机床,2007(12):17-20.
Qi Jiyang,Zhu Changan,Wang Huan.Development of Reconfigurable CNC System Based on USB and Component Technologies[J].Manufacturing Technology & Machine Tool,2007(12):17-20.
[6]王太勇,李波,万淑敏,等.基于现场总线的可重构数控系统的研究[J].计算机集成制造系统,2006,10(12):1662-1667.
Wang Taiyong,Li Bo,Wan Shumin,et al.Reconfigurable CNC System Based on Field Bus[J].Computer Integrated Manufacturing Systems,2006,10(12):1662-1667.
[7]OMG.OMG Unified Modeling Language(OMG UML),Superstructure(v2.4.1)[EB/OL],(2011-08-06)[2011-10-01].http://www.omg.org/spec/UML/2.4.1/Superstructure/PDF
[8]Miro Samek.PRACTICAL UML STATECHARTS IN C/C++,Second Edition[M].Burlington:Newnes,2008.
[9]李霞,王永章,梁宏斌,等.有限状态机在开放式数控系统中的应用[J].计算机集成制造系统-CIMS,2005,11(3):428-432.
Li Xia,Wang Yongzhang,Liang Hongbin,et al.Finite State Machine Application in Open CNC[J].Computer Integrated Manufacturing Systems,2005,11(3):428-432.
[10]Chito S,Michael J,Wang Shige,et al.Specifying Reconfigurable Control Flow for Open Architecture Controllers[J].Proceedings 1998Japan- USA Symposium on Flexible Automation,1998,7(2):659-666.
[11]Harel D.Statecharts:A Visual Formalism for Complex Systems[J].Science of Computer Programming,1987,8(3):231-274.