第五章Flexsim相关的概念及关键技术研究5.1Flexsim软件介绍Flexsim是由美国的FlexsimSoftwareProduction公司出品的,是一款商业化离散事件系统仿真软件。Flexsim采用面向对象技术,并具有三维显示功能。建模快捷方便和显示能力强大是该软件的重要特点。该软件体供了原始数据拟合、输入建模、图形化的模型构建、虚拟现实显示、运行模型进行仿真试验、对结果进行优化、生成3D动画影像文件等功能,也提供了与其他工具软件的接口。图5-1是Flexsim软件及其构成模块的结构图[7]。图5-1Flexsim功能结构图Flexsim提供了仿真模型与ExpertFit和Excel的接口,用户可以同过ExperFit对输入数据进行分布拟合,同时可以在Excel中方面地实现和仿真模型之间的数据交换,包括输出和运行模型过程中动态修改运行参数等。另外该软件还提供了优化模块Optquest,增加了帮助迅速建模的MicrosoftVisio的接口。5.1.1Flexsim软件的主要特点Flexsim仿真软件的特点主要体现在采用面向对象技术,突出3D显示效果,建模和调试简单开放方便,模型的扩展性强,易于和其他软件配合使用等方面。(1)基于面向对象技术建模Flexsim中所有用来建立模型的资源都是对象,包括模型、表格、记录、GUI等。同时,用户可以根据自己行业和领域特点,扩展对象,构建自己的对象库。面向对象的建模技术使得Flexsim的建模过程生产线化,对象可以重复利用,从而减少了建模人员的重复劳动。(2)突出的3D图形显示功能Flexsim支持OpenGL技术,也支持3ds、wrl、dxf和stl等文件格式。因此用户可以建ExpertFit等拟和分布工具Excel等可以用作统计分析的工具模型建立与调试模型有效性确认运行仿真试验3D的可视化结果动态显示生成影像文件Flexsim仿真软件MicrosoftVisualC++.NET输入建模系统仿真运行仿真试验结果统计分析立逼真的模型,从而可以帮助用户对模型有一个直观的认识,并帮助模型的验证。用户可以在仿真环境下很容易地操控3D模型,从不同角度、放大或缩小来观测。(3)建模和调试的方便建模过程中用户只需要从模型库中拖入已有的模型,根据模型的逻辑关系进行连接,然后设定不同对象的属性。建模的工作简单快捷,不需要编写程序。(4)建模的扩展性强Flexsim支持建立用户定制对象,融合了C++编程。用户完全可以将其当作一个C++的开发平台来开发一定的仿真应用程序。(5)开放性好提供了与外部软件的接口,可以通过ODBC与外部数据库相连,通过socket接口与外部硬件设备相连,与Excel、Visio等软件配合使用。5.2Flexsim的一些重要概念Flexsim是目前国内最新的仿真软件,关于该软件的资料和使用经验还很少。作者是在不断的摸索中学习的,所以希望本文能对其他人有一定的借鉴。要完全掌握好Flexsim,并将其用到我们的工作、学习和研究当中,理解该软件的一些重要概念和思想是很重要的,本节针对集装箱码头建模仿真中用到的技术做一个梳理。5.2.1面向对象的思想相对于目前的一些仿真软件(如Witness,eM-Plant等),Flexsim是采用面向对象思想和技术开发的,其本身更是用C++语言实现。严格地说该仿真软件包括了两部分,仿真软件和后台支持环境VC++.NET。由于C++是一种面向对象的语言,所以使用Flexsim软件,从用户用于系统建模,或是做一些二次开发,这些工作都有面向对象思想的体现。可以这样说,没有领会面向对象的思想,就不能完全发挥Flexsim软件本身的特点,也就不能用其实现用户的目的。使用Flexsim软件的用户需要对C++语言有一定程度的熟悉。本节主要是解释Flexsim中所特有的一些面向对象思想,而不涉及面向对象语言的解释(关于C++语言的知识请查看相关书籍)。对象(Object)的概念在Flexsim软件中无处不在,我们先直观的感受一下。软件的运行界面左边是一个常用的对象库(如图5-1)。库中的各种部件就是有特定功能的对象,这些对象是软件本身自带的,使用这些基本的部件对象用户可以完成大多数的仿真工作。我们使用Processor来解释一下对象的概念:我们日常所见的任何具体事物都可看作是对象,这里Processor就是一种设备,它的作用就是对经过他的物件进行一些加工,即改变物件的状态。这里我们可以将其当作现实中的设备,如机床等。图5-1这里我们借用C++程序设计语言中的对象的概念。对象是类的实例,类是对现实对象的抽象。类中包含了对象的数据(相当于现实对象的状态),以及对象的方法(相当于现实对象用来处理外界所给信息的方法)。对象封装了属性和方法,进一步到Flexsim中,对于软件中可用的库对象,他们本身有自己的属性(如颜色,尺寸,位置等),还有处理物件的方法。在使用软件的过程中,我们完全可以以人们平时的思维方式来思考,而无须过多的抽象化,这也就是面向对象方法的优点。5.2.2Flexsim的对象层次结构面向对象方法的一个优点是类与类之间可以有继承关系,对象的继承性给我们提供了更大的柔性来扩展我们自己的对象,即衍生出新的对象。在Flexsim中我们可以充分利用继承性来开发我们自己的对象,而软件本身也给用户提供了这样的机制。Flexsim本身的库对象是高度抽象化的,具有很强的通用性,几乎涵盖了仿真中可能遇到的所有对象。这些对象之间有一定的继承关系,他们之间存在着逻辑关系。下图(图5-2)是Flexsim中对象的层次结构。从类的派生关系图中我们可以对Flexsim中各种对象的逻辑关系一目了然。对象库中的对象分为两种,一种是从FixedResource中派生下来的,另一种是TaskExecuter中派生下来的。通过分析我们不难发现,从FixedResource中派生来的对象有一个共同的特点,其本身是不会运动的,他们的作用只是产生或消除物件、存储物件、加工物件等等;从TaskExecuter中派生的对象,其本身是可以运动的,其作用是将物件从一个地点运送到另一个地点。当现有的库对象不能满足用户的需要时,用户就需要创建自己的对象。Flexsim为用户提供了这样一种机制——用户可以定制自己的库对象。在对象层次图中,我们看到有两个虚线框,这表示用户可以从FixedResource和TaskExecuter中派生出自己的对象。Flexsim的早期版本中从这两个类中派生新的对象比较复杂,最新的3.06版中增加了BasicFR和BasicTE类,使用户的开发工作更容易。后面的章节中将具体介绍怎样来实现一个新对象的定制。5.2.3节点和树在介绍树结构之前,我们先来了解Flexsim中节点(node)的概念。节点是树结构的最基本的组成单元,他们组成了链接的层次。所有的节点都有一个文本缓冲区,用来保存节点的名字。节点可以是其他节点的容器,可以是用来定义一个对象属性FlexsimObjectFixedResourceDispatcherNavigatorNetworkNodeSourceQueueSinkConveyorRackReservoirFixedSourceTemplateProcessorTaskExecuterCombinerSeparatorOperatorTranspoterCraneASRSvehicleNetworkNavigatorCraneNavigatorBasicTEBasicRF的关键字,或是拥有一个数据项。属于一个节点的数据项类型可能是:数值(number),字符串(string),对象(object),或指针(pointer)。下面列出FLexsim中不同类型的节点标志:标准(Standard):对象(Object):属性/变量(Attribute/Varibale):函数(Function(C++)):函数(Function(FlexScript)):用户可以在对象的树结构中任意地操作节点,例如增加节点,删除节点,改变节点所包含的值等。含有对象数据(Object)的节点可能包含有节点的子列表。含有对象数据的节点称之为对象节点。当你单击一个对象节点时,你会看到在节点的左边有一个大于号()。单击将打开对象数据的树分支。如果一个节点包含子节点,可以按下+按钮来展开。如果一个节点包含对象数据,可以按下来展开。下图(图5-3)展示了一个队列(Queue)展开的对象数据树。图5-3树结构(tree)是一种很常用的数据结构。Flexsim仿真模型中的对象,或对象中的属性和方法节点等都是树结构;用户甚至可以直接在树结构中操作对象。在Flexsim中有两个主要的对象类型:模型(Model)或仿真对象(SimulationObject)和视图对象(ViewObject)。两种类型都有对象数据树,包含了属性和行为控件。一个对象节点的对象数据树中的节点可以作为属性、变量或成员函数。也有只是作为简单的容器来包含节点以达到组织的目的。5.2.4任务序列任务序列(TaskSequences)是Flexsim仿真软件中的核心机制。各种复杂仿真的实现很大程度取决于怎样实现任务序列。前面介绍了Flexsim中有两种对象,一种是派生至FixedResource的静态对象(即对象本身不运动);另一种是派生至TaskExecuter的动态对象(即对象本身可运动)。如果用户建立的系统模型全部使用了静态对象,那么就不需要任务序列的机制,但是这种情况几乎没有。使用动态对象搬运物件,对象怎样运动,实现什么样的功能等,这就需要。任务序列是由TaskExecuter执行的一组命令序列。这里TaskExecuter涵盖了所有派生自他的动态对象,如Operators,Transpoters,Crane,ASRSvehicle,Robots,Elevators以及其他可运动的对象。图1-4表示一个任务序列,该任务序列有多个任务组成。图1-4Flexsim中为用户提供了功能齐备的任务类型。常用的任务序列有:TASKTYPE_TRAVEL、TASKTYPE_LOAD、TASKTYPE_UNLOAD、TASKTYPE_TRAVELTOLOC等。不同的任务序列有不同的设置参数,用户可以根据需要在使用的时候查询帮助文档。5.2.4.1默认任务序列FixedResource为了将物件(item)移至下一个站点(station),有一个创建任务序列的默认机制。FixedResource对象的参数对话框中一个通用的“Flow”选项页,选择其中的“UseTransport”复选框,这样就可创建默认的任务序列。对于Processor对象,还可以自动创建对Setuptime/Processtime/Repairoperation的任务序列。当仿真运行时,这些自动创建的任务序列就会传递给与其中心端口相连的动态对象来执行。这里给个简单的例子说明。假设用户选择了Queue对象参数对话框的“Flow”选项页中的“UseTransport”复选框,当系统运行时,产生了如下任务序列:当Operator收到该任务序列时,顺序地执行任务序列中的每个任务,执行过程如下:Operator先移动到Queue处(Travel);接着拿起物件(Load);然后移动到下一个站点处(Travel);最后放下物件(Unload)。在仿真运行的任意时刻,一个TaskExecuter只能执行一个任务序列,而此时FixedResource可能创建了许多任务序列,这些未执行的任务序列被放置在缓存队列中等待执行。5.2.4.2定制任务序列一般情况下,默认的任务序列就可以满足仿真要求。有时候用户需要为某些特定的工艺、多个设备的组合操控灯定制任务序列。这里分三种介绍定制任务序列,第一种是创建最简单的、只分配给一个对象执行的任务序列;第二种是由多个对象协同作业的任务序列。定制简单任务序列P1P2TravelLoadBreakTravelUnloadP1P2Task1Ta