基于Linux-RTAI的数控软件结构设计与实现

来源:互联网

点击:1776

A+ A-

所属频道:新闻中心

关键词:数控软件 数控系统

      Linux是一个遵循可移植操作系统接口(POSIX, Portable Operating System Interface)标准的多用户、多任务且具有先进的网络特性开源操作系统。基于模块化设计思想在开放的软硬件平台上开发适合一定需求的专用数控系统,已成为数控领域的一个研究热点。虽然2.6以后的内核版本是可抢占的,但实时性仍比较弱,而数控系统本身要求有明显的实时控制、实时交互和实时监测等特性。本文首先将RTAI移植到Linux OS,使系统达到了强实时的要求,而后在此平台上完成了数控软件的体系结构设计。

    1 实时Linux的实现

      提高Linux实时性,目前有两种方法:1)直接修改Lint内核,如:Montavista; 2 )在Linux内核之上增加实时模块,采用双内核结构,如:RTAI。

      前一种方案对开发人员的技术要求较高,需要修改大量的代码,开发效率低。RTAI是一个遵循GNU的开源项目。RTAI采用双内核方法,不直接使用Lint的任何功能,而是把实时任务写成一个驱动程序的形式,然后直接用PC时序芯片所产生的中断调用这个驱动程序。RTAI在Lint上定义了一个实时硬件抽象层(RTHAL, Real Tirne Hardware Abstraction Layer),并针对RTAI开发了LXPT,让RTAI可以调用Lint本身的系统调用功能。RTHAL的作’用是使RTAI能够在实时任务需要运行的任何时刻中断。引入RTAI后,Linux仅作为优先级最低的任务运行,并且只有在没有实时任务时它才能执行。这样做的好处在于将直接修改Linux核心的代码减到最小,这使得将RTAI移植到Linux内核的工作量减至最低。

      本文以PIV 2.0GHz, S12MB RAM的通用PC机作为硬件开发平台,以Red Hat 9为操作系统平台,将3.5版本的RTAI移植到版本为2.6.15.2的Linux内核中测试操作系统实时性能,测试结果显示,无论是内核层还是用户层都能够满足数控系统实时性的要求。需要特别指出的是,许多不可测因素会导致调度器的运行时间变的不确定,继而使接下来的任务的开始时间发生相应的变化,即产生了调度抖动。调度抖动对于基于通用处理器的实时系统来说是不可避免的。经试验测定,上述开发平台的调度抖动时间在50 ms左右,能够满足数控系统的需要。

    2 系统的软件结构设计

      以集成RTAI实时内核的Linux操作系统为开发平台,基于模块化思想将数控软件按照实时性的要求分为用户层模块和内核层实时模块两部分。所有与实时相关的任务都运行在内核层下,且用一个独立的内核进程来执行;所有非实时进程运行于用户层下,它们不能打断实时进程的运行。同时两大模块又划分为不同的子模块。采用这种模块化结构,实质是将功能分配给组件,这有利于软件测试、系统维护以及增加新功能。该软件体系结构如图1所示。

    图1数控软件体系结构

      2.1 系统实时模块的实现

      数控软件的主程序由插补预处理任务、插补任务、位置控制任务、I/O控制任务和状态监测任务(图1中未全部给出)等组成。本文将以上任务分别作为一个内核进程,每个进程编译成后缀为.0的模块。数控加工过程中,G代码是顺序执行的,每一个模块读取前一模块的数据,而将处理得到的数据输出给后一模块使用。首先,插补预处理任Pre-inter-polate ( )从I/O缓冲区中读人G代码,将代码解释为插补模块可识别的数据结构,送入到预处理数据缓冲区prepare-fifo。而后,插补任务interpolate ( )从预处理数据缓冲区prepare-fifo中取出数据,然后进行插补运算,将结果送interpolate-fifo()。最后,位置控制任务motor( )周期性地从插补缓冲区interpolated-fifo计算出下一周期的实际坐标增量,输出到位控数据缓冲区供伺服驱动单元(位控输出模块)使用。

      位控输出模块的优先级别最高,运行过程中不允许其它模块中断。同时,它的运行周期必须匹配于伺服驱单元的运行周期。因此,将其设计成周期性RTAI进程,运行周期为20 ms,l级优先权(级别越小,优先级越高)。预处理模块、插补模块和位置控制模块的运行较之于位控输出模块都要快得多,因此将他们的周期设置为5 ms,优先级别依次为4级、3级和2级。

      采用基于优先级抢占的进程调度策略,实现对数控模块的实时调度。当位控数据缓冲区的数据量小于缓冲区大小一半时,位控输出模块挂起自身,唤醒次高级的模块(位控模块);以此类推,当插补数据缓冲区的数据量小于缓冲区大小一半时,位控模块就挂起自身,唤醒次高优先级模块(插补模块)。

      此外,在数控加工过程中,功能控制任务control()利用FIFO从用户层向内核层传递控制命令,如点动、暂停和自动等,并实现对I/O口的控制。状态检测任务monitor()将传输到I/O口的各个阀门,压力表状态保存在status-fifo中,同时负责对运行时水压和电流等值状态进行判断,实时监控机床运行状态,对机床故障进行实时响应。这些任务采用实时中断策略,由中断信号触发相应的模块。

      实时模块在数控软件启动时就加载到Linux内核中,实时进程和函数就可以访问系统的底层资源。实时任务模块由init-module()和cleanup -module()两个RTAI函数声明实现,并且可以通过这两个函数进行资源分配和回收。

      2.2 模块间的通信

      数控软件各模块之间需要大量的数据通信。归纳起来,主要有三类:

      (1)非实时进程间通信

      这类通信主要存在于人机交互界面中,用于编辑加工代码、设置机床和系统的初始值等,采用管道、消息队列、共享内存、信号等实现。

      (2)实时与非实时进程间通信

      这类通信主要完成插补主程序与系统界面的人机交互,动态模拟刀具轨迹,显示加工状态,采用实时管道FIFO和共享内存。

      (3)实时进程间通信

      这类进程主要完成数控主程序模块之间的通信,采用FIFO和共享内存的方式进行通信。

      数控模块通过调用RTAI接口函数ttf-create ( )来创建实时管道FIFO,实现数据传输,实时管道创建后在目录/dev下生成字符设备文件/devlrkf" oLinux进程通过对这些文件的操作实现对实时管道的操作,调用。pen ( ) , read ( )和write ( )实现管道打开、读和写操作,调用select()和poll()实现异步I/OoFIFO的通信是单向的,因此模块间的信息交互必须至少创建两条管道才能实现。

    3 应用实例

      目前,经济型数控系统仅具有直线和圆弧插补功能。针对这一现状,课题组研究了二次曲线(直线、圆、椭圆、抛物线和双曲线)的插补方法,编写了直接插补直线、圆、椭圆、抛物线和双曲线的模块,将软件应用于三坐标数控铣床的控制,进行了轮廓曲线的加工试验,如图2所示。

      对于一条二次曲线(直线、圆、椭圆、抛物线或双曲线),数控软件仅需调用相应的加工模块一次,即可完成加工。而渐开线、摆线等复杂曲线的加工,可以应用直线、圆、椭圆、抛物线或双曲线进行拟合,编写数控加工程序代码进行加工。数控软件首先读取加工程序代码,并根据插补预处理模块的输出信息,自动调用相应的插补模块完成加工。

      实验结果表明,数控软件采用优先级抢占的调度策略实现了对数控加工任务的实时调度,能够流畅地运行在Linux-RTAI强实时性平台上,完成对三坐标铣床的控制。

    4 结束语

      本文在实现Linux硬实时性的基础上,完成数控软件模块化设计,并通过实验验证其正确性。在未来研究中,应重点开发其它曲线的插补模块,同时应进一步优化任务周期、优先级以及缓冲区的选择,减少系统对由于参数选择不当引起的异常任务的响应。

    (审核编辑: 智汇胡妮)

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