1 问题的提出
全软件数控系统以通用Pc+标准规范的I/O信号转接器的模式实现。整个系统是由PC扩展而成,数控系统所有的实时任务和非实时任务都由PC完成,能实现NC内核的功能开放并支持上层软件的用户定制,是一种真正意义上的开放式数控系统。其控制通道为:PC通过总线控制每一个I/O端口,I/O端口与各个控制目标相连。近年来,发展通用的全软件开放式数控系统已成为国际数控行业研究的热点,代表着数控技术发展的最新潮流。
与传统的基于Pc的数控系统的结构相比,全软件数控系统不仅要解决插补运算和位置控制的软件化问题,还应以开放的NC内核作为其主要特征之一。同时系统所选择的运行环境必须能及时响应数控系统的实时性任务,否则系统响应的实时性不够会导致在自动加工过程中出现断续等不稳定现象。然而作为目前主流操作系统的Windows产品并不支持实时陛要求很高的实时任务的调度管理,从而,如何对Windows操作系统进行强实时功能的扩展以及合理应用Windows多线程技术来解决系统的实时多任务成为实现全软件数控系统的关键问题之一。
2 系统实时控制方案的分析比较
高速、高精度的数控加工首先要求的是极短的插补周期和高的计算精度,而且插补精度越高,所需要的插补周期就越短。Windows最初并不是作为实时操作系统而设计的,它是一种抢占式、多任务、基于消息传递机制的操作系统。但是仅凭消息调度机制显然是不能满足全软件数控系统的实时控制要求的,目前在这方面的研究中讨论较多的是采用有效的实时中断方式来解决诸如插补和位控之类的高实时性问题。为具体量化数控系统的实时性要求,这里以脉冲增量式插补的数控系统为例来计算一个插补周期的时间。假定系统脉冲当量为0.001 mm,系统COO的最大进给量设置为10 000 mm/min。可以算得:在COO恒速进给时插补周期是6斗s,也就是说要求系统每隔6μs并在6μs内要完成一次插补计算并输出一组脉冲信号,这个脉冲周期是微秒级的,对操作系统的实时响应要求比较高。下面我们来分析几种中断控制的方案。
2.1 利用WINDOWS系统定时器SetTimer()定时产生中断
对于Windows系统定时器,其本身就是通过截取DOS的08H硬件中断来实现的,该中断约每秒钟发生18+2次,器§时间阅隔为54.945 ms。在上鼷应用程序中可以通过调焉SetTimer函数为程序分配一个定时器,在一个时间间隔之后,Windows将向应用程序发送一个WM_TIMER消息,但它被认为属于不太熏要的消息而放在常规消息队列中的最后,而且当队列中有多条WM_TIMER消息时,系统会把所有的WM_TIMER消怠合并成一条WM_TIMER消息。
由此可见,简单的依靠Windows系统定时器提供的时钟消息,应用程序不一定能够按照SetTimer设定的时间间隔得到响应,更何况,即使能得到响应,这个毫秒级的响应周期也是远远不能够满足实时控制要求的。
2.2 剃用程序软件定对产生中断
通过在上瀑应用程泞中进行软件延时的方法可以获得比较高精度的插补周期。但是由于Windows操作系统是多任务并行进行的,在软件延时的时候,它和中断服务程序并不是异步进行的,CPU也不是究全被独占,这样会导致插补周期的间隔时间不稳定。经过简单的程序调试(比如用for语句获德每隔一定时间延后启动一个中断输盛脉冲的程序),我们发现输出的脉冲波形较之于理想状态有抖动现象,在正常加工中这是不允许的;而且这种情况下,由程序软件延时所获得的插补周期与计算机的硬件配置(如主频等)有直接联系,导致程序的移植性必将受到影响。我们也不提倡采用这种方案。
2.3 利用CreateSystemTimer()定时产生中断
CreateSystemTimer()用到Windows的SYSTEM.DRV驱动程序中的系统计时器函数,这几个函数虽然没有被写入Windows.h中,但却被SYSTEM.DRV输出了。这些函数可以帮勘我们获得计时器服务,即系统计时器。这其中最重要一点是CreateSystemTimer()和KillS)rstemTimer()这两个函数允许我们安装异步计时器的回调函数,有些类似于在DOS环境中截取INT08H中断处理程序。这个回调是真正异步的,完全避开了Windows的消息工具。但这种方法获得的定时精度仍然是只有毫秒级鹣,所以在需要高速赢精度加工数控系统中,还是不能够胜任。
2.4 使用外围设备的硬件中断实现实时控制
由于Windows 9x及其以上的操作系统具有保护机制,工作在CPU的用户态(3环)程序是不能直接对系统硬件进行操作的,所以中断的处理只能在CPU的特权态(0环)进行。对予Windows操作系统下的外匿
设备的硬件中断,它的实现涉及到虚拟设备驱动程序VxD。Windows系统的控制实权掌握在虚拟级管理器VMM(Vinue Machine Manager)帮虚拟设备驱动程痔VxD手中,两显VMM黧VxD的操作模式帮真正酶程序不阉。在大多数时候,它们是潜伏的。一般应用程序在系统中运行时,这些VxD程序不会被激活,只有当某些需要它们处理的硬件中断/错误/事件发生时,它们才被唤醒。Windows系统为可编程中断控制器8259安装了驱动程序VPICD(Viaue Programmable InterruptController),并通过相关服务达到允许其它VxD利用硬中断的目的。VPICD负责映射中断信号到虚拟机,并模拟相应的I/0来识别虚拟机发出的中断请求。
有了上述硬件中断的可行性,我们接下来简单分板一下VxD的中断处理浚稷。Windows启动时,它初始亿中断描述表IDT(Interrupt Descriptor Table),中断是由虚拟拟机管理器VMM处理的。当发生中断时,VMM和一个叫做虚拟可编程中断控制器VPICD的VxD协调工作。后者虚拟化了PC机中的双8259A PIC。发生中断时,VMM接管控制,然后VMM通知VPICD这个中断事件,希望虚拟此中断的VxD,当VPICD接收到巢一中断事件时,就会通知登记到此中断的VxD。这个流程如图1所示。
我们关注的是系统中断的实时性,从而有必要了解这个中断的响应时间。显然,执行上面描述的这个过程是需要时间的,我们把硬件产生一个中断信号请求服务开始,到。环的设备驱动程序响应中断,并执行中断服务程序ISR之间的这段时间称之为中断延时。中断延时中最大的部分来自于中断自身,当82:59通知CPU发生了硬件中断时,CPU自动屏蔽中断,直到中断服务程序重新打开中断屏蔽。如果当前的中断还没有处理完,新产生的中断会被CPU忽略直到再次允许中断,这样就会导致不确定的中断延时。如果硬件设备过于频繁地产生中断,也会导致中断延时的增加。所以这个时间间隔对于硬件和软件设计都是非常重要的。对于硬件,中断延时决定了硬件产生中断并可以得到正确响应的最高频率。如果硬件产生中断的频率高于此频率,则系统肯定工作不正常,甚至于死机。所以我们在设计触发中断的硬件电路时必须兼顾到这个方面的问题。软件方面,设备驱动程序应该发掘操作系统和硬件的潜力,使延时尽可能地小。这就体现在所设计的驱动程序的效率问题上,因为它将直接影响到数控系统插补周期的时间。在中断服务子程序中,我们提倡尽量用优化的软件结构,以汇编语言编写来确保在规定的插补周期内完成这类强实时性任务。