三层电梯状态机课程设计报告
状态机图
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;
}//关门后待机
}