电机上位机控制及界面设计.docx
《电机上位机控制及界面设计.docx》由会员分享,可在线阅读,更多相关《电机上位机控制及界面设计.docx(39页珍藏版)》请在冰豆网上搜索。
电机上位机控制及界面设计
电机上位机控制及界面设计
吴牛俊
(自动化与电气工程学院指导教师:
周克宁)
摘要:
随着计算机、电子、通讯技术的飞速发展,人们对于车间现场设备的运行管理控制,可视化操作等综合水平提出了新的要求。
为了满足这新的要求,本毕业设计本着“不在现场,远离现场”的原则,以C语言作为开发语言,VC为开发环境,针对某充电机产品编写了应用程序,将充电机的现场设备界面通过串口通信技术,与上位机界面有机的结合起来,以实现计算机的远程监控功能。
此外,该上位机应用软件还实现了查看充电机存储在U盘中的运行记录文件的功能。
在本毕业论文通过这个项目的开发过程,阐述了编程环境的选择,串口通讯实现远程测试的方法,通过文件操作读取U盘数据的技巧。
探讨如何在PC平台与工控机平台间建立远程测试和历史数据读取和分析的一般方法。
关键词:
人机界面;串口通信;VisualC++6.0;文件操作
Abstract:
Withthedevelopmentofcomputer,electronics,communicationstechnology,thepeoplearerequiringthatthetheoperationandmanagementoftheequipmentcontrol,andtheVisualizationoperationmustdeveloptoo.
Tomeetthesenewrequirements,thedesignofthegraduatesbaseonthat"notonthescene,thesceneawayfromtheprincipleof"andusetheClanguageandVCenvironmentprogrammingthechargerprocedures.ThedesignusesthecommunicationstechnologytoputthechargerfieldequipmentinterfaceandPCinterfacecombination.AnditcanbeachievedRMON.Inaddition,thePCapplicationsoftwarealsocanviewthetestrecordsstoredintheUdisk.
Thispaperthroughtheprojectdevelopmentprocessdescribesthefollowingpoints.FirstisThechoiceofprogrammingenvironments.SecondisSerialCommunicationremotetestmethod.ThirdistheskillsofreadingthetestrecordsstoredintheUdisk.DiscussionongeneralmethodsthatthroughthePCplatformwiththeestablishmentofindustrialcomputerplatformforremotetestingandreadinghistoricaldataandanalysis
Keywords:
Human-machineinterface;SerialCommunication;;VisualC++6.0;File
1绪论
1.1背景
随着计算机、电子、通讯技术的飞速发展,人们对于车间现场设备的运行管理控制,可视化操作等综合水平提出了新的要求。
随着计算机的运算速度不断升级功能日渐强大,在车间现场测控中扮演了越来越重要的角色。
利用计算机软件通过运用先进的通讯技术监控远程现场设备的运行状况和运行参数。
这将大大提高生产效率,保证生产安全。
出于节省人工,提高效率或者安全生产方面的考虑很多环节需要远程监控车间设备的运行情况,这就离不开通讯技术的应用。
这里所说的通信是只计算机与远程设备之间的信息交换。
由于串行通信是在一根传输线上一位一位的传送信息,所用的传输线少,并且可以借助现成的电话网进行信息传送,因此,特别适合于远距离传输。
对于那些与计算机相距不远的人机交换设备和串行存储的外部设备如终端、打印机、逻辑分析仪、磁盘等,采用串行方式交换数据也很普遍。
同时,随着人们对车间现场设备智能化的要求的提高,越来越多的设备采用了外存储器对生产测试过程中的数据进行存储,监控人员通过定期对存储了历史数据记录的分析,可以清楚得了解到设备的动态运行情况,这些数据对设备排错和参数设置提供依据都有很高的价值。
随着PC端USB接口技术的普及,以U盘作为设备外存储器存储运行数据,具有实现简单,读取方便的特点,应用也越来越广泛。
如何高效,方便的通过最常用的PC机来读取设备外存储器中的数据,为数据的快速分析提供了保证。
因此研究计算机通过串行通信对远程车间设备的监控,读取U盘历史数据文件并显示具有一定的现实意义。
1.2任务和目标
本毕业设计本着“不在现场,远离现场”的原则,为导师研制的某型号充电机产品编写PC端应用程序将充电机设备界面通过串口通信技术,与上位机界面有机的结合起来,以实现计算机的远程监控功能。
按要求在上位机中打开并查看充电机设备运行过程中的存储在U盘中的历史数据文件,以便于分析测试。
另外还要编写下位机微型打印机数据打印程序,为用户提供多种查看选择。
我在认真分析以上设计要求之后,以C语言作为开发语言,VC为开发环境,在MFC框架上编写完成一个应用程序。
这个应用程序采用MSCOMM控件来实现串口通讯,以C语言文件操作实现U盘历史数据文件的读写和显示操作。
并且在此基础上,我还对上位机软件的界面进行了美化和优化,还添加了现场测试数据自动生成WORD文档,使得软件更人性化和操作更简单。
在本毕业论文通过这个项目的开发过程,阐述了编程环境的选择,串口通讯实现远程测试的方法,通过文件操作读取U盘数据的技巧。
探讨如何在PC平台与工控机平台间建立远程测试和历史数据读取和分析的一般方法。
2总体设计方案
2.1系统总体结构
系统总体结构如下图所示,下位机是一台试用在变电所等电力部门的充电机设备,采用工控机作为核心处理器。
PC机端的应用程序通过RS232串口与设备实现通讯。
充电机设备带有USB接口,用于接入U盘存储充电机历史数据。
当用户需要查看历史记录数据时,将U盘从设备中拔下,接入PC端可以利用应用程序通过文件操作打开查看。
图1.系统总体结构图
另外,该充电机设备通过工控机打印口连接一台微型打印机用于运行参数和测试数据的即时打印,供用户查看。
2.2上位机用户操作界面结构
图2.软件组织结构
3上位机用户操作界面的建立
3.1编程语言及编程环境
3.1.1C++语言介绍
C++是脱胎自C语言的一种中级语言。
从计算机角度看,它可以嵌入ASM等低端语言;从面向对象的程序设计角度看,它有具备OOP的三个基本特征——抽象,封装和继承。
C语言是结构化和模块化的语言,它是面向过程的。
C++保留了C语言原有的所有优点,增加了面向对象的机制。
C++与C完全兼容。
C++是对C的扩充,是C的超集。
它既可用于结构化程序设计,又可用于面向对象的程序设计,功能强大。
C++性能良好,因为它被编译为机器代码。
对于VBScript和Java等语言,代码在运行时由程序解释,而且每次运行程序时都要将代码转换为机器码,这样做效率比较低,不仅仅是已编译过的C++程序运行得较快,而且微软C++编译器已存在多年。
这意味着微软的编译器程序员已经把许多优点集中到编译器上,以致于它能产生非常高效的机器码。
因为C++是编译语言,而且非常自然,比VB更接近机器代码,所以由C++编译器产生的代码一定比VB的编译代码效率更高。
C++是一种编译语言,即C++代码在执行之前已转换为机器码。
只要此代码不依赖于外部的动态链接库(DLL),C++就可以在不需要安装额外程序的情况下移动到运行同样操作系统的其他机器和微处理器上,而移动Java程序时需要先安装Java运行期库。
因此,使用C++语言相比其他语言具有最小的依赖性
由于C和C++已经存在许多年了,现在有许多可利用的代码,我们的服务器组件可以使用现有的C/C++代码或库。
鉴于上述特点,我在本设计中选择C++作为主要编程语言。
3.3.2VisualC++6.0编程环境介绍
本次设计中使用的VisualC++6.0是一个基于C++语言,基于Windows操作系统的功能强大的可视化软件开发工具。
这不仅表现出在应用程序界面编辑和代码的编写中,还表现为数据处理上的高可视化和高面向对象性。
VisualC++6.0不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrateddevelopmentenvironment,IDE)。
它由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导ClassWizard等开发工具。
这些组件通过一个名为DeveloperStudio的组件集成为和谐的开发环境。
另外,VisualC++6.0还提供了一个"无所不包"的应用框架MFC,并且可以非常方便的使用MSCcomm控件进行串口编程。
使用VisualC++6.0的向导可以生成大量的使用代码,而不必人工地编写代码。
从编写程序的难易程度和程序的性能综合考虑,这些特点完全能够满足我在本次课题设计中的各种需求。
3.3.3MFC程序框架介绍
MFC就是一个程序的框架。
这个框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法。
使用者只要通过预定义的接口把具体应用程序特有的东西填入这个轮廓就可以了。
在它基础上来建立Windows下的应用程序,相对SDK来说更为简单。
VisualC++6.0提供了相应的工具来完成这个工作:
AppWizard可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口;ClassWizard用来协助添加代码到框架文件;最后,编译,则通过类库实现了应用程序特定的逻辑。
在本设计中要求通过编写代码来建立必要的用户界面,控制并定制其外观。
同时还要响应用户的操作行为。
例如,如果用户单击了现场测试按钮,就需要有代码来响应这一动作。
而使用MFC框架,则会自动添按钮的响应消息,只需在对应位置添加事件处理动作就能完成控制任务。
为此采用了VisualC++6.0的MFC单文档程序框架作为上位机软件的基本框架。
3.4基本界面的建立
3.4.1单文档
一个典型的应用程序应该活动在称为“框架窗口”中。
一个框架窗口是一个全功能的主窗口,用户可以改变尺寸、最小化、最大化等。
本设计方案中主要涉及单文档窗口,和对话框窗口。
整个上位机界面的底层是单文档,而上层使用的使对话框,并在对话框上添加主要控件,从而构成了完整的界面外观。
图3.单文档结构图
使用MFC的向导即可生成如上所示的单文档窗口。
这是整个界面的基础框架部分。
3.4.1对话框
在基础的单文档框架上面添加了两个无(标题栏)对话框将单文档窗体分为两部分。
上一部Dialog1分为工具条按钮,下一部分Dialog2为具体功能显示区。
此两部分窗口均为非模态化对话框。
首先在资源里插入新建对话框,修改其属性;然后添加相应的类,如CUDiskDlg;再使用以下代码分别创建模态化对话框和非模态化对话框。
CUDiskDlgm_CUDiskDlg;//定义对象
m_UDHisDlg.Create(IDD_UDISKHIS,this);//创建非模态化对话框
m_UDHisDlg.ShowWindow(TRUE);//显示对话框
m_UDHisDlg.DoModal();//创建模态化对话框
3.4.1控件介绍
Button控件:
Button控件是按钮控件,可以响应单击(BN_KLICKED)和双击(BN_DUBLEKLICKED)事件。
其使用方法是:
在资源标签的相应窗体下,从Controls对话框中将Button控件拖至对话框的相应位置,修改属性及ID号后,在其对应的事件处理函数中添加事件代码即可。
在本设计中使用颇多,如U盘历史数据查询按钮,现场测试按钮等。
Edit控件:
Edit控件是文本编辑控件,在本设计中主要用于U盘查询界面中详细数据的参数显示,和现场测试中参数设置部分的数据输入和测试结果表格中的数据显示及测试结论、处理意见的输入。
将Edit控件在类向导中与一变量(如m_edit8)以value的形式相关联。
当用于数据显示时,使用语句m_edit8=str;将值赋予变量m_edit8,再用语句UpdateData(FALSE);将变量内容显示。
当用于数据输入时,应用语句UpdateData(TRUE);将控件中的数据读入赋予相关变量。
ListContrl控件:
ListContrl控件主要用于显示列表式的数据显示。
在本设计中,历史信息,详细数据,现场测试数据的显示均使用了ListContrl控件。
该控件使用前需进行风格设置。
即通过以下语句获得原有风格:
DWORDdwStyle=:
:
GetWindowLong(m_listctrl.m_hWnd,GWL_STYLE);
dwStyle&=~(LVS_TYPEMASK);dwStyle&=~(LVS_EDITLABELS);
通过以下语句置新风格:
SetWindowLong(m_listctrl.m_hWnd,GWL_STYLE,dwStyle,|LVS_REPORT|LVS_NOLABELWRAP|LVS_SHOWSELALWAYS);
通过以下语句设置扩展风格
DWORDstyles=
LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES;ListView_SetExtendedListViewStyleEx(m_listctrl.m_hWnd,styles,styles);。
进行风格设置后,先插入列头,后才可以逐行添加数据信息。
插入列头时,应用InsertColum方法,而逐行添加信息时,第一列的信息应该用InsertItem方法,而后几列则应用SetItem方法。
ListContrl控件也可以响应双击事件,其函数为OnDblclkListHis(NMHDR*pNMHDR,LRESULT*pResult)。
并且能获得双击时鼠标所在的Item号。
由此来实现双击历史信息记录后,显示对应的详细数据。
Picture控件:
Picture控件是一个静态控件,用于插入图片等功能。
而图片的插入,有静态插入和动态插入两种方法。
静态插入是指,直接在Picture控件属性中,将将“类型”选项改为Bitmap,然后再在“图像”选项中选择合适的位图即可。
动态插入是指,在程序中定义HBITMAP类型变量m_Brown_h1,用语句m_Brown_h1=:
:
LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BROWN_H1))将变量m_Brown_h1与位图资源IDB_BROWN_H1关联起来。
然后再将Picture控件与变量m_h1关联,再通过语句m_h1.SetBitmap(m_Blue_h1);就可以将图片动态插入。
3.5历史数据察看功能
3.5.1历史数据察看功能介绍
历史数据察看功能主要是用于察看直接通过下位机,以文件形式存储在USB可移动存储设备上的历史检测数据纪录的。
该纪录由历史信息和历史信息对应的详细数据信息两部分。
每条历史信息包括序号、日期、时间、整定电压(在放电测试项目中无该纪录)、整定电流、已放容量(只在放电测试项目中有该纪录)五项内容;每条历史信息对应得详细数据信息有各自不同的几项内容。
各项测试的详细数据信息如下:
放电参数测试包括序号、时、分、端电压、放电电流五项;电压稳定精度测试包括输入电压、电压最大值、电压最小值、稳压精度、纹波系数五项;电流稳定精度测试包括输入电压最大值、电流最大值、电流最小值、稳流精度四项;限流特性测试包括输入电压、-10%、100%、+10%、稳流精度五项。
在用户进入该程序后,单击U盘历史查询按钮就会进入历史数据察看状态。
按下各测试项目选择按钮,则进入不同的测试项目历史纪录查询状态。
对应的历史信息就立刻显示在List中。
双击List条目,则将对应的详细数据信息显示在List中,其参数也将显示在对应位置。
图4.历史数据查询界面
3.5.2历史数据察看功能实现的方法
3.5.2.1盘符的确定
由于每台PC的盘符划分不同,USB移动存储设备连接后所在的盘符也将不同。
而对文件的操作必须指定明确的文件路径,方能正确的打开文件,读取数据。
因此,如何确定USB移动存储设备的盘符是必须解决的问题。
在本设计中,我采用了添加配置文件方式来解决该问题。
即在可执行程序的根目录下添加一可读写的文件,用于保存指定的盘符。
当用户在某一PC机上第一次使用本软件时,将提示配置USB可移动存储设备盘符。
当用户输入该PC机上USB可移动存储设备所在盘符,并按配置按钮后,盘符信息将写入配置文件,并一直保存至下一次配置前。
按下推出按钮,则向主框架发出消息,要求其重新创建历史数据察看功能对话框,在对话框的初始化中重新装载配置文件,读入正确的盘符。
其中配置文件的装载,采用函数GetCurrentDirectory(dirlen,sDir)获得可执行文件的根目录,再用函数strcat(sDir,"\\con_set.ini")生成完整的配置文件路径。
图5.第一次配置文件界面
生成配置文件代码如下:
UpdateData();
if((m_usb.GetLength()>0&&m_usb.GetLength()<2)&&((m_com.GetLength()>0)&&m_com.GetLength()<2))
{
FILE*fp;
fp=fopen("con_set.ini","wb");
charDisk,Com;
Disk=m_usb.GetAt(0);
Com=m_com.GetAt(0);
fputc(Disk,fp);
fputc(Com,fp);
fclose(fp);
MessageBox("配置成功!
");
}
else
{
MessageBox("输入的参数格式错误,无法配置!
");
}
配置文件的装载代码如下:
FilePath="C:
\\FHIST";
FilePath.SetAt(0,Disk);
l=FilePath.GetLength();
FileName=FileName_tmp;
for(r=0;r*(FileName+r)=FilePath.GetAt(r);
*(FileName+l)=NULL;
////打开文件并判断文件是否打开成功
if((fp=fopen(FileName,"rb"))==NULL)
{
MessageBox("文件不存在,请检查文件位置并重新配置");
return;
}
3.5.2.2历史数据及对应的详细数据的读取和显示
历史纪录在USB移动存储设备中以文件的形式存储。
各项历史信息和详细数据信息对应的文件名如下图:
检测项目
历史信息文件名
详细数据文件名
放电测试
FHIST
VDATA
电压稳定精度测试
UHIST
UDATA
电流稳定精度测试
IHIST
IDATA
效率测试
EHIST
EDATA
限流特性测试
XHIST
XDATA
图6.各项历史信息和详细数据信息
实现历史信息的读取,首先从配置文件中读入盘符,获取到对应历史信息的文件路径,以二进制流形式打开对应文件,读取历史信息条数(即第一个二进制数据)到int变量mark中。
由于下位是16位操作系统,一个int型占16位,而上位机是32位操作系统,一个int型占32位,一个shortint型占16位。
由文件存储格式可知,实际的标志位为16位数,因此需将读取的二进制数强制转换为shortint型数据。
然后根据各项历史信息数据的存储格式,移动指针,依次读取一条数据到数组data_tmp[7]中,共读取mark次。
移动指针读取数据到数组data_tmp[7]中的代码如下:
fseek(fp,(2+i*7*4),SEEK_SET);//移动指针到相应位置
fread(data_tmp,4,7,fp);//
详细数据的读取是当鼠标双击list1控件的某一条历史信息时,将响应list1控件的双击事件,进入的其响应函数。
在该函数中,通过switch语句判断该条历史信息所属的测试项目,并由此打开相应的详细数据文件。
当双击list1控件的某一条历史信息时,nItem=m_listctrl.GetNextItem(-1,LVNI_FOCUSED);将获取该行索引值,即该条历史信息在全部信息中排列的序号。
根据此及对应测试项详细数据存储格式,可计算出该条历史信息所对应得详细数据的第一个数据的指针。
然后移动指针,读取该详细数据信息到数组tem[]。
放电测试项详细数据读取时移动指针,读取数据到数组data_tmp[7]中的代码如下:
fseek(fp,(2+nItem*1240),SEEK_SET);//移动指针到对应日期的数据存储位置
fread(data,4,310,fp);//读取数据流到tem[],float*data的指向tem[]的首地址
历史信息和对应的详细数据的显示,主要是edit控件的显示和listContrl控件的信息插入。
以放电测试为例,历史信息数据显示的主要代码如下:
for(i=0;i{
fseek(fp,(2+i*7*4),SEEK_SET);//移动指针到相应位置
fread(data_tmp,4,7,fp);
rewind(fp);
itIndex=m_list_his.GetItemCount();
LV_ITEMlvitem;
lvitem.mask=LVIF_TEXT;
lvitem.iItem=itIndex;
lvitem.iSubItem=0;
itoa((i+1),ch1,10);
lvitem.pszText=ch1;
m_list_his.InsertItem(&lvitem);
//日期
str="";
itoa((int)data_tmp[0],ch1,10);
str=str+ch1+".";
itoa((int)data_tmp[1],ch1,10);
str=str+ch1+".";
itoa((int)data_tmp[2],ch1,10);
str=str+ch1;
intstr_length;
str_length=str.GetLength();
char*str_data;
chars_data[15];
str_data=s_data;
for