本文共 4066 字,大约阅读时间需要 13 分钟。
随着嵌入式系统的迅速发展和广泛应用,嵌入式Linux以其强大的性能和开放性,越来越被开发人员所推崇。现在,各种基于Linux的嵌入式系统已被用于各行各业中。其中,人们对基于嵌入式实时Linux平台的开放性的数控系统展开了很多的研究和探讨。而数控软件人机界面,作为数控系统的控制台,其图形构造与人机交互功能直接影响着人们对数控系统的评价。
1软件结构
数控系统软件是由多个程序组成的,包括界面程序、任务管理程序、I/O管理程序等。为讨论方便,将它大致分为两个部分,即界面程序和数控软件主体程序,如图1所示。界面程序的任务是提供一个友好的图形画面,显示诸如位置、模式、刀迹模拟等信息;同时要实现人机交互功能,接受外部用户指令,如文字输入,开关、按钮动作等。其实,界面只是一个控制台角色,它不能直接实现用户的指令,它必须将用的动作转换为相应的内部指令,然后传送给数控软件的主体程序并由主体程序来实现;它也不能自动产生诸如位置、刀迹模拟等信息,也必须从数控软件的主体程序中获取这些信息。于是,界面程序与主体程序之间存在着数据通信。本项目中,基于System V的IPC机制,采用共享内存的方法,开辟两个共享内存块,分别用于界面程序向主体程序发送指令,以及主体程序向界面程序反馈状态信息,分别称为命令渠道和状态渠道。
其中,数控系统界面程序可以详细分为三层结构,如图2所示。底层接口主程序负责与数控软件主体程序通信,实现指令信息的发送与状态信息的更新;中间层是根据数控需求而扩展的Tcl /Tk解释器,它除了具有标准C库外,还增加了与底层接口主程序相关联的Tcl /Tk扩展C库。对于标准的Tcl /Tk脚本命令,解释器会调用标准C库函数来处理;而对于扩展后与数控功能相关联的Tcl /Tk脚本命令,解释器就会调用扩展C库函数来处理。而顶层就是基于这个解释器的Tcl /Tk脚本程序。这两层结构体现了Tcl /Tk特殊的双重属性:①它是一种脚本语言。它提供一套完整的脚本命令,可用于构建图形画面,处理事件,实现交互功能。②它是一个解释器。它可以被添加到专用的应用程序中,将应用程序提供的编程接口与自定义的Tcl /Tk命令挂钩,使得用户可以编写具有特殊功能的脚本程序,如数控软件的人机界面程序。这也就是Tcl /Tk解释器的可扩展性。
2人机界面程序具体实现
2.1底层接口主程序
该层的任务包括:
(1)实现数控系统界面程序与主体程序之间的通信,包括
2人机界面程序具体实现
2.1底层接口主程序
该层的任务包括:
(1)实现数控系统界面程序与主体程序之间的通信,包括命令渠道和状态渠道的建立,命令信息与状态信息的格式设计,命令信息的传输与状态信息的获取等内容。下面是本项目中实现以上功能的编程接口,而且利用类的方法进行封装。
①建立命令渠道与状态渠道
void CommandChannel : : GetChannel( )
{
. . .
shmget( . . . ) ; / /建立共享内存
shmat( . . . ) ; / /将共享内存区添加到本地地址空间中
semget( . . . ) ; / /建立信号量,用于解决对共享内存的访问同步
问题
. . .
}
②信息的发送与接收
void CommandChannel : : SendMsg( MASSAGE * massage)
{
. . .
GetSem( . . . ) ; / /获取信号量
WriteMem( . . . ) ; / /将信息写入共享内存
ReleaseSem( . . . ) ; / /释放信号量
. . .
}
void ReadMSg( MASSAGE * massage)
{
. . .
ReadMem( . . . ) ; / /从共享内存获取信息
. . .
}
③信息格式。本项目中,利用类Massage来定义信息格式
class MASSAGE {
int MsgType; / /用不同的数值区分不同功能的信息
int MsgLength; / /代表信息的长度
. . . / /其他成员
}
(2)提供实现数控操作的编程接口,即对应不同的用户操作,界面程序需要向主体程序发送不同的信息;如一个代表“程序运行”指令的编程接口如下:
void SendRun ( )
{
. . .
/ /将一个代表“程序运行”指令的信息发送出去
SendMsg( RunProgramMsg ) ;
. . .
}
(3) Main ( )函数。主要任务,与数控系统主体程序建立联系;添加Tcl /Tk解释器。
main( int argc, char * argv[ ] ) {
{
. . .
/ /建立并连接命令渠道和状态渠道
CommandChannel * cmdChnPtr = new CommandChannel( ) ;
StatusChannel * statChnPtr = new StatusChannel( ) ;
/ /添加Tcl/ Tk解释器
Tk_Main( argc, argv, Tcl_AppInit ) ;
}
Tcl /Tk的编程接口Tk_Main( )简化了添加Tcl /Tk解释器的工作,它会创建包含所有标准Tcl命令的解释器,创建Tk主窗口;然后,它会调用用户自定义的初始化函数Tk_AppInit( )来定制一个合乎用户要求的Tcl /Tk解释器;最后进入脚本解
释循环中。
2. 2扩展Tcl/Tk解释器,即编写函数Tk_AppInit( )
其任务包括:
( 1)调用Tcl /Tk库函数Tcl_Init( Interp)和Tk_Init( Interp)对解释器进行标准初始化;
( 2)调用Tcl /Tk库函数Tcl_CreateObjCommand( )添加新的Tcl /Tk命令,并使之与应用程序编程接口挂钩。如添加一个名为Run_Program的命令,使之与Tcl /Tk扩展C库中的Run_Program函数相关联,并最终调用底层接口程序提供的接口SendRun( )函数,实现发送一条“程序运行”的指令给数控主体程序的功能。Tcl_CreateObjCommand ( interp, " run_program" , Run_Program,( Client_Data) NULL, ( Tcl_CmdDeleteProc * ) NULL) ;综合( 1)和( 2) , Run_Program命令的整个实现过程如图3所示
( 3)编写脚本程序,实现用户图形界面。
①界面设计。Tcl /Tk提供了足够而且合适的图形部件来构建数控软件图形界面,较为常用的组件包括框架、标签、按钮、文本和输入框。数控软件界面的特点是规则与简洁,而且具有很强的专业惯例,结合这些特点,我们将界面布局划分为三个部分,即状态栏、主窗口和按钮栏(图4、图5)。
状态栏用于显示当前模式、当前功能界面名称、加工文件及加工状态等信息;按钮栏用于模拟面板按钮,并显示按钮功能,且按照不同的操作界面切换不同的按钮功能菜单;如图5中的位置功能界面,它的按钮功能菜单包括“相对坐标”、“绝对坐标”、“ALL”等;而程序功能界面的按钮菜单包括“打开文件”、“删除文件”等。主窗口用于显示当前功能界面。本项目的数控软件图形界面分为七个功能界面,分别是“位置”、“程序”、“参数”、“图形”、“系统”、“诊断”和“帮助”,根据用户选择,七个功能界面相互切换。如图6、图7所示,主窗口位置显示的分别是“程序”功能界面和“图形”功能界面。
②程序实现。该项目中,界面脚本程序分为两部分,即界面构建部分和循环监视部分。界面构建,就是要利用Tcl /Tk提供的组件构建一个操作画面,不仅要显示信息,还要能够接受外部指令。这里提供两
个主要的技巧:多用框架作为容器,将相关组件进行打包。如图4中的状态栏、主窗口和按钮栏三部分,就是对应三个框架,从而使三部分彼此独立,这样便于管理。同理,七个功能界面也是对应七个框架(分别是positionFrame, programFrame, graphyFrame等)。这样一来,在主窗口中,能够很方便地对它们进行切换,只要直接控制各个功能界面的顶层框架的“隐”或“现”就行了。如
proc ChangeFunc { } {
pack forget$LastFuncFrame ; #隐藏上一个功能界面
pack$CurrentFuncFrame ; #显示当前需要的功能界面
set LastFuncFrame$CurrentFuncFrame
}
使用键盘绑定功能,实现用户与界面的交互。例如,将按键F7与前面所述的用户自定义的命令scnc_
run绑定起来。bind all < F7 > { scnc_run }这样,当用户按键F7时,便能促发事件,并通过底层应用程序接口向数控软件主体程序发送“程序运行”命令。当然,用户与数控软件人机界面的交互方式不一定是通过键盘,本项目中,是通过一个与串口相连的控制面板来实现的。但中间经过一个映射程序转换为键盘信息,又实现了键盘绑定的功能。循环监视。界面构建工作完成之后,程序就调用Update( )
函数进入循环监视状态。这个函数负责定期查看状态,更新界
面。
Proc Update { } {
#从状态渠道获取最新状态信息
scnc_update
#更新界面信息,如位置坐标、模式、加工轨迹模拟等
#定期循环监视
after 200 Update
}
该系统运行情况如图8所示。
3结束语
随着科技的发展,人们对数控系统的需求越来越大,对数控系统的人机界面的要求也越来越高。综合在基于嵌入式Linux的数控系统上的开发经验,提出了利用Tcl /Tk实现数控系统人机界面的一种方法。其实用性和可靠性在实际使用中得到验证。
转载地址:http://jnima.baihongyu.com/