全球FlexSim系统仿真中文论坛

搜索
查看: 16688|回复: 15
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2015-9-23 13:53:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2015-9-23 16:05 编辑
) m, X! g& e& ^4 K2 X
; s% s7 b- }, M
以货架随机摆放临时实体为例学习Flexsim事件及触发机制
) [' R2 |( R8 ?
很多初学者都对flexsim的事件及触发不太理解,到底先执行什么后执行什么,先触发什么后触发什么?用户手册中也没有相关的说明。如何才能把这件事情弄明白?其实并没有想象中那么难,只要稍稍花一点时间,你就能彻底掌握其中的奥妙。
$ J8 Y  A) ]. ]. d( g接下来我们以货架随机摆放临时实体为例,来看一下在flexsim中,各种事件、触发的发生顺序。6 p) b: C: u5 F1 k' t
flexsim中依次拖入货架、发生器、暂存区,软件会将这三个实体自动命名为Rack2Source3Queue4(请注意这三个实体的拖入顺序)。依次A连接发生器、暂存区、货架。双击打开货架属性,勾选“Floor Storage”,设置最大库存为50,设置列和行随机摆放,每个货位内最大摆放量为1,设置货架为510行。$ v/ X! U0 w0 u) B5 E. a
         ( O% l3 x& W1 y

6 G, o! h3 T, h2 B. i. S- P" r* C重置视图,最终效果图如下所示:
+ y1 _* ]7 u, I+ c9 P! x7 c) b. ]5 e! s9 b, P% @
debug菜单中选择EventLog,打开Event Log窗口。
  G! [9 M! S" q! k1 r$ V& z" _- A- s2 D1 L5 C( ?( U. O
点击settings按钮,我们可以看到flexsim可以记录的事件类型和事件列表。2 a: U7 e# @! ]9 e' g* S7 L) k* Q( T

% Z) ?& y! y- C' ^/ T6 J4 ~6 TFlexsim把事件分为了四大类:EngineTriggerTaskSequenceBeginTask
) r3 V2 r* \+ R" s# V1 u" e! D/ V" e9 i+ W% l! v# A4 d* ?
引擎事件包括了创建实体、摧毁实体,打开输入/输出端口,接收实体,发送实体,发送消息,定时事件。8 S6 y9 j% Q# d( B# ]! |
. d; b6 Y1 a  _+ h
触发事件就多了,我们在实体属性的触发选项卡中见到各种触发都可以在这里找到,还有属性窗口中的一些设置项也可以视为触发。比如发生器的到达时间间隔,处理器的“预置时间”等,flexsim也将其归类为触发事件。
2 ^# Y# k3 k, s* N5 o. Q' k" ]8 S! A
TaskSequenceBeginTask其实都属于任务事件,flexsim将其细化,分为两类。  N6 }; c9 L) j  h, K
任务序列事件只包括开始任务序列、结束任务序列、接收任务序列。
" [7 d) L$ m2 Q# J0 W7 ^; J, V+ p2 o% p( |2 D$ A6 N9 N
开始任务事件则是任务序列的具体过程,比如装载、行走,卸载、中断、移动实体等。8 A: v3 O6 t6 k

6 c4 Q  ]/ |1 W0 ^7 r8 tEvent Log窗口勾选”EnabelLogging”,运行模型一段时间后,点击”Export”,将事件日志导出保存。也可以自己指定运行的时间段,比如设置Start Time0End Time15
) k& L% o+ B: m打开保存的日志文件,就可以看到flexsim模型在运行过程中各种事件、触发的顺序。# Q4 Q7 D% x) H/ N6 Z& x; T

7 v" ~4 I& t: T先看一下0时刻模型发生了什么:3 R# F" @( C* R) R3 O
  Time
. B5 E+ Y- Z% g* l8 [  
  Object
/ u3 n1 z# o( U8 M  
  Event1 a  e: E6 x9 H" e- Q2 E+ E9 y; I
  
  0  U* n2 |4 k0 A: ?. r: G# F
  
  /FlexsimModelFloor* }. g2 v( T! g* g1 P
  
  Trigger: OnReset5 M6 ?5 w  u. z# t0 A4 J
  
  01 c  B7 |* Q1 Z$ F
  
  /Rack4+ R! R3 V) L+ K( q, u1 g/ K
  
  Trigger: OnReset
6 ~, x0 O! P  l7 Z/ E  F9 r  
  0  [7 @" X9 w0 `8 K+ D. N
  
  /Source31 n# D5 u8 P, b9 E1 B' Q
  
  Trigger: OnReset
4 ~- i# p" _% E+ X  
  0
  J) m. D( D% P% _  
  /Source36 i9 X: u; L8 N" M: T& X4 V
  
  Trigger: Inter-Arrival Time% @$ i8 h0 D) r3 r
  
  0) f* V" }( I( y" ^
  
  /Queue4
3 S- [% O  Q; v1 C  
  Trigger: OnReset( h/ D4 Z  d8 R5 x) l3 d
  
0秒的时候各种实体会激发OnReset触发。本例中依次激发了FlexsimModelFloorRack2Source3Queue4的重置,重置的顺序并不是按照模型逻辑,而是按照实体创建的顺序。在创建模型的时候我们最先拖入的实体是货架,所以货架在发生器和暂存区之前被重置。而在货架之前,flexsim自动创建了ModelFloor实体,所以货架的命名是从2开始的。这一点可以打开树结构验证。/ V# j2 k5 q, l5 {
! `5 W4 M0 P8 ^1 E" m* }
在发生器被重置之后,马上触发的到达时间间隔触发,这是为了决定什么时间创建第一个临时实体。
9 z( x! v% l& o0 E5.303038时刻,发生器创建了第一个临时实体,并由此引发了接下来的一系列事件和触发:, O0 X! U, k' G$ F- P
  Time* p9 k+ T8 b& N. l; d) L* {" X
  
  Object
% r) t& s( f. P5 |  
  Event9 }+ f! j8 E9 k4 `
  
  Involved% b( {4 W; O7 o) j1 ^
  
  P14 ?! i. i# I  M9 F# }4 w
  
  5.303038
$ C  h0 Z9 u" q* J3 e+ t9 L8 M. s  
  /Source3
/ l" ^& c. o' X. l  l" r  
  Engine: Timed Event
3 n8 }& c, K- k9 q  {" `  
  /Source3
: f) q, ~8 z! {6 Q% ?) z& {  
  EVENT_CREATEPART
" v& J2 C: O" N2 v- p' [  
  5.303038
7 _, }- `& ?- g3 j; [  
  /Source33 @; g% s1 O6 X& _4 q5 e( x
  
  Trigger: OnCreation
  e$ b% V) @0 Q& \$ ?6 M/ d* K/ y  
  /Source3/Box
2 T5 H7 U& O7 E6 n9 S2 o2 X  
  rownum: 0.0) z6 p) n8 d# |8 D% Y8 \) M
  
  5.3030380 h/ K" x7 R" T- {: @$ h
  
  /Source30 N% m1 k. t1 L, I2 U
  
  Trigger: Send To Port1 m1 s6 X/ {1 r7 a% b+ p; c0 A
  
  /Source3/Box
* S; q+ Y! i, w7 F8 M1 v# g3 U  
  
# e! H" `+ B2 l- _3 U7 r; }  V% T8 A3 ^
* P) r* v7 G- W) F0 S* k0 r, p  
  5.303038% u; n( L8 F; Q2 o5 t; e
  
  /Source3
- c* n, m3 ]$ f0 e. ]* x2 l  
  Engine: Send Object0 R7 T- V2 K# w8 U+ n
  
  /Source3/Box
% b- e' m4 _2 V+ s; N5 R! s; x. t  
  7 u2 U/ w5 G& j
# |$ C3 P0 T9 t8 G4 }. _* z! |
  
  5.303038
8 v) m- N  }0 }1 h3 q- w2 W8 n* w: u  
  /Source3: t# p" s; D8 }
  
  Trigger: Inter-Arrival Time$ ]' ?+ d$ U7 B4 r; K: v
  
  7 q* |: Z# A7 a+ E- A3 W

4 m' e: `5 X! E# ~3 H  
  / i; X, t* G/ }8 a& \8 j: ]
& H& n3 k* x. I3 C5 m6 Q: M2 t1 ^
  
  5.3030386 d9 t3 ?  b! K# P: k- H
  
  /Source3
( w9 }2 z& I8 d  
  Trigger: OnExit7 H/ ^  t" J1 u% E7 c
  
  /Source3/Box( P6 v8 k. N( a0 _! W
  
  port: 1.0
# A+ k% n9 z' {- w, p  
当临时实体被创建时,首先执行的是定时事件:CREATEPART,然后才激发创建触发,临时实体被创建后,还要决定其从哪一个端口发送,然后执行发送,临时实体离开发生器。而在临时实体离开之前,发生器还激发了到达时间间隔触发。
3 |2 K- q4 k9 m本例中的每个实体都是以Engine事件开始,要么创建,要么接收。暂存区正是以接收实体事件开始:) v( k7 k: ]" x4 j! e
Time
: A# |6 i2 ~  w4 [6 h  
  Object. k  `& o0 d$ V. R3 D0 N( C- s3 [
  
  Event) V9 D  Q8 q5 A. s# W
  
  Involved" n+ C& D4 O( W
  
  P1
( J* B- K1 n/ q  
  5.3030386 c+ f7 ~9 M; O* B% V9 A# E
  
  /Queue4! c9 z% F0 u0 b
  
  Engine: Receive Object
" Y3 X3 ?# z4 ?' }* b$ m3 M2 _; z  
  /Queue4/Box
) c1 P- z* P! s% n# ?  
  
$ M6 Z5 p! ?* c! G! t- ~  ~- G: M* p" ]: c1 U. C+ b* i+ Z7 E( J5 M+ ]  F
  
  5.303038
. e; M7 ^* u: I$ m  
  /Queue4; U- H/ V' {# ?+ Q( x
  
  Trigger: OnEntry
  h* U- y/ K% D! y  
  /Queue4/Box. ~2 S0 B! H7 u& o6 A( x
  
  port: 1.0
" j4 l& f# `3 g$ I  
  5.303038
+ S1 Y& e5 Q$ u4 {" B. N0 A8 `8 w4 v2 E  
  /Queue4
4 \9 d& M0 O" W( a( Y& D6 r( h  
  Trigger: OnEndCollecting
" s1 E1 u9 [  v( O, s% h3 l" c  
  /Queue4/Box
9 \" k; t' \# f9 `  
  batchsize: 1.0
- O# L- e1 L( ?6 R; {. L9 N  
  5.303038
- e: {9 x, f9 P; x% z6 F* {  
  /Queue48 O$ j3 H6 n; Q1 H4 r4 R* T
  
  Trigger: Send To Port2 |7 g0 l, `- f* \$ v* O
  
  /Queue4/Box" P2 ]$ e) o$ R; e, a9 o
  
  
6 w# R) G& F5 b2 ^; l" C: {
1 o3 T  L  R7 n4 {& D  
  5.303038
3 x4 G$ G& }$ o" r$ T! R# M  
  /Queue4
; j- L* r0 Z+ O" M6 U4 @  
  Engine: Send Object) k6 K6 r( J; |* N( i& u  y" l
  
  /Queue4/Box
) X' @3 S/ W; }/ |  
  , ?( P: i" o! \# j& K" }* r+ V

1 B1 K$ I4 Y4 @% c. m' B( A7 g  
  5.303038
$ D* y. r: l0 ~+ l$ t. y; M& O. f  
  /Queue4" C. J5 \8 z# k& `
  
  Trigger: OnExit
. D4 D4 m  e) E9 I  
  /Queue4/Box
, \0 h! X& o8 z& q4 A  
  port: 1.0
5 @( e& ~$ `6 x7 A- X9 }8 M( j! c  
接收实体之后激发了进入触发,然后判断批次,获取发送端口,执行发送,最后离开暂存区。2 y7 V7 E+ G- m6 |2 {1 C
货架同样以接收临时实体开始:
* g# B" S% i7 B2 j. {
  Time
, f  o6 [/ R. l8 Y# ^/ \  
  Object
; U% Z; Z/ F3 H  r  @& _+ i  
  Event. n3 w& J3 e* H9 q! m
  
  Involved0 D* M# {6 A4 h' A2 E/ t0 V
  
  P1
) X" f8 z" W* O& u  
  5.3030389 q  j7 I0 n/ N/ A( _+ r
  
  /Rack4
9 o# k# Z2 S0 u2 P  
  Engine: Receive Object! b% X8 ^+ Z3 B( \2 R/ c2 p0 G
  
  /Rack4/Box$ w" l1 F7 ^: x- u
  
  
: l5 r: y4 k3 V' G( ?  q$ s* K) t
0 z: ]# [4 s: |* K  
  5.3030387 e/ Y; y' u  t+ w
  
  /Rack4' U! K0 k; Y9 ]  Q# _: M
  
  Trigger: Place in Bay
8 |+ s- d/ G0 \2 g3 A" p, n  
  /Rack4/Box
: O" g( _1 }! u4 o  
  * c' o6 j$ l. ]( @. a

  c0 o% {8 X9 ~. ]) i5 j1 B  
  5.3030381 ^5 W: I' f+ u: @; ]/ s$ l
  
  /Rack4
" _( W  C6 [; {2 S  {* R+ k  
  Trigger: Place in Level2 G# Y+ T, a% ~; `
  
  /Rack4/Box+ r- b% Q) u- m; P: T
  
  bay: 3.0- w! P$ r) F" {2 `5 R, U- C* ^
  
  5.303038
8 F+ r6 y9 j( R) o  
  /Rack4
. X) @) r$ X7 n+ u% I( v  
  Trigger: OnEntry( c1 |" w# u7 y
  
  /Rack4/Box
& Z+ C( d* E3 |5 E# a, t# p  
  port: 1.0
  R) E0 I( _/ j& ]  
  5.3030380 }  H/ _$ h( x/ K3 j) [+ U. q
  
  /Rack4
- A6 i+ p4 K* F6 x$ o4 n' M9 [" J  
  Trigger: Minimum Dwell Time9 L3 l, ^$ f; o3 [9 C& j: b
  
  /Rack4/Box9 |* N. r2 B) R1 ]; v, I. g
  
  port: 1.0$ x) V; D; [/ n0 Y4 U9 ^# ?; ?1 A
  
  5.303038
3 O) G3 _$ p0 J  
  /Rack4
. o" i: [5 t. S, c; v2 f  
  Engine: Timed Event
2 X- W) W) b7 v5 E  
  /Rack4/Box5 J/ I# J. T4 D3 [
  
  EVENT_PROCESSFINISH  a6 Z% t& V6 q& F! y
  
  5.303038
: \7 {2 J. T2 j) L! H$ o8 u  
  /Rack4/ x5 Z% O/ @' ]3 B0 W
  
  Trigger: OnEndDwellTime, ~5 u  A! W1 G% u' M
  
  /Rack4/Box
# I6 q- U) b: D$ Z7 y' B  
  6 N2 N6 |! H3 b" L* v
0 {( k* r* n5 z- v( T* Y( {
  
  5.3030387 ^( ^- l& O0 N
  
  /Rack43 v; S3 ~+ T! }2 G  N
  
  Trigger: Send To Port
- A2 ~2 y0 @) A! r: W, `& y6 q" B  
  /Rack4/Box/ m9 l0 K- M+ i% w) v7 H* K. g) B
  
  
7 F/ k- G5 I0 x2 h( s
5 E& y0 `# ?  h! j* d4 k  
接收临时实体之后依次判断应该放置在哪一列、哪一层,然后激发进入触发,临时实体进入货架之后需要获取其在货架最短停留时间,由于这里设置的最短停留时间是0,所以随即激发定时事件PROCESSFINISH(如果是停留结束会更合理、更便于理解),再激发“停留时间结束触发,最后获取发送端口。由于本例中并没有为货架指定下游端口,所以这里没有执行”Send Object“事件,也没有离开触发。/ \2 ^" M% {2 D
接下来的其他时间节点都是在重复着同样的事件和触发,直到货架被摆满。
" x# B9 O* Z; V, ~9 P通过Event Log工具,我们可以详细的分析每一个实体的工作机制。比如可以分析推式策略、拉式策略的不同,比如可以调用运输工具,添加任务序列,来分析任务的优先级别、先占级别的处理机制等等。8 N4 ?% W( m0 F! Q/ y

; O, E: }( T/ c4 }! j' Q

; K- ^% N9 j0 S0 m7 L8 V) s+ `1 J. f- B! x+ G! Z. c+ a

本帖子中包含更多资源

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

x
2#
1010265352 发表于 2015-9-23 14:04:53 | 只看该作者
学习啦
3#
FFFrenk 发表于 2015-9-24 12:04:12 | 只看该作者
感谢分享event log的使用方法!讲得很详细!
+ e! g: o5 b3 j* R* b. g- c2 @
9 [6 ^, M2 W9 j, @* j
. K* ~" t8 H# M9 e8 b0 Q, p文中出现其了一处与我理解不同的地方,我贴上来,一起讨论讨论~
  c8 C" R0 a* H. a# v5 V
; K. s; n# J( g6 K; h' O“重置的顺序并不是按照模型逻辑,而是按照实体创建的顺序。”
  v& L) a* l, k3 ]& Y, S并不是实体创建的顺序,flexsim中并没有一个节点存放实体创建的时候(临时实体有)。
" y. E# }9 r( J这是因为,先拉到模型中的实体的rank靠前。但是,rank是可以修改的,后拉进来的实体的rank可以调整到靠前,on reset触发就更加靠前咯。也就是是实现了“后进来的实体先触发重置触发”。
4#
慧娴亚伦 发表于 2015-9-24 21:03:39 | 只看该作者
非常好的学习材料!感谢分享!事件日志帮助我们更好地理解flexsim的运作机制,也能够帮助我们更快找到模型建立过程中遇到问题的解决办法。
5#
shiningcz 发表于 2015-9-25 10:49:13 | 只看该作者
感谢,以前自己看得一头雾水,现在明白多了
6#
shiningcz 发表于 2015-9-25 10:53:54 | 只看该作者
另外请教一下“拉入”策略时,上下游实体的触发顺序,“拉入”成功与否,触发器执行的次序是什么样的
7#
慧娴亚伦 发表于 2015-9-25 15:27:41 | 只看该作者
您可以按照加老师的方法,用eventlog来实验一下,实验出真知。
8#
657776724 发表于 2015-9-26 18:00:20 | 只看该作者
我也说一点:
8 k6 P( f- L, ~0 ~在事件日志中,涉及的实体一般都是box,这样我们很难区分到底是哪一个触发的,如果需要,我们可以对产生的临时实体进行重命名,编号处理,这样就可以知道就哪一个临时实触发了什么。
9#
manaijin 发表于 2016-4-12 11:04:30 | 只看该作者
对软件的运行机制学习很重要。
10#
慧娴亚伦 发表于 2016-4-13 09:32:49 | 只看该作者
我也说一点:9 O  h- |( V- c$ X& ~" A" ]2 o
在事件日志中,涉及的实体一般都是box,这样我们很难区分到底是哪一个触发的,如果需要,我们可以对产生的临时实体进行重命名,编号处理,这样就可以知道就哪一个临时实触发了什么。* U3 p8 c( b9 R5 P% ?) T  W
657776724 发表于 2015-9-26 18:00
0 F4 F2 D5 i. _* n% _. q
! G& {6 \, O0 _# D( [6 U6 X* E
一个好消息:最新的2016版本已经自动区分在不同实体上面不同rank的实体了,这样就使得debug的过程更加简单方便快速~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|全球FlexSim系统仿真中文论坛 ( 京ICP备14043114号-2 )

GMT+8, 2025-6-28 06:46 , Processed in 0.089093 second(s), 14 queries .

Powered by Discuz! X3.3© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表