1、 电梯仿真系统设计文档总目录1 设计任务2 设计规则3 设计目标4 设计模型5 设计思想6 运行情况总结7 程序清单1.设计任务某国际贸易中心共 40 层,设有载客电梯 10 部(用 E0E9 标识) 。利用多线程技术实现个电梯载客的仿真情况。2.设计规则2.1 电梯的运行规则:. E0、E1: 可到达每一层。. E2、E3: 可到达 1、25 40 层。. E4、E5: 可到达 125 层。. E6、E7: 可到达 1、2 40 层。. E8、E9: 可到达 139 层。2.2 每部电梯的最大乘员量均为 K 人(K 值可以根据仿真情况在 1020 人之间确定) 。2.3 仿真开始时,各电梯随
2、机处于起符合运行规则的任意一层,为空梯。2.4 仿真开始后,有 N 人(1000N)在 M 分钟(10M)内随机地到达该国际贸易中心的一层,开始乘梯活动。2.5 每个人初次所要到的楼梯层是随机的,令其在合适的电梯处等待电梯的到来。2.6 每个人乘坐的合适电梯到达指定楼层后,随机地停留 10120 秒后,在随机地去往另一楼层,依次类推,当每个人乘坐过 L 次(L 值可以根据仿真情况在 310 次之间确定)电梯后,第 L+1 次为下至底层并结束乘梯行为。到所有人结束乘梯行为时,本次仿真结束。2.7 电梯运行速度为 S 秒/层(S 值可以根据仿真情况在 15 之间确定) ,每个人上下的时间为 T 秒
3、(T 值可以根据仿真情况在 210 之间确定)2.8 电梯运行的方向由先发出请求者决定,不允许后发出请求者改变电梯的当前运行方向,除非是未被请求的空梯。2.9 当某层有人按下乘梯电钮时,首先考虑离该层最近的、满足条件 2.8、能够最快到达目标层的电梯。2.10 不允许电梯超员。3.设计目标3.1 各电梯相互独立,各自在自己的线程中运行,动态显示个电梯的载客和运行情况。3.2 动态显示各楼层的人员停留情况和要求乘梯情况。3.3 动态显示从仿真开始到目前的时间。3.4 显示时要求表示出每个乘客当前要求去往的楼层。例如,13-33 表示第 13 号的乘客要去 33 楼。3.5 统计各梯的运行与空闲时
4、间;统计每个人发出乘梯要求后的等待时间;3.6 每部电梯的最大成员量 K、参与仿真人数 N、到齐时间 M、每人要乘坐 L 次、电梯运行速度 S、每人上下时间 T 可变动输入。3.7 界面友好易于理解。4 设计模型楼 层系 统 监 控 电 梯已 到 乘 客检 查 电 梯 承 载 情 况检查楼层乘客停留情况检查乘客乘梯情况初 始 化检查楼层等待队列发 送 请 求发 送 请 求 到 等 待 队 列系 统 时 钟加入初始化后的新乘客新 到 乘 客5 设计思想 该程序采用可视化的面向对象语言 Delphi 采用多线程技术实现,其中定义了六个类,电梯 TElevator、乘客 Tperson、楼层 Tfl
5、oor、系统 TsystemControl、电梯运行线程TrunThread、系统监控 TsystemMonitor;每条线程动态监控每个电梯的运行情况,以电梯为主要对象,系统以每秒的事件触发每个线程对象的动作。因为乘客不是一次性到达大楼,所以必须考虑用动态对象数组,这个是由系统控制对象来不停地完成的新到来的乘客对象的初始化任务。因为每个乘客到的目标楼层是随机的,所以必须按照一定的规则选择要乘坐的电梯,当选择好目标电梯后就向该对象的等待队列发送请求, 当上了电梯后,就删除该乘客在电梯和当前楼层的等待请求。加入所乘电梯的乘载队列。电梯每到一层楼就检测是有人要下,如果没有人下,再判断是否满员,如果
6、没有满员,再检测当前楼层的等待队列是否有人上。对于乘客对象,每秒都要选择一次看看哪个电梯最快到达目标楼层,就加入该电梯的等待队列。对于系统监控对象,他是在系统监控线程中独立运行的,他动态监控大楼中每个人的乘坐情况,每个楼梯的运行情况,每层楼的乘客停留情况。6. 运行情况总结程序中最大问题是多线程数据共享问题,如果遇到数个线程同时访问一个数据就会出现共享冲突,比如 i 个电梯对象同时到达第 j 层,就会同时访问该层的乘客请求队列和闲留队列,当有乘客上了电梯,就必须删除该乘客在该层的请求,加入电梯承载队列,但是当 i 个电梯中有一个操作了第 j 层的请求队列,可能使得该队列变小,但是在其他几个电梯
7、操作该队列时并没有注意到这个问题,这样就会出现队列下标溢出错误!所以解决的办法有 2 个是:1)在每个电梯对象操作它当前层的队列时锁定该队列。2)统一加入一个临时操作队列,由系统监控对象一次性完成。本程序采用第一个方法。鉴于微机产生的伪随机数是均匀分布的,所以乘客每秒新到大厦的人数是由 1-10 内的伪随机数产生的,然后初始化新到的人,加入请求队列。这个可以在程序运行初,第一个到达一楼的电梯承载框看到。在程序中发现多数人在一楼等待,有的电梯已经到达但是还没有人乘做,所以思考之下发现,是因为对于乘客对象他应该是可以一选多个电梯,否则当一个电梯人员已满,他还是在等待,那就是很多人都选择了他们认为最
8、近的电梯但是没有考虑到电梯已经满了,造成队列太长。7 程序清单设置参数窗体:unit Setupin;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;SEMaxLoa
9、d: 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;Labe
10、l13: TLabel;procedure BitBtn2Click(Sender: TObject);procedure BitBtn1Click(Sender: TObject);private Private declarations public Public declarations end;varsetupForm: TsetupForm;implementationuses main;$R *.DFMprocedure TsetupForm.BitBtn2Click(Sender: TObject);beginApplication.Terminate;end;procedure
11、 TsetupForm.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.主窗体程序清单:unit mai
12、n;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: TPa
13、nel;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: TL
14、abel;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;Label
15、21: 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: TSta
16、ticText;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;M
17、emo11: 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;procedure FormCreate(Sender: TObjec
18、t);procedure FormDestroy(Sender: TObject);procedure FormShow(Sender: TObject);private Private declarations public Public declarations end;varmainform: Tmainform;implementation$R *.DFMprocedure Tmainform.FormCreate(Sender: TObject);var i:integer;beginfor i:=0 to 9 DObeginElavotorTracki:=TTrackbar.Cre
19、ate(nil);Elavotor_idle_Labeli:=TStaticText.Create(nil);Elavotor_Busy_Labeli:=TStaticText.Create(nil);Elavotor_Memoi:=Tmemo.Create(nil);end;ShowFloor:=TStringGrid.Create(nil);ShowFloor:=StrGD1;ElavotorTrack0:=TB0;ElavotorTrack1:=TB1;ElavotorTrack2:=TB2;ElavotorTrack3:=TB3;ElavotorTrack4:=TB4;Elavotor
20、Track5:=TB5;ElavotorTrack6:=TB6;ElavotorTrack7:=TB7;ElavotorTrack8:=TB8;ElavotorTrack9:=TB9;Elavotor_idle_Label0:=idleST0;Elavotor_idle_Label1:=idleST1;Elavotor_idle_Label2:=idleST2;Elavotor_idle_Label3:=idleST3;Elavotor_idle_Label4:=idleST4;Elavotor_idle_Label5:=idleST5;Elavotor_idle_Label6:=idleST
21、6;Elavotor_idle_Label7:=idleST7;Elavotor_idle_Label8:=idleST8;Elavotor_idle_Label9:=idleST9;Elavotor_Busy_Label0:=ST0;Elavotor_Busy_Label1:=ST1;Elavotor_Busy_Label2:=ST2;Elavotor_Busy_Label3:=ST3;Elavotor_Busy_Label4:=ST4;Elavotor_Busy_Label5:=ST5;Elavotor_Busy_Label6:=ST6;Elavotor_Busy_Label7:=ST7;
22、Elavotor_Busy_Label8:=ST8;Elavotor_Busy_Label9:=ST9;Elavotor_Memo0:=Memo0;Elavotor_Memo1:=Memo1;Elavotor_Memo2:=Memo2;Elavotor_Memo3:=Memo3;Elavotor_Memo4:=Memo4;Elavotor_Memo5:=Memo5;Elavotor_Memo6:=Memo6;Elavotor_Memo7:=Memo7;Elavotor_Memo8:=Memo8;Elavotor_Memo9:=Memo9;trySystemControl:=TSystemCon
23、trol.Create;SystemControl.Initsystem;finallyend;SystemControl.Initsystem;end;procedure Tmainform.FormDestroy(Sender: TObject);var i:integer;begin/释放所有类对象和线程的内存资源trySystemMonitor.FreeOnTerminate:=true;SystemMonitor.Terminate;for i:=0 to Systemcontrol.CurrentPersonTotal-1 DOPersoni.Free;for i:=0 to 9 DobeginRunThreadi.FreeOnTerminate:=true;RunThreadi.Terminate;Elavotori.Free;
Copyright © 2018-2021 Wenke99.com All rights reserved
工信部备案号:浙ICP备20026746号-2
公安局备案号:浙公网安备33038302330469号
本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。