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所示。
图1 VxD中断处联流程
我们关注的是系统中断的实时性,从而有必要了解这个中断的响应时间。显然,执行上面描述的这个过程是需要时间的,我们把硬件产生一个中断信号请求服务开始,到。环的设备驱动程序响应中断,并执行中断服务程序ISR之间的这段时间称之为中断延时。中断延时中最大的部分来自于中断自身,当82:59通知CPU发生了硬件中断时,CPU自动屏蔽中断,直到中断服务程序重新打开中断屏蔽。如果当前的中断还没有处理完,新产生的中断会被CPU忽略直到再次允许中断,这样就会导致不确定的中断延时。如果硬件设备过于频繁地产生中断,也会导致中断延时的增加。所以这个时间间隔对于硬件和软件设计都是非常重要的。对于硬件,中断延时决定了硬件产生中断并可以得到正确响应的最高频率。如果硬件产生中断的频率高于此频率,则系统肯定工作不正常,甚至于死机。所以我们在设计触发中断的硬件电路时必须兼顾到这个方面的问题。软件方面,设备驱动程序应该发掘操作系统和硬件的潜力,使延时尽可能地小。这就体现在所设计的驱动程序的效率问题上,因为它将直接影响到数控系统插补周期的时间。在中断服务子程序中,我们提倡尽量用优化的软件结构,以汇编语言编写来确保在规定的插补周期内完成这类强实时性任务。
为了测定中断响应时间,我们用汇编语言编写了虚拟设备驱动程序来实现对外部中断信号的响应,并设计了一块基于1SA的插件板,用以产生脉冲中断信号送CPIT。其上设有一个高精度定时器8253、一个脉冲频率发生器和一个中断发生器。考虑到硬件匹配的需要我们选用20 MH:的晶振,由它产生的晶振周期是50ns。比如一个主频为500 MHz Pentium处理器的
一个指令周期是2 ns,对于它,使用这个插件板可以大致测量到几十、几百个指令的时阀。设计该程序的思路是这样的:先关闭8253 GATEl,把8253设置在方波发生器模式,写入初始簸0FFFFH;打开8253 GATEl,使定时器开始工作;开中断并触发中断。在中断服务子程序里安排一个关闭8253 GATEl的操作,使定时器停止计数;并读出当前8253计数器中的数值,把初始值减去这个数值的结果再乘以50便是当前系统环境下程序中断响应的时间了。
利用这个方法,我们分别在不同主频和Windows98系统、Windows2000系统的空闲状态下分20次为一组测量。
这个实验结果表明,这些响应时间都是微秒级的,使用外围设备的硬件中断来实现实时控制能够达到控制要求。同时我们还注意到同一主频下,Win98比Win2000的响应时间略短一些,我们初步分析认为这是由于系统处理中断过程的差异性造成的。
3 利用Windows多线程技术实现实时多任务
我们把插补计算和位置控制放在前台的实时中断服务子程序中去完成,通过变量和寄存器进行前后台的信息交互。那么剩下的}h作就是组织全软件数控系统后台的处理工作了,这时应当合理充分利用Win-down的多线程技术来展现全软件数控系统控制的灵活性和强大功能。设计中,为便于人机交互的工作,以用户界面线程作为主线程,利用多线程将“CPU资源分时共享”的特点,将有并行要求的模块比如程序编辑模块、参数设置模块、图形仿真模块等置于独立的线程中,实现系统的多任务并行工作。考虑到在信息处理过程的轻重缓急,需要设置线程的优先级别,比如限位报警线程要高于其他线程,加工代码解释及预处理线程要高于图形仿真线程等等。基于进程的不同基础优先级和可能的线程优先级,一共有22个不同优先级值,它们分布在1和31之间,数值越大,优先级越高。
多线程之间须要考虑同步,它有四种方法,分别是:互斥量、临界段、信号量和事件。比如事件同步是通过把事件设置为有或者无信号状态来通知其他线程关于某操作己完成或者仍未完成。线程的具体实现原理是首先在头文件里声明一个事件对象,然后在初始化对话框中使这个事件对象处于无信号状态。下面以手动运行为例说明。当在手动运行按钮事件中无限循环输出脉冲的时候,每次循环都判断这个事件对象是否有信号,如果没有,程序继续运行,如有信号,则退出循环。而使这个事件对象处于有信号状态的操作就在手动复位按钮事件中写出。由于篇幅所限,相关程序代码从略。
在辅助线程响应的时候,数控系统最好是要求CPU能快速响应用户发出的消息,所以优先级别应设得较高。可以通过函数Set'ThreadPriority ( HA}DL.E <>hThread , iut nPriority)来设置线程优先级。在这里把nPriority设置成THREAD_ PRIORITY_ HIGHEST,就可以满足系统的实时性要求。
4 结语
在机械制造加工中,数控软件的设计很重要的一个方面是实现连续加工控制的实时性。我们以VisualC++6. 0作为开发工具,在Windows2000平台下,充分利用PC的硬件功能,通过编写VPICD虚拟设备驱动程序来提供实时中断并结合Windows多线程机制较好地解决了全软件开放式数控系统实时控制问题,并对我们己开发的一套数控系统作了这方面进一步的改进,取得了比较明显的成效。
(审核编辑: 智汇胡妮)