电梯仿真系统设计文档总目录1.设计任务2.设计规则3.设计目标4.设计模型5.设计思想6.运行情况总结7.程序清单1.设计任务某国际贸易中心共40层,设有载客电梯10部(用E0~E9标识)。利用多线程技术实现个电梯载客的仿真情况。2.设计规则2.1电梯的运行规则:.E0、E1:可到达每一层。.E2、E3:可到达1、25~~40层。.E4、E5:可到达1~~25层。.E6、E7:可到达1、2~~40层。.E8、E9:可到达1~~39层。2.2每部电梯的最大乘员量均为K人(K值可以根据仿真情况在10—20人之间确定)。2.3仿真开始时,各电梯随机处于起符合运行规则的任意一层,为空梯。2.4仿真开始后,有N人(1000N)在M分钟(10M)内随机地到达该国际贸易中心的一层,开始乘梯活动。2.5每个人初次所要到的楼梯层是随机的,令其在合适的电梯处等待电梯的到来。2.6每个人乘坐的合适电梯到达指定楼层后,随机地停留10—120秒后,在随机地去往另一楼层,依次类推,当每个人乘坐过L次(L值可以根据仿真情况在3—10次之间确定)电梯后,第L+1次为下至底层并结束乘梯行为。到所有人结束乘梯行为时,本次仿真结束。2.7电梯运行速度为S秒/层(S值可以根据仿真情况在1—5之间确定),每个人上下的时间为T秒(T值可以根据仿真情况在2—10之间确定)2.8电梯运行的方向由先发出请求者决定,不允许后发出请求者改变电梯的当前运行方向,除非是未被请求的空梯。2.9当某层有人按下乘梯电钮时,首先考虑离该层最近的、满足条件2.8、能够最快到达目标层的电梯。2.10不允许电梯超员。3.设计目标3.1各电梯相互独立,各自在自己的线程中运行,动态显示个电梯的载客和运行情况。3.2动态显示各楼层的人员停留情况和要求乘梯情况。3.3动态显示从仿真开始到目前的时间。3.4显示时要求表示出每个乘客当前要求去往的楼层。例如,13-33表示第13号的乘客要去33楼。3.5统计各梯的运行与空闲时间;统计每个人发出乘梯要求后的等待时间;3.6每部电梯的最大成员量K、参与仿真人数N、到齐时间M、每人要乘坐L次、电梯运行速度S、每人上下时间T可变动输入。3.7界面友好易于理解。4.设计模型楼层系统监控电梯已到乘客检查电梯承载情况检查楼层乘客停留情况检查乘客乘梯情况初始化检查楼层等待队列发送请求发送请求到等待队列系统时钟加入初始化后的新乘客新到乘客5.设计思想该程序采用可视化的面向对象语言Delphi采用多线程技术实现,其中定义了六个类,电梯TElevator、乘客Tperson、楼层Tfloor、系统TsystemControl、电梯运行线程TrunThread、系统监控TsystemMonitor;每条线程动态监控每个电梯的运行情况,以电梯为主要对象,系统以每秒的事件触发每个线程对象的动作。因为乘客不是一次性到达大楼,所以必须考虑用动态对象数组,这个是由系统控制对象来不停地完成的新到来的乘客对象的初始化任务。因为每个乘客到的目标楼层是随机的,所以必须按照一定的规则选择要乘坐的电梯,当选择好目标电梯后就向该对象的等待队列发送请求,当上了电梯后,就删除该乘客在电梯和当前楼层的等待请求。加入所乘电梯的乘载队列。电梯每到一层楼就检测是有人要下,如果没有人下,再判断是否满员,如果没有满员,再检测当前楼层的等待队列是否有人上。对于乘客对象,每秒都要选择一次看看哪个电梯最快到达目标楼层,就加入该电梯的等待队列。对于系统监控对象,他是在系统监控线程中独立运行的,他动态监控大楼中每个人的乘坐情况,每个楼梯的运行情况,每层楼的乘客停留情况。6.运行情况总结程序中最大问题是多线程数据共享问题,如果遇到数个线程同时访问一个数据就会出现共享冲突,比如i个电梯对象同时到达第j层,就会同时访问该层的乘客请求队列和闲留队列,当有乘客上了电梯,就必须删除该乘客在该层的请求,加入电梯承载队列,但是当i个电梯中有一个操作了第j层的请求队列,可能使得该队列变小,但是在其他几个电梯操作该队列时并没有注意到这个问题,这样就会出现队列下标溢出错误!所以解决的办法有2个是:1)在每个电梯对象操作它当前层的队列时锁定该队列。2)统一加入一个临时操作队列,由系统监控对象一次性完成。本程序采用第一个方法。鉴于微机产生的伪随机数是均匀分布的,所以乘客每秒新到大厦的人数是由1-10内的伪随机数产生的,然后初始化新到的人,加入请求队列。这个可以在程序运行初,第一个到达一楼的电梯承载框看到。在程序中发现多数人在一楼等待,有的电梯已经到达但是还没有人乘做,所以思考之下发现,是因为对于乘客对象他应该是可以一选多个电梯,否则当一个电梯人员已满,他还是在等待,那就是很多人都选择了他们认为最近的电梯但是没有考虑到电梯已经满了,造成队列太长。7.程序清单设置参数窗体:unitSetupin;interfaceusesWindows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,ExtCtrls,Buttons,Spin,Define;typeTsetupForm=class(TForm)Panel1:TPanel;Label1:TLabel;BitBtn1:TBitBtn;BitBtn2:TBitBtn;GroupBox1:TGroupBox;SEMaxLoad:TSpinEdit;SEPersonNum:TSpinEdit;SEOntime:TSpinEdit;SEElavotorSpeed:TSpinEdit;SEUpDownTime:TSpinEdit;Label2:TLabel;Label3:TLabel;Label4:TLabel;Label5:TLabel;Label6:TLabel;Label7:TLabel;Label8:TLabel;Label9:TLabel;Label10:TLabel;Label11:TLabel;Label12:TLabel;SETakeNum:TSpinEdit;Label13:TLabel;procedureBitBtn2Click(Sender:TObject);procedureBitBtn1Click(Sender:TObject);private{Privatedeclarations}public{Publicdeclarations}end;varsetupForm:TsetupForm;implementationusesmain;{$R*.DFM}procedureTsetupForm.BitBtn2Click(Sender:TObject);beginApplication.Terminate;end;procedureTsetupForm.BitBtn1Click(Sender:TObject);beginMaxload:=SEMaxload.Value;//电梯最大乘客量PersonNum:=SEPersonNum.Value;//参与仿真人数Ontime:=SEOntime.Value;//人员到齐时间ElavotorSpeed:=SEElavotorSpeed.Value;//电梯运行速度UpDownTime:=SEUpDownTime.value;//上下电梯时间TakeNum:=SETakeNum.Value;//乘做电梯次数self.hide;end;end.主窗体程序清单:unitmain;interfaceusesWindows,Messages,SysUtils,Classes,Graphics,Controls,setupin,Define,Forms,Dialogs,ComCtrls,ExtCtrls,StdCtrls,Grids;typeTmainform=class(TForm)STB1:TStatusBar;Panel1:TPanel;PageControl1:TPageControl;TabSheet1:TTabSheet;TabSheet2:TTabSheet;TabSheet3:TTabSheet;Panel2:TPanel;TB0:TTrackBar;TB1:TTrackBar;TB2:TTrackBar;TB3:TTrackBar;TB4:TTrackBar;TB5:TTrackBar;TB6:TTrackBar;TB7:TTrackBar;TB8:TTrackBar;TB9:TTrackBar;Label1:TLabel;Label2:TLabel;Label3:TLabel;Label4:TLabel;Label5:TLabel;Label6:TLabel;Label7:TLabel;Label8:TLabel;Label9:TLabel;Label10:TLabel;Memo0:TMemo;Memo1:TMemo;Memo2:TMemo;Memo3:TMemo;Memo4:TMemo;Memo5:TMemo;Memo6:TMemo;Memo7:TMemo;Memo8:TMemo;Memo9:TMemo;Label11:TLabel;Label12:TLabel;Label13:TLabel;Label14:TLabel;Label15:TLabel;Label16:TLabel;Label17:TLabel;Label18:TLabel;Label19:TLabel;Label20:TLabel;Label21:TLabel;Label22:TLabel;Label23:TLabel;Label24:TLabel;Label25:TLabel;Label26:TLabel;Label27:TLabel;Label28:TLabel;Label29:TLabel;Label30:TLabel;ST0:TStaticText;ST1:TStaticText;ST2:TStaticText;ST3:TStaticText;ST4:TStaticText;ST5:TStaticText;ST6:TStaticText;ST7:TStaticText;ST8:TStaticText;ST9:TStaticText;idleST0:TStaticText;idleST1:TStaticText;idleST2:TStaticText;idleST3:TStaticText;idleST4:TStaticText;idleST5:TStaticText;idleST6:TStaticText;idleST7:TStaticText;idleST8:TStaticText;idleST9:TStaticText;Panel3:TPanel;Panel4:TPanel;StrGD1:TStringGrid;Memo10:TMemo;Memo11:TMemo;Memo12:TMemo;Label31:TLabel;Label32:TLabel;Label33:TLabel;Memo13:TMemo;Label34:TLabel;Label35:TLabel;Label36:TLabel;Label37:TLabel;Label38:TLabel;Label39:TLabel;Label40:TLabel;Label41:TLabel;Label42:TLabel;Label43:TLabel;Label44:TLabel;procedureFormCreate(Sender:TObject);procedureFormDestroy(Sender:TObject);procedureFormShow(Sender:TObject);private{Privatedeclarations}public{Publicdeclarations}end;varmainform:Tmainform;implementation{$R*.DFM}procedureTmai