《flexsim高级培训》PPT课件.ppt_第1页
《flexsim高级培训》PPT课件.ppt_第2页
《flexsim高级培训》PPT课件.ppt_第3页
《flexsim高级培训》PPT课件.ppt_第4页
《flexsim高级培训》PPT课件.ppt_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,北京创时能科技发展有限公司 ,Flexsim高级培训,咨询部工程师:于绍政 联系电话QQ:2802438895,2,Company Logo,基本实体,一、任务序列,3,1、自定义任务序列 2、全局任务序列 3、子任务序列 4、协同任务序列,4,4,4,任务 任务执行器执行的一个指令或活动。 如:LOAD flowitem 任务序列 按顺序执行的一系列任务 如 TRAVEL to queue LOAD flowitem TRAVEL to processor UNLOAD flowitem,5,任务和任务序列,6,6,20120327,自定义任务序列的相关命令: createemptytasksequence() inserttask() dispatchtasksequence() 首先,使用createemptytasksequence()创建一个任务序列。然后连续使用inserttask()令往此任务序列中插入任务。最后使用dispatchtasksequence()来分配此任务序列。,1、自定义任务序列,7,7,createemptytasksequence(创建任务序列) createemptytasksequence(obj dispatcher, num priority, num preempting): 该命令有三个参数。第一个参数是要处理此任务序列的实体,它应当是一个分配器或任务执行器。第二个和第三个参数是数字,分别指定任务序列的优先级和先占值。命令返回一个所创建的任务序列的引用。,8,8,inserttask(插入一个任务) inserttask(obj tasksequence, num type , obj involved1, obj involved2 , num var1, num var2, num var3, num var4 ):命令将一个任务插入到任务序列的末尾。第一个参数是此任务要插入的那个任务序列的引用,第二个是任务类型值,用来定义此任务是什么类型。第三与第四个参数是两个相关实体的引用。如果一个任务类型中,一个指定的相关实体未被使用或者是可选的,则可以简单地传递一个NULL插入到任务命令中,如果没有需要指定的数字参数,甚至可以干脆丢掉那个参数。第五到第九个参数是可选的,只需要定义var1-var4。这些值默认为0。,简单的任务序列格式,9,treenode forklift = centerobject(current, 1); treenode origin = centerobject(current, 2); treenode destination = centerobject(current, 3); treenode item = first(origin); treenode ts = createemptytasksequence(forklift, 0, 0); inserttask(ts, TASKTYPE_TRAVEL, origin, NULL); inserttask(ts, TASKTYPE_FRLOAD, item, origin); inserttask(ts, TASKTYPE_TRAVEL, destination, NULL); inserttask(ts, TASKTYPE_FRUNLOAD, item, destination); dispatchtasksequence(ts);,10,任务类型,TASKTYPE_LOAD: flowitem, pickup TASKTYPE_FRLOAD: flowitem, pickup, outputport TASKTYPE_UNLOAD: flowitem, dropoff TASKTYPE_FRUNLOAD: flowitem, dropoff, inputport TASKTYPE_UTILIZE: involved, station, state TASKTYPE_STOPREQUESTFINISH: stoppedobject, NULL TASKTYPE_TRAVEL: destination, NULL TASKTYPE_TRAVELTOLOC: NULL, NULL,xloc,yloc,zloc, endspeed TASKTYPE_TRAVELRELATIVE: NULL, NULL,xloc,yloc,zloc, endspeed TASKTYPE_BREAK: NULL, NULL TASKTYPE_DELAY: NULL, NULL, delaytime, state TASKTYPE_SENDMESSAGE: receiver, NULL, param1,param2,param3 TASKTYPE_MOVEOBJECT: flowitem, container, port TASKTYPE_DESTROYOBJECT: object, NULL 棕色代表需要输入的参数, 灰色 具有可选择性,11,2、全局任务序列,11,20120327,全局任务序列允许用户通过图形用户界面,而不是代码建立任务序列。通过工具主菜单、全局任务序列子菜单、点击添加,即可弹出创建任务序列的窗口。,12,12,20120327,建立全局任务序列,首先创建实体引用名,然后创建与这些引用相关联的任务。 对于每种实体引用均可定义名称和类型(动态或静态)。实体引用为动态,意思是实际创建任务序列时,将处理这些引用;实体引用为静态,意思是它们在所有任务序列实例中都保持不变。 点击添加和移除按钮,即可添加或者移除实体的引用。对于动态类型,用户可以将引用选为动态参数1-5的其中一种。对于静态引用,点击浏览按钮,并且在模型树中选择期望的实体。,13,13,20120327,第二步是创建任务序列。 默认状态下任务序列为空。窗口的最左侧为可以拖动的任务表格。从左边的任务表格中拖拽任务,放置在右边的空白表格中,即可实现任务添加。然后就会在窗口的最右侧弹出属性面板。 要编辑每个任务的属性,可以直接点击列表中的任务,然后编辑右侧的参数。 使用位于列表上面的两个按钮,可以调节和移动序列中任务的位置。,14,14,20120327,一旦创建了任务序列,可以在任何实体的属性窗口中,实体流选项卡的“按下列请求运输工具”模块中选择“使用全局任务序列”选项。输入全局任务序列的名称和适当的动态参数。,15,15,相关命令,treenode ts = createglobaltasksequence(tsname, dispatcher, dp1,dp2,dp3,dp4,dp5); dispatchtasksequence(ts); freeoperators(Dispatch,item);,16,案例 1(AGV充电系统),17,模型要求 1、附件中有本题7.0的原始布局,使用其他版本请也按照附件中的模型进行布局,以方便审核和对比; 2、附件中有本次模型的布局图。有两辆AGV小车在系统中进行运输,A区产品进入暂存区,由AGV运送至B区进行加工作业,加工完成后运送至C区,卸载至C区的暂存区,D区为自动充电区,整个运输过程AGV必须严格按照轨道逆时针单向运行; 3、发生器产生产品服从exponential(0,30,0),C区的暂存区累积到10个产品之后送离系统,C区卸载之后,AGV将回到A区等待新产品的到达; 4、模型一开始运行,AGV就开始消耗电量(无论AGV处在什么状态),初始电量为100%,每秒钟消耗0.1%的电量,两辆AGV的电量是相互独立的。当AGV的电量低于30%,AGV从C区回到A区的过程中,将前往D区停留30秒进行充电,充电完成之后AGV的电量将恢复为100%,并回到A区; 5、越接近现实逻辑越好。 提示:1 可以在D区之前添加网络节点进行检查; 2 轨道路径是单向的,不能出现回头情况,也不能离开轨道进行装载等动作(可以通过设置AGV的偏移拾取方式来完成);,18,3、子任务序列,18,20120327,作为任务序列的一部分,告诉任务执行器去执行不同的任务序列。当子任务完成之后,返回到原来的任务序列。 此任务和中断任务相似,只是它保证第二个任务序列一结束,就立即返回到原来那个任务序列的下一个任务。下图说明了其工作方式。,19,19,任务序列A执行到一个调用子任务类型的任务,它在这里中断转入任务序列B。任务序列B一完成,立即返回任务序列A中的下一个任务。,20,20,命 令,TASKTYPE_CALLSUBTASKS(任务类型_调用子任务):object, tasksequence, param1,param2,param3 举例:inserttask(ts, TASKTYPE_CALLSUBTASKS, centerobect(current, 1),NULL); inserttask(ts, TASKTYPE_CALLSUBTASKS, NULL, specificTaskSequence);,21,21,参 数,Involved1:指向模型中某个实体的引用。,Involved2:它被解释为任务执行器应该中断转而去执行的任务序列的直接引用。,22,22,在消息中,需要将任务序列的引用转换成一个数字,因为消息触发函数返回的是数值型的值。可以使用tonum()命令来完成: tonum(mytasksequence)。,参数 involved1、involved2 相互排斥。必有一个设为NULL,默认情况都设为NULL。,参 数,23,子任务和任务分配器,调用子任务会触发Involve1实体的OnMessage 触发器 OnMessage必须返回一个数字引用到任务序列。 调用子任务可以让任务执行器执行其他分配器中的任务序列 相关命令 movetasksequence( tasksequence, dispatcher ) gettasksequencequeue( dispatcher ),24,案例 2,目的 通过调用子任务序列对任务执行器进行更多控制 描述 零部件通过两条传送带到达; 到达第一条传送带上的货物通过第一条离开传送带离开,到达第二条传送带将零部件循环送往第二条和第三条离开传送带。 叉车从传送带二叉取货物之前必须从传送带一叉取货物,无论哪台叉车,从第一条传送带叉取货物后,它都必须从第二条传送带叉取另外一个零部件。 使用网络节点使得叉车能够沿着顺时针方向运动。,25,布 局,26,4、协同任务序列,26,20120327,createcoordinatedtasksequence() insertallocatetask() insertproxytask() insertsynctask() insertdeallocatetask() dispatchcoordinatedtasksequence(),协同任务序列用来完成需要两个或多个任务执行器进行复杂协同的操作。这些任务序列用来实现这样一些概念,如任务执行器的分派和取消分派,又如使多个并行进行的操作同步处理等。 适用于协同任务序列的命令有以下几个:,27,27,Createcoordinatedtasksequence(创建协同任务序列) createcoordinatedtasksequence(obj dispatcher):该 命令有一个参数,是一个实体的引用。此实体被指定为“任务协调器”,它持有任务序列,并同时协调这些任务。任务协调器也可以是在任务序列中进行分派的实体之一。任务协调器可以是任意分配器或任务执行器。 注意,选择一个任务协调器并不意味着分派那个任务协调器。一个任务协调器可以在任意时刻协调任意数量的协同任务序列。同时,与常规任务序列不同,协同任务序列不进行排队。当用户分配了任务协调器后,它将立即开始执行协同任务序列,无论它正在协调多少其它的协同任务序列。,28,28,Insertallocatetask (插入分派任务) insertallocatetask(obj tasksequence, obj dispatcher, num priority, num preempt):该命令有四个参数。 第一个参数是任务序列。第二个参数是任务执行器或分配器,将给它一个“分派(allocated)” 任务。 当任务协调器执行到一个分派任务时,它实际上创建一个单独的任务序列, 里面有一个“分派(allocated)” 任务, 并将那个任务序列传递给指定的任务执行器或分配器。,29,29,如果它是一个分配器,则意味着用户需要分派几个任务执行器中的任何一个, 这时可以使用此命令的返回值作为一个关键词,来引用被分派的几个任务执行器中特定的那个, 这是由于在创建任务序列时还不能确切地知道是哪一个。第三和第四个参数是将要创建的那个单独任务序列的优先级和先占值。,30,30,Insertproxytask(插入代理任务) insertproxytask(obj tasksequence, num executerkey, num type , num/obj involved1, num/obj involved2 , num var1, num var2, num var3, num var4):此命令与inserttask命令类似,第一个参数为指定的协同任务,另外又添加了第二个参数,用来指定想要分派哪个实体去执行此任务。由于任务协调器实际上是“执行”此任务序列的那个实体,所以,一旦它获得一个代理任务,它将通知所分派的实体来“通过代理”执行此任务。第三个参数为所要执行的任务类型。注意,对于involved1和 involved2,可以传递一个关键字,也可以传递一个实体的引用。,31,31,insertsynctask(插入同步任务) insertsynctask(obj tasksequence, num taskkey):此命令中断任务序列的执行,直到一个用关键字引用的特定任务被完成。它有两个参数:任务序列和一个给定的代理任务的关键值。重点指出,在默认情况下,为不同的任务执行器指定的代理任务将并行完成,除非指定了一个同步任务,而将代理任务分给了同一个任务执行器,代理任务将自动地按顺序执行,而不需要同步任务。,32,32,insertdeallocatetask(插入取消分派任务) insertdeallocatetask(obj tasksequence, num allocationkey):此命令取消一个用关键字引用的指定的任务执行器。第一个参数引用协同任务序列。 第二个参数是想要取消分派的资源的分派关键字。,33,33,dispatchcoordinatedtasksequence (分配任务) dispatchcoordinatedtasksequence(obj tasksequence):调度指定的协同任务序列。,34,34,在给任何资源分配代理任务之前,必须要确定分派哪个资源。 必须从每个分派任务中返回一个关键字,因为后面要使用它。insertproxytask 命令为代理任务的执行器获得一个关键字。 这是分派任务返回的关键字。在取消分派此实体时也要使用此关键字。 确保取消分派所有已分派的实体, 否则, 任务序列将不能正确地释放它分派的实体。 一旦取消分派了一个资源, 就不要再给它任何代理任务。,注意事项,35,二、GUI,用户可以使用GUI为模型或实体创建自己的窗口界面。通过这个界面,用户可以随意的和模型、实体进行交互。 1、控制Flexsim模型及实体的各种属性、变量; 2、显示Flexsim模型及实体的各种统计数据; 3、满足各种用户对图形窗口的特有需求。,36,为什么要创建GUI,并不是所有人都知道怎么操作FlexSim 不需要理解代码来操作或控制模型 能够节约大量的测试时间 可将大量信息集中在一个地方 更加专业的外观,37,GUI创建器,通过工具GUI(G)添加,可以新建一个GUI创建器,这时就会弹出2个窗口。,新建GUI,GUI生成器和GUI画布,38,GUI创建器界面,所有属性显示所有用于创建GUI界面的属性 常用属性GUI界面中常用的属性列表 专有属性专用于被选中控件的属性 查看属性查看当前选中的视图的属性 查看结构查看当前选中的视图的结构 无更新当你在GUI画布中点击控件时,不更新GUI编辑器。,39,将GUI和树节点链接起来,有时候需要穿过GUIs树结构,获得属性节点需要的数据。 objectfocus指定一条到达某个实体的路径,路径应该包含文本数据,到达包含所需信息的节点。 热链接/冷链接它是一种实现与模型中某个节点链接的属性。热链接将会随着模型中值的变化,连续更新它的文本区。而冷链接只有当打开窗口,设置值,并且只有当点击应用按钮后,它才能获取此值。 字符串示例: objectfocus+variables/variablename Hotlink示例: 处理器的统计选项卡上,实体的容量统计则是热连接的示例。 Coldlink示例: 处理器选项卡上,最大容量则是冷连接的示例。 Hotlinkx/Coldlinkx和上面的相似,但是需要使用脚本创建链接,而不使用字符串。 代码: return(node(“objectfocus+“,c);,40,链接到什么节点?,链接到的节点应该包含你想要的值 参数:如速度、最大容量 MAIN:/project/model/obj_namevariables/maxcontent objectfocus+variables/maxspeed 标签: objectfocus+/obj_namelabels/label_name 全局表: MAIN:/project/model/Tools/GlobalTables/Table_namevariables/data 标签表、状态图,41,穿过树结构,使用链接属性时或者在函数中定义字符串路径(例如node())时,以下符号非常有用。 穿越树结构的起点就是路径所在的节点。 : 指向当前节点的根节点。通常指自定义的GUI窗口。 : 指向节点的属性树。就像节点变高亮时,它左边出现的符号。 +: 读取节点的文本,并将该文本作为指向实体的路径。 /: 到达节点的子节点(子结构树)。 :到达节点的父节点。,42,引用树,43,GUI生成器菜单,选中实体使用此GUI 此选项将模型中被选中实体的guifocusclass 属性引用指向这 个GUI 复制当前GUI到选中实体 此选项将会完全复制GUI,将其保存在每个被选中的实体中。 添GUI 至当前用户库 作为可以拖动的图标它将以图标的方式显示在用户库中。 并可以通过拖动的方式将其添加至其他的模型中,拖动的同时,GUI 将会被添加至模型的工具箱中。 作为自动安装的组件GUI 将会添加至用户库中,但是不会显示在库中。它是作为组件添加至库中的,且当用户库被装载时,自动安装到模型中,44,GUI生成器菜单,将GUI 分配给控制按钮 选择此选项,点击Flexsim 主工具栏中的“控制”按钮时,就可以直接打开此GUI 默认GUI 工具栏中的“俯视视图”和“透视图”按钮通过此菜单定义后,可以直接打开创建的GUI。选择“返回俯视图/透视图原始GUI”选项,即可通过点击俯视图/透视图按钮,返回其原始GUI。 网格 用户可以使用此菜单设置GUI 画布是否与网格对齐,和网格的大小。,45,创建GUI的秘诀,偷取它! (右键单击) 你可以通过打开已经存在的FlexSim GUIs来获取更多制作GUI控件的方式,46,46,三、动画编辑器和运动学,1、动画编辑器 2、运动学,47,47,动画创建器允许用户为模型中的Flexsim实体创建和保存自定义的动画。 在Flexsim中,动画由关键帧组成。 要创建或者编辑动画,双击任意实体从而打开它的属性窗口,单击常规选项卡,点击视景/动画后面的编辑按钮,将会打开动画创建器。 动画创建器运行用户编辑现存动画,创建新动画并且预览动画。,1、动画创建器,48,48,49,49,创建一个新动画的步骤: 1)打开动画创建器,添加一个新的动画。 2)时间线归0,分别确定运动部件的初始位置,在初始位置上添加关键帧。 3)移动时间线,分别调整运动部件到相应位置,在该位置上添加关键帧。 4)重复步骤3,添加完所有的动画,关闭动画创建器。 5)在需要使用新动画时使用命令startanimation。,50,50,运动学功能用来使一个实体同时执行多个运动操作,每个运动都有各自的加速度、减速度、开始速度、结束速度以及最大速度属性。 对任何实体进行系统之外的动画自定义 包括行走和旋转 需要创建一个用于储存和更新动作的节点 单个运动节点可以添加多个动作,2、运 动 学,51,51,第一步:设置空节点的引用,可以是一个label或者变量。注意:有些实体本身就有这样的空节点(如convey:convkinematic节点) 第二步:调用initkinematics命令,初始化运动数据,保存类似起始位置和实体转角等所需要完成的动作的数据。,实现步骤,52,52,第三,初始化运动后,就可以用addkinematic命令给出实体后继的行进/旋转操作,例如: KINEMATIC_TRAVEL/KINEMATIC_ROTATE 第四,调用updatekinematics 命令来在运动执行动作过程中刷新视图,此命令计算实体当前的位置和转角。,53,53,1、一般在customer draw触发器,调用updatekinematics函数 2、在每个addkinematic后面(特别是消息触发器)加一个updatekinematics,防止模型运行太快, customer draw触发器触发的频率跟不上。,注意事项,54,54,3、必须为initkinematics命令传递一个空节点的引用作为第一个参数,它指定了在哪里存储运动信息,或者是否从已经存储了运动信息的地方获取信息。此节点必须是没有被其它地方使用的节点,运动学功能才能够存储需要的信息。对于建模人员,此节点很可能是一个标签。运动初始化后,节点将会显示文本“do not touch(请勿接触)”。在运动学操作正在进行中时,不能在树或表视图中点击此节点,否则运动数据将可能混乱。,55,相关命令,initkinematics( kinematicnode, object ) 初始化运动学,在开启动画的触发触发器中使用 deactivatekinematics(kinematicnode ) 清除运动学节点的信息,在OnReset重置触发器中使用 addkinematic( kinematicnode, num x, num y, num z, num targetspeed, num acc, num dec, num startspeed, num endspeed, num starttime, int type ) 定义运动学动画,在开启运动学动画的事件代码中使用 updatekinematics( kinematicnode, object ) 更新运动学节点信息,用于Custom Draw trigger 和OnMessage Trigger (在相同的事件开始动画时发送消息来更新运动学) KINEMATIC_TRAVEL:定义x/y/z方向的移动 KINEMATIC_ROTATE: 定义旋转动画,56,56,Initkinematics 命令是可重载的,所以可以根据情况用两个不同的参数集调用initkinematics命令: void initkinematics(treenode datanode, treenode object , int managerotation, int localcoords ) 此参数集假设用户需要移动一个实体,例如运输机。第一个参数,仍是运动数据的空节点,可能是标签、属性或者变量。第二个参数是将要执行移动的实体。此命令将保存此实体的初始位置和转角。,57,57,initkinematics(treenodedatanode , double x, double y, double z, double rx, double ry,double rz, int managerotation, int localcoords ) 这个参数集用来直接传递初始位置和转角,而不是传递一个引用的实体。虽然当要把实体传递给参数时可能更经常使用其它参数,但此参数集可以使你更为灵活。当你需要直接传递实体的初始位置和转角时,或者当模型中位置和转角不必代表实际位置和参

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论