查看: 15|回复: 15

分析Flexsim事件及触发机制的方法

[复制链接]

主题

0

回帖

544

积分

中级会员

积分
544
发表于 2015-9-23 13:53:11 | 显示全部楼层 |阅读模式
[i=s] 本帖最后由 zorsite 于 2015-9-23 16:05 编辑 [/i]

[align=center][font=黑体][size=14.0pt]以货架随机摆放临时实体为例学习Flexsim事件及触发机制[/size][/font][/align]
[font=宋体]很多初学者都对[/font]flexsim[font=宋体]的事件及触发不太理解,到底先执行什么后执行什么,先触发什么后触发什么?用户手册中也没有相关的说明。如何才能把这件事情弄明白?其实并没有想象中那么难,只要稍稍花一点时间,你就能彻底掌握其中的奥妙。[/font]
[font=宋体]接下来我们以货架随机摆放临时实体为例,来看一下在[/font]flexsim[font=宋体]中,各种事件、触发的发生顺序。[/font]
[font=宋体]在[/font]flexsim[font=宋体]中依次拖入货架、发生器、暂存区,软件会将这三个实体自动命名为[/font]Rack2[font=宋体]、[/font]Source3[font=宋体]、[/font]Queue4[font=宋体](请注意这三个实体的拖入顺序)。依次[/font]A[font=宋体]连接发生器、暂存区、货架。双击打开货架属性,勾选[/font]“Floor Storage”[font=宋体],设置最大库存为[/font]50[font=宋体],设置列和行随机摆放[/font],[font=宋体]每个货位内最大摆放量为[/font]1[font=宋体],设置货架为[/font]5[font=宋体]列[/font]10[font=宋体]行。[/font]
         

[font=宋体]重置视图,最终效果图如下所示:[/font]

[font=宋体]在[/font]debug[font=宋体]菜单中选择[/font]EventLog[font=宋体],打开[/font]Event Log[font=宋体]窗口。[/font]

[font=宋体]点击[/font]settings[font=宋体]按钮,我们可以看到[/font]flexsim[font=宋体]可以记录的事件类型和事件列表。[/font]

Flexsim[font=宋体]把事件分为了四大类:[/font]Engine[font=宋体]、[/font]Trigger[font=宋体]、[/font]TaskSequence[font=宋体]、[/font]BeginTask[font=宋体]。[/font]

[font=宋体]引擎事件包括了创建实体、摧毁实体,打开输入[/font]/[font=宋体]输出端口,接收实体,发送实体,发送消息,定时事件。[/font]

[font=宋体]触发事件就多了,我们在实体属性的触发选项卡中见到各种触发都可以在这里找到,还有属性窗口中的一些设置项也可以视为触发。比如发生器的[/font]“[font=宋体]到达时间间隔[/font]”[font=宋体],处理器的“预置时间”等,[/font]flexsim[font=宋体]也将其归类为触发事件。[/font]

TaskSequence[font=宋体]和[/font]BeginTask[font=宋体]其实都属于任务事件,[/font]flexsim[font=宋体]将其细化,分为两类。[/font]
[font=宋体]任务序列事件只包括开始任务序列、结束任务序列、接收任务序列。[/font]

[font=宋体]开始任务事件则是任务序列的具体过程,比如装载、行走,卸载、中断、移动实体等。[/font]

[font=宋体]在[/font]Event Log[font=宋体]窗口勾选[/font]”EnabelLogging”[font=宋体],运行模型一段时间后,点击[/font]”Export”[font=宋体],将事件日志导出保存。也可以自己指定运行的时间段,比如设置[/font]Start Time[font=宋体]为[/font]0[font=宋体],[/font]End Time[font=宋体]为[/font]15[font=宋体]。[/font]
[font=宋体]打开保存的日志文件,就可以看到[/font]flexsim[font=宋体]模型在运行过程中各种事件、触发的顺序。[/font]

[font=宋体]先看一下0时刻模型发生了什么:[/font]
[table=492][tr][td=1,1,84]  [size=1]Time
  [/size][/td][td=1,1,164][size=1]  Object
  [/size][/td][td=1,1,244][size=1]  Event
  [/size][/td][/tr] [tr][td=1,1,84][size=1]  0
  [/size][/td][td=1,1,164][size=1]  /FlexsimModelFloor
  [/size][/td][td=1,1,244][size=1]  Trigger: OnReset
  [/size][/td][/tr] [tr][td=1,1,84][size=1]  0
  [/size][/td][td=1,1,164][size=1]  /Rack4
  [/size][/td][td=1,1,244][size=1]  Trigger: OnReset
  [/size][/td][/tr] [tr][td=1,1,84][size=1]  0
  [/size][/td][td=1,1,164][size=1]  /Source3
  [/size][/td][td=1,1,244][size=1]  Trigger: OnReset
  [/size][/td][/tr] [tr][td=1,1,84][size=1]  0
  [/size][/td][td=1,1,164][size=1]  /Source3
  [/size][/td][td=1,1,244][size=1]  Trigger: Inter-Arrival Time
  [/size][/td][/tr] [tr][td=1,1,84][size=1]  0
  [/size][/td][td=1,1,164][size=1]  /Queue4
  [/size][/td][td=1,1,244][size=1]  Trigger: OnReset
  [/size][/td][/tr][/table][font=宋体]在[/font]0[font=宋体]秒的时候各种实体会激发[/font]OnReset[font=宋体]触发。本例中依次激发了[/font]FlexsimModelFloor[font=宋体]、[/font]Rack2[font=宋体]、[/font]Source3[font=宋体]、[/font]Queue4[font=宋体]的重置,重置的顺序并不是按照模型逻辑,而是按照实体创建的顺序。在创建模型的时候我们最先拖入的实体是货架,所以货架在发生器和暂存区之前被重置。而在货架之前,[/font]flexsim[font=宋体]自动创建了[/font]ModelFloor[font=宋体]实体,所以货架的命名是从[/font]2[font=宋体]开始的。这一点可以打开树结构验证。[/font]

[font=宋体]在发生器被重置之后,马上触发的[/font]“[font=宋体]到达时间间隔[/font]”[font=宋体]触发,这是为了决定什么时间创建第一个临时实体。[/font]
[font=宋体]在[/font]5.303038[font=宋体]时刻,发生器创建了第一个临时实体,并由此引发了接下来的一系列事件和触发:[/font]
[table=98%][tr][td=1,1,81]  [size=1]Time
  [/size][/td][td=1,1,82][size=1]  Object
  [/size][/td][td=1,1,215][size=1]  Event
  [/size][/td][td=1,1,106][size=1]  Involved
  [/size][/td][td=1,1,130][size=1]  P1
  [/size][/td][/tr] [tr][td=1,1,81][size=1]  5.303038
  [/size][/td][td=1,1,82][size=1]  /Source3
  [/size][/td][td=1,1,215][size=1]  Engine: Timed Event
  [/size][/td][td=1,1,106][size=1]  /Source3
  [/size][/td][td=1,1,130][size=1]  EVENT_CREATEPART
  [/size][/td][/tr] [tr][td=1,1,81][size=1]  5.303038
  [/size][/td][td=1,1,82][size=1]  /Source3
  [/size][/td][td=1,1,215][size=1]  Trigger: OnCreation
  [/size][/td][td=1,1,106][size=1]  /Source3/Box
  [/size][/td][td=1,1,130][size=1]  rownum: 0.0
  [/size][/td][/tr] [tr][td=1,1,81][size=1]  5.303038
  [/size][/td][td=1,1,82][size=1]  /Source3
  [/size][/td][td=1,1,215][size=1]  Trigger: Send To Port
  [/size][/td][td=1,1,106][size=1]  /Source3/Box
  [/size][/td][td=1,1,130][size=1]  

  [/size][/td][/tr] [tr][td=1,1,81][size=1]  5.303038
  [/size][/td][td=1,1,82][size=1]  /Source3
  [/size][/td][td=1,1,215][size=1]  Engine: Send Object
  [/size][/td][td=1,1,106][size=1]  /Source3/Box
  [/size][/td][td=1,1,130][size=1]  

  [/size][/td][/tr] [tr][td=1,1,81][size=1]  5.303038
  [/size][/td][td=1,1,82][size=1]  /Source3
  [/size][/td][td=1,1,215][size=1]  Trigger: Inter-Arrival Time
  [/size][/td][td=1,1,106][size=1]  

  [/size][/td][td=1,1,130][size=1]  

  [/size][/td][/tr] [tr][td=1,1,81][size=1]  5.303038
  [/size][/td][td=1,1,82][size=1]  /Source3
  [/size][/td][td=1,1,215][size=1]  Trigger: OnExit
  [/size][/td][td=1,1,106][size=1]  /Source3/Box
  [/size][/td][td=1,1,130][size=1]  port: 1.0[/size]
  [/td][/tr][/table][font=宋体]当临时实体被创建时,首先执行的是定时事件:[/font][font=宋体][size=11.0pt]CREATEPART[/size][/font][font=宋体],然后才激发[/font]“[font=宋体]创建触发[/font]”[font=宋体],临时实体被创建后,还要决定其从哪一个端口发送,然后执行发送,临时实体离开发生器。而在临时实体离开之前,发生器还激发了[/font]”[font=宋体]到达时间间隔[/font]“[font=宋体]触发。[/font]
[font=宋体]本例中的每个实体都是以[/font]Engine[font=宋体]事件开始,要么创建,要么接收。暂存区正是以接收实体事件开始:[/font]
[table=98%][tr][td=1,1,84] [size=1] Time
  [/size][/td][td=1,1,66][size=1]  Object
  [/size][/td][td=1,1,203][size=1]  Event
  [/size][/td][td=1,1,111][size=1]  Involved
  [/size][/td][td=1,1,123][size=1]  P1
  [/size][/td][/tr] [tr][td=1,1,84][size=1]  5.303038
  [/size][/td][td=1,1,66][size=1]  /Queue4
  [/size][/td][td=1,1,203][size=1]  Engine: Receive Object
  [/size][/td][td=1,1,111][size=1]  /Queue4/Box
  [/size][/td][td=1,1,123][size=1]  

  [/size][/td][/tr] [tr][td=1,1,84][size=1]  5.303038
  [/size][/td][td=1,1,66][size=1]  /Queue4
  [/size][/td][td=1,1,203][size=1]  Trigger: OnEntry
  [/size][/td][td=1,1,111][size=1]  /Queue4/Box
  [/size][/td][td=1,1,123][size=1]  port: 1.0
  [/size][/td][/tr] [tr][td=1,1,84][size=1]  5.303038
  [/size][/td][td=1,1,66][size=1]  /Queue4
  [/size][/td][td=1,1,203][size=1]  Trigger: OnEndCollecting
  [/size][/td][td=1,1,111][size=1]  /Queue4/Box
  [/size][/td][td=1,1,123][size=1]  batchsize: 1.0
  [/size][/td][/tr] [tr][td=1,1,84][size=1]  5.303038
  [/size][/td][td=1,1,66][size=1]  /Queue4
  [/size][/td][td=1,1,203][size=1]  Trigger: Send To Port
  [/size][/td][td=1,1,111][size=1]  /Queue4/Box
  [/size][/td][td=1,1,123][size=1]  

  [/size][/td][/tr] [tr][td=1,1,84][size=1]  5.303038
  [/size][/td][td=1,1,66][size=1]  /Queue4
  [/size][/td][td=1,1,203][size=1]  Engine: Send Object
  [/size][/td][td=1,1,111][size=1]  /Queue4/Box
  [/size][/td][td=1,1,123][size=1]  

  [/size][/td][/tr] [tr][td=1,1,84][size=1]  5.303038
  [/size][/td][td=1,1,66][size=1]  /Queue4
  [/size][/td][td=1,1,203][size=1]  Trigger: OnExit
  [/size][/td][td=1,1,111][size=1]  /Queue4/Box
  [/size][/td][td=1,1,123][size=1]  port: 1.0
  [/size][/td][/tr][/table]接收实体之后激发了进入触发,然后判断批次,获取发送端口,执行发送,最后离开暂存区。
货架同样以接收临时实体开始:
[table=98%][tr][td=1,1,84][size=1]  Time
  [/size][/td][td=1,1,65][size=1]  Object
  [/size][/td][td=1,1,219][size=1]  Event
  [/size][/td][td=1,1,94][size=1]  Involved
  [/size][/td][td=1,1,161][size=1]  P1
  [/size][/td][/tr] [tr][td=1,1,84][size=1]  5.303038
  [/size][/td][td=1,1,65][size=1]  /Rack4
  [/size][/td][td=1,1,219][size=1]  Engine: Receive Object
  [/size][/td][td=1,1,94][size=1]  /Rack4/Box
  [/size][/td][td=1,1,161][size=1]  

  [/size][/td][/tr] [tr][td=1,1,84][size=1]  5.303038
  [/size][/td][td=1,1,65][size=1]  /Rack4
  [/size][/td][td=1,1,219][size=1]  Trigger: Place in Bay
  [/size][/td][td=1,1,94][size=1]  /Rack4/Box
  [/size][/td][td=1,1,161][size=1]  

  [/size][/td][/tr] [tr][td=1,1,84][size=1]  5.303038
  [/size][/td][td=1,1,65][size=1]  /Rack4
  [/size][/td][td=1,1,219][size=1]  Trigger: Place in Level
  [/size][/td][td=1,1,94][size=1]  /Rack4/Box
  [/size][/td][td=1,1,161][size=1]  bay: 3.0
  [/size][/td][/tr] [tr][td=1,1,84][size=1]  5.303038
  [/size][/td][td=1,1,65][size=1]  /Rack4
  [/size][/td][td=1,1,219][size=1]  Trigger: OnEntry
  [/size][/td][td=1,1,94][size=1]  /Rack4/Box
  [/size][/td][td=1,1,161][size=1]  port: 1.0
  [/size][/td][/tr] [tr][td=1,1,84][size=1]  5.303038
  [/size][/td][td=1,1,65][size=1]  /Rack4
  [/size][/td][td=1,1,219][size=1]  Trigger: Minimum Dwell Time
  [/size][/td][td=1,1,94][size=1]  /Rack4/Box
  [/size][/td][td=1,1,161][size=1]  port: 1.0
  [/size][/td][/tr] [tr][td=1,1,84][size=1]  5.303038
  [/size][/td][td=1,1,65][size=1]  /Rack4
  [/size][/td][td=1,1,219][size=1]  Engine: Timed Event
  [/size][/td][td=1,1,94][size=1]  /Rack4/Box
  [/size][/td][td=1,1,161][size=1]  EVENT_PROCESSFINISH
  [/size][/td][/tr] [tr][td=1,1,84][size=1]  5.303038
  [/size][/td][td=1,1,65][size=1]  /Rack4
  [/size][/td][td=1,1,219][size=1]  Trigger: OnEndDwellTime
  [/size][/td][td=1,1,94][size=1]  /Rack4/Box
  [/size][/td][td=1,1,161][size=1]  

  [/size][/td][/tr] [tr][td=1,1,84][size=1]  5.303038
  [/size][/td][td=1,1,65][size=1]  /Rack4
  [/size][/td][td=1,1,219][size=1]  Trigger: Send To Port
  [/size][/td][td=1,1,94][size=1]  /Rack4/Box
  [/size][/td][td=1,1,161][size=1]  

  [/size][/td][/tr][/table][font=宋体]接收临时实体之后依次判断应该放置在哪一列、哪一层,然后激发进入触发,临时实体进入货架之后需要获取其在货架最短停留时间,由于这里设置的最短停留时间是[/font]0[font=宋体],所以随即激发定时事件[/font]PROCESSFINISH[font=宋体](如果是停留结束会更合理、更便于理解),再激发“停留时间结束[/font]“[font=宋体]触发,最后获取发送端口。由于本例中并没有为货架指定下游端口,所以这里没有执行[/font]”Send Object“[font=宋体]事件,也没有离开触发。[/font]
[font=宋体]接下来的其他时间节点都是在重复着同样的事件和触发,直到货架被摆满。[/font]
[font=宋体]通过[/font]Event Log[font=宋体]工具,我们可以详细的分析每一个实体的工作机制。比如可以分析推式策略、拉式策略的不同,比如可以调用运输工具,添加任务序列,来分析任务的优先级别、先占级别的处理机制等等。[/font]
[font=宋体]
[/font]
[font=宋体]
[/font]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

主题

0

回帖

897

积分

中级会员

积分
897
发表于 2015-9-23 14:04:53 | 显示全部楼层
学习啦

主题

0

回帖

2945

积分

高级会员

积分
2945
发表于 2015-9-24 12:04:12 | 显示全部楼层
:lol感谢分享event log的使用方法!讲得很详细!


文中出现其了一处与我理解不同的地方,我贴上来,一起讨论讨论~

“重置的顺序并不是按照模型逻辑,而是按照实体创建的顺序。”
并不是实体创建的顺序,flexsim中并没有一个节点存放实体创建的时候(临时实体有)。
这是因为,先拉到模型中的实体的rank靠前。但是,rank是可以修改的,后拉进来的实体的rank可以调整到靠前,on reset触发就更加靠前咯。也就是是实现了“后进来的实体先触发重置触发”。

主题

0

回帖

4万

积分

版主

积分
45331
发表于 2015-9-24 21:03:39 | 显示全部楼层
非常好的学习材料!感谢分享!事件日志帮助我们更好地理解flexsim的运作机制,也能够帮助我们更快找到模型建立过程中遇到问题的解决办法。

主题

0

回帖

987

积分

中级会员

积分
987
发表于 2015-9-25 10:49:13 | 显示全部楼层
感谢,以前自己看得一头雾水,现在明白多了

主题

0

回帖

987

积分

中级会员

积分
987
发表于 2015-9-25 10:53:54 | 显示全部楼层
另外请教一下“拉入”策略时,上下游实体的触发顺序,“拉入”成功与否,触发器执行的次序是什么样的

主题

0

回帖

4万

积分

版主

积分
45331
发表于 2015-9-25 15:27:41 | 显示全部楼层
您可以按照加老师的方法,用eventlog来实验一下,实验出真知。

主题

0

回帖

3389

积分

高级会员

积分
3389
发表于 2015-9-26 18:00:20 | 显示全部楼层
我也说一点:
在事件日志中,涉及的实体一般都是box,这样我们很难区分到底是哪一个触发的,如果需要,我们可以对产生的临时实体进行重命名,编号处理,这样就可以知道就哪一个临时实触发了什么。

主题

0

回帖

2001

积分

高级会员

积分
2001
发表于 2016-4-12 11:04:30 | 显示全部楼层
对软件的运行机制学习很重要。

主题

0

回帖

4万

积分

版主

积分
45331
发表于 2016-4-13 09:32:49 | 显示全部楼层
[quote]我也说一点:
在事件日志中,涉及的实体一般都是box,这样我们很难区分到底是哪一个触发的,如果需要,我们可以对产生的临时实体进行重命名,编号处理,这样就可以知道就哪一个临时实触发了什么。
[size=2][color=#999999]657776724 发表于 2015-9-26 18:00[/color] [url=http://flexsim.asia/redirect.php?goto=findpost&pid=18178&ptid=5502]http://flexsim.asia/images/common/back.gif[/url][/size][/quote]

一个好消息:最新的2016版本已经自动区分在不同实体上面不同rank的实体了,这样就使得debug的过程更加简单方便快速~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:admin@discuz.vip

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.|京ICP备14043114号-2

在本版发帖
关注公众号
QQ客服返回顶部