基于Linux 及Tcl / Tk 的数控系统人机界面的实现

来源:百度文库 编辑:神马文学网 时间:2024/04/28 15:08:06
俺 基于Linux 及Tcl / Tk 的数控系统人机界面的实现
随着嵌入式系统的迅速发展和广泛应用, 嵌入式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 实现数控系统人机界面的一种方法。其实用性和可靠性在实际使用中得到验证。