APP下载

基于嵌入式linux的数控系统软件设计

2012-07-04芬,常勇,王

制造业自动化 2012年9期
关键词:实时性数控系统内核

李 芬,常 勇,王 威

LI Fen1,CHANG Yong2,WANG Wei2

(1.烟台工程职业技术学院 数控技术系,烟台 264006;2.北京机械工业自动化研究所,北京 100120)

0 引言

数控技术是发展尖端工业的使能技术和基础装备,数控系统作为数控车床的大脑,其性能直接影响甚至决定着机床的整体性能。数控机床既是高新技术专业不可缺少的基础装备,又是传统产业更新换代的重要手段。随着半导体技术的飞速发展,数控系统逐渐朝嵌入式方向发展。嵌入式系统是近年发展最快的技术之一,它是以应用为中心,以计算机技术为基础、软硬件可裁减,适应应用系统对功能、可靠性、成本、体积、功耗等综合性严格要求的专用计算机系统。目前市面上主流的经济型数控系统如广州数控的GSK980TDb和北京凯恩帝K90Ti等都是使用了ARM处理器构建的嵌入式数控系统。

本数控系统硬件平台分为两大组成部分:ARM 子系统和 FPGA 子系统,采用主从式的两级插补结构。ARM 子系统采用三星S3C2410处理器,主要用于粗插补计算,以及键盘、显示和D/A转换等管理工作。FPGA 子系统采用Altera 公司的ACEX 系列芯片,主要负责系统的精插补脉冲输出、编码器脉冲计数以及 I/O 控制等工作。

本数控系统软件部分采用Xenomai实时化方案改造标准Linux内核[1],构建基于Xenomai的实时嵌入式操作系统。Xenomai/Linux系统为用户程序提供了内核空间和用户空间两种模式,前者通过系统调用接口实现,后者通过实时内核实现。用户空间的执行模式保证了系统的可靠性和良好的软实时性,内核空间程序则能提供优秀的硬实时性[2]。

1 系统硬件模块设计

数控系统开发的关键是软件部分,为缩短系统开发周期,本系统尽量采用模块化设计,积极利用市场现有的成熟技术。该数控系统按功能模块构架设计,大致划分为如下几个模块:

控制模块:控制模块的主处理器采用市面上流行的三星S3C2410处理器,片上运行嵌入式Linux+Xenomai操作系统,负责信息存储、LCD显示、串口传输、USB 接口的处理,实现译码、文件系统、图形显示和 PLC 等功能。控制模块采用市面流行的MINI2440开发板实现控制功能,该开发小板集成了三星S3C2440微处理器、并使用两片外接的SDRAM芯片,两片共64Mb并连在一起形成32位的数据总线宽度;配备2Mb的NOR FLASH和128Mb的NAND FLASH,支持两种FLASH启动,有利于开发阶段的调试和系统文件的烧写[3]。

键盘模块:采用AVR单片机,负责键盘扫描、LED灯点亮等信号处理,通过串行口与ARM进行通信。

FPGA模块:该模块采用AlTERA的FPGA控制。负责输入输出接口控制、编码器反馈和机床 I/O 信号处理。FPGA模块与键盘模块一起集成设计在核心板上,采用4层板设计,留出各个JTAG接口,利于集中调试和烧写[4]。

电源及接口模块:该模块主要用于核心板和控制板的供电及I/O接口处理。该模块设置在I/O接口板上,该板同样采用4层板设计,配置各种外部连接和调试插头。

各模块组成的数控系统硬件结构如下图所示:

图1 系统硬件结构

2 系统软件模块设计

2.1 数控系统软件平台的选择

数控系统本身是一个复杂的多任务并发的实时应用系统,目前市面上比较流行的实时操作系统有VxWorks、QNX等,这些系统实时性好,但开放性差并且价格昂贵;开源但不免费的uC/OS-II是由美国人 Jean J.Labrosse 先生所编写的实时嵌入式操作系统内核,实时性好并且相当精简,但由于其仅是操作系统内核,针对其内核要进行开发的内容和项目比较多,影响开发进度;因此本系统选用开放性好、移植性强、免费并且开源的嵌入式Linux+Xenomai实时操作系统作为软件平台,该软件平台具有良好的用户态实时性和优秀的内核态实时性,可分别用于实时性不高的软实时任务和实时性要求很高的硬实时任务。

2.2 系统的软件结构

系统软件部分的开发是关乎整个数控系统研发成败的关键。数控系统具备的功能比较多,但其主要功能是解释翻译数控代码,并按照代码要求自动完成工件的加工。自动加工过程主要是完成刀具轨迹的控制,如加减速、插补、位置控制等;其次是一些逻辑控制,如冷却液开关及限位控制等等;除具备主要功能外,数控系统应该具备良好的人机界面等功能。如何合理的布置这些层次结构及划分模块,对整个数控系统的开放性、后期可扩展性以及系统的性能都具有重要意义。结合选用的嵌入式Linux+Xenomai软件平台,综合考虑数控系统的功能需求及多任务之间数据依赖等要求,我们把系统分两层进行开发:用户层和内核层,每层又划分为若干模块和子模块,同层模块相互配合共同完成该层任务,用户层与内核层之间通过命名管道实现数据通信[5]。

用户层:主要提供系统的人机接口界面,人机接口界面内包含有位置界面、程序界面、刀补界面、设置界面、参数界面和诊断界面。人机接口界面为用户提供直观的操作界面及各种加工信息、状态参数和诊断参数等,等待接受用户的操作要求,并将操作要求和数据处理后传递给内核层。

内核层:主要用于内核控制、运算控制、输入输出控制,分算法模块和FPGA模块;算法模块内又分译码、预插补、插补、位置控制、加减速控制、PLC控制等子模块。每个子模块都是一个单独的线程,子模块之间通过消息队列进行通信。内核层中的算法模块是整个系统的核心,它进行的都是实时性要求很高的插补、加减速、位置等控制任务,实现毫米级甚至微秒级的间隔周期;决定着系统的整体性能。FPGA模块用于直接控制硬件芯片,完成输入输出控制。算法模块和FPGA模块均设计为内核模块中,系统启动时,直接加载到实时内核中。

具体划分如图2所示:

图2 系统软件结构和模块划分

3 系统软件详细设计

3.1 用户层与内核层的通信设计

用户层与内核层在嵌入式Linux系统中属于两个相对独立的空间,两个空间之间不能直接进行通信和数据交换。嵌入式Linux系统进行Xenomai实时化改造后,管道通信、消息队列和共享内存等全部保留。用户层与内核层通过管道通信进行连接,在内核层建立管道后,在用户层可以通过读取设备文件进行管道读写。

内核层创建及读写管道如下:

int rt_pipe_create (RT_PIPE *pipe, const char*name, int minor,size_t poolsize);//创建管道

ssize_t rt_pipe_receive (RT_PIPE *pipe, RT_PIPE_MSG **msgp, RTIME timeout);

//从管道接收一条信息;

ssize_t rt_pipe_send (RT_PIPE *pipe, RT_PIPE_MSG *msg, size_tsize, int mode);//向管道发送一条信息用户层读写管道如下:int Pipe0 = open("/dev/rtp0",O_RDWR);//打开管道文件

int write(int handle, void *buf, int nbyte);//向管道文件写入数据

int read(int handle, void *buf, int nbyte);//读取管道文件数据

3.2 用户层的设计

友好的人机界面是数控必须具备的功能,用户层的主要任务就是提供人机交互界面。通过比较市面上流行的GUI开发软件Qt/Embedded、MiniGUI、UC/GUI和Nano-X,结合Linux特性,本数控系统选用Qt/Embedded进行界面程序的开发。Qt/E是一个完整的基于framebuffer[6]的GUI系统,它用C++编写,对用C语言程序有很好的兼容性,有着丰富的API函数库和图形处理功能,界面开发与图形驱动分开,易于开发和移植,同时它也是开源软件。

设计过程中,根据用户层的划分,把位置、刀补、程序等界面采用单独的QWidget设计,每个界面都有自己的头文件和cpp文件,所有界面公用一个数据结构,将各个界面通用的参数放到一起,设置一个主Mainwindow,用于系统初始化、界面切换、变量初始化以及加载系统信息等功能。主界面中对按键的处理也是相当重要的,开发过程中充分利用Qt中的按键事件,设计过程中区分按下及释放事件,并单独编写按键更新程序。具体如下:

void mainWindow::keyPressEvent(QKeyEvent *k)void mainWindow::keyReleaseEvent(QKeyEvent *k)void mainWindow::keyUpdate()

用户层设计过程中着重要考虑的就是各个界面之间的通信问题,各界面之间充分利用Qt特有的信号与槽的通信机制,在界面之间进行信号发送和槽函数调用。具体实现如下:

signals: void mySignal(); //信号

public slots: void mySlot(); //槽函数bool QObject::connect ( const QObject * sender,const char * signal, const QObject * receiver,

const char * member );//信号与槽函数的连接

程序中可以通过emit();函数发出signals,调用与信号连接的槽函数。

3.3 内核层的设计

系统软件设计的关键仍然是内核层的设计,内核层满足硬实时任务的要求,将系统的插补算法、加减速算法以及位置控制算法等集成在一起;对于各个数控系统厂家,其插补算法和加减速控制算法都被列入公司核心机密,由此足以看出内核层设计的重要性。

内核层的软件设计采用内核模块直接挂载到系统内核中,FPGA模块直接针对硬件用于输入输出数据传输,并且输出内核符号供算法模块直接读写FPGA设备。算法内核模块中采用多线程设计,将预插补、插补、加减速、位置控制、PLC控制、手脉控制、译码控制以及显示控制等采用单独的线程进行设计,各线程之间通过命名管道和消息队列进行数据交换。每个线程设立独立的运行周期,周期设定必须满足系统功能的需要,本系统插补周期设定为2ms。显示控制用于读取缓冲区数据,发送给用户层进行屏幕显示,其设定周期满足基本显示需要即可,本系统设定为200ms。以显示线程为例,实现功能的部分函数具体如下:

void LCDDisp(void *cookie)

rt_task_set_periodic(&display_task,TM_NOW,200*1000000); //设置任务运行周期

for( ; ; )

{rt_task_wait_period(NULL); //挂起任务到下个周期再运行;

/* 显示线程实现代码*/}

算法模块在加载到内核模块时,首先要做的就是进行模块的初始化,初始化过程中需要把内核层之间通信以及内核层与用户层通信所需要的命名管道和消息队列等创建完毕,内核层各线程之间可以通过读写管道和消息内存完成数据交换。实现函数如下:

ssize_t rt_pipe_write (RT_PIPE *pipe, const void*buf, size_t size, int mode)

ssize_t rt_pipe_read (RT_PIPE *pipe, void *buf,size_t size, RTIME timeout)

//管道读写数据

int rt_queue_read (RT_QUEUE *q, void *buf,size_t size, RTIME timeout)

int rt_queue_write (RT_QUEUE *q, const void*buf, size_t size, int mode)

//消息队列读写数据

4 结束语

经济型数控系统的软件仅包括基本的x轴和z轴直线插补、圆弧插补等功能,属于低端产品,开发过程较短,开发难度也较低,本系统软件开发过程中综合考虑了经济型数控系统的特点,迅速快捷的进行开发,同时也预留了后期软件升级为x轴、z轴和y轴三维插补的接口。设计过程中为系统人机界面部分也仅是满足基本的需求,后期开发过程中仍然需要进一步的丰富和完善,尤其是在U盘文件处理和串口通信方面;但系统现有开发的功能完全可以满足旧机床的数控化改造需求。

[1] 韩守谦,裴海龙,王清阳.基于Xenomai的实时嵌入式Linux操作系统的构建[J].计算机工程与设计,2011,32(1):96-98.

[2] 陈曾汉,张鹏,晏来成.基于Xenomai的实时测控系统的研究与实现[J].计算机应用与软件,2009,26(5).

[3] 广州友善之臂.mini2440用户手册.20110421版.

[4] 孙程建.基于Linux的嵌入式数控系统底层软件设计[D],武汉科技大学.

[5] 朱达宇.基于RTLinux的全软件数控系统设计与开发[D],四川大学.

[6] 赵霞.基于Frambuffer的嵌入式GUI系统实现[J].嵌入式软件应用.2007,23(12-2).

猜你喜欢

实时性数控系统内核
多内核操作系统综述①
强化『高新』内核 打造农业『硅谷』
活化非遗文化 承启设计内核
微软发布新Edge浏览器预览版下载换装Chrome内核
基于FANUC 32i A数控系统的外部测量设计
西门子840D sl数控系统在SC125大型车铣镗床技术改造中的应用
基于FANUC Oi mate TD数控系统的手动功能开发
数控系统中GUI软件平台设计和实现
航空电子AFDX与AVB传输实时性抗干扰对比
计算机控制系统实时性的提高策略