Windows环境下数控软件实时控制的实现

来源:互联网

点击:1247

A+ A-

所属频道:新闻中心

关键词:数控软件 实时控制CNC

    引言

      自1952 年第一台数控机床诞生以来,数控系统已经历了两个阶段和六代的发展。进入90 年代后,基于个人计算机(PC)的数控系统(简称PCNC)成为第六代数控系统的代表。作为CNC 发展的主要方向,PCNC 有成本低、开放性强、软件开发环境完备、软件资源丰富和良好的通讯功能等特点。从组成类型来看,目前“软件NC”和“NC 嵌入PC”是PCNC的主流形式。所谓“软件NC”,就是“CNC 的功能处理全产由PC 进行,并通过装在PC 扩展插槽中的接口卡对伺服驱动进行控制。其优点是编程处理相当灵活,数控软件的通用性强。缺点是实时处理比较困难,可靠性待进一步研究。目前,实时处理能力是制约PCNC 展的重要因素。在PC 的操作系统中,MS - DOS 是一个非实时单任务内核,Windows95 并不实时能系统的数控实时性能只能依赖系统设计和程序设计来保证。

    1 数控软件的实时性

      PCNC 软件系统一般都包括:读取处理后的NC文件→译码→轨迹插补计算→伺服控制这样一个基本的加工循环,在未运行完最后一条NC 语句前,该循环将一直进行。显然,丙次循环之间总存在一定的时间间隔,而时间间隔的长短需要根据实际加工对实时性的要求来确定。

      对于控制精度要求不高的情况可以直接用Windows的计时器计时,在达到设定的时间后,计时器发出WM-TIMER 消息到应用程序的消息对列中,如果将上述循环程序放在WM-TIMER 消息的处理函数中,就可以方便地实现定时。但这种方法存在两个问题:一是WM-TIMER 消息的优先级比较低,只有当系统处理完消息队列中优先级较高的消息后,才会处理WM-TIMER 消息;二是计时器是以PC 硬件的时间中断次数来确定计时的长短,而时间中断的周期是以系统电子钏的时间为基准,固定54.95ms。由此可见,计时器的实际地精度大于55ms,只能用于实时性求不高的场合。

      大多数情况下,计时器都不能满足要求。为了增强控制程序的实时性,可以采用软件延时的方法,即在上述循环中放一段延时语句。对于毫秒级的延时精度,可通过调用Windows 的API 函数timeGetTime来实现,该函数采用了基于BIOS 的时间基准。以下是VC + + 中实现毫秒级延时的例子。

      void deIaytime(int timdeIay)  {DWORD m-timerI;  m-timerI = timeGetTime()  whiIe((timeGetTime() - m-timerI) < timdeIay  }

      timeGetTime 函数能实现毫秒级的延时,与计时器相比,时间精度得到了一定的提高。但毫秒级的时间精度并不能完全满足数控加工的要求。为了进一步提高时间精度,可以通过执行循环程序来实现(如用for 语句)。但这种情况下,循环次数不仅与延时的时间长短有关,还与计算机的硬件配置(如主频等)有直接联系。所以这种方法的最大弊端就是程序的移植性很差。

      如前所述,从时间精度的角度来看,计时器只能用于控制精度不高的场合,多数情况下需要用timeGetTime 函数或执行循环程序的方法。从获得精确时间的方式来看,计时器以硬件中断为基础,不&ldquo;独占CPU&rdquo;,而timeGetTime 函数和执行循环程序采用了延时的方法,程序在执行的过程中将&ldquo;独占CPU&rdquo;。如果应用程序仅有一个线程,即用户界面线程,一旦CPU 被&ldquo;独占&rdquo;,程序将无法接收、处理用户输入的消息和事件,这显然不能满足设计要求,所以必须考虑引入多线程。(注:由于Windows 是基于消息的多任务操作系统,这里的&ldquo;独占CPU&rdquo;并不表示一直完全占有CPU,而是表示在执行该线程的时间片内独占CPU,而其它时间片CPU 并非由该线程占有。)

    2 多线程

      VisuaiC + + 中的线程分为用户界面线程(UserImterface Thread)和工作者线程Worker Thread)。用户界面线程的特点是拥有单独的消息队列,具有自已的窗口界面,能够对用户输入的事件和消息做出响应。工作者线程一般用于处理后台任务,仅由一个函数体实现,不处理窗口。

      在拥有多个线程的应用程序中,当两个或更我的线程同时访问同一数据时,就会导致不可预知的结果,因此必须保持线程间的同点。Visuaic + + 中有四种同步方法:临界段、信号灯、互斥量和事件。事件同步是通过将事件本身设置为有信号或无信号来通知其他线程某一操作已完成或尚未完成。下面以实现M01功能为例,介绍在数控软件中使用多线程和事件同步的方法。

    3 实现M01功能

      M01&mdash;计划程序停止。该指令的作用是:在操作面板上预先按下&ldquo;任选停止&rdquo;按钮,当执行完M01指令之后,程序停止,主轴停转,进给停止,冷却工作者线程流程图液关闭,加工停止。

      如果不按&ldquo;任选停止&ldquo;按钮,则M01指令无效。在加工停止后,如果重新按下&ldquo;循环启动&rdquo;按钮,则继续加工。如果仅用用户界面线程,当控制精度很高,采用了延时程序时, 循环指令将会&ldquo;独占CPU&rdquo;,从而导致用户界面线程不能处理用户输入的事件和消息,无法实现人机交互。解决的方法是将含有轨迹插补的循环指令放入一个工作者线程中,将各种实现人机交互的按钮(如&ldquo;任选停止&rdquo;按钮)放在用户界面线程中。这样,尽管工作者线程一直&ldquo;忙&rdquo; 个不停,但用户界面线程却&ldquo;闲&rdquo;着,能够及时响应用户输入的事件和消息。当用户界面线程接收到用户输入的事件和消息后,通过线程同步,就能使工作者线程实现预定的操作实现M01功能的具体方法如下:

      首先在&ldquo;任选停止&rdquo;按钮和&ldquo;循环启动&rdquo;按钮的ciick(单击)事件的响应函数中分别设置某一事件有信号,然后在工作者线程的扦环体内检测相应事件是否有信号,并根据检测的结果做出相应的处理。需要做的工作是:定义两个事件,创建一个工作者线程,并建立工作者线程的控制函数体。程序流程如图所示,主要代码如下:

      其中,AfxBeginThread 为启动工作者线程的全局函数,该函数创建并初始化CwindThread 对象、启动并返回线程的地址。

      控制函数用于定义线程。进入控制函数时,线程启动;退出时,线程终止。以上控制函数中Deaiedatathread为控制函数名,参数param 是一个32 位值。该参数在创建线程对象时传递过来。工作者线程的控制函数体如下:

      最后在&ldquo;任选停止&rdquo;按钮和&ldquo;循环启动&rdquo;按钮的click(单击) 事件的响应函数中分别设置gpauseevent 和g starteevent 有信号即可,可通过以下两条语句实现。

      g pauseevent. SetEvent(); / / 设置停止事件为有信号  g pauseevent. SetEvent(); / / 设置启动事件为有信号

    4 结束语

      多线程和事件同步能有效地解决数控软件实时控制中存在的&ldquo;独占CPU&rdquo;的问题,实现人机交互。本文介绍了一种易于实现的简便方法。

    (审核编辑: 智汇胡妮)

    声明:除特别说明之外,新闻内容及图片均来自网络及各大主流媒体。版权归原作者所有。如认为内容侵权,请联系我们删除。