電梯調度(二)


     結組隊員:劉靜(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層,如果不選擇電梯種別會有提示:  

             

    

                      

           

 

 

                

五、小組成員時間安排


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM