
北邮大一电梯程序概要设计.docx
9页小组电梯系统概要设计第二版本小组电梯系统概要设计第二版本编制时间:2013-6-17 组员: 房辉 侯明洋 版本号:V1.01 用户界面设计用户界面设计1.1 动画方式动画方式【【界面操作说明界面操作说明】】MaxFloor 为 9 楼,左边是模拟电梯的升降和电梯外部运行图和外部指令按 钮,分为上和下两个右边是电梯内部电梯指令按钮和电梯楼层显示器,数字 键是目标楼层 //图形方式给出界面的布局设计,说明界面中各输入框和按钮的作用,说明如何使用界面 元素完成程序要求的功能1.2文件方式;文件方式;.文件名称:运行指令文件格式: .txt对给定文件夹在电梯运行时候产生一个文档,命令电梯运行的过程输入指令方法:就是一系列的呼叫和目标输入可以采用两种方法: a.以键盘输入呼叫和目标例如我们可以设定如下:当敲击键 1、2、3、4、5、6、7、8、9时表示电梯内有乘客按目标按钮,指定相应目标楼层当敲击 键Q、W、E、R、T、Y、U、I时表示8层到1层有上行呼叫请求当敲击键 A、S、D、F、G、 、H、J、K时表示9层到2层有下行呼叫请求 b.将呼叫和目标写入一个正文文件,然后程序读取这些呼叫和目标数据后可以在没有 人工干预的情况下模拟电梯运行情况。
呼叫目标,和键盘输入的设定一致,占1个字节 1、2、3、4、5、6、7、8、9时表示电梯内有乘客按目标按钮; Q、W、E、R、T、Y、U、I时表示8层到1层有上行呼叫请求; A、S、D、F、G、H、J、K时表示9层到2层有下行呼叫请求; 楼层输出格式:state current floor target floor direction time input//如果从文件输入或者输出到文件,则在此对输入输出文件进行说明,使人能看懂这些文 件, 要说明文件中各个数据项的含义、取值范围以及各个取值的含义2 自动机模型(状态转换图)自动机模型(状态转换图)空空闲闲运运行行停停靠靠其其他他楼楼层层有有请请 求求(n层层)到到达达目目标标 楼楼层层停停靠靠时时间间结结 束束//运行指令.txt 和运行记录.txt 文件 的指针 HEGG hegg[8];//保存 egg 句柄的数组int up[10];//存放向上呼叫的数组 int down[10];//存放向下呼叫的数组 int inside_button[10];//存放内部请求的数组 int present_floor;//当前楼层 int aim_floor;//目标楼层int firstcall;//电梯在 OFF 状态接收到的第一个信号 int firstfloor;//电梯在 OFF 状态接收到的第一个楼层int Hchoice;//用于记录输入方式 int state;//电梯运行状态int call;//改变电梯状态的指令 int way;//电梯运行方向 int sumtime;//电梯程序中的时间 4 高层算法设计高层算法设计void state_trans() { switch(state){ case PAUSE://电梯无运行方向 if(present_floor == aim_floor){ if(number==1){; state=STOP; number=2; } else{ state=PAUSE; way=NOWAY; } firstcall=1; } else{ state=RUN; }break; case RUN://电梯运行 if(present_floor aim_floor state=RUN; way=DOWN; } else if(present_floor > aim_floor way=DOWN; } if(present_floor==aim_floor){//当前楼层等于目标楼层 state=STOP; /* 判断响应的呼叫。
然后把响应的呼叫和请求值归零 表示响应结束 */ button_reduction(); if(way==UP) if(up[present_floor]==1) up[present_floor]=0; else down[present_floor]=0; else if(way==DOWN) if(down[present_floor]==1) down[present_floor]=0; else up[present_floor]=0; inside_button[present_floor]=0; } break; case STOP: if(aim_floor!=present_floor) state=RUN; else {state=PAUSE; } }}void control() {int fl, fn=0; incall=0;if(number==2){ button_reduction(); up[present_floor]=0; inside_button[present_floor]=0; down[present_floor]=0; number=0; } if(present_floor!=aim_floor){ if(way == UP){ for(fl=present_floor+1;flaim_floor fl-- )//搜索向上的呼叫/请求 if((down[fl]==1 || inside_button[fl]==1) fn=1; } }//end of if }// end of if else if(present_floor==aim_floor){ if(way == UP){ for(fl=present_floor+1;flpresent_floor fl--){ if((down[fl]==1 || inside_button[fl]==1) fn=1; } } }if(fn==0) //如果没找到,则向下,搜索位于当前楼层之下的 向下的请求/呼叫 for(fl=present_floor-1;fl>=1 fl--){ if((down[fl]==1 || inside_button[fl]==1) way=DOWN; fn=1; } }if(fn==0)//如果没有找到,则从最底层向上,搜索位于当前楼层之下的向 上的请求/呼叫 for(fl=1;fl=1 fl-- )//搜索在当前楼层下方的向下 的呼叫/请求 if((down[fl]==1 || inside_button[fl]==1) fn=1; } if(fn==0)//如果没找到,则从最低层向上,搜索位于当前楼层之下的向 上的请求/呼叫 for(fl=1;flpresent_floor fl--) if((down[fl]==1) way=UP; } } } else{ if(firstcall==0){ aim_floor=firstfloor; if(firstfloor>present_floor){ for(fl=present_floor+1;fl=1 fl-- )//搜索在当前楼层下 方的向下的呼叫/请求 if((down[fl]==1 || up[fl]==1 || inside_button[fl]==1) way=DOWN; fn=1; } }//end of else if else{ way=NOWAY; if(number==0 } } } } }}int protection(int target) { if(state==RUN else return 0; }void data_ini() { int i;state=PAUSE; way=NOWAY; firstcall=firstfloor=present_floor=1;//初始化楼层 aim_floor=1; number=0; for(i=1;i<=MAXFLOOR;i++){ up[i]=0; down[i]=0; inside_button[i]=0; }。












