应用实例电梯调度模拟器

合集下载

组态王实验案例——三层电梯

组态王实验案例——三层电梯

组态王实验案例——三层电梯三层电梯组态王实验案例一、实验目的:掌握三层电梯的组态王图形化编程方法,了解电梯控制系统的基本原理,掌握电梯调度算法。

二、实验设备:1.电梯模拟系统(组态王软件);2.电梯控制器。

三、实验原理:电梯调度算法是电梯控制系统的核心部分。

在本实验中,我们将通过组态王软件对三层电梯进行图形化编程,实现对电梯的自动调度。

四、实验步骤:1.创建工程:启动组态王软件,选择新建工程,设置工程名称和目录路径。

2.添加设备:选择设备配置向导,选择PLC和人机界面,并按照提示进行配置。

3.界面设计:选择人机设计,设计电梯的上行、下行按键,显示当前楼层和电梯状态的指示灯等。

4.程序编写:选择PLC编程,使用组态王提供的图形化编程语言进行程序设计。

根据电梯的工作原理和调度算法,编写电梯的运行逻辑和调度策略。

5.调试运行:保存程序后,选择模拟运行,观察电梯的运行情况,进行调试和优化。

五、实验结果:经过调试和优化后,我们成功实现了三层电梯的自动调度。

在电梯界面上,我们可以看到当前楼层和电梯状态的指示灯实时更新。

当按下上行或下行按钮时,电梯会自动根据调度策略选择最合适的楼层进行运行,到达目的地后会触发门禁信号,打开电梯门,并自动调整回待命状态。

六、实验总结:通过本次实验,我们深入了解了电梯控制系统的工作原理和调度算法。

通过组态王软件的图形化编程,我们可以方便地设计和调试复杂的电梯控制系统。

电梯作为现代化大楼中不可或缺的交通工具,其安全性和效率性对人们的生活和工作起着重要的作用。

掌握电梯控制系统的原理和优化方法,对于提高电梯运行的效率和安全性具有重要意义。

电梯运行模拟控制器

电梯运行模拟控制器

目录1.课程设计简介 (1)1.1简介 (1)1.2设计总电路图 (2)1.3实物图 (4)2.设计题目 (4)3.总体设计 (6)3.1电梯运行模拟控制器的总体运作流程 (6)3.2电梯运行模拟控制器各模块关系 (6)4.详细设计 (7)6.1基本的IO配置(输入/输出模式) (7)输出模式配置 (7)输入模式配置 (7)6.2外部中断配置 (8)定时器中断 (8)外部按键输入中断 (8)6.3电梯运行逻辑设计(软件编码) (9)数据结构设计 (9)功能接口设计 (9)5.体会与总结 (10)6.附录 (11)源代码 (11)参考文献 (26)1.课程设计简介1.1简介本设计使用STM8S系列作为主控芯片,使用矩阵键盘、若干个LED和两位数码管作为外设。

其中矩阵键盘用来模拟电梯按键,若干个LED灯用来模拟电梯的运动方向、楼层的指示灯(电梯内部楼层对应的按钮),两位的数码管用于显示电梯目前所处楼层。

1.2设计总电路图(基于AD这个平台生成的PCB图与原理图)原理图原理图PCB图PCB图1.3实物图实物图2.设计题目设计一个电梯运行模拟控制器,其系统框图如下图所示:电梯运行模拟控制器框图功能要求:能够模拟控制一个8层楼梯的电梯的运行。

具体要求如下: 1.电梯平时没有接到命令时候或者执行完命令后停在1楼,门关闭.。

2.电梯运行速度2秒一层楼3.电梯门在开启的情况下没有收到命令10秒中后自动关闭。

在运动中门必须关闭,(最后3秒可以设置音响警告信号)4.一句话,电梯控制器满足实际电梯的运行要求,电梯在运行的时候可以最多记住8个命令。

并且综合考虑公平性(先按键先执行)和有效性(完成任务的总的行走路径最短)来执行。

要求完成的内容:1.完成硬件电路的设计与安装调试(可借助单片机实验电路板),并用CAD 软件画出原理电路图。

2.画出流程图,编写并调试驱动程序。

3.撰写设计报告。

MCU1位七段数码管,3个LED 灯(显示当前电梯所处楼层与运行方向以及键盘以及对应的LED 灯(1-8,开门,关门)每个数字按键对应一个LED 灯,按下按键灯亮,8个LE D灯显示电梯所2个灯显示当前电梯8×2-2=14个按键表示每层楼入口的电梯按键3.1 电梯运行模拟控制器的总体运作流程等待外部信号整体配置初始化收到中断信号?执行电梯处理逻辑是否电梯运行模拟控制器整体运作流程3.2 电梯运行模拟控制器各模块关系电梯运行模拟控制器各模块关系图6.1基本的IO配置(输入/输出模式)输出模式配置对于输出模式IO的配置,用到的外设(LED灯,数码管,矩阵键盘),在代码中都有对它们进行对应的配置。

应用实例_电梯调度模拟器

应用实例_电梯调度模拟器

UML程序设计实例—电梯调度模拟器—本章通过电梯调度模拟器的例子详细介绍了如何利用UML进行一个实际系统的开发。

这个系统的实现过程,遵循Rational统一软件开发过程,最后用Vc++编码实现。

问题描述在开发任何一个系统之前,开发人员对所要开发的系统的初步理解首先是从用户的问题描述开始的。

问题描述的内容包括系统的基本功能需求,用户对系统的性能,外观等特性的要求。

这种描述根据开发项目的规模不同,呈现不同的形式。

对于大的项目,问题描述可能是长达几页(几十页)的需求规格说明;对于小的项目,可能只是口头上的几句陈述。

通过问题描述,开发人员对要开发的系统产生一个大概的印象。

此实例的问题描述如下:有一座8层楼房,每层提供一组按钮(“上”或“下”),用于请求电梯的到达;每部电梯内部提供一个控制面板,提供用户对目标楼层的选择,并显示电梯当前所处楼层、运行方向。

两部电梯由一个调度器统一调度。

如果没有请求,并超过一定时限,电梯回到一楼。

希望开发人员能实现一个电梯调度模拟器来模拟如上所述的一切,对电梯的调度准则没有做特别要求。

此外,用户还可能会对系统的性能,外观等特性提出要求,这些都需要在开发过程中加以考虑。

需求分析拟订侯选需求在系统开发启动之前,首先要对项目做一些可行性分析。

在Rational统一软件开发过程中,称这个阶段为初始阶段。

在初始阶段主要是跟各方进行交流,广泛收集信息,听取客户和专家的建议。

并对这些信息和建议进行记录,整理得到一个后选需求列表。

后选需求列表中应包括如下各项1.名称2.简要说明3.状态(建议的、批准的、并入的或证实的)4.实现成本估算(人小时,人月)5.优先级(关键的、重要的或辅助的)6.实现风险的级别(关键的、重要的或一般的)表1 后选需求列表这时对系统所要实现的功能在整体上有了一个大致的了解。

然后明确哪一部分功能是系统中应该实现的,哪一部分功能是由其它外部系统实现的。

即确定出系统的功能范围,并粗略估计一下项目的花费和可能得到的收益。

人工智能实验 电梯调度

人工智能实验 电梯调度

人工智能实验报告1题目:模拟实现电梯调度姓名:班级:学号:学院:计算机科学与信息专业:计算机科学与技术指导教师:日期:2011年12月6日一、实验目的:掌握产生式系统设计方法,理解状态机的原理。

二、实验原理:产生式系统是常用的知识表示方法之一,可以用于表示电梯调度的动作函数。

状态机的存储器能够存储前一次的输入、特征和动作,利用状态机的原理可以提高电梯调度的效率。

三、实验内容:设计一个能有效控制电梯的产生式系统(如果电梯内仍有人想要去更高层或者电梯外的更高层仍有人想要乘电梯,该系统却改“上升”为“下降”,则此系统就不能有效控制电梯)。

四、实验描述及要求:编写电梯调度的模拟程序,用动画演示电梯调度过程。

五、实验结果:六:实验代码namespace 电梯{public partial class Form1 : Form{public Form1(){InitializeComponent();timer1.Interval = 1000;lab1.BackColor = Color.Blue;txtout.Text = "电梯未运行";}public static int[] Up = new int[15]; public static int[] Down = new int[15];public enum direction{ up, down, loc };public static int i1 = 2;public static int j1 = 2;public static int i2 = 1;public static int j2 = 1;public static int site = 1;public static int location;public direction direct = direction.loc;public int add(){if (location > site){for (int a = 1; a < i1; a++){if (Up[a] == location)return 0;}Up[i1 - 1] = location;i2 = i1 - 1;for (int a = 1; a < i1; a++)for (int b = 1; b < i1; b++){if (Up[a] > Up[b] && a > b){int c;c = Up[a];Up[a] = Up[b];Up[b] = c;}}i1++;return 0;}if (location < site){for (int a = 1; a < j1; a++){if (Down[a] == location)return 0;}Down[j1 - 1] = location;j2 = j1 - 1;for (int a = 1; a < j1; a++)for (int b = 1; b < j1; b++){if (Down[a] > Down[b] && a < b) {int c;c = Up[a];Down[a] = Down[b];Down[b] = c;}}j1++;return 0;}return 0;}public void db(){if (direct == direction.loc){if (Up[1] > 1){direct = direction.up;}else if (Down[1] > 0){direct = direction.down;}}if (direct == direction.up && Up[1] == 0){if (Down[1] > 0)direct = direction.down;else direct = direction.loc;}if (direct == direction.down && Down[1] == 0) {if (Up[1] > 0)direct = direction.up;else direct = direction.loc;}}public void move(){db();if (direct != direction.loc){if (direct == direction.up && Up[1] > 0){site++;if (site == Up[i2]){Up[i2] = 0;i2--;i1--;}switch (site){case 1:lab1.BackColor = System.Drawing.Color.Blue; break;case 2:lab2.BackColor = System.Drawing.Color.Blue; lab1.BackColor = System.Drawing.Color.Purple; break;case 3:lab3.BackColor = System.Drawing.Color.Blue; lab2.BackColor = System.Drawing.Color.Purple; break;case 4:lab4.BackColor = System.Drawing.Color.Blue; lab3.BackColor = System.Drawing.Color.Purple; break;case 5:lab5.BackColor = System.Drawing.Color.Blue; lab4.BackColor = System.Drawing.Color.Purple; break;case 6:lab6.BackColor = System.Drawing.Color.Blue; lab5.BackColor = System.Drawing.Color.Purple; break;case 7:lab7.BackColor = System.Drawing.Color.Blue; lab6.BackColor = System.Drawing.Color.Purple; break;case 8:lab8.BackColor = System.Drawing.Color.Blue; lab7.BackColor = System.Drawing.Color.Purple; break;default: break;}}if (direct == direction.down && Down[1] > 0){site--;if (site == Down[j2]){Down[j2] = 0;j2--;j1--;}switch (site){case 1:lab1.BackColor = System.Drawing.Color.Blue; lab2.BackColor = System.Drawing.Color.Purple; break;case 2:lab2.BackColor = System.Drawing.Color.Blue; lab3.BackColor = System.Drawing.Color.Purple; break;case 3:lab3.BackColor = System.Drawing.Color.Blue; lab4.BackColor = System.Drawing.Color.Purple; break;case 4:lab4.BackColor = System.Drawing.Color.Blue; lab5.BackColor = System.Drawing.Color.Purple; break;case 5:lab5.BackColor = System.Drawing.Color.Blue; lab6.BackColor = System.Drawing.Color.Purple; break;case 6:lab6.BackColor = System.Drawing.Color.Blue; lab7.BackColor = System.Drawing.Color.Purple; break;case 7:lab7.BackColor = System.Drawing.Color.Blue; lab8.BackColor = System.Drawing.Color.Purple; break;case 8:lab8.BackColor = System.Drawing.Color.Blue; break;default: break;}}}txtout.Text = "电梯在" + site + "楼";}private void btn7_up_Click(object sender, EventArgs e) {location = 7;add();}private void btn6_up_Click(object sender, EventArgs e) {location = 6;add();}private void btn5_up_Click(object sender, EventArgs e) {location = 5;add();}private void btn4_up_Click(object sender, EventArgs e) {location = 4;add();}private void btn3_up_Click(object sender, EventArgs e) {location = 3;add();}private void btn2_up_Click(object sender, EventArgs e) {location = 2;add();}private void btn1_up_Click(object sender, EventArgs e) {location = 1;add();}private void btn8_down_Click(object sender, EventArgs e) {location = 8;add();}private void btn7_down_Click(object sender, EventArgs e) {location = 7;add();}private void btn6_down_Click(object sender, EventArgs e) {location = 6;add();}private void btn5_down_Click(object sender, EventArgs e) {location = 5;add();}private void btn4_down_Click(object sender, EventArgs e) {location = 4;add();}private void btn3_down_Click(object sender, EventArgs e) {location = 3;add();}private void btn2_down_Click(object sender, EventArgs e) {location = 2;add();}private void btn8_Click(object sender, EventArgs e){location = 8;add();}private void btn7_Click(object sender, EventArgs e) {location = 7;add();}private void btn6_Click(object sender, EventArgs e) {location = 6;add();}private void btn5_Click(object sender, EventArgs e) {location = 5;add();}private void btn4_Click(object sender, EventArgs e) {location = 4;add();}private void btn3_Click(object sender, EventArgs e) {location = 3;add();}private void btn2_Click(object sender, EventArgs e) {location = 2;add();}private void btn1_Click(object sender, EventArgs e) {location = 1;add();}private void timer1_Tick(object sender, EventArgs e) {move();}private void btnOK_Click(object sender, EventArgs e){if (btnOK.Text == "运行"){btnOK.Text = "暂停";timer1.Enabled = true;}else{btnOK.Text = "运行";txtout.Text = "电梯停止运行";timer1.Enabled = false;}}private void btncancle_Click(object sender, EventArgs e) {DialogResult result;result = MessageBox.Show("确定退出吗?", "退出提醒", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);if (result == DialogResult.OK)Application.Exit();}}}。

电梯调度模拟系统-详细设计

电梯调度模拟系统-详细设计

电梯调度模拟系统详细设计目录第一部分、引言 (2)1.1编写目的 (2)1.2背景 (2)1.3定义 (2)3.1程序描述 (3)3.2功能 (3)3.3性能 (4)3.4输人项 (4)3.5输出项 (4)3.6算法 (4)3.7流程逻辑 (4)3.9存储分配 (5)3.10注释设计 (5)3.11限制条件 (5)3.12测试计划 (5)3.13尚未解决的问题 (6)4.1程序描述 (6)4.2功能 (6)4.3性能 (6)4.4输入项 (6)4.5输出项 (6)4.6算法 (6)4.7逻辑流程 (6)4.8接口 (8)4.9存储分配 (8)4.10注释设计 (8)4.11限制条件 (8)4.12测试计划 (8)4.13尚未解决的问题 (8)5.0帮助系统 (8)第五部分、项目分工..................................................................................................... (9)第一部分、引言1.1编写目的本说明书在概要设计的基础上,电梯调度模拟系统系统的各模块、程序分别进行了实现层面上的要求和说明。

软件开发小组的产品实现成员应该阅读和参考本说明进行代码的编写、测试。

1.2背景说明:A、软件系统的名称:电梯电镀迷你系统:B、任务提出者:算法与设计实验小组开发者:西安工业大学软件工程A组成员C、实现完成的系统将可用在所有装有Microsoft Windows 操作系统的个人PC上.为使用者提供一种全新的娱乐方式,用户在工作疲劳时可以放松自己的精神.提高自己的工作效率.D、本系统将是独立的系统。

1.3定义API函数----由函数、消息、数据结构、数据类型以及语句组成,它们可在创建在Microsoft Windows 下运行的应用程序中使用。

API 中使用最多的部分是从Windows 中调用API 函数的代码元素,包括过程声明(Windows 函数)、用户自定义类型的定义(用来传递到函数中的数据结构),以及常数声明(传递给函数以及从函数中返回的值)。

数据结构——电梯模拟的报告

数据结构——电梯模拟的报告

数据结构——电梯模拟的报告数据结构——电梯模拟的报告1. 简介本文档将介绍电梯模拟的实现过程和基本原理。

通过模拟电梯的行为,我们可以更好地理解数据结构在实际应用中的作用和效果。

2. 问题描述在楼房中,电梯通常被用来运送乘客。

电梯内部有多个按钮,表示不同楼层的乘客需求。

乘客可以按下按钮来请求乘坐电梯到达特定楼层。

电梯的运行顺序应该是合理的,比如不会从高楼层下降到低楼层。

本模拟的电梯系统需要满足以下要求:- 电梯能接收来自乘客的请求。

- 电梯能根据请求的楼层,按照合理的顺序运行,将乘客送到目标楼层。

- 当电梯到达目标楼层,乘客可以进入或离开电梯。

- 电梯需要实时更新运行状态,如目标楼层、当前楼层等。

3. 数据结构设计为了实现电梯模拟,我们需要设计合适的数据结构来存储电梯的状态和乘客请求。

以下是我们设计的关键数据结构:3.1 电梯状态电梯的状态包括当前楼层、目标楼层和运行方向等信息。

我们可以使用一个结构体来表示电梯的状态:```c++struct ElevatorState {int currentFloor;int targetFloor;Direction direction;};```其中,`currentFloor`表示当前所在楼层,`targetFloor`表示目标楼层,`direction`表示电梯的运行方向。

3.2 乘客请求乘客请求包括乘客所在楼层和目标楼层。

我们可以使用一个结构体来表示乘客请求:```c++struct Request {int fromFloor;int toFloor;};```其中,`fromFloor`表示乘客所在楼层,`toFloor`表示目标楼层。

3.3 电梯控制器电梯控制器用于管理电梯的状态和乘客请求。

我们可以使用一个队列来存储乘客请求,使用一个变量来保存电梯的当前状态。

以下是电梯控制器的设计:```c++class ElevatorController {private:std::queue<Request> requests;ElevatorState state;public:void addRequest(Request request);void processRequests();};```其中,`addRequest`方法用于添加乘客请求到队列中,`processRequests`用于处理乘客请求并控制电梯的运行。

自己动手C#模拟电梯的运行V1.0

自己动手C#模拟电梯的运行V1.0

⾃⼰动⼿C#模拟电梯的运⾏V1.01.1先来先服务算法(FCFS)先来先服务(FCFS-First Come First Serve)算法,是⼀种随即服务算法,它不仅仅没有对寻找楼层进⾏优化,也没有实时性的特征,它是⼀种最简单的电梯调度算法。

它根据乘客请求乘坐电梯的先后次序进⾏调度。

此算法的优点是公平、简单,且每个乘客的请求都能依次地得到处理,不会出现某⼀乘客的请求长期得不到满⾜的情况[12]。

这种⽅法在载荷较轻松的环境下,性能尚可接受,但是在载荷较⼤的情况下,这种算法的性能就会严重下降,甚⾄恶化。

⼈们之所以研究这种在载荷较⼤的情况下⼏乎不可⽤的算法,有两个原因:(1)任何调度算法在请求队列长度为1时,请求速率极低或相邻请求的间隔为⽆穷⼤时使⽤先来先服务算法既对调度效率不会产⽣影响,⽽且实现这种算法极其简单。

(2)先来先服务算法可以作为衡量其他算法的标准。

1.2最短寻找楼层时间优先算法(SSTF)最短寻找楼层时间优先(SSTF-Shortest Seek Time First) [14]算法,它注重电梯寻找楼层的优化。

最短寻找楼层时间优先算法选择下⼀个服务对象的原则是最短寻找楼层的时间。

这样请求队列中距当前能够最先到达的楼层的请求信号就是下⼀个服务对象。

在重载荷的情况下,最短寻找楼层时间优先算法的平均响应时间较短,但响应时间的⽅差较⼤,原因是队列中的某些请求可能长时间得不到响应,出现所谓的“饿死”现象。

1.3扫描算法(SCAN)扫描算法(SCAN)是⼀种按照楼层顺序依次服务请求,它让电梯在最底层和最顶层之间连续往返运⾏,在运⾏过程中响应处在于电梯运⾏⽅向相同的各楼层上的请求。

它进⾏寻找楼层的优化,效率⽐较⾼,但它是⼀个⾮实时算法。

扫描算法较好地解决了电梯移动的问题,在这个算法中,每个电梯响应乘客请求使乘客获得服务的次序是由其发出请求的乘客的位置与当前电梯位置之间的距离来决定的,所有的与电梯运⾏⽅向相同的乘客的请求在⼀次电向上运⾏或向下运⾏的过程中完成,免去了电梯频繁的来回移动[2]。

操作系统课程设计-模拟电梯调度算法 实现对磁盘的驱动调度

操作系统课程设计-模拟电梯调度算法 实现对磁盘的驱动调度

衡阳师范学院操作系统课程设计报告设计题目:驱动调度系别:计算机科学系专业:计算机科学与技术(师范)班级:1001班姓名:XXX学号:XXX指导教师:XXX2012年11月26日目录一、程序设计内容原理及目的·······························1、设计内容················································`2、设计原理·················································3、设计目的·················································二、程序设计过程·········································1、驱动调度中的数据结构设计·································2、程序算法设计··············································三、用户手册··············································1、运行坏境··················································2、执行文件··················································四、程序实现及运行结果····································1、源代码····················································2、代码······················································3、运行结果·················································五、心得总结···············································六、参考文献···············································二、程序设计内容原理及目的1、设计内容模拟电梯调度算法,实现对磁盘的驱动调度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

UML程序设计实例—电梯调度模拟器—本章通过电梯调度模拟器的例子详细介绍了如何利用UML进行一个实际系统的开发。

这个系统的实现过程,遵循Rational统一软件开发过程,最后用Vc++编码实现。

问题描述在开发任何一个系统之前,开发人员对所要开发的系统的初步理解首先是从用户的问题描述开始的。

问题描述的内容包括系统的基本功能需求,用户对系统的性能,外观等特性的要求。

这种描述根据开发项目的规模不同,呈现不同的形式。

对于大的项目,问题描述可能是长达几页(几十页)的需求规格说明;对于小的项目,可能只是口头上的几句陈述。

通过问题描述,开发人员对要开发的系统产生一个大概的印象。

此实例的问题描述如下:有一座8层楼房,每层提供一组按钮(“上”或“下”),用于请求电梯的到达;每部电梯内部提供一个控制面板,提供用户对目标楼层的选择,并显示电梯当前所处楼层、运行方向。

两部电梯由一个调度器统一调度。

如果没有请求,并超过一定时限,电梯回到一楼。

希望开发人员能实现一个电梯调度模拟器来模拟如上所述的一切,对电梯的调度准则没有做特别要求。

此外,用户还可能会对系统的性能,外观等特性提出要求,这些都需要在开发过程中加以考虑。

需求分析拟订侯选需求在系统开发启动之前,首先要对项目做一些可行性分析。

在Rational统一软件开发过程中,称这个阶段为初始阶段。

在初始阶段主要是跟各方进行交流,广泛收集信息,听取客户和专家的建议。

并对这些信息和建议进行记录,整理得到一个后选需求列表。

后选需求列表中应包括如下各项1.名称2.简要说明3.状态(建议的、批准的、并入的或证实的)4.实现成本估算(人小时,人月)5.优先级(关键的、重要的或辅助的)6.实现风险的级别(关键的、重要的或一般的)表1 后选需求列表这时对系统所要实现的功能在整体上有了一个大致的了解。

然后明确哪一部分功能是系统中应该实现的,哪一部分功能是由其它外部系统实现的。

即确定出系统的功能范围,并粗略估计一下项目的花费和可能得到的收益。

这个阶段最重要的是弄清楚启动这个项目是不是有意义,有价值。

初始阶段根据项目的大小,表现为不同的形式。

对于小的项目,可能只需要与相关人员进行一些交流和讨论。

而对于大的项目可能要花费几个月的时间进行可行性分析。

经过分析,作出启动项目的决定之后,就进入开发过程的细化阶段。

理解系统上下文建立领域模型如果对要实现系统所要解决的问题领域没有一个清楚的了解,就不可能开发出一个满足用户需求的软件。

因此,进行系统建模时,应首先建立领域模型,描述问题领域中的基本概念。

建立领域模型时,先不要考虑软件是怎样实现的,而只关心如何将用户和领域专家头脑中与业务过程相关的概念组织起来,并将业务过程描绘出来。

所以在电梯调度模拟器这个实例中,暂不考虑用户界面,而首先考虑把电梯的运做过程描述清楚。

用户界面的加入推迟到分析阶段的后期进行。

首先从问题描述和所了解的领域知识中抽取出可能与解决问题有关的重要概念(领域对象)。

本例中通过分析问题描述提取出了这样一些名词(概念)。

同时,为了便于理解,各名词的修饰语也被一同标注出来。

1.楼房2.(两部)电梯3.(每层)一组按钮(“上”或“下”)4.(电梯内部)控制面板5.用户6.调度器接下来,再抽取问题描述中重要动词短语,它们可能会成为某个类的属性或方法。

1.请求电梯的到达;2.提供用户对目标楼层的选择;3.显示电梯当前所处楼层、运行方向通过对这些概念做进一步分析,不难发现2.电梯、3.按钮(“上”或“下”)、4.控制面板、5.用户、9.调度器等这些概念在电梯运做过程中都担当一定的职责,可以把它们抽象为系统中的一个类。

“请求电梯的到达”可以作为外部控制面板的职责;“提供用户对目标楼层的选择”作为内部控制面板的职责;“显示电梯当前所处楼层、运行方向”作为电梯的职责。

此外,还有1.楼房,它在电梯运做过程中不与任何其它对象交互,也不承担任何职责,也不能成为任何其它对象的属性或方法,则把它删除。

根据以上分析,初步地找出了系统中的一些类实体,再根据用户或领域专家对电梯运做过程的描述,以及开发者本人对问题的理解,建立起这些对象之间的关联关系。

此外,根据问题描述中限定这些概念的量词(例如:8层、两部、一个等),还可以进一步描述它们之间的多重性关系。

然后,为每个类分配职责,并添加一些必要的注释信息。

这样就建立起了这个系统的原始领域模型,如图1所示。

图1 电梯运行系统领域模型建立业务模型至此,通过领域模型描述了问题领域中存在的重要概念,并从静态视角描述了它们之间的关系。

考察系统的动态行为是正确理解一个系统运做情况的关键。

所以还需要刻画出系统的动态特性。

这一点通过建立系统的业务模型来实现。

在这个实例中,主要通过活动图和交互图来描述电梯使用的内部运做过程。

根据对问题的理解,建立下面的活动图来描述乘客使用电梯过程中发生的各个活动。

图2 电梯运作之活动图为了进一步描述领域对象之间的交互关系,建立下面的顺序图描述电梯运作系统中各对象间的信息传递。

图3 电梯运作之顺序图建立词汇表在建立领域模型和业务模型的同时,收集问题领域中的一些重要概念,建立起一个可供用户,项目经理、系统分析员、开发人员、测试人员和其他相关人员共同使用的词汇表。

这样各种人员就可以使用共同的术语来进行讨论和交流,不仅为系统的实现带来很多便利,还可以防止因误解而使开发的系统偏离用户的真正需求。

提取用例建立用例模型对系统运作过程有了一定了解之后,下一步开始考虑系统的功能。

通过分析业务模型找出执行者并提取用例,建立用例模型来描述系统应实现的功能。

首先,通过分析业务模型找出系统的潜在用户,即执行者。

在本实例中只有一类执行者——电梯乘客。

然后,通过跟踪执行者与系统的交互行为,找出用例。

在本实例中,用户与系统有两次交互,一次是按上/下按钮,请求电梯到达,另一次是进入电梯后,通过内部控制面板选择目标楼层。

进一步分析,会发现用户与电梯的这两次交互都需要对电梯进行调度。

因此提取出公共用例“调度电梯”。

用例图如图4。

图4 用例图简单描述用例提取出用例以后,应对每一个用例做一个简单描述。

以表明它的功能和大致的执行流程。

这个描述,在Uml_Designer中,可以通过添加注释体来实现,也可以写入用例的规格说明中。

例如,对调度电梯这个用例所做的简单描述:调度电梯过程:有两个触发条件:➢用户有请求(包括请求电梯到达和选择目标楼层);➢某个时钟信号到达第一种情况:1.获取用户请求;2.获取电梯的当前状态;3.调度器调度,调度结果通知电梯;4.电梯运动。

第二种情况:1.分析时钟信号;2.获取电梯当前状态;3.调度器调度,调度结果通知电梯;4.电梯执行调度结果。

确定用例优先级别对于大的系统,会找到好多用例。

但这些用例对所开发的系统来说,并不同等重要。

所以确定用例的优先级别是很必要的,对于高优先级的用例,首先对它进行分析,设计,甚至实现;而对于低优先级的用例可以留到后面迭带过程中再予以考虑。

那些优先级别较高的用例就刻画出了系统的体系结构。

本实例由于规模较小,所以没有实施这一过程。

但这一过程在系统实现过程中,是有着重要意义的。

细化用例在这一阶段,用例分析员应与用户密切合作,商讨完成。

首先描述用例执行过程的基本路径,然后再描述发生异常时可能会出现的分支路径。

对有的用例来说,文本描述就足够了。

但对于对象间交互比较复杂的用例,借助顺序图、合作图和活动图来描述,则更能说明问题,更易于交流。

当然,若能采用图文并貌的方法,则更好不过了。

下面的活动图描述了调度电梯用例的一种场景。

图5 调度电梯之活动图设计用例界面现在对业务执行过程有了清楚的认识,下一步加入系统界面。

首先分析用例在与用户进行交互时,需要用户提供什么信息,系统应向用户返回什么信息。

设计的界面应能帮助用户和系统完成这种交互。

加入系统界面后,作为电梯模拟器系统,它的用例才被完整的进行了考虑。

在电梯运行模拟过程中,需要用户输入电梯到达请求和对目标楼层的选择,系统要向用户显示电梯运行的模拟情况,比如电梯的当前状态信息等。

所以界面中应能提供控件来显示这些行为和状态。

在用例模型中增加一个新的用例:系统界面,执行者相应改为模拟器用户。

结构化用例模型结构化用例模型是指通过进一步分析,提取那些公用的模块和那些可选的分支模块,使它们单独各自成为一个用例。

然后,标出用例间的使用和扩展关系。

用例图调整后如下图。

图6 用例图分析在需求分析阶段所做的各项工作,都是面向问题领域的。

是为了充分的理解所要解决的问题空间,以及与各方进行交流和讨论。

采用的术语也都是客户容易理解的。

进入分析阶段之后,所做的工作开始转向面向实现领域,主要是为了帮助开发者更深入的理解系统的实现。

所采用的术语也逐渐转向面向便于程序代码的实现。

在分析阶段,所建立的模型仍然是概念层次上的。

虽然是深入系统内部进行分析,但分析阶段并不考虑系统最终实现时的一些特性,比如:实现语言、操作平台,可用构件,用户界面技术、数据库技术等等。

这些是设计和实现阶段所要解决的问题。

识别分析类通过分析用例图和用例描述,找出分析类。

这些分析类在用例的实现过程中,承担一种或几种职责。

它们相互合作共同实现用例描述的功能。

这些分析类有一部分可以从问题域中的相关实体直接对应得到,而其它大多数则需要通过分析抽象得到。

分析类一般可以分为三种:边界类、实体类和控制类。

边界类用于系统与角色之间的交互,系统通过边界类向执行者请求信息,返回和显示信息(如用户界面)。

在此实例中,可以抽象出一个SystemInterface类,作为用户与系统交互的界面。

通过这个界面,用户可以初始化模拟器、启动模拟和终止模拟器运行。

此外,通过此界面用户还可以实现与内部控制面板和外部控制面板的交互。

实体类用于为系统长期存在的信息建模。

通常情况下,实体类可由问题域中的实体直接对应得到。

此实例中如电梯,内、外部控制面板。

控制类是在一个用例实现过程中协调其它对象的交互,并控制实现流程的一类对象。

它们在用例的实现过程中,承担了管理和控制的职责。

本例中,Dispatcher担当了这样一个角色。

此外,为了防止Dispatcher负担过大,引入一个CentralManager类来负责Dispather 与其它对象的交互,比如信息的获取,调度命令的下达等;而Dispather则专门负责电梯调度算法的实现。

分析类如图7所示。

图7 分析类图接着,建立如下图所示的顺序图,进一步描述这些类的实例间的交互协作关系和信息传递。

图8 电梯使用过程识别各个类的职责一个类可能在多个用例中担当(同种和不同种)角色:比如,SytemInterface类参与了系统界面、请求电梯到达和选择目标楼层三个用例。

一个类的职责是它在不同用例实现中所起作用的总和。

相关文档
最新文档