程序中可以通过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_taskes wait_period(NULL);//挂起任务到下个周期再运行:
/*显示线程实现代码*/}
算法模块在加载到内核模块时,首先要做的就是进行模块的初始化,初始化过程中需要把内核层之间通信以及内核层与用户层通信所需要的命名管道和消息队列等创建完毕,内核层各线程之间可以通过读写管道和消息内存完成数据交换。实现函数如下:
ssize_t rt pipe_write (RT_PIPE *pipe,*buf, size t size, int mode)
ssize_t R_pipe_read (RT_PIPE *pipe,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, sizs_t size, int mode)
//消息队列读写数据
4 结束语
经济型数控系统的软件仅包括基本的x轴和2轴直线插补、圆弧插补等功能,属于低端产品,开发过程较短,开发难度也较低,本系统软件开发过程中综合考虑了经济型数控系统的特点,迅速快捷的进行开发,同时也预留了后期软件升级为x轴、z轴和y轴三维插补的接口。设计过程中为系统人机界面部分也仅是满足基本的需求,后期开发过程中仍然需要进一步的丰富和完善,尤其是在U盘文件处理和串口通信方面;但系统现有开发的功能完全可以满足旧机床的数控化改造需求。