电焊条焊药的自动配料系统模拟软件设计.docx
《电焊条焊药的自动配料系统模拟软件设计.docx》由会员分享,可在线阅读,更多相关《电焊条焊药的自动配料系统模拟软件设计.docx(34页珍藏版)》请在冰豆网上搜索。
电焊条焊药的自动配料系统模拟软件设计
成绩
课程名称:
程序设计实训______________
设计题目:
电焊条焊药的自动配料系统模拟软件设计
姓名:
学号:
1108020104
专业班级:
网络工程1101班
指导教师:
李爱国
完成日期:
2013–07-10
学校:
西安科技大学
题目
电焊条焊药的自动配料系统模拟软件设计
姓名
学号
1108020104
班级
网工1101
指导老师
李爱国
完成日期
2013–07-10
1.设计任务
1.1设计目的
(1)了解电焊条焊药生产过程中的自动配料系统原理,学习分析数据和算法设计思想。
(2)进一步学习C/C++工程设计方法以及程序调试技巧,进一步熟悉计算机语言的使用方法和设计理念。
(3)了解并学习微软基础类MFC,会用MFC进行简单的框架设计,可以做基本绘图以及简单菜单单文档文件的编写,并输出简单系统程序的exe文件。
(4)学习撰写专业技术文档,为之后撰写毕业设计及工作中的报告积累经验
1.2设计内容
1.2.1电焊条的简介
电焊条在建筑和工业中被广泛应用于将钢制结构焊接在一起。
一根电焊条可以分为焊料和焊药两部分。
焊料是一根规定材质、长度(约400毫米)和直径(约5毫米)的钢棒;而焊药是包裹在焊料上面的一层化学药品。
焊接的时候,在高温作用下将焊料熔化,熔化的焊料填满被焊接的两块钢板之间的缝隙,从而达到将这两块钢板焊接在一起的目的。
焊药是助焊剂,其作用是帮助焊料更好地将被焊接的钢结构焊接在一起。
根据电焊条的焊料材质的不同、用途不同,焊药的配方需要做相应的改变,因此焊药的配方至关重要。
1.2.2焊药自动配料过程的工作原理
自动配料系统的作用是,根据焊药的配方,将有关化学原料按照规定的重量比例投放到搅拌机里。
焊药自动配料系统的原理是:
在1条导轨(类似火车铁轨)上放置一辆电动配料小车,小车中安置了电子秤,可以称量小车中化学原料的重量。
导轨上安置了0—7号位置开关,当小车到达某个位置开关出时,此位置开关就动作(此位置开关输出高电平),反之,此位置开关就不动作(此位置开关输出低电平)。
导轨的上方固定了6只料斗,里面分别放置了不同的面粉状固体化学原料。
每个料斗上都有一个电子阀门,控制料斗的打开和关闭。
自动配料系统的工作过程如下:
1)操作员通过计算机键盘设定一种焊药的配方(即需用到要哪几种化学原料,每种化学原料的重量)。
假设一种焊药配方最多只需要6种化学原料,分别是A,B,C,D,E,F,并假设A,B,C,D,E,F这6种化学原料分别存放在A,B,C,D,E,F这6只料斗里面。
因此还要设定好要用到的每种化学原料分别装在那只料斗里面。
下面我们假设某种焊药的配方用到4种化学原料A,C,D和E。
A,C,D和E这4种化学原料分别装在A,C,D,E这4只料斗里面,而且A,C,D和E这4种化学原料的重量比例是5公斤,10公斤,20公斤和65公斤(假设小车最多能装100公斤化学原料)。
设定好后,操作员发布“开始配料”命令。
2)首先将小车退回到达0号位置开关,准备开始一次配料。
即当小车到达0号位置开关时,小车停止。
3)启动小车向前行驶,当小车到达1号位置开关时,小车停止,A料斗打开,开始向小车里面流入化学原料A,当达到5公斤时,A号料斗关闭,停止流料。
启动小车向前行驶。
4)当小车2号位置开关时,因为不需要配B号料斗里面的化学原料B,故小车不停止,继续向前行驶。
5)同理经过3,4,5,6好位置开关,产生不同响应,完成配料。
6)当小车到达7号位置开关时,小车停止,并将车厢自动翻起来,将车厢里的化学原料倒入搅拌机,然后小车快速倒退行驶。
小车快速倒退行驶,直到小车遇到0号位置开关才停止行驶。
7)循环执行第3步到第6步,直到操作员发布“停止配料”命令,配料过程结束。
操作员只有在小车到达0号和7号位置开关时,才能发布“停止配料”命令。
1.2.3设计内容
用C语言或者C++语言编写一个程序,用形象化的动画动作模拟焊药自动配料系统的工作过程。
可以根据自己的想象设计出美观逼真的形象。
焊药的配方可以由用户设定,但是小车一次只能装不超过100kg的原料,并要求。
1)小车匀速向前行驶,小车匀速倒退行驶,且倒退速度明显快于前进速度,以提高生产效率。
2)配料重量用小车在料斗前停顿的时间长度来模拟。
1.3设计指标或者要求
(1)要求使用C++语言设计并编译满足程序设计要求的程序,并调试正确,可以正常运行。
(2)要求在设计自动配料系统中利用到MFC,做出一个单文档窗口。
(3)可以自主完整的讲述自己的设计,并详细严谨的撰写程序设计报告。
2.设计过程
2.1程序功能
根据焊药自动配料原理,用形象化的动画动作模拟焊药自动配料系统的工作过程。
本焊药自动配料系统采用C++语言,利用MFC设计,实现简单的焊药自动配料过程,并用一个单文档窗口输出,达到形象美观逼真功能基本完善的要求。
通过用户自由简单的控制,可以完成6种配料任意比例的配制,及小车的装卸过程,并可以控制配料的开始与停止。
达到形象美观逼真功能基本完善。
2.2程序流程图
2.3程序主要模块或者函数
2.3.1焊药自动配料系统主要有以下几个模块:
(1)车厢内原料动作变化;
(2)小车翻转的卸料过程;
(3)配料过程;
(4)加料过程;
(5)小车加料、卸料、倒退的三个状态;
(6)菜单的绘制。
2.3.2焊药自动配料系统主要函数:
类名
类方法及变量
AddDlg
inta_b1,a_b2,a_b3,a_b4,a_b5,a_b6
Car
intm_start,starty,startx,m_unload,m_carstate,GetPositionx();voidCarGo(CDC*pDC);intstarty;car()
CMainFrame
protected:
CMainFrame();DECLARE_DYNCREATE(CMainFrame)
public:
virtual~CMainFrame();virtualBOOLPreCreateWindow(CREATESTRUCT&cs)
CMyApp
public:
CMyApp();DECLARE_MESSAGE_MAP()
CMyDoc
protected:
CMyDoc();DECLARE_DYNCREATE(CMyDoc)
public:
virtual~CMyDoc();virtualBOOLOnNewDocument();virtualvoidSerialize(CArchive&ar);
CMyView
public:
virtualvoidOnDraw(CDC*pDC);voidDrawcar(CDC*pDC,Car*Mycar)
virtualBOOLPreCreateWindow(CREATESTRUCT&cs);
voidXBoard(CDC*pDC);voidDrawMeterial(CDC*pDC);voidDrawSwitch(CDC*pDC);voidJudgeV();voidCarState(CDC*pDC);voidDrawView(CDC*pDC);
intx_v,v_flag,CJY,v,flag,sum,ma,mb,mc,md,me,mf,m_go,step,m_state;SwitchSwitch_a,Switch_b,Switch_c,Switch_d,Switch_e,Switch_f,Switch_g;MeterialPMeterial_a;MeterialMyMeterial_a,MyMeterial_b,MyMeterial_c,MyMeterial_d,MyMeterial_e,MyMeterial_f;CarMycar;boolAddMeterial;CStringstrTime;virtual~CMyView();
protected:
afx_msgvoidOnStartCar();afx_msgvoidOnTimer(UINTnIDEvent);afx_msgvoidOnAddmeterial();afx_msgvoidOnStopcar();afx_msgvoidOnExit();afx_msgvoidOnUpdateStopcar(CCmdUI*pCmdUI);afx_msgvoidOnYu();afx_msgvoidOnV2();afx_msgvoidOnV1();
virtualBOOLOnPreparePrinting(CPrintInfo*pInfo);
virtualvoidOnBeginPrinting(CDC*pDC,CPrintInfo*pInfo);
virtualvoidOnEndPrinting(CDC*pDC,CPrintInfo*pInfo);
Equipment
public:
voidPaintEquipment(CDC*pDC);Equipment();virtual~Equipment();
Meterial
public:
intm_mcount,m_meterial;voidPaintMeterial(CDC*pDC);Meterial();virtual~Meterial();
Switch
public:
intm_flag;Switch();virtual~Switch();
3.软件运行或测试结果
3.1软件运行结果截图说明
图1运行后的主界面:
图2开始菜单图3配料菜单
图4退出菜单
图5点击开始菜单后,若预先没有配料提示加料的页面如下:
图6点击配料中的加料子菜单后,出现加料窗口。
在对应位置输入所需原料的重量。
其页面如下图所示:
图7加料时输入所需原料的重量不能超过100kg,若超过,则会出现错误提示。
其页面如下图所示:
图8配料成功后,小车正在加料。
并且各原料的重量也会显示在页面的右侧。
其页面如下图所示:
图9完成加料后,下车正在卸料。
如下图所示:
图10小车完成加料卸料后,会询问是否继续。
若继续,则会重复之前的加料卸料程序。
若否,则会回到初始页面。
其图如下所示:
3.2软件结果
焊药自动配料系统运行正常,图形界面整体效果简洁、美观,用户操作简单,基本实现了焊药自动配料功能,但是因为技术水平有限,不能使软件再具备其他辅助功能等,需要进一步完善。
4.软件设计过程中遇到的问题及解决办法
(1)刚开始遇到的最大困难是基础类MFC的快速学习与应用。
因为要做出一个有着美观界面的窗口,对MFC的学习必不可少。
通过学习我了解到MFC实际上是微软提供的,用于在C++环境下编写应用程序的一个框架和引擎,是WinAPI与C++的结合。
(2)接下来遇到的是如何画图的问题,经过查资料,才有了初步的掌握。
从画笔的创建,到画刷的使用,再到图形的绘制,才完成界面上的图形绘制。
(3)在设计过程中,如何实现动画功能,这同样是一个很复杂的问题。
通过学习新的知识,不断调试更改,才实现了这个功能。
(4)实现料斗下料,小车内原料变化,都比较困难,较为复杂,最后通过查询资料和请教同学才得以解决。
5.总结
通过两周的课程设计,我觉得受益匪浅。
焊药自动配料系统,是我第一次使用MFC编写出来的程序。
也正是因为这个程序,我才能接触并学习基础类MFC,并对所学知识有了一次深刻地认识与巩固。
在编写程序过程中让我认识到了做一件事认真与细心是必不可少的,并且在编程过程中我对所学知识综合运用,深刻理解。
在程序设计过程中,程序功能有些复杂;在设计过程中遇到很多等问题,如何画图,如何实现动画功能,如何实现交互功能;我通过调试及查阅资料和自学新知识解决部分问题,但依然有个别问题我难以解决,这要在今后学习中不断改进解决。
在写程序过程中,要用到很多平时上课没有学过的知识,这对我来说有一些难度,但这也提醒我,不仅要重视平时课内知识,还要在课外多学习其他知识,丰富自己的知识库,这对我们今后的工作学习是很重要的。
这两周的实习使我对今后的学习有很大的启发:
只有平时基础知识学习扎实,才能在程序设计时确定正确,实用,简洁的方向,才能在遇到问题时很好的解决;平时多了解一些专业知识,能扩充知识面;多实践也是很有帮助的,只有在实践中才能很好的发现问题。
最后,真的很感谢老师这两周以来的指导与教诲,让我在今后的生活和学习上,有了全面的认识,使我更加明确了以后的方向。
附录:
程序源代码
1闫阿丹view.p
//闫阿丹View.cpp:
implementationoftheCMyViewclass
#include"stdafx.h"
#include"闫阿丹.h"
#include"resource.h"
#include"闫阿丹Doc.h"
#include"闫阿丹View.h"
#include"ar.h"
#include"Equipment.h"
#include"Switch.h"
#include"Meterial.h"
#include
#include"AddDlg.h"
#include
#pragmacomment(lib,"winmm.lib")
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
IMPLEMENT_DYNCREATE(CMyView,CView)
BEGIN_MESSAGE_MAP(CMyView,CView)
ON_COMMAND(ID_StartCar,OnStartCar)
ON_WM_TIMER()
ON_COMMAND(IDD_ADDMETERIAL,OnAddmeterial)
ON_COMMAND(ID_STOPCAR,OnStopcar)
ON_COMMAND(ID_EXIT,OnExit)
ON_UPDATE_COMMAND_UI(ID_STOPCAR,OnUpdateStopcar)
ON_COMMAND(ID_YU,OnYu)
ON_COMMAND(ID_V2,OnV2)
ON_COMMAND(ID_V1,OnV1)
ON_COMMAND(ID_FILE_PRINT,CView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT,CView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView:
:
OnFilePrintPreview)
END_MESSAGE_MAP()
CMyView:
:
CMyView(){
m_state=0;//小车的坐标与导轨开始初的坐标之差
x_v=0;//小车的小刮刮与小车壁坐标之差
m_go=1;//小车是否去配料
mf=0;//保存料f的重量
me=0;//保存料e的重量
md=0;//保存料d的重量
mc=0;//保存料c的重量
mb=0;//保存料b的重量
ma=0;//保存料a的重量
sum=0;//保存料的总重量
Step=0;//小车轮子转动的速度
m_color=0;//小车是否是第一次去配料
AddMeterial=false;//小车是否是正在加料
flag=0;//小车是否去配料
v=1;//保存小车的速度
CJY=0;//用于提前检测小车的坐标
v_flag=0;//标志小车速度是否等于2m/s}
CMyView:
:
~CMyView(){}
BOOLCMyView:
:
PreCreateWindow(CREATESTRUCT&cs){
returnCView:
:
PreCreateWindow(cs);}
voidCMyView:
:
OnDraw(CDC*pDC){
CMyDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
intm_nWidth,m_nHeigth;
CDCm_nDC;
CBitmapm_nBmp;
//映射屏幕的内存设备环境,获取游戏窗口的大小用于下面设置内存位图的尺寸
CRectwindowRect;
GetClientRect(&windowRect);
m_nWidth=windowRect.Width();
m_nHeigth=windowRect.Height();
//内存设备环境与屏幕设备环境兼容
m_nDC.CreateCompatibleDC(pDC);
//内存位图与屏幕设备兼容,大小为游戏窗口的尺寸
m_nBmp.CreateCompatibleBitmap(pDC,m_nWidth,m_nHeigth);
m_nDC.FillSolidRect(windowRect,RGB(0,0,0));
//内存设备环境与内存位图兼容,以便通过m_nDC在内存位图上作画
m_nDC.SelectObject(&m_nBmp);
DrawView(&m_nDC);
//把内存DC上的图形拷贝到电脑屏幕上
pDC->BitBlt(0,0,m_nWidth,m_nHeigth,&m_nDC,0,0,SRCCOPY);
m_nDC.DeleteDC();//删除DC
m_nBmp.DeleteObject();//删除位图}
BOOLCMyView:
:
OnPreparePrinting(CPrintInfo*pInfo){
returnDoPreparePrinting(pInfo);}
voidCMyView:
:
OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/){}
voidCMyView:
:
OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/){}
#ifdef_DEBUG
voidCMyView:
:
AssertValid()const{CView:
:
AssertValid();}
voidCMyView:
:
Dump(CDumpContext&dc)const{CView:
:
Dump(dc);}
CMyDoc*CMyView:
:
GetDocument(){
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
return(CMyDoc*)m_pDocument;}
#endif//_DEBUG
//绘制小车,及小车的动作
voidCMyView:
:
Drawcar(CDC*pDC,Car*Mycar){
CPennewpen,*oldpen;//创建画笔
newpen.CreatePen(PS_SOLID,2,RGB(118,130,122));//小车的颜色设置与画刷相同的颜色
oldpen=pDC->SelectObject(&newpen);//选择创建的画刷
if(!
Mycar->m_unload){//小车不处于卸料的状态
doubledalta=20;constdoubleR=10;constdoublePI=3.1415926;
doubleangle;angle=-1*R/PI*180;Step+=2*v;
pDC->Rectangle(700-m_state,200,720+60-m_state,200+40);//画一个矩形
pDC->Ellipse(710+5-m_state,200+40,710+25-m_state,200+60);//在给定半径以(x,y)为圆心画圆
pDC->Ellipse(710+35-m_state,200+40,710+55-m_state,200+60);pDC->Ellipse(710+12-m_state,200+47,710+18-m_state,200+53);pDC->Ellipse(710+42-m_state,200+47,710+48-m_state,200+53);
CBrushRedBrush;
RedBrush.CreateSolidBrush(RGB(251,135,171));//车轮的颜色设置填充模式和颜色
CBrush*pBrhold;
pBrhold=(CBrush*)pDC->SelectObject(&RedBrush);
if(AddMeterial==false){
if(m_go){
pDC->Pie(710+5-m_state,200+40,710+25-m_state,200+60,725-m_state+10*cos(Step/(10)),250-10*sin(Step/(10)),725-m_state+10*cos(Step/(10)+9*PI/5),250-10*sin(Step/(10)+9*PI/5));//绘制并填充一个扇形
pDC->Pie(710+35-m_state,200+40,710+55-m_state,200+60,755-m_state+10*cos(Step/(10)),250-10*sin(Step/(10)),755-m_state+10*cos(Step/(10)+9*PI/5),250-10*sin(Step/(10)+9*PI/5));}
else{
pDC->Pie(710+5-m_state,200+40,710+25-m_state,200+60,725-m_state-10*cos(Step/(10)),250-10*sin(Step/(10)),725-m_state-10*cos(Step/(10)+1*PI/5),250-10*sin(Step/(10)+1*PI/5));pDC->Pie(710+35-m_state,200+40,710+55-m_state,200+60,755-m_state-10*cos(Step/(10)),250-10*sin(Step/(10)),755-m_state-10*cos(Step/(10)+1*PI/5),250-10*sin(Step/(10)+1*PI/5));}}
pDC->S