电梯仿真系统设计文档.docx
- 文档编号:25058950
- 上传时间:2023-06-04
- 格式:DOCX
- 页数:44
- 大小:69.17KB
电梯仿真系统设计文档.docx
《电梯仿真系统设计文档.docx》由会员分享,可在线阅读,更多相关《电梯仿真系统设计文档.docx(44页珍藏版)》请在冰豆网上搜索。
电梯仿真系统设计文档
电梯仿真系统设计文档
总目录
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人(1000>N)在M分钟(10>M)内随机地到达该国际贸易中心的一层,
开始乘梯活动。
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;
interface
uses
Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,
StdCtrls,ExtCtrls,Buttons,Spin,Define;
type
TsetupForm=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;
var
setupForm:
TsetupForm;
implementation
usesmain;
{$R*.DFM}
procedureTsetupForm.BitBtn2Click(Sender:
TObject);
begin
Application.Terminate;
end;
procedureTsetupForm.BitBtn1Click(Sender:
TObject);
begin
Maxload:
=SEMaxload.Value;//电梯最大乘客量
PersonNum:
=SEPersonNum.Value;//参与仿真人数
Ontime:
=SEOntime.Value;//人员到齐时间
ElavotorSpeed:
=SEElavotorSpeed.Value;//电梯运行速度
UpDownTime:
=SEUpDownTime.value;//上下电梯时间
TakeNum:
=SETakeNum.Value;//乘做电梯次数
self.hide;
end;
end.
主窗体程序清单:
unitmain;
interface
uses
Windows,Messages,SysUtils,Classes,Graphics,Controls,
setupin,Define,Forms,Dialogs,ComCtrls,ExtCtrls,StdCtrls,Grids;
type
Tmainform=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;
var
mainform:
Tmainform;
implementation
{$R*.DFM}
procedureTmainform.FormCreate(Sender:
TObject);
vari:
integer;
begin
fori:
=0to9DO
begin
ElavotorTrack[i]:
=TTrackbar.Create(nil);
Elavotor_idle_Label[i]:
=TStaticText.Create(nil);
Elavotor_Busy_Label[i]:
=TStaticText.Create(nil);
Elavotor_Memo[i]:
=Tmemo.Create(nil);
end;
ShowFloor:
=TStringGrid.Create(nil);
ShowFloor:
=StrGD1;
ElavotorTrack[0]:
=TB0;
ElavotorTrack[1]:
=TB1;
ElavotorTrack[2]:
=TB2;
ElavotorTrack[3]:
=TB3;
ElavotorTrack[4]:
=TB4;
ElavotorTrack[5]:
=TB5;
ElavotorTrack[6]:
=TB6;
ElavotorTrack[7]:
=TB7;
ElavotorTrack[8]:
=TB8;
ElavotorTrack[9]:
=TB9;
Elavotor_idle_Label[0]:
=idleST0;
Elavotor_idle_Label[1]:
=idleST1;
Elavotor_idle_Label[2]:
=idleST2;
Elavotor_idle_Label[3]:
=idleST3;
Elavotor_idle_Label[4]:
=idleST4;
Elavotor_idle_Label[5]:
=idleST5;
Elavotor_idle_Label[6]:
=idleST6;
Elavotor_idle_Label[7]:
=idleST7;
Elavotor_idle_Label[8]:
=idleST8;
Elavotor_idle_Label[9]:
=idleST9;
Elavotor_Busy_Label[0]:
=ST0;
Elavotor_Busy_Label[1]:
=ST1;
Elavotor_Busy_Label[2]:
=ST2;
Elavotor_Busy_Label[3]:
=ST3;
Elavotor_Busy_Label[4]:
=ST4;
Elavotor_Busy_Label[5]:
=ST5;
Elavotor_Busy_Label[6]:
=ST6;
Elavotor_Busy_Label[7]:
=ST7;
Elavotor_Busy_Label[8]:
=ST8;
Elavotor_Busy_Label[9]:
=ST9;
Elavotor_Memo[0]:
=Memo0;
Elavotor_Memo[1]:
=Memo1;
Elavotor_Memo[2]:
=Memo2;
Elavotor_Memo[3]:
=Memo3;
Elavotor_Memo[4]:
=Memo4;
Elavotor_Memo[5]:
=Memo5;
Elavotor_Memo[6]:
=Memo6;
Elavotor_Memo[7]:
=Memo7;
Elavotor_Memo[8]:
=Memo8;
Elavotor_Memo[9]:
=Memo9;
try
SystemControl:
=TSystemControl.Create;
SystemControl.Initsystem;
finally
end;
SystemControl.Initsystem;
end;
procedureTmainform.FormDestroy(Sender:
TObject);
vari:
integer;
begin
//释放所有类对象和线程的内存资源
try
SystemMonitor.FreeOnTerminate:
=true;
SystemMonitor.Terminate;
fori:
=0toSystemcontrol.CurrentPersonTotal-1DO
Person[i].Free;
fori:
=0to9Do
begin
RunThread[i].FreeOnTerminate:
=true;
RunThread[i].Terminate;
Elavotor[i].Free;
ElavotorTrack[i].Free;
Elavotor_idle_Label[i].free;
Elavotor_Busy_Label[i].free;
end;
fori:
=0to39DO
Floor[i+1].Free;
SystemControl.Free;
finally
end;
end;
procedureTmainform.FormShow(Sender:
TObject);
vari:
integer;
begin
SystemMonitor.Resume;
sleep(1000);
fori:
=0to9DO
RunThread[i].Resume;
end;
end.
unitDefine;
interface
uses
Classes,Forms,Controls,Windows,comctrls,stdctrls,Sysutils,grids,Dialogs;
Const
MaxFloor=40;//最大楼梯层
MaxPerson=1000;//最大仿真人数
MaxElavotor=10;//最大电梯数
ElavotorStatus_Idle=0;//电梯空闲状态
ElavotorStatus_UP=1;//电梯上行状态
ElavotorStatus_Down=2;//电梯下行状态
PersonStatus_idle=0;//人员停留状态
PersonStatus_Request=1;//人员请求状态
PersonStatus_Taking=2;//人员乘梯状态
type
//定义线程对象
TRunThread=class(TThread)
private
ElavotorID:
integer;
protected
procedureRuningElavotor;//线程仿真电梯运行
procedureRuning(ElavotorID:
integer);//线程仿真电梯运行
procedureExecute;override;
end;
TSystemMonitor=class(TThread)
private
protected
procedureMonitor;//线程仿真电梯运行
procedureExecute;override;
end;
//定义电梯对象
TElavotor=class
private
protected
public
Speed:
integer;//速度
Direction:
integer;//电梯运行方向“0=idle""1=up""2=down"
MaxLoadCapacity:
integer;//电梯最大载客量
CurrentLoadCapacity:
integer;//电梯当前载客量
DestFloorLayer:
integer;//电梯目标楼层
isFull:
Boolean;//电梯满员
nIdleTime:
integer;//空闲时间计数器
nBusyTime:
integer;//工作时间计数器
CurrentStatus:
integer;//电梯当前状态"idle""up""down"
PersonTotal:
integer;//总完成承载人数
ID:
integer;//电梯编号
CurrentFloor:
integer;//电梯当前所处楼层
UpDownTime:
integer;//每人上下电梯时间
OSdelaytime:
integer;//电梯开关门时间
OuterRequestArray:
TStringList;//等待队列"xx-xx"
InsideRequestArray:
TStringList;//等待队列"12-35"
procedureOpenDoor(DelayTime:
integer);//开门
procedureCloseDoor(DelayTime:
integer);//关门
ProcedureUPrun;//上行
ProcedureDownrun;//下行
ProcedureContinuerun;//继续运行
FunctionCheckStop(CurrentFloor:
integer):
Boolean;//检查当前层是否有人上下
ProcedureTakeElavotor(CurrentFloor:
integer);//乘梯
end;
//定义人员对象
TPerson=Class
Private
Protected
public
Direction:
integer;//请求的方向"0=idle""1=Up""2=Down"
FinishedCount:
integer;//目前已乘坐次数
DestinationFloor:
integer;//请求目标楼层
CurrentFloor:
inte
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电梯 仿真 系统 设计 文档