




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
3 《C语言程序设计》实验设计报告 学院:_机电工程专业班级:自动化31班学生姓名:王刘鄞 学号导老师:段江涛 设计题目:___三层电梯状态机编程__2016年05月18日目录1.设计题目:三层电梯状态机 3前期只考虑了三层电梯模型,由此产生了(版本一)后期对电梯程序进行了修改,适应多楼层(版本二)2.设计方案: 32.1前期设计方案(版本一)2.2后期改进及楼层推广,适应多楼层(版本二)3.状态机建模: 33.1状态图建立图一:状态图 图二:思维图3.2状态机功能模块 3.3函数以及调用关系 4.代码分析及程序优化 94.1版本一与版本二初始化比较分析4.2版本一与版本二上升函数部分比较分析4.3版本一与版本二下降函数部分比较分析4.4版本一与版本二开门函数部分比较分析4.5版本一与版本二关门函数部分比较分析4.6两种版本的的评估及比较分析5.系统运行测试结果分析 17测试一:电梯内楼层按键的使用及演示(目前基于三层)测试二:楼层外上下按键的使用及演示测试三:开关门按钮的使用及演示测试四:自动到一楼综合测试分析以上测试结果对于版本一及版本二都适用,实测正确。6.学习心得及一些改进和调试过程中的心得体会 263.2状态机功能模块 一:初始化二:移动下降模块上升模块三:开关门开门模块关门模块可能发生的Events:E1:门内开门按钮(OpenDoorLight)E2:门内关门按钮(CloseDoorLight)E3:门内楼层按钮(PanelFloorLight)目前使用三个按钮(1,2,3)E4:门外up呼叫按钮(CallLight)E5:门外down呼叫按钮(CallLight)3.2函数以及调用关系:状态机主要函数及自己发挥部分/*****************************************************************************/voidIdlestate(int*state);//初始化函数voidmovingup(int*state);//向上升函数voidmovingdown(int*state);//下降函数voidDooropen(int*state);//开门函数voidDoorclosing(int*state)//门关闭函数初始化函数根据条件跳转上升下降及开门函数;上升下降函数根据条件跳转开门函数;门开函数根据条件调用门关闭函数;门关闭根据条件调用初始化及门开;三层电梯使用到的函数/*******************************************************************///系统是否运行boolIsElevatorRunning();//电梯门外Up/Down呼叫按钮灯(CallLight)boolGetPanelFloorLight(intfloor);voidSetCallLight(intfloor,boolup,bools);//电梯门内楼层按钮灯(PanelFloorLight)boolGetPanelFloorLight(intfloor);//IdleWhatFloorToGoTo()等函数中用voidSetPanelFloorLight(intfloor,bools);//电梯门内开关门按钮灯boolGetOpenDoorLight();voidSetOpenDoorLight(bools);boolGetCloseDoorLight();voidSetCloseDoorLight(bools);//电梯箱体门boolIsDoorOpen(intfloor);boolIsDoorClosed(intfloor);voidSetDoor(intfloor,boolopen);//设置电机功率,power=1,全速上升;-1,全速下降;0,停止voidSetMotorPower(doublepower);//一定时间无动作,自动到1楼externvoidAutoTo1Floor();//取消自动到1楼externvoidCancelTo1Floor();//获取电梯箱体当前所在楼层doubleGetFloor();//浮点数,如1.5,表示电梯箱体处在1层到2层的中间intGetNearestFloor();//GetFloor()函数的四舍五入值if(fabs(GetFloor()-GetNearestFloor())<Lib_FloorTolerance){到达GetNearestFloor()层}//静态监测,电梯处于空闲状态,确定下一步的运动方向和所到楼层(目标楼层)intIdleWhatFloorToGoTo(bool*up);intfloor;boolup;floor=IdleWhatFloorToGoTo(&up);//动态监测,电梯正在上升时,检测将要到达停止的最近楼层(目标楼层)intGoingUpToFloor();//动态监测,电梯正在下降时,检测将要到达停止的最近楼层(目标楼层)intGoingDownToFloor();/*******************************************************************/3.3分别对每个状态进行分析Idle状态,电梯停止在某楼层,门是关闭的,处于静止状态,等待相关事件的发生,从而转换到下一个状态。(S1)检查E3、E4、E5事件。静态检测,boolup;目标楼层=IdleWhatFloorToGoTo(&up);关闭本层门外up按钮,SetCallLight();即消费门外up按钮,防止下一周期重复处理此按钮行为。(S2)同(S1),消费门外down按钮。1层以上,一定时间无动作,自动下降到1楼。AutoTo1Floor();[其它 状态, 取消此功能,CancelTo1Floor()](S3)检查E1事件,开门,消费开门按钮;上升(up&&E4事件),开门,消费门外up按钮下降(!up&&E5事件),开门,消费门外down按钮(S4)检查E2事件,此时门应该是关闭的,因此仅读取关门灯,并关闭关门灯,即消费按键行为,防止下一周期重复处理该按钮的行为。if(GetCloseDoorLight()){SetCloseDoorLight(false);return;}Moving状态:MovingUp/MovingDown跳转到DoorOpen(S5)检查E3、E4、E5事件。动态检测,目标楼层floor=GoingUpToFloor();if(fabs(GetFloor()-floor)<Lib_FloorTolerance)到达目标楼层,停止,开门消费门外up按钮;到了最高层Lib_FloorNum,消费门外down按钮。消费门内楼层按钮。(D)检查E1、E2事件,无动作,消费开/关门按钮。(S6)检查E3、E4、E5事件。动态检测,目标楼层=GoingDownToFloor();其它与 (S5)类似。DoorOpen状态:电梯门打开跳转到DoorClosing(S7)检查E2事件,转而关门,GetCloseDoorLight(),SetDoor();消费关门按 钮。开门结束后,自动进入关门状态。IsDoorOpen();SetDoor();检查E1事件,无动作,消费开门按钮。DoorClosing状态:正在关门跳转到DoorOpen(S8)检查E1事件,转而开门。GetOpenDoorLight();SetDoor();消费关门按钮。检查E2事件,无动作,消费关门按钮。DoorClosing状态:正在关门Idle(S9)关门结束后,进入Idle状态。IsDoorClosed();4.1版本一与版本二初始化比较分析版本一使用switch语句进行判断,1层以上,一定时间无动作,自动下降到1楼。AutoTo1Floor();[其它状态,取消此功能,CancelTo1Floor()分别在某一层可能发生的事件进行判断,并进行相应的处理。没有使用部分函数代码及注解分析如下:floor=GetNearestFloor(); up=1;//up这里只是充当数值上或者下switch(floor)//到了每一层进行判断各层会发生的状况 { case1: if(GetCallLight(1,up))//在第一楼向上的按了 { *state=DoorOpen; //开门 printf("Transition:fromIdlestatetoDoorOpen.\n"); return; } //如果在2,3层或者是按楼层键 if(GetPanelFloorLight(2)|GetCallLight(2,up)|GetCallLight(2,0)| GetPanelFloorLight(3)|GetCallLight(3,0)) { *state=MovingUp;//上升状态 printf("Transition:fromIdlestatetoMovingUp.\n"); return; } //开关门判断 if(GetOpenDoorLight())//如果开门按钮打开 { SetDoor(floor,true);//开门 SetOpenDoorLight(false); *state=DoorOpen; return; } if(GetCloseDoorLight())//有关门按键就关门 { SetDoor(floor,false); SetCloseDoorLight(false); *state=DoorClosing; return; } break; case2: //在第二层 if(GetPanelFloorLight(3)|GetCallLight(3,0)|GetCallLight(3,up)) //第三层出现按键有用 { *state=MovingUp; //上升 printf("Transition:fromIdlestatetoMovingUp.\n"); return; } if(GetPanelFloorLight(1)|GetCallLight(1,0)|GetCallLight(1,up))//第一层按键 { *state=MovingDown;//下降 SetCallLight(floor,0,false); printf("Transition:fromIdlestatetoMovingDown.\n"); return; } if(GetOpenDoorLight())//如果开门按钮打开 { SetDoor(floor,true);//开门 SetOpenDoorLight(false); *state=DoorOpen; return; } if(GetCloseDoorLight())//有关门按键就关门 { SetDoor(floor,false); SetCloseDoorLight(false); *state=DoorClosing; return; }AutoTo1Floor();//自动到一楼 break; case3: //第三层碰到的情况 if(GetPanelFloorLight(1)|GetPanelFloorLight(2)|GetCallLight(2,0)| GetCallLight(1,1)|GetCallLight(2,1)) { *state=MovingDown; SetCallLight(floor,0,false);//下降 printf("Transition:fromIdlestatetoMovingDown.\n"); return; } if(GetOpenDoorLight())//如果开门按钮打开 { SetDoor(floor,true);//开门 SetOpenDoorLight(false); *state=DoorOpen; return; } if(GetCloseDoorLight())//有关门按键就关门 { SetDoor(floor,false); SetCloseDoorLight(false); *state=DoorClosing; return; } AutoTo1Floor();//自动到一楼 break;以上是版本一的初始化函数版本二使用静态检测,boolup;目标楼层=IdleWhatFloorToGoTo(&up);只对事件进行判断voidIdlestate(int*state){ intfloor,nowfloor; boolup; nowfloor=GoingDownToFloor(); if(nowfloor==1) { if(GetCallLight(1,1)) { *state=DoorOpen; SetCallLight(1,1,false); printf("Transition:fromIdlestatetoDoorOpen.\n"); return; } } floor=IdleWhatFloorToGoTo(&up);//静态检测上升到那一楼 if(floor>-1) { //判断电梯楼层按钮程序 if(up&&GetPanelFloorLight(floor))//向上的按钮按了就向上运行 { // SetCallLight(floor,up,false); *state=MovingUp; //状态翻转 printf("Transition:fromIdlestatetoMovingUp.\n"); return; //减少代码运行时间 } if(!up&&GetPanelFloorLight(floor)) { // SetCallLight(floor,!up,false); *state=MovingDown; printf("Transition:fromIdlestatetoMovingDown.\n"); return; } //电梯内上下按钮的程序 if(GetCallLight(floor,up)|GetCallLight(floor,!up))//楼层上下呼叫 { if(up==true) //开始消费 { *state=MovingUp; printf("Transition:fromIdlestatetoMovingUp.\n"); return; } if(up==false) { *state=MovingDown; printf("Transition:fromIdlestatetoMovingUp.\n"); return; } } //开关门函数处理 if(GetCloseDoorLight()) //关门灯判断 { SetCloseDoorLight(false); *state=DoorClosing; printf("Transition:fromIdlestatetoDoorClosing.\n"); return; } if(GetOpenDoorLight()) //开门灯判断 { SetOpenDoorLight(false); *state=DoorOpen; printf("Transition:fromIdlestatetoDoorOpen.\n"); return; } } ///对自动下降函数的处理 if(nowfloor>1) { AutoTo1Floor(); //printf("进去了1111\n");//测试用 }}4.2版本一与版本二上升函数部分比较分析版本二在版本一的基础上修改不大,局部进行了部分调整,但没什么变化。版本一这个函数已经接近完善。两者的思路相似只是一个消费的过程,其它绝大多数都在初始化中进行了判断。版本一voidmovingup(int*state){ intfloor; boolup=1; CancelTo1Floor(); floor=GoingUpToFloor(); //动态检测 if(GetPanelFloorLight(floor)) //灭灯的过程,防止重复消费 SetPanelFloorLight(floor,false); if(GetCallLight(floor,up)) SetCallLight(floor,up,false); if(GetCallLight(floor,0)) SetCallLight(floor,0,false); if(fabs(GetFloor()-floor)<Lib_FloorTolerance)//判断距离,调节电机 { SetMotorPower(0); SetDoor(floor,1); *state=DoorOpen; printf("Transition:fromMovinguptoDowmOpen.\n"); return; } else SetMotorPower(1);}版本二voidmovingup(int*state){ intfloor; boolup=1; CancelTo1Floor();//取消自动到一楼 floor=GoingUpToFloor(); //判断到那一层 if(fabs(GetFloor()-floor)<Lib_FloorTolerance) //距离判断 { if(GetCallLight(floor,up)|GetCallLight(floor,!up))//楼层上下呼叫 { SetCallLight(floor,up,false);//灭灯 SetCallLight(floor,!up,false); } if(GetPanelFloorLight(floor)) //灭灯楼层按钮 SetPanelFloorLight(floor,false); SetMotorPower(0); SetDoor(floor,1); *state=DoorOpen; printf("Transition:fromMovinguptoDowmOpen.\n"); return; } else SetMotorPower(1);}4.3版本一与版本二下降函数部分比较分析版本二在版本一的基础上修改不大,局部进行了部分调整,但没什么变化。版本一的这个函数,在调试过程中遇到了麻烦。两者的思路相似只是一个消费的过程,其它绝大多数都在初始化中进行了判断。版本一voidmovingdown(int*state){ intfloor; boolup=1; CancelTo1Floor(); if(GetPanelFloorLight(1)|GetPanelFloorLight(2)|GetCallLight(2,0)|GetCallLight(1,1)|GetCallLight(2,1)|GetPanelFloorLight(1)|GetCallLight(1,0)|GetCallLight(1,up)) { floor=GoingDownToFloor(); //灭灯 }//加上这个解决了不能到一楼的BUG floor=1; if(GetPanelFloorLight(floor)) SetPanelFloorLight(floor,false); if(GetCallLight(floor,!up)) SetCallLight(floor,!up,false); if(GetCallLight(floor,up)) SetCallLight(floor,up,false); if(fabs(GetFloor()-floor)<Lib_FloorTolerance) { SetMotorPower(0); SetDoor(floor,1); *state=DoorOpen; printf("Transition:frommovingdowntoDoorOpen.\n"); return; } else SetMotorPower(-1);}版本二:voidmovingdown(int*state){ intfloor;// boolup=1; CancelTo1Floor(); //{// floor=1;// if(GetCallLight(floor,!up)|GetCallLight(floor,up)|GetPanelFloorLight(floor))//{// 去掉了那一部分,精简了代码 floor=GoingDownToFloor(); //} if(GetPanelFloorLight(floor)) SetPanelFloorLight(floor,false); if(fabs(GetFloor()-floor)<Lib_FloorTolerance) { if(GetCallLight(floor,up)|GetCallLight(floor,!up))//楼层上下呼叫 { SetCallLight(floor,up,false);//灭灯 SetCallLight(floor,!up,false); } if(GetPanelFloorLight(floor)) SetPanelFloorLight(floor,false); SetMotorPower(0); SetDoor(floor,1); *state=DoorOpen; printf("Transition:frommovingdowntoDoorOpen.\n"); return; } else SetMotorPower(-1); }4.4版本一与版本二开门函数部分比较分析voidDooropen(int*state){ intfloor; floor=GetNearestFloor(); CancelTo1Floor(); if(GetCloseDoorLight())//有关门按键就关门 { SetDoor(floor,false); SetCloseDoorLight(false); *state=DoorClosing; return; } elseif(IsDoorOpen(floor)) //如果门是关闭的就进去,返回门是否是打开的,true表示门是打开的,否则门是关闭的或者正在打开/关闭 { SetDoor(floor,false); *state=DoorClosing; return; } if(GetOpenDoorLight())//如果开门按钮打开 { SetDoor(floor,true); SetOpenDoorLight(false); }}4.5版本一与版本二关门函数部分比较分析两个版本几乎一样//关门函数的编写voidDoorclosing(int*state){ intfloor; floor=GetNearestFloor();//判断到最近的楼层 CancelTo1Floor(); if(GetCloseDoorLight()) //判断关门 { SetCloseDoorLight(false); SetDoor(floor,false); } elseif(GetOpenDoorLight()) //判断开门 { SetDoor(floor,true);//开门 SetOpenDoorLight(false); *state=DoorOpen; return; } elseif(IsDoorClosed(floor)) //判断门是否开了 { *state=Idle; // printf("进去了\n");//用来测试 return; }}4.6两种版本的的评估及比较分析版本一:这个初期未完成任务,而没过于想太多,在运行调试过程中能正确执行,但是局限性比较
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 神木职业技术学院《固体物理导论》2023-2024学年第二学期期末试卷
- 天津农学院《管理学实务》2023-2024学年第二学期期末试卷
- 武汉铁路职业技术学院《学前儿童艺术教育活动设计》2023-2024学年第二学期期末试卷
- 陕西理工大学《擒拿与格斗》2023-2024学年第二学期期末试卷
- 中央司法警官学院《钢筋混凝土与砌体结构设计》2023-2024学年第二学期期末试卷
- 陕西机电职业技术学院《政府与非营利组织会计》2023-2024学年第二学期期末试卷
- 天津工程职业技术学院《室内装修工程》2023-2024学年第二学期期末试卷
- 郑州卫生健康职业学院《BIM技术应用》2023-2024学年第二学期期末试卷
- 新乡工程学院《文学概论一》2023-2024学年第二学期期末试卷
- 西安科技大学高新学院《机械工程测试技术基础》2023-2024学年第二学期期末试卷
- 硅热式风速传感器输出稳定性的多维度解析与优化策略研究
- Brand KPIs for spirits Tito's Handmade Vodka in the United States-外文版培训课件(2025.2)
- 2025届深圳市高三年级第二次调研试题讲评 课件
- 北京2025年中国专利信息中心招聘14名社会在职人员笔试历年参考题库附带答案详解
- 中级审计师考试真题模拟试题及答案
- 无人机飞行器编程基本知识试题及答案
- 2024-2025部编版小学道德与法治二年级下册期末考试卷及答案 (三套)
- 2025-2030中国试管行业市场发展趋势与前景展望战略研究报告
- 河北检察院试题及答案
- 《光生载流子效应》课件
- 2025年国际金融理财师考试全球经济影响因素试题及答案
评论
0/150
提交评论