logo资料库

三层电梯状态机.docx

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
Movingup、movingdown
三层电梯状态机课程设计报告 状态机图 Movingdown Movingup Dooropen Doorclosing
流程图 Idle Idle Yes SetMotorPower(1) floor > 0 && up Movingup No floor > 0 && !up No Yes SetMotorPower(-1) 1:SetDoor(floor, 1); :2:SetOpenDoorLight(0) Yes GetOpenDoorLight() Movingdown Dooropen GetCloseDoorLight() Idle
Movingup、movingdown SetMotorPower(0); SetDoor(floor, 1); Yes Movingup fabs(GetFloor() - floor) < Lib_FloorTolerance No fabs(GetFloor() - 3) < Lib_FloorTolerance GetOpenDoorLight(); SetOpenDoorLight(0); GetCloseDoorLight(); SetCloseDoorLight(0) Yes No SetCallLight SetCallLight no Dooropen
Dooropen Yes SetCloseDoorLight(0); SetDoor(floor, 0); Dooropen GetCloseDoorLight() No (IsDoorOpen(floor) SetOpenDoorLight(0) No Yes SetDoor(floor, 0) Doorclosing Dooropen 状态
void StateIdle(int *state) { int floor; bool up; floor = IdleWhatFloorToGoTo(&up); if (floor > 0 && up) { SetMotorPower(1); *state = MovingUp; }//电梯准备上升 else if (floor > 0 && !up) { SetMotorPower(-1); *state = MovingDown; }//电梯准备下降 if (GetOpenDoorLight()) { SetDoor(floor, 1); SetOpenDoorLight(0); *state = DoorOpen; }// 电梯内开门 if (GetCloseDoorLight()) { SetCloseDoorLight(0); return; }//电梯关闭 } void StateMovingUp(int *state) { int floor; bool up; floor = GoingUpToFloor(); if (fabs(GetFloor() - floor) < Lib_FloorTolerance) { SetMotorPower(0); SetDoor(floor, 1); *state = DoorOpen; if (fabs(GetFloor() - 3) < Lib_FloorTolerance) SetCallLight(floor, 0, 0); SetCallLight(floor, 1, 0); SetPanelFloorLight(floor, 0); }//开门 else { GetOpenDoorLight(); SetOpenDoorLight(0);
GetCloseDoorLight(); SetCloseDoorLight(0); }//安全设置,无动作 } void StateMovingDown(int *state) { int floor; bool up; floor = GoingDownToFloor(); if (fabs(GetFloor() - floor) < Lib_FloorTolerance) { SetMotorPower(0); SetDoor(floor,1); *state = DoorOpen; if (fabs(GetFloor() - 1) < Lib_FloorTolerance) SetCallLight(floor, 1, 0); SetCallLight(floor, 0, 0); SetPanelFloorLight(floor, 0); GetNearestFloor(); }//下降后开门 else { GetOpenDoorLight(); SetOpenDoorLight(0); GetCloseDoorLight(); SetCloseDoorLight(0); }//关灯 } void StateDoorOpen(int *state) { int floor; bool up; floor=GetNearestFloor(); if (GetCloseDoorLight()) { SetCloseDoorLight(0); SetDoor(floor, 0); *state = DoorClosing; }//正在开门,按关门,关门 if (IsDoorOpen(floor)) { SetDoor(floor, 0); *state = DoorClosing; }//开门完,直接关门 if (GetOpenDoorLight())
{ SetOpenDoorLight(0); }//开门时,按开门,无动作 } void StateDoorClosing(int *state) { int floor; bool up; floor=GetNearestFloor(); if (GetOpenDoorLight()) { SetOpenDoorLight(0); SetDoor(floor, 1); *state = DoorOpen; }//正在关门,按开门,开门 else if (GetCloseDoorLight()) { SetCloseDoorLight(0); }//正在关门,按关门,无动作 else if (IsBeamBroken()) { SetDoor(floor,1); *state = DoorOpen; }//门口有东西挡住,自动上升 else if (IsDoorClosed(floor)) { *state = Idle; }//关门后待机 }
分享到:
收藏