设计题目:电焊条焊药的自动配料系统模拟软件设计
姓 名: 学 号: 专业班级: 指导老师: 完成日期:
学 校:
题目 姓名 指导老师 学号 班级 完成日期 1 设计任务
1.1 设计目的
(1) 了解电焊条的焊药生产过程的自动配料系统的原理;
(2) 进一步学习C语言或者C++程序工程设计的方法以及程序调试技巧; (3) 学习撰写专业技术文档。
1.2 设计内容
在电焊条的生产过程中,需要将不同的化学原料按照不同的比例混合在一起,然后搅拌 成糊状并均匀地裹在焊料上。自动配料系统的作用是,根据焊药的配方,将有关化学原料按 照规定的重量比例投放到搅拌机里。
自动配料系统的工作过程如下:
1) 操作员通过计算机键盘设定一种焊药的配方(即需用到要哪几种化学原料,每种化学原料的重量)。假设一种焊药配方最多只需要6 种化学原料,分别是A,B,C,D,E,F,并假设A,B,C,D,E,F这6种化学原料分别存放在1,2,3,4,5,6这6只料斗里面。因此还要设定好要用到的每种化学原料分别装在那只料斗里面。下面我们假设某种焊药的配方用到4种化学原料A,C,D和E。A,C,D和E这4种化学原料分别装在1,3,4,5这4只料斗里面,而且A,C,D和E这4种化学原料的重量比例是5公斤,10公斤,20公斤和65公斤(假设
小车最多能装100公斤化学原料)。设定好后,操作员发布“开始配料”命令。
2) 首先将小车退回到达0号位置开关,准备开始一次配料。即当小车到达0号位置 开关时,小车停止。
3) 启动小车向前行驶,当小车到达1号位置开关时,小车停止,1号料斗打开,开始 向小车里面流入化学原料A,当达到5公斤时,1号料斗关闭,停止流料。启动小 车向前行驶。
4) 当小车2号位置开关时,因为不需要配2号料斗里面的化学原料B,故小车不停 止,继续向前行驶。
5) 当小车3号位置开关时,小车停止,3号料斗打开,开始向小车里面流入化学原料 C,当达到10公斤时,3号料斗关闭,停止流料。启动小车向前行驶。
6) 当小车4号位置开关时,小车停止,4号料斗打开,开始向小车里面流入化学原料 D,当达到20公斤时,4号料斗关闭,停止流料。启动小车向前行驶。
7) 当小车5号位置开关时,小车停止,5号料斗打开,开始向小车里面流入化学原料 E,当达到65公斤时,5号料斗关闭,停止流料。启动小车向前行驶。
8) 当小车6号位置开关时,因为不需要配6号料斗里面的化学原料F,故小车不停 止,继续向前行驶。
9) 当小车到达7号位置开关时,小车停止,并将车厢自动翻起来,将车厢里的化学 原料倒入搅拌机,然后小车快速倒退行驶。小车倒退行驶过程中,遇到6,5,4, 3,2,1号位置开关都不停止行驶,直到小车遇到0号位置开关才停止行驶。
10) 循环执行第3步到第9步,直到操作员发布“停止配料”命令,配料过程结束。 操作员只有在小车到达0号和7号位置开关时,才能发布“停止配料”命令。
用C语言或者C++语言编写一个程序,用形象化的动画动作模拟上述焊药自动配料系 统的工作过程。图1-4中料斗、开关和小车的形状仅是示意图,你可以根据自己的想象设计 更加美观、逼真的形象。
1.3 设计指标或者要求
1)假设小车匀速向前行驶,小车匀速倒退行驶,且倒退速度明显快于前进速度。其目 的是提高生产效率。
2)配料重量可以用小车在料斗前停顿的时间长度来模拟。例如每公斤料对应小车停顿 0.2秒。(希望每公斤料对应小车的停顿时间应该可以调整)。
3)所有的化学原料都是面粉状的固体原料。
2 设计过程
2.1 程序功能
用C语言编写程序,制作动画模拟上述焊药自动配料系统的工作过程。
2.2 算法原理
小车行驶:小车在屏幕上行驶采用的方法是在原地画出该图形在此刻将其擦去,并在下
一时刻在其将要行驶到的位置将其再次画出,利用视觉暂留现象实现小车的行驶。
配料下落:配料下落的过程,首先生成随机数,进而生成随机点的坐标,再利用函数关
系将随机点根据料筒的位置固定在不同的区域,在小车到来停下时生成下落的配料。生成配料的同时将随机生成的点的坐标存入数组,待配料下落的粉末在屏幕上生成完全,再很快将其擦除,以此达到配料的下落的消失过程。
2.3 程序流程图
开始 Y N 2.4 程序主要模块或者函数 是否停止 int show_the_car(int right_x)//生成小车 输入配料比例 { N //int three_corner[6]={this_num-9,120,this_num+14,120,this_num+2,132}; //fillpoly(3,three_corner); setcolor(BLACK); rectangle(right_x-50,260,right_x,285); 有配料输入 setlinestyle(0,NULL,2); circle(right_x-36,292,6); circle(right_x-14,292,6); return 0; } int cut_the_car(int right_x)//擦除小车
{ //int three_corner[6]={this_num-9,120,this_num+14,120,this_num+2,132}; 小车行驶,开始一个配料周//fillpoly(3,three_corner); 期 setcolor(LIGHTWHITE); setfillstyle(LIGHTWHITE,SOLID_FILL); rectangle(right_x-50,260,right_x,285); //bar(right_x-50,258,right_x,286); setlinestyle(0,NULL,2); circle(right_x-36,292,6); circle(right_x-14,292,6); return 0; }
结束 Y int move_car(int begin_tail,int end_tail)//移动小车
{
//show_the_car(begin_tail+27); int distance=begin_tail-end_tail; int small_distance=distance/3;
int big_distance=distance-small_distance; //快走
for(int i_1=0;i_1 show_the_car(begin_tail+26-i_1); Sleep(5); } //慢走 for(int i_2=0;i_2 show_the_car(begin_tail+26-big_distance-i_2); Sleep(20); } //move_counter=0; return 0; } 3 软件运行或者测试结果 进入界面时会弹出对话框,要求用户输入配料的重量。当用户将配料重量全部输入时,配料开始,小车将开始行驶。 小车行驶过程中,如果需要配料,将会在对应的料筒下停住,等待下料后会继续行驶。 小车最后将接到的配料倒入搅拌机。 4 软件设计过程中遇到的问题以及解决办法 问题一:小车行走过程中出现多余线条 小车的显示调用出现小车的函数show_the_car(),行走的时候同时调用show_the_car() 和cut_the_car(),由于设置的坐标的缘故,小车开始出现的初始位置和move()函数开始发挥作用的位置不一致,造成开始位置处由于小车移动产生多余线条。在不修改初始坐标位置的基础上,在主函数中将开始出现的小车在开始位置强行覆盖擦除,再调用move()即可消除多余线条。 问题二:配料下落随机点形成的粉末区域太死板 配料下落时,会先产生随机数生产坐标的X和Y坐标,在一开始的时候只是采用简单 的生成区域限制导致生成的坐标形成了死板的矩形。后来根据料筒所在的位置计算出X和Y的线性约束关系,把下落的形状调整成了梯形。 5 总结 这次实习任务锻炼了我在DOS下使用C图形库绘图的能力,在具体实施的过程中遇到了很多问题,比如一开始的对点线绘制的控制,后来逐渐掌握一块图形的出现消失和运动。当遇到问题的时候虽然不知道怎么处理,还是主动去搜索问题的解决办法。绘制图形的过程有点繁琐,不过对图像实现的动态效果也是很有意思的一件事情。原本想深入地探索一下C绘图,但由于时间和自身能力的原因,目前只是做到这个地步。希望以后自己在程序上多多练习。 附录 #include int show_three_corner(int this_num)//绘制上面的三角形 { int three_corner[6]={this_num-9,120,this_num+14,120,this_num+2,132}; fillpoly(3,three_corner); return 0; } int show_the_car(int right_x)//生成小车 { //int three_corner[6]={this_num-9,120,this_num+14,120,this_num+2,132}; //fillpoly(3,three_corner); setcolor(BLACK); rectangle(right_x-50,260,right_x,285); setlinestyle(0,NULL,2); circle(right_x-36,292,6); circle(right_x-14,292,6); return 0; } int cut_the_car(int right_x)//擦除小车 { //int three_corner[6]={this_num-9,120,this_num+14,120,this_num+2,132}; //fillpoly(3,three_corner); setcolor(LIGHTWHITE); setfillstyle(LIGHTWHITE,SOLID_FILL); rectangle(right_x-50,260,right_x,285); //bar(right_x-50,258,right_x,286); setlinestyle(0,NULL,2); circle(right_x-36,292,6); circle(right_x-14,292,6); return 0; } int move_car(int begin_tail,int end_tail)//移动小车 { //show_the_car(begin_tail+27); int distance=begin_tail-end_tail; int small_distance=distance/3; int big_distance=distance-small_distance; //快走 for(int i_1=0;i_1 show_the_car(begin_tail+26-i_1); Sleep(5); } //慢走 for(int i_2=0;i_2 show_the_car(begin_tail+26-big_distance-i_2); Sleep(20); } //move_counter=0; return 0; } //翻转车厢 int turn_up_box() { setcolor(BLACK);//显示15. line(97,285,145,272); line(145,272,139,248); line(139,248,91,261); line(91,261,97,285); Sleep(500); setcolor(LIGHTWHITE);//擦除15. line(97,285,145,272); line(145,272,139,248); line(139,248,91,261); line(91,261,97,285); setcolor(BLACK);//显示30. line(97,285,140,260); line(140,260,128,238); line(128,238,85,263); line(85,263,97,285); Sleep(2000); return 0; } int turn_down_box() { setcolor(BLACK);//显示30. line(97,285,140,260); line(140,260,128,238); line(128,238,85,263); line(85,263,97,285); Sleep(2000); setcolor(LIGHTWHITE);//擦除30. line(97,285,140,260); line(140,260,128,238); line(128,238,85,263); line(85,263,97,285); //Sleep(500); setcolor(BLACK);//显示15. line(97,285,145,272); line(145,272,139,248); line(139,248,91,261); line(91,261,97,285); Sleep(500); setcolor(LIGHTWHITE);//擦除15. line(97,285,145,272); line(145,272,139,248); line(139,248,91,261); line(91,261,97,285); show_the_car(149); return 0; } //清除车厢 int clear_carbox() { setcolor(LIGHTWHITE); setfillstyle(LIGHTWHITE,SOLID_FILL); rectangle(149-50,260,149,285); return 0; } //货物从漏斗中倒入小车 int way_drop_in_car(int loudou_num) { } //货物最后倒入搅拌机 int final_drop() { int seed=78; srand(seed); int rand_1=rand()%30+70; int x[500], y[500]; for(int i_3=0;i_3<500;i_3++) { int seed=80; srand(seed); int x[500], y[500]; for(int i_3=0;i_3<500;i_3++) { x[i_3] = rand()%30+loudou_num-15; y[i_3] = rand()%120+138; if((4*x[i_3]+y[i_3]-118)>=4*loudou_num&&(4*x[i_3]-y[i_3]+118)<=4*loudou_num) { putpixel(x[i_3],y[i_3],BLACK); } } for(i_3=0;i_3<500;i_3+=10) { } return 0; Sleep(1); for(int j_3=0;j_3<10;j_3++) { putpixel(x[i_3+j_3],y[i_3+j_3],LIGHTWHITE); } x[i_3] = rand()%30+70; y[i_3] = rand()%80+300; if((8*x[i_3]+y[i_3])>=940&&(8*x[i_3]-y[i_3])<=420) { putpixel(x[i_3],y[i_3],BLACK); Sleep(10); } } for(i_3=0;i_3<500;i_3+=10) { Sleep(1); for(int j_3=0;j_3<10;j_3++) { putpixel(x[i_3+j_3],y[i_3+j_3],LIGHTWHITE); } } setfillstyle(BROWN_2,SOLID_FILL);//生成搅拌机 bar3d(30,390,100,440,30,1); return 0; } //倒车 int back_the_car() { //cut_the_car(149); //show_the_car(begin_tail+27); int distance=575-122; int small_distance=distance/4; int big_distance=distance-small_distance*2; //慢走 for(int i_1=0;i_1 show_the_car(122+28+i_1); Sleep(18); } //快走 for(int i_2=0;i_2 show_the_car(122+28+small_distance+i_2); Sleep(1); } //继续慢走 for(int i_3=0;i_3 show_the_car(122+28+small_distance+big_distance+i_3); Sleep(18); } //move_counter=0; return 0; } void main() { int i = 0; int count = 0; int x, y, a; int graph_driver = DETECT; int graph_mode; float s; double m; char my_range = 0; char *nr[] = {\"1\char *radian[] = {\"7\//int threepoints[6]={100,100,50,200,150,200}; initgraph(&graph_driver, &graph_mode,\"\"); setbkcolor(LIGHTWHITE); setcolor(DARKBLEAK_1); setlinestyle(0,NULL,3); setfillstyle(DARKBLEAK_1,SOLID_FILL); cleardevice(); /* clear the sceen, set origin point is current point*/ line(100, 300, 600, 300); //me 划线 //setcolor(BLUE); bar(98,295,105,302); bar(595,295,602,302); setfillstyle(BROWN_2,SOLID_FILL);//搅拌机 bar3d(30,390,100,440,30,1); setfillstyle(DARKBLEAK_1,SOLID_FILL); //line(50, 20, 50, 400); //原点在(50, 300) //outtextxy(499, 292, \">\"); //outtextxy(501, 301, \"x\"); //outtextxy(48, 16, \"^\"); //outtextxy(52, 20, \"y\"); //下部分图形显示 setfillstyle(LIGHTDARKGREEN,SOLID_FILL); for (i =105; i <= 600; i = i + 70) { } //上部分图形显示 count=1; for (i =175; i <= 525; i = i + 70) { } show_the_car(600);//出现在初始位置 setcolor(LIGHTDARKGREEN); bar(i-10,105,i+15,100+20); //fillpoly(3,threepoints); show_three_corner(i); //line(i, 100,i, 100+10); /* 每个刻度之间是70个像素点 */ outtextxy(i-3, 85, *(radian+count)); count++; line(i, 300,i, 300+10); /* 每个刻度之间是70个像素点 */ outtextxy(i-3, 315, *(radian+count)); count++; // // Sleep(800); //强行擦除 setcolor(LIGHTWHITE); setfillstyle(LIGHTWHITE,SOLID_FILL); //rectangle(right_x-50,260,right_x,285); bar(600-52,257,600+2,288); setlinestyle(0,NULL,2); circle(600-36,292,6); circle(600-14,292,6); //移动小车 int a1[6]; int i_2 = 1; char box[1]; char tips[] =\"请输入第1个料桶的配料重量\"; char tips_2[1]; for (int i_3=0; i_3<6;i_3++) { itoa(i_3+1, tips_2, 10); tips[8] = tips_2[0]; InputBox(box, 5, tips, \"\ a1[i_3] = atoi(box); } move_car(575,525); Sleep(1000); way_drop_in_car(525); if (a1[0]) { Sleep(1000); way_drop_in_car(525); } for(int j_1=1;j_1<6;j_1++) { move_car(525-70*(j_1-1),525-j_1*70); if(a1[i_2++]) { } } } way_drop_in_car(525-j_1*70); Sleep(1000); //最后一站:7号站台 move_car(175,122); Sleep(1000); clear_carbox();//清除车厢 turn_up_box();//翻起车厢 final_drop();//货物最终下落至搅拌机 turn_down_box();//车厢返回原始状态 back_the_car(); getch(); closegraph(); 因篇幅问题不能全部显示,请点此查看更多更全内容