电梯模拟程序

这是一个使用Qt5构建的小型电梯模拟程序,包含门控和电梯上下控制。程序使用MSVC编译,存在一个关于最近外呼面板信号的小bug。需要先点击开机按钮启动。系统架构采用前后端分离,状态机由门和电梯两部分组成。
摘要由CSDN通过智能技术生成


用c++和qt5编写的单电梯模拟程序
简介:这是一个在Qt5中构建的小型电梯模拟程序。包括门控和电梯升降控制。因为我在其中使用win32 api, MSVC应该是构建的选择。目前,它仍然存在一个小bug,它总是由最近的呼叫面板信号引起的。还有一件事,当系统准备好启动时,必须首先单击启动按钮,否则将发生意外的错误。

开机图:
你好! 这是你第一次使用 **Markdown编辑器** 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
启动图:

在这里插入图片描述

源代码链接地址:

GitHub源代码链接:Elevator-Simulation

Elevator-Simulation
This is an small elevator-simulation program builded in Qt5. Contains door control and elevator up-down control. Since I’m using win32 api in it, the MSVC should be choice for build. For now, a small bug is still exists in it which is always caused by nearest out-call panel signal. One more thing, you must click the Starting up button at first when system is ready for starting, otherwise a unexpected error will be happen.
构建说明
第一步:新建你的Qt项目
第二步:删除项目所有.cpp和.h和.ui文件
第三步:将.h添加进你项目中的Headers(注:头文件),将.cpp添加进你的Sources(源文件),将.ui文件添加进你的Forms(界面)中。
第四步:构建你的项目并运行
第五步:点击开机按钮,开始体验模拟电梯吧

系统架构

采用前后分离

电梯的状态机和控制系统分离
qt界面和电梯逻辑分离

逻辑实现

编写步骤:
第一步,在vs上编写纯逻辑实现核心代码:elevaotr.cpp和elevator.h
第二部,编写Qt5适配器,做可视化和接受控制信号:QtAdapter.h
状态机组成:
状态机由门和电梯两部分组成,实时扫描外界面板控制信号和内派信号。

具体画的状态机转换图纸在家放着,有时间补上

核心代码1:

elevator.h

#ifndef ELEVATOR_H
#define ELEVATOR_H

#include <QMainWindow>
#include<QObject>

/*
系统				电梯控制系统V2.1
编写时间          2021/1/29
编译环境          VS2017 X86 Debug模式  SDK:10.0.17763.0
作者			李照月
说明:			对比1.0系统,加入了门
收获:			按阶段编程,省时省力,一步到位
*/

#include<Windows.h>
#include<stdio.h>
#include<string.h>
#define LEVEL 6//楼层
//门的状态
enum eDoorState
{
   
    OPEN=1,	//已打开
    CLOSE,		//门关闭
    LOCK,		//门上锁
    OPENING,	//开门中
    CLOSING,	//关门中
};

//电梯的状态
enum eElevatorState
{
   
    STOP=1,
    UP,
    DOWN
};

//门控状态
enum eDoorButton
{
   
    NONE=0,
    OPENDOOR,
    CLOSEDOOR
};

enum eElevatorDirection
{
   
    LIFT=1,
    DROP,
    SUSPEND
};

//电梯高度
struct ElevatorHight
{
   
    ElevatorHight():nowHight(0), levelHigh(1000)	,fullLevel(LEVEL)	, moveSpeed(5){
   }
    int nowHight;	//当前高度
    const int levelHigh;	//每层楼高度
    const int fullLevel;		//总楼层
    const int moveSpeed;
};

//电梯宽度
struct DoorWidth
{
   
    DoorWidth() :nowWidth(0), fullWidth(1000),openSpeed(5),waitTime(100){
   }
    int nowWidth;
    const int fullWidth ;
    const int openSpeed ;
    const int waitTime;
};

//电梯类编写
class Elevator : public QObject
{
   
public: //属性
    char floorDownList[LEVEL];		//楼层下行按钮
    char floorUpList[LEVEL];			//楼层上行按钮
    char panelButtonList[LEVEL];	//电梯内面板楼层按钮

    enum eDoorState doorState;	//门的状态
    enum eElevatorState elevatorState;		//电梯状态
    enum eDoorButton doorButton;			//门控按钮
    enum eElevatorDirection liftDirection;	//电梯的运行方向


    struct ElevatorHight elevatorHight;	//电梯高度
    struct DoorWidth  doorWidth;			//门的宽度

    Elevator();
private://行为
    void doorClose();	//门关闭
    void doorLock();		//门上锁
    void doorOpening();	//门开机
    void doorClosing();		//门关闭
    void doorOpen();		//门打开

    void liftStop
建立一座两层楼,一部电梯模拟程序。为简化起见,每部电梯限乘一人,电梯每天在一楼关门等待。 三、具体要求及应提交的材料 模拟程序包括一个时钟,每天从零开始。模拟程序得调度器组件随机设置每一层第一个人到来的时间,当时钟的时间等于第一个人到来的时间时,模拟程序生成一个新到的人将该人放到这一层。然后这个人按下按钮,请求电梯开门。这个人的目的地楼层不能与他上电梯的楼层相同。 如果第一个人到达第一层,则可以在按下按钮、等待电梯开门之后立即进入电梯。如果第一个人在第2层,则电梯要升到第2层去接他。电梯从1层移到2层需要5秒。 电梯到达一层时,打开电梯门上的灯,并在电梯内发出铃声,该层的按钮和电梯中表示该层的按钮复位,电梯门打开,乘客走出电梯(如果有到该层的乘客)。另一乘客(如果该层有人等待)进入电梯按下目的层按钮,电梯们关上。电梯移动前确定移动方向(两层很容易判断),为简单起见,电梯到达一层直到关门所花时间为0。 任何时间每层最多只能有一人等待,如果新到的人(不在电梯中)要到达该层时该层被占用,则一秒后才能安排新到达者。假设每隔5到20秒人们随机到达每层。 要求: 对每个类(building,floor,elevator,person,button,time)设计 一个头文件,存放类定义,建立一个程序,存放类的实现。例如floor.h,floor.cpp 输出结果用文字表示即可,如“Person1 arriveds on Floor1, Person 1 enters Elevator”等。
八、 实验内容和要求: 要求根据下面的功能说明描述实现模拟电梯控制软件 (一)电梯配置 1. 共有1个电梯 2. 共有maxfloor层楼层。maxfloor=9。 3. 中间层每层有上下两个按钮,最下层只有上行按钮,最上层只有上行按钮。每层都有相应的指示灯,灯亮表示该按钮已经被按下,如果该层的上行或者下行请求已经被响应,则指示灯灭 4. 电梯内共有maxfloor个目标按钮,表示有乘客在该层下电梯。有指示灯指示按钮是否被按下。乘客按按钮导致按钮指示灯亮,如果电梯已经在该层停靠则该按钮指示灯灭 5. 另有一启动按钮(GO)。当电梯停在某一楼层后,接受到GO信息就继续运行。如果得不到GO信息,等待一段时间也自动继续运行。 6. 电梯内设有方向指示灯表示当前电梯运行方向。 说明:由于本次实验不使用可视化框架,所以无法作到从图形界面上获取按钮请求。因此电梯按钮的设计,不在图形界面上体现,仅用来设计键盘的模拟输入。 (二)电梯的运行控制 1.电梯的初始状态是电梯位于第一层处,所有按钮都没有按下。 2.乘客可以在任意时刻按任何一个目标钮和呼叫钮。呼叫和目标对应的楼层可能不是电梯当前运行方向可达的楼层。 3. 如果电梯正在向I层驶来,并且位于I层与相邻层(向上运行时是I-1层或者向下运行时是I+1层)之间,则因为安全考虑不响应此时出现的I层目标或者请求。如果电梯正好经过了I楼层,运行在I楼层和下一楼层之间,则为了直接响应此时出现的I层目标或者请求,必须至少到达运行方向上的下一楼层然后才能掉头到达I楼层(假设掉头无须其它额外时间),如果I楼层不是刚刚经过的楼层则可以在任意位置掉头,此时掉头后经过的第一个楼层不可停。 4. 电梯系统依照某种预先定义好的策略对随机出现的呼叫和目标进行分析和响应。 5. 乘客数量等外界因素(可能导致停靠时间的长短变化)不予考虑。假设电梯正常运行一层的时间是5S,停靠目标楼层、上下乘客和电梯继续运行的时间是5S。 6. 当电梯停靠某层时,该层的乘客如果错误的按目标或呼叫按钮都不予响应。 7. 电梯停要某一层后,苦无目标和呼叫,则电梯处于无方向状态,方向指示灯全灭,否则电梯内某个方向的指示灯亮,表示电梯将向该方向运行。等接到“GO”信号后电梯立即继续运行。若无GO信号,则电梯在等了上下乘客和电梯继续运行时间后也将继续运行。 8. 当一个目标(呼叫)已经被服务后,应将对应的指示灯熄灭。 (三)电梯运行的控制策略 以下是几个候选策略: 1.先来先服务策略: 将所有呼叫和目标按到达时间排队,然后一一完成。这是相当简单的策略,只需要设计一个将呼叫和目标排队的数据结构。因为该策略效率也很低,所以没有实际的电梯采用这种策略。 2. 顺便服务策略: 顺便服务是一种最常见的简单策略。这种策略在运行控制中所规定的安全前提下,一次将一个方向上的所有呼叫和目标全部完成。然后掉转运行方向完成另外一个方向上的所有呼叫和目标。 可以采用设定目标楼层的办法来实现这个策略,即电梯向一个目标楼层运行,但这个楼层可以修改。具体策略如下: 1) 修改目标楼层的策略: a.如果电梯运行方向向上,那么如果新到一个介于当前电梯所处楼层和目标楼层之间,又可以安全到达的向上呼叫或者目标,将目标楼层修改为这个新的楼层。 b.如果电梯运行方向向下,那么如果新到一个介于当前电梯所处楼层和目标楼层之间,又可以安全到达的向下呼叫或者目标,将目标楼层修改为这个新的楼层。 2)确定新的目标楼层: 如果电梯向上运行,当它到达某个目标楼层后,则依照以下顺序确定下一个目标楼层: a.如果比当前层高的楼层有向上呼叫或者目标,那么以最低的高于当前楼层的有向上呼叫或者目标的楼层为目标。 b.如果无法确定目标楼层,那么以最高的向下呼叫或者目标所在楼层为电梯当前目标楼层。 c.如果无法确定目标楼层,那么以最低的向上呼叫所在楼层为电梯当前的目标楼层。 d.如果仍然不能确定目标楼层(此时实际上没有任何呼叫和目标),那么电梯无目标,运行暂停。 如果电梯向下运行,依照以下顺序确定下一目标楼层: a.如果比当前层低的楼层有向下呼叫或者目标,那么以最高的低于当前楼层的有向下呼叫或者目标的楼层为目标。 b.如果无法确定目标楼层,那么以最低的向上呼叫或者目标所在楼层为电梯当前目标楼层。 c.如果无法确定目标楼层,那么以最高的向下呼叫楼层为目标楼层。 d.如果仍然不能确定目标楼层(此时实际上没有任何呼叫和目标),那么电梯无目标,运行暂停。 3)最快响应策略: 响应所有的现在存在的所有呼叫和目标所需时间(采用不同方案电梯停靠时间相同,所以不必考虑)最短的策略。 可选方案一是电梯先向上运行响应经过各层的目标和向上呼叫,再向下运行响应所有向下呼叫以及途经各层的目标,最后再向上响应剩余的向上呼叫。二是恰好相反,
建立一座两层楼,一部电梯模拟程序。为简化起见,每部电梯限乘一人,电梯每天在一楼关门等待。 三、具体要求及应提交的材料 模拟程序包括一个时钟,每天从零开始。模拟程序得调度器组件随机设置每一层第一个人到来的时间,当时钟的时间等于第一个人到来的时间时,模拟程序生成一个新到的人将该人放到这一层。然后这个人按下按钮,请求电梯开门。这个人的目的地楼层不能与他上电梯的楼层相同。 如果第一个人到达第一层,则可以在按下按钮、等待电梯开门之后立即进入电梯。如果第一个人在第2层,则电梯要升到第2层去接他。电梯从1层移到2层需要5秒。 电梯到达一层时,打开电梯门上的灯,并在电梯内发出铃声,该层的按钮和电梯中表示该层的按钮复位,电梯门打开,乘客走出电梯(如果有到该层的乘客)。另一乘客(如果该层有人等待)进入电梯按下目的层按钮,电梯们关上。电梯移动前确定移动方向(两层很容易判断),为简单起见,电梯到达一层直到关门所花时间为0。 任何时间每层最多只能有一人等待,如果新到的人(不在电梯中)要到达该层时该层被占用,则一秒后才能安排新到达者。假设每隔5到20秒人们随机到达每层。 要求: 对每个类(building,floor,elevator,person,button,time)设计一个头文件,存放类定义,建立一个程序,存放类的实现。例如floor.h,floor.cpp 输出结果用文字表示即可,如“Person1 arriveds on Floor1, Person 1 enters Elevator”等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值