智能拖地机器人,云鲸 NARWAL 0 引言 开放式数控系统已经成为当前CNC技术发展的必然趋势,而基于/PC+运动控制器0结构体系的开放式数控系统也已成为自动化领域备受关注的数控装置之一。含有DSP处理器的运动控制器,实现复杂的控制算法和功能,完成数控系统中补偿处理、速度控制、位置控制等实时性任务; PC机利用其丰富的软件资源,在Windows环境下开发相应的应用程序模块,专注于人机界面、输入输出、预处理、发送指令等弱实时和非实时性任务的实现。人机界面是集成各种应用程序模块的平台,设计一个界面简洁,操控方便的人机界面,是构建开放式数控系统的重要内容。本文介绍采用C++Builder编程语言构建基于固高GT400-SV型运动控制器的开放式数控系统人机界面的实现方法。 1 界面显示方案选择 在界面的设计初期,拟订了两种界面显示方案:多窗口模式和窗口分页显示模式。 在多窗口模式下,将每一个功能模块设计在一个功能子窗口上。即先设计一个主窗口,在主窗口下分设多个子窗口来作为各个功能模块的接口。但这种模式的界面整体性不够好,每需要一种功能时必须得激活相应窗口,其他窗口会被隐藏起来,而这种隐藏会使各个功能窗口混到一起,当需要激活某一特定功能时,无法确认所要打开的窗口。 单一窗口分页显示模式是在一个主窗口上设计出多个分页,将特定的功能模块设计在相应的分页上,这样每个分页在主窗口上都有确定的位置。这种显示方式能够很方便地在各个功能之间进行切换。通过两种方案的对比,决定采用第二种方案。 2 界面设计与文件衔接 界面设计与文件的衔接是界面设计的重点。下面针对具有代表性的模块论述衔接过程。在同一类功能当中,设计思想是一样的,不同的只是所响应的事件不同而已。 2.1 主程序文件与程序编辑器 设计程序编辑器是为了让主程序文件当中的函数能够读取和编辑程序编辑器当中的代码。通过以下函数来实现其衔接: (1)Dword CallbackThreadFunc(void* ptr) 这个函数是一个线程回调函数,函数体实现的功能跟一般的函数类似,唯一不同的是这种函数只能够用于多线程,只能由某一线程调用。当一个线程建立起来后,它必须调用某一个线程函数才能够完成某一特定功能。例如在程序设计中,通过建立一个线程来执行G代码转换,这个线程的作用是从编辑器读取G代码,经过相应的转换,再调用GT400基本功能函数。由于C++Builder中的RichEdit编辑器控件本身的功能就很完善,所以只要一条原代码,就完成了从编辑器中读取G代码的功能。原代码是: pedit=Form1->RichEdit1->Lines->GetText(); (2)void _fastcallTForm1:: SetFileName(constAn-siString FileName) 这个函数完成的功能是为编辑器当中所编辑的未命名或重命名文件设定文件名并在标题栏显示出来。这个函数与界面的关系,可以从整条语句看出:TForm1是一个窗体类,而Form1为控制界面的主窗体,因而它属于主窗体文件,要连接到界面还须配合界面的相应功能按钮。 (3)void _fastcallTForm1::CheckFileSave(void) 这个函数检查G代码是否被修改过,如果被修改过则在文件关闭或进行一些其他操作时,提示是否要对当前文件进行存储。这个函数可以由其它函数调用,也可以响应界面编辑按钮来完成对G代码文件的检验。 (4)TTextAttributes* _ fastcall TForm1:: CurrText(void) 这个函数从编辑器中返回所选择字体的属性。这些函数完成了编辑器与主程序的连接,是界面和G代码转换的桥梁。 2.2 界面功能按钮与响应事件的衔接 在控制界面当中,功能按钮大致可以分为三类:第一类是主菜单底下的子菜单按钮;第二类是工具栏中的快捷按钮;第三类是界面上的其它功能按钮。这三类按钮是程序与界面衔接的重要部分,现以第一类按钮当中存储子菜单为例说明衔接过程: 在完成菜单项的界面设计之后,先在集成开发环境当中单击存储子菜单按钮,则在主程序文件当中会自动生成这样一个函数: void __fastcallTForm1::N7Click(TObject* Sender) { } 由于没有响应事件,在编译运行后点击该子菜单时,系统不做任何响应。然后在响应函数当中添加如下实体,以便完成存储功能: void __fastcallTForm1::N7Click(TObject* Sender) { if(! strcmp(FFileName. c_str(), "未命名")); //判断G 代码文件是否命名 { if(SaveDialog1->Execute()); //没有命名,打开存储 文件对话框 { RichEdit1->Lines->SaveToFile(SaveDialog1-> FileName); //存储文件 SetFileName(SaveDialog1->FileName); //在文件标题上显示 RichEdit1->Modified=false; //复位文件修改标志 } } else //如果文件已命名则直接存储 { RichEdit1->Lines->SaveToFile(FFileName); RichEdit1->Modified=false; } } 这样,程序运行之后点击存储按钮,就可完成将编辑器当中的G代码存储起来。 第二类是工具栏上的快捷工具按钮,而在子菜单当中又都能够找到它们的响应按钮,所以可以直接将它们与各个相应子菜单按钮衔接,这样就不用在它们的函数当中添加同样的函数体以省去写原代码的麻烦。仍以存储按钮为例,通过两种方法来实现两个按钮的衔接: (1)在集成开发环境当中的界面工具栏上选中存储按钮(假设界面已设计好),在左边控件属性栏中点击even,t再点击Onclick右边的框子,在下拉菜单中选相应按钮名称即可完成衔接。 (2)在集成开发环境当中的界面工具栏上双击存储按钮,在主程序文件当中会自动生成如下响应函数: void __fastcallTForm1::ToolButton1Click(TObject* Sender) { } 在函数体中添加如下代码即可完成两个按钮之间的衔接: void __fastcallTForm1::ToolButton1Click(TObject* Sender) { N7Click(Sender); } 由于设计思路一样,对其他按钮的衔接问题不再赘述。 2.3 界面参数的读入 在控制界面上读入各种控制参数,才能建立起系统的运行环境。界面参数输入一般通过Edit和Com-boBox等控件来实现。 如图1所示为设定系统周期的输入框,通过下面函数,可将输入框中的各个参数输入系统:
图1 系统周期参数输入框 void ZhouqiSet() { short rtn; tm=StrToFloat(Form1->cbotm->Text); lmt=StrToFloat(Form1->cbolmt->Text); enc=StrToFloat(Form1->cboenc->Text); . } 图中三个输入框都是ComboBox控件,从上到下被命名为cbotm、cbolmt、cboenc。系统伺服周期通过Form1->cbotm->Text语句读入,此语句在功能上相当于一个指针,对应地址当中的内容就是向输入框当中输入的数字,这时参数的类型为String而不是整形或浮点型,因而需要进行转换后再赋予相应变量,以便系统函数调用。转换的数据类型通过这样的语句实现: tm=StrToFloat(Form1->cbotm->Text),这句将周期输入框中的输入参数转换成浮点型,再赋予周期变量。 Edit控件的读入原理跟ComboBox一样。 2.4 界面参数的输出 在程序设计中,用到的数据输出控件主要有Lable控件、PaintBox控件及状态条StatusBar控件。PaintBox控件的使用与图形显示有关,而Lable控件是一个标签控件,它可以用于在界面上标示各种输入输出框的作用,也可以直接用于输出某一数据,在设计中,除了利用这个控件来标示各种输入框外,还用于输出X轴和Y轴的位置坐标。以显示运行轨迹界面X、Y位置坐标为例,论述其输出过程。 首先,访问GT400运动控制器的位置寄存器。访问函数为: shortGT_GetAtlPos(long* Apos);这个函数返回各坐标的位置数据,以便实现必要的位置数据输出和图形显示。位置坐标的读回代码为: EnterCriticalSection(&Sect1); //多线程中初始化临界区域 rtn=GT_Axis(1); error(rtn); rtn=GT_GetAtlPos(&actl_xpos); error(rtn); //读回X位置值,放到变量actl_xpos中 rtn=GT_Axis(3); error(rtn); rtn=GT_GetAtlPos(&actl_ypos); error(rtn); //读回Y位置值,放到变量actl_ypos中 LeaveCriticalSection(&Sect1); //释放临界区然后,在界面上显示坐标位置: Form1->xpos->Caption=" " +IntToStr(actl_xpos); // 将X轴的位置值向运行轨迹分页的X轴标签处输出 Form1->StatusBar1->Panels->Items[1] ->Text=" X: "+IntToStr(actl_xpos); //将X位置值向控制界面的状态栏输出 Form1->ypos->Caption=" " + IntToStr( actl_ypos); //将Y轴的位置值向运行轨迹分页的Y轴标签处输出 Form1->StatusBar1->Panels->Items[2] ->Text=" Y: "+IntToStr(actl_ypos); //将Y位置值向控制界面的状态栏输出 第一句涉及到多线程当中对公共变量的访问问题。为了避免在多线程中因为同时访问公共数据块而造成不良后果,需要对公共数据块进行保护,直到一个线程对它的访问结束为止,在设计中调用的是W in32的API函数进行临界区域的划定,即EnterCriticalSec-tion(&Sect1)和LeaveCriticalSection(&Sect1)。设定临界区域后就可以保证一次只有一个线程对该区域进行访问,而不会引起数据访问的冲突。 3 轨迹显示设计过程 分的执行代码包含在Display. cpp程序文件当中。运行轨迹界面设计成其被激活时才显示轨迹,其它界面被激活时不显示。运动轨迹显示的坐标轴采用红色,运行G00时运动轨迹采用黄色,其它轨迹采用蓝色。设计中用到C++Builder中的两个控件:一个是Standard组件当中的GroupBox控件,它用来标记出轨迹显示的边界;另一个是System组件当中的PaintBox控件,即图形显示控件,它能够在窗体上指定形成一个Canvas对象的绘图区域,通过这个绘图区域可以实现运动轨迹的实时显示。实现步骤分为两步: (1)在窗体初始化时先画出坐标轴,它通过Dis-play. cpp程序文件当中的void Coordinate()函数实现; (2)当程序运行时,通过位置读回函数GT_GetAt-lPos(double)不断读回坐标位置值,并将其映射到坐标轴中去,再利用定时器快速刷新坐标值,而每一个坐标值勾画一段小直线,这样无数段小直线便勾画出各种运动轨迹。该部分的功能通过Display. cpp程序文件当中的void Display ()函数来实现。 轨迹显示执行流程如图2所示,运行轨迹显示界面如图3所示。
图2 轨迹显示执行流程图
图3 运行轨迹显示界面 4 结束语 初步完成了以固高GT400-SV运动控制器构建的开放式数控系统人机界面部分的设计。通过调试证明,所设计的人机界面满足两坐标数控系统的要求。此界面包括了常用的菜单栏、工具栏、界面显示栏等。设计方法和过程对构建基于运动控制器的开放式数控系统人机界面具有一定的通用性。设计中对界面作了相应地优化,去掉了那些具有重复功能的按钮,并使菜单栏和工具栏中的按钮只有在编程界面上有效,而在其它界面上无效,提高了系统的可靠性。 本网站官方群 工业工程5000人群号 249148633 |
2020-02-17
2022-06-13
2021-12-13
2022-11-09
2022-10-20