位控输出模块的优先级别最高,运行过程中不允许其它模块中断。同时,它的运行周期必须匹配于伺服驱单元的运行周期。因此,将其设计成周期性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硬实时性的基础上,完成数控软件模块化设计,并通过实验验证其正确性。在未来研究中,应重点开发其它曲线的插补模块,同时应进一步优化任务周期、优先级以及缓冲区的选择,减少系统对由于参数选择不当引起的异常任务的响应。