• 电梯调度(二)


         结组队员:刘静(20092532)  解凤娇(20112878)  王洪叶(20112886

    一、电梯调度编写综述:

         1、电梯分为四个,因此设置一个电梯标号选项工乘客选择向乘坐的电梯。

         2、电梯为负一层到二十层,因此为满足电梯需求,每一层电梯内部设置26个按钮工乘客选择所要到达的电梯层数。电梯外部设置两个按钮(第二十层和负一层除外,第二十层只设置向下按钮,负一层只设置向上按钮)并通过按钮的亮灭状态判断电梯的运行状态。

         3、电梯时间设置:电梯到达各层停止时间设置为10s供电体中乘客走出或者电梯外部的人进入电梯;电梯开关门时间设置为1s,通过每一层所用时间为9s

         4、电梯在每一层会判断电梯载重量是否超重,若超重则不再应答电梯外部请求,直到满足条件为止。

    二、流程图:

                                 

     

    三、功能实现思想:

         1、编译环境:vs2010

         2、实现语言:C#

         3、(1)静态数据设置:

                      具体实现部分代码:

    static public class St   
        {
            public enum proSt { Wait, Run ,Ready};                             
    
            public enum dir { Up, Down, Stay };                                  
        }
        public class INFO        //INFO数据块
        {
            public bool Run = true;      //电梯运行状况
    
            public int req = 0;    //电梯剩下的请求数
    
            public St.proSt sta = St.proSt.Ready;        //电梯运动状态
    
            public St.dir edir = St.dir.Stay;              //电梯运动的方向
    
            public St.dir nextDir = St.dir.Stay;        //电梯被请求的下一个运动方向
    
            public int curFlo = 0;          //电梯当前楼层数
    
            public int[] upFlo = new int[20];  //上行 目的地状态栏:0为没有请求 1为有请求
    
            public int[] downFlo = new int[20];     //下行 目的地状态栏:0为没有请求 1为有请求
                                           
    
            public int[] light = new int[20];        //电梯内按钮灯的状态,1为亮灯,0为灭灯
    
            public int[] uplight = new int[20];       //控制上行灯的显示状态标识
    
            public int[] dLight = new int[20];      //控制下行灯的显示状态标识
        }

    2)电梯运行状态类:public class Process

                         具体代码部分:

    public class Process
        {
            public INFO info = new INFO();
            public TextBox eleSta = new TextBox();  //用来显示此电梯状况的表
          private delegate void boxDelegate();
            public void Lightup(int floor)
            {
                info.light[floor - 1] = 1;
            }
            public void Lightclose(int floor)
            {
                info.light[floor] = 0;
            }

    3)电梯运行方向实现方法:public void setdir()

                        具体实现部分代码:

    public void setdir()
            {
                int i = 0;
                if (info.req != 0)
                {
                    for (i = info.curFlo; i != 20; i++)
                    {
                        if (info.upFlo[i] == 1)
                        {
                            if (info.curFlo == i)
                            {
                                info.edir = St.dir.Stay;
                                break;
                            }
                            else                        {
                                info.edir = St.dir.Up;
                                break;
                            }
                        }
                    }
                    if(i == 20)
                    {
                        for(i = 19;i != -1 ;i--)
                        {
                             if (info.downFlo[i] == 1)
                            {
                                if (info.curFlo == i)
                                {
                                    info.edir = St.dir.Stay;
                                    break;
                                }
                                else                          
                              {
                                    info.edir = St.dir.Down;
                                    break;
                                }
                             }
                        }
                    }
                    if(i == -1)
                        info.edir = St.dir.Stay;
                }
            }

    4)请求参数改变运行状态:public void setFlo(int floor, int reqDir)

            具体实现部分代码:

    public void setFlo(int floor, int reqDir)
    {
                if (info.upFlo[floor - 1] == 1| info.downFlo[floor - 1] == 1)
                {
                    return;
                }
                info.req++;
                if (info.curFlo - (floor-1) <= 0)
                {
                    if (reqDir == -1)
                        info.downReverseSta[floor - 1] = 1;
                    info.upFlo[floor - 1] = 1;
                }
                else if (info.curFlo - (floor - 1) > 0)
                {
                    if (reqDir == 1)
                        info.uplight[floor - 1] = 1;
                    info.downFlo[floor - 1] = 1;
                }
                setdir();
    
            }
            public void arrFlo(int arrflo)
            {
                if (info.edir == St.dir.Up | info.edir == St.dir.Stay)
                {
                    info.upFlo[arrflo] = 0;
                    if (info.dLight[arrflo] == 1)
                        outOrder.downFloors[arrflo] = 0;
                    else
                        outOrder.upFloors[arrflo] = 0;
                    info.downReverseSta[arrflo] = 0;
                }
                else if (info.edir == St.dir.Down)
                {
                    info.downFlo[arrflo] = 0;
                    if(info.uplight[arrflo] == 1)
                        outOrder.upFloors[arrflo] = 0;
                    else
                        outOrder.downFloors[arrflo] = 0;
                    info.uplight[arrflo] = 0;
                }
                if (info.req == 0)
                {
                    info.edir = St.dir.Stay;
                    info.nextDir = St.dir.Stay;
                }
            }
            public int isRightReq(int orderFloor) 
            {
                orderFloor--;
                if ((info.curFlo > orderFloor) && (info.edir == St.dir.Up|info.Sta == St.proSt.Wait))
                    return -1;
                else if ((info.curFlo < orderFloor) && (info.edir == St.dir.Down|info.Sta == St.proSt.Wait))
                    return -1;
                else
                    return 0;
            }      
            public void run(object t)
            {
                eleSta = (t as TextBox);   
                while (info.Run)
                {
                    if (info.req != 0)
                    {
                        setdir();
                        if(info.edir != St.dir.Stay)
                            info.Sta = St.proSt.Run;
                        this.eleSta.Dispatcher.Invoke(new boxDelegate(UpdataShow));
                        this.eleSta.Dispatcher.Invoke(new boxDelegate(MoveShow));
                        this.eleSta.Dispatcher.Invoke(new boxDelegate(UpdataShow));
                    }
                    if (isArr())
                    {
                        arrFlo(info.curFlo);
                        Lightclose(info.curFlo);
                        Thread.Sleep(3000); 
                    }
                    Thread.Sleep(1000);
                    if (info.req == 0)
                    {
                        info.Sta= St.proSt.Ready;
                        this.eleSta.Dispatcher.Invoke(new boxDelegate(UpdataShow));
                    }                   
                 }
                do
                {
                    Thread.Sleep(3000);
                }
                while (!info.Run);
                run(t);
            }
    }

      

    四、运行结果截图

        主界面:

     

                  

          主界面默认在电梯-1层,如果不选择电梯种别会有提示:  

                 

        

                          

               

     

     

                    

    五、小组成员时间安排

  • 相关阅读:
    expect脚本实例
    Linux dialog详解(图形化shell)
    makefile——小试牛刀
    gdb入门
    linux常见系统调用函数列表
    linux前后台任务的切换以及执行暂停
    centos 7.0 lnmp安装部署步骤
    环境列表
    setjmp与longjmp非局部跳转函数的使用
    malloc,calloc,alloca和free函数
  • 原文地址:https://www.cnblogs.com/xiefengjiao/p/3619423.html
Copyright © 2020-2023  润新知