姚文姣,黄 艳
(1.中国科学院沈阳计算技术研究所,沈阳 110000;2.中国科学院大学,北京 100049;3.沈阳中科数控技术股份有限公司 GJ事业部,沈阳 110000)
在当今信息时代的影响下,智能化、信息化技术被应用于各个方面。工业制造领域对数控技术的需求不再局限于过去的设计生产水平,开放性与可重构性是数控系统发展的重要趋势[1-2]。人机界面是用户与数控系统之间联系的媒介。具有开放性的数控系统人机界面,在提高用户使用感的同时为开发者对系统进行后期维护提供便利[3]。
本文基于UML技术和面向对象设计方法,构建结构模型和动态模型完成对界面框架及对象行为的描述,创建一种具有开放性的数控系统人机界面的框架模型。在界面的设计实现阶段,由于高频率的界面刷新重建会出现界面闪烁甚至卡死的问题,影响使用体验。李宽等[4]在实验中使用双缓冲技术解决了界面刷新时产生的闪烁、抖动问题。针对该问题,本文在双缓冲的基础上,在界面开发阶段应用三缓冲技术,降低界面负载和刷新延迟,取得了良好的效果。
以用户的需求和所期望达到的预期目标为依据,对数控系统人机界面进行需求分析。界面结构如图1所示,概括了系统所包含界面的大致种类及相应子界面,构造一个条理清晰的界面框架结构。
图1 界面结构组成
针对每个界面 进行需求分析,获取该界面的功能需求。位置界面中用户可选择零件的加工方式,实现对机床坐标、主轴速率及运动信息等的调整控制;参数界面实现对系统参数的读取显示、修改、删除等操作;程序界面中包括对NC程序的管理及校验;设置界面包括对操作权限的设置,可对系统数据进行分类别的备份还原,以达到对系统的维护;报警界面需将系统运行时出现的错误和报警信息及时反馈给用户,记录并存储系统的运行状态信息;补偿界面完成对刀具补偿和螺距补偿信息的录入和修改等。
将需求分析阶段获取的功能需求抽象成功能用例,并确定功能用例之间的交互关系,反映系统的实际使用情况。使用UML中的用例图对框架模型和功能用例进行整体描述,如图2所示。
图2 系统用例图
用例图是UML静态模型中的一种,它描述了系统角色与功能用例之间、各功能用例之间的交互关系[5],反映了系统的开发目的。UML模型能够对系统结构、系统对象的静态特性及动态特性实现视图化的描述,深化了开发者对系统行为、结构及其独立元素的认识,有助于更好地确定设计流程,开发出易于维护的系统[6-7]。
以参数界面为例,通过对实现该界面所涉及的设计类、方法进行结构化的描述,得到界面设计类图,为实现阶段提供框架基础,如图3所示。
图3 参数类图
Display_Task类实现界面信息显示及响应界面事件的功能。ViewParData类根据Key类传递的键值和获取的当前光标位置,对选定数据实现相应的操作。FrameWin类实现对界面控件的布局管理。
顺序图将功能用例进一步细化,关注系统对象之间的交互,强调在通信流程中的先后顺序。通过对象间交互流程的描述,可提高界面开发的可操作性。以用户对参数设置的功能用例建立顺序图,如图4所示。Key类对用户按下的按键获取键值后进行识别判断,FrameWin类做出刷新界面响应,并向DataParaCursor类发送读取数据信息请求,显示信息以实现当前界面的刷新。
图4 参数操作顺序图
上文中以参数界面为例,展示了基于面向对象设计方法的UML模型构建。通过类图与顺序图的描述,开发者可以明确设计类之间的调用继承关系及通信流程,为后期界面实现提供了明确的整体开发框架[8-9]。
在硬件方面,使用基于ARM9处理器和已经移植有μC/OS-II实时操作系统的开发板作为目标机,且该开发板使用LCD液晶的显示方式。PC机作为宿主机,选择IAR Systems作为开发环境,结合JLink硬件仿真器进行实时调试,完成用户界面的实现。
根据所创建的系统框架模型和UML分析得到的设计类,由于C语言对嵌入式软件的编码效率更好,所以需要将建模工具Rational Rose 生成的界面框架C++代码进行相应的修改,并将处于静态的对象所包含的方法修改成独立的函数。
主界面如图5所示,系统初始状态设置为程序回零。
图5 主界面
由于界面给用户最直观的视觉感受,因而在外观设计方面,需考虑到界面布局方式、色彩搭配、字体等因素,以一致性为基准,各个界面须风格统一[10-11]。本系统界面采用冷色调中的蓝色作为基调,给人以低调镇静之感。使用以文字为主的信息反馈方式,直观且易于理解,因此,创建了14×14、16×16、18×18三种不同大小的字体,在清晰显示的前提下提供尽可能多的信息,若当前界面无法包含所有的信息内容,可使用上下键和翻页键进行查看。对于涉及参数显示的界面采用LISTVIEW控件进行列表化的展示,达到整齐划一的效果。界面菜单采用二级树状菜单的形式,每个界面都包含了主功能按钮和子功能按钮两种类型,分别在界面的下方和侧面。每个主功能按钮都关联相应的子功能操作。
在此主界面中,加工信息、位置参数和NC程序状态等信息都进行了分类别分区域的显示,使用户不需进行其他操作就可了解当前机床的状态信息。
在本系统中,界面需实时反馈机床的相关信息,即界面动态信息需实时刷新显示。涉及到信息更新和界面切换时需刷新界面,而刷新时会伴随界面闪烁的现象。
针对此现象,应用三缓冲技术进行处理,该技术可以保证界面在复杂情况下的连续性,提高界面刷新的流畅度。其基本原理如图6所示。
图6 三缓冲实现原理
该技术需要构建一个前置缓冲区和两个后置缓冲区。前置缓冲区用来暂存后置缓冲区绘制完成的内容,待全部完成后复制到显示缓冲区。相比而言,双缓冲技术仅包含一个后置缓冲区,在面临大量绘图计算时,会出现影响性能和输入延迟的情况,而三缓冲的额外缓冲区使系统有足够的空间计算大量的图形数据,且复制速度极快,可有效解决界面闪烁问题,同时也可避免数据丢失。实现流程如下:
(1)在LCDConf_Lin_Template.c文件中开启三缓冲,定义缓冲区个数;在主函数中调用WM_MULTIBUF_Enable(1)进行使能。
(2)配置三缓冲功能:
GUI_MULTIBUF_ConfigEx(i,NUM_BUFFERS); //设置三缓冲区
GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER, COLOR_CONVERSION,0,0);//创建显示驱动器件
LCD_SetDevFunc(i,LCD_DEVFUNC_COPY-BUFFER,(void(*)(void))_LCD_CopyBuffer); //定义Copy函数
(3)函数GUI_MULTIBUF_BeginEx( )和GUI_MULTIBUF_EndEX( )分别实现绘制工作的开始和结束,且仅在后置缓冲区绘制;完成后,函数LCD_CopyBuffer( int LayerIndex, int IndexSrc, int IndexDst)将前置缓冲区暂存的内容复制到显示缓冲区,同时向LCD_X_DisplayDriver( )函数传递 LCD_X_SHOWBUFFER信息,读取数据实现界面显示,工作流程如图7所示。
图7 三缓冲工作流程
(4)当调用GUI_MULTIBUF_EndEX( )结束缓冲绘制时,数据内容被复制到显示缓冲区完成读取显示,为了防止出现撕裂效果,需在中断处理程序中做相应处理,核心代码如下:
intStatus = ELCDIF_GetInterruptStatus(LCDIF);
//获得中断状态,响应中断
ELCDIF_ClearInterruptStatus(LCDIF,intStatus);//清中断
if (intStatus & kELCDIF_CurFrameDone){
if (s_LCDpendingBuffer >= 0){
ELCDIF_SetNextBufferAddr(LCDIF, addr);//将显示内存中的数据显示出来
GUI_MULTIBUF_Confirm(s_LCDpendingBuffer);//确认前置缓冲区可见并立即调用
s_LCDpendingBuffer = -1;
}
}
采用该方法后,在使用过程中界面切换、刷新流畅,没有出现屏幕闪烁的情况。
此外,与重绘整个界面相比,局部重绘可以降低界面负载和刷新延迟。函数WM_InvalidateRect(hWin, &Rect)对指定矩形区域Rect进行无效处理,然后调用 WM_Paint( )对该区域进行重绘。
本文对数控系统人机界面采用面向对象与UML建模技术相结合的方法,分析了该人机界面的功能需求、组织结构之间的逻辑关系和控制流程,构建了基于动静态模型的系统框架,为开放式数控系统的开发提供了建模方法和功能框架。
采用三缓冲技术解决了开发过程中出现的界面闪烁问题,有效提高了界面切换的流畅度,取得了良好的效果,为涉及大量图像数据的界面开发工作提供一个有效的解决方式,具有重要的实际意义。