您的当前位置:首页正文

C语言实现动画小车模拟焊药自动配料系统

2020-05-09 来源:易榕旅网
成绩 课程名称:

设计题目:电焊条焊药的自动配料系统模拟软件设计

姓 名: 学 号: 专业班级: 指导老师: 完成日期:

学 校:

题目 姓名 指导老师 学号 班级 完成日期 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_1cut_the_car(begin_tail+27-i_1); //Sleep(1);

show_the_car(begin_tail+26-i_1); Sleep(5); } //慢走

for(int i_2=0;i_2cut_the_car(begin_tail+27-big_distance-i_2); //Sleep(5);

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 #include #include #include #include #include #include #define INTERCEPT = 0 #define PI 3.1415

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_1cut_the_car(begin_tail+27-i_1); //Sleep(1);

show_the_car(begin_tail+26-i_1);

Sleep(5); } //慢走

for(int i_2=0;i_2cut_the_car(begin_tail+27-big_distance-i_2); //Sleep(5);

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_1cut_the_car(122+27+i_1); //Sleep(1);

show_the_car(122+28+i_1); Sleep(18);

} //快走

for(int i_2=0;i_2cut_the_car(122+27+small_distance+i_2); //Sleep(2);

show_the_car(122+28+small_distance+i_2); Sleep(1); }

//继续慢走

for(int i_3=0;i_3cut_the_car(122+27+small_distance+big_distance+i_3); //Sleep(1);

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();

因篇幅问题不能全部显示,请点此查看更多更全内容