全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2015-9-23 13:53:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2015-9-23 16:05 编辑 / w# D: D4 B8 }

1 W7 f# i' ^3 E
以货架随机摆放临时实体为例学习Flexsim事件及触发机制

$ }* Q) i" q9 S" r很多初学者都对flexsim的事件及触发不太理解,到底先执行什么后执行什么,先触发什么后触发什么?用户手册中也没有相关的说明。如何才能把这件事情弄明白?其实并没有想象中那么难,只要稍稍花一点时间,你就能彻底掌握其中的奥妙。
* |; v2 B  {' C4 P; r* F; Q1 ?接下来我们以货架随机摆放临时实体为例,来看一下在flexsim中,各种事件、触发的发生顺序。9 j8 R/ F* P* b% W1 m( L* P. Z1 o; D
flexsim中依次拖入货架、发生器、暂存区,软件会将这三个实体自动命名为Rack2Source3Queue4(请注意这三个实体的拖入顺序)。依次A连接发生器、暂存区、货架。双击打开货架属性,勾选“Floor Storage”,设置最大库存为50,设置列和行随机摆放,每个货位内最大摆放量为1,设置货架为510行。; B/ L) }# P, B, \8 H
         
0 z" y: u, ]6 {! r, T1 @- L; e% P2 `
重置视图,最终效果图如下所示:' i0 P, ?1 P( u4 _& d

, Y2 d, v3 T! g3 E$ h0 A9 udebug菜单中选择EventLog,打开Event Log窗口。
: Q' u, N( D# j0 w6 v6 K6 S7 d: |* Q' K1 d: L5 D5 Z2 v/ J
点击settings按钮,我们可以看到flexsim可以记录的事件类型和事件列表。. U$ v# B3 a: X5 q  d, x6 E% X. U

2 E5 f& J! [+ N( @1 p: a4 U* Z% wFlexsim把事件分为了四大类:EngineTriggerTaskSequenceBeginTask
$ w* m0 ~1 e  K2 {% E5 n7 v. O- l- J% v$ B2 L& @
引擎事件包括了创建实体、摧毁实体,打开输入/输出端口,接收实体,发送实体,发送消息,定时事件。
" k( D0 L9 Y. A3 ^; x6 z) i6 D6 Y9 A) l
触发事件就多了,我们在实体属性的触发选项卡中见到各种触发都可以在这里找到,还有属性窗口中的一些设置项也可以视为触发。比如发生器的到达时间间隔,处理器的“预置时间”等,flexsim也将其归类为触发事件。
" {" H! \7 J  r/ ^& p# q: h4 }; y  G/ c$ O
TaskSequenceBeginTask其实都属于任务事件,flexsim将其细化,分为两类。
( ?3 ]* ]- Y; M/ _任务序列事件只包括开始任务序列、结束任务序列、接收任务序列。
- ~/ |& S7 J; q- D* f- k& R* h' B$ g/ K  C% z# |: F. g
开始任务事件则是任务序列的具体过程,比如装载、行走,卸载、中断、移动实体等。7 `, _7 M; [: k: G' l
' ?! U* G3 R8 b' _4 O. e
Event Log窗口勾选”EnabelLogging”,运行模型一段时间后,点击”Export”,将事件日志导出保存。也可以自己指定运行的时间段,比如设置Start Time0End Time15" ^8 d# v1 H) z
打开保存的日志文件,就可以看到flexsim模型在运行过程中各种事件、触发的顺序。
0 W$ s5 L( V9 {4 _: V- g" m3 i6 K6 g) q- ?% s, {
先看一下0时刻模型发生了什么:; ^& O; x, m- p4 x* n- V& |
  Time! _0 O; ]' {9 W2 ]7 d
  
  Object0 {6 F5 F" q1 v! }4 O
  
  Event
9 _( Z+ W# u7 C& \1 e  
  08 _" ~" o4 d3 M; [
  
  /FlexsimModelFloor
5 A5 E+ J9 y/ h$ L3 [; k- ~4 j  
  Trigger: OnReset
+ c, D% |5 v$ v0 I/ j  
  0- W4 z" x1 l  J5 X* H
  
  /Rack4
1 y4 n! b8 }* `. {2 G8 s1 J  u  
  Trigger: OnReset6 B  g' ^( [) r" D1 s7 U, s6 X
  
  0
5 e+ o- ^' R1 |% |" E; e  
  /Source3
$ b" w- b  w2 a: X- m: z( E4 `  
  Trigger: OnReset
' _- V+ b( }2 s) d, j- s# p5 ^  
  0
; ^+ w& r( z- \" v: z! L* r  
  /Source3* }" P1 H& D3 n0 e0 O5 q' ~
  
  Trigger: Inter-Arrival Time1 n) \# ]5 |) V4 m
  
  0! e. M) T( j0 K' g$ B9 C4 [: g1 [
  
  /Queue42 c2 k7 R2 G8 Z, A- U9 p$ Q5 T
  
  Trigger: OnReset
! A: S& P  }" J7 B5 U. A  
0秒的时候各种实体会激发OnReset触发。本例中依次激发了FlexsimModelFloorRack2Source3Queue4的重置,重置的顺序并不是按照模型逻辑,而是按照实体创建的顺序。在创建模型的时候我们最先拖入的实体是货架,所以货架在发生器和暂存区之前被重置。而在货架之前,flexsim自动创建了ModelFloor实体,所以货架的命名是从2开始的。这一点可以打开树结构验证。
1 l' K' J" r, q& ^3 M
. ]7 h8 `8 q& u; g' Q+ b; j# _- v在发生器被重置之后,马上触发的到达时间间隔触发,这是为了决定什么时间创建第一个临时实体。
: w: J# T$ ~& e5 ^& O5.303038时刻,发生器创建了第一个临时实体,并由此引发了接下来的一系列事件和触发:& U7 m& b1 E5 }1 a6 p
  Time* `. x9 K2 o7 W* ~) j! p6 o! M
  
  Object$ m% O2 r) T% b8 ]# m
  
  Event
6 ^  F4 l0 ~( f' R; A5 Y  
  Involved3 s- ^5 G' P% H
  
  P1! f% o' s0 J6 ]+ [+ t
  
  5.303038) z; z% Q5 U7 s5 V9 K7 a) ^- _2 I
  
  /Source3" ^8 `3 G6 P! q4 D1 f
  
  Engine: Timed Event$ i5 G3 [1 s$ d+ m3 v0 ^
  
  /Source3+ \1 |# Y+ G( O9 ]
  
  EVENT_CREATEPART) f1 X" _6 K+ m
  
  5.303038
5 S0 e7 a  C' |  
  /Source3
6 C( N/ _& Z; t% E5 @  V  
  Trigger: OnCreation: f& z: @) O0 n4 ~  f2 Y9 S5 i
  
  /Source3/Box: l0 `* c  [" {+ x3 b
  
  rownum: 0.0
4 J$ }1 z7 D  f( l1 ~  
  5.303038. W# J  _4 y  Y! ?
  
  /Source3
' E* l4 E) @% @  
  Trigger: Send To Port# |# z; K% E( h6 _" i% d
  
  /Source3/Box# N/ e* e4 I$ k! V# D; h$ Q
  
    t8 g( {6 J: J6 K% X

* t1 r; a# A, {3 H  
  5.3030380 k; d; `6 ?* x7 A/ G
  
  /Source30 [8 y4 |/ y0 j: ?
  
  Engine: Send Object; R0 e  U# W9 ]8 J6 ?  b9 C! l
  
  /Source3/Box
9 A  U: ~, m* H7 f* w  
  
, S6 v. v7 x: h1 _5 R0 p
4 C3 J2 b/ Z& X& S. J2 j  
  5.303038
9 [2 }9 V  x& F3 m8 @4 }  
  /Source3. C0 n0 A1 I6 Y" q$ n
  
  Trigger: Inter-Arrival Time+ g8 h5 D3 \, m# v5 p3 d
  
  
: X4 x4 s% H% M# q$ |" r1 C8 m
7 U3 m  R. }- E5 N0 a  
  
$ \' R8 ?4 h+ A* J
) }- F) @# G* ^% B; Q" N/ y  
  5.303038
9 `2 B2 b( N( k- Y- z5 b; x  
  /Source3% a- G: z% W% L7 i6 v1 P4 k
  
  Trigger: OnExit
& L6 P8 M: H8 Q4 O* ~  
  /Source3/Box
) m0 k" }# d% L1 W2 b6 Y  
  port: 1.0
3 H$ K: p  y1 W( ^2 I' ?  
当临时实体被创建时,首先执行的是定时事件:CREATEPART,然后才激发创建触发,临时实体被创建后,还要决定其从哪一个端口发送,然后执行发送,临时实体离开发生器。而在临时实体离开之前,发生器还激发了到达时间间隔触发。
/ C* U" n8 ?: i' B! ~8 R8 h% r本例中的每个实体都是以Engine事件开始,要么创建,要么接收。暂存区正是以接收实体事件开始:* }; b  X' B1 f/ W* @% E" f$ D
Time
- M! [, |: H/ r+ _9 T1 Y3 f# W  
  Object
6 p9 n( V* c+ @6 X4 o( P% B7 I# x  
  Event, n2 j3 I6 ^) d( I8 U  _# U1 {
  
  Involved( h$ n1 g/ Q7 g5 e9 k
  
  P1
* Z" Y% a" i9 @. m+ a. \  
  5.303038
2 x& O3 [: K5 K# _5 D7 L  
  /Queue4; G% Q, {' w4 |
  
  Engine: Receive Object* r$ G+ _1 ]- D
  
  /Queue4/Box5 e5 O+ s- ]) t; ]" x# s6 F* A; {/ B
  
  
% N3 s0 j* Q+ w9 ]& B- u  z$ b; ]9 P8 E! m( Y
  
  5.303038
* r+ h0 f. S# q7 a+ ^  
  /Queue46 Z3 c% L2 l& f* H4 C* [7 L; w
  
  Trigger: OnEntry  E8 g- C9 R, Y, W# [5 I
  
  /Queue4/Box$ L" D" Q1 b: M- z* h' x. L' d
  
  port: 1.0
- ^& @+ ?: |) z3 P6 S, Q- C$ h  
  5.303038
9 ?% S0 M2 c8 j8 c- Q( B7 ~8 u  
  /Queue4* m( O% [8 k' \$ q1 F
  
  Trigger: OnEndCollecting
+ C/ d- R  g2 `8 V% H, J% {  
  /Queue4/Box
, ^2 @3 a' i4 A/ D  
  batchsize: 1.0
- L" ^  }2 l# Y' `4 C" k; \4 d4 |  
  5.303038$ D' s* A" F- f0 D. ^! p
  
  /Queue4. k! c5 z. m  `# [7 ]1 q
  
  Trigger: Send To Port
; X. `6 U" [7 D1 P8 G* y! d& x0 p  
  /Queue4/Box) f, V) y7 ^6 ~3 Z% g4 ?
  
  ' y1 R. j6 q: T' p# G8 ]- N% {9 l

) {' h! }' k% a! [$ t  
  5.303038
' h7 Y3 \5 R* ~  
  /Queue4
5 ~  B: z# `+ t9 T9 {  J7 s7 ^  
  Engine: Send Object
0 B3 V, |# J9 }. T7 t& c0 V2 C  
  /Queue4/Box- d& z( V; ^! _
  
  ( r# ?; G& E( ?+ r1 b5 v
( `  m) f! V  m7 U' ]9 y
  
  5.303038
9 ~7 V( E6 x/ `$ q' a' ~- ~* R2 F  
  /Queue4
' G- t1 s) _1 D5 h8 j  
  Trigger: OnExit
2 M5 n; I; p# X  
  /Queue4/Box+ {0 a' r# p+ l. E( @
  
  port: 1.0$ Y* l- D5 D& j% ?% s- V: Y0 x
  
接收实体之后激发了进入触发,然后判断批次,获取发送端口,执行发送,最后离开暂存区。
* x& R6 f7 {9 r. F1 }% _9 T货架同样以接收临时实体开始:% D% ~1 d) |, y
  Time
! r- _1 W6 c1 ]) |9 j; [  
  Object# ]! e$ G: s8 Z. x
  
  Event
( m9 l5 o  h  K+ u$ U5 Q; h; D  
  Involved& P6 v: W1 U0 `9 B9 R5 c/ I& _
  
  P10 p3 t; x! f2 `) V% J
  
  5.303038
# L# _' O: @; e1 @) ]3 O  
  /Rack4' u2 k4 w; H: J0 T. `4 B) \) q4 w
  
  Engine: Receive Object
8 B' N: _- |7 J2 [- Q- J; B6 ~  
  /Rack4/Box/ {  j3 b6 L0 n3 b5 |2 e
  
  7 V# G) r0 }3 N( X
0 X3 }) @( Z5 l1 l) K# |$ F% c
  
  5.303038
4 q5 `0 [+ K3 [. g  o3 g, a  
  /Rack4
3 }- x+ F! m$ y; U9 t  r  
  Trigger: Place in Bay3 z8 e3 m/ A1 w7 c: D1 V. _3 }
  
  /Rack4/Box+ T) y5 s) O3 |6 a( `6 a
  
  
- P, a/ u+ W: Q- a/ x
) j4 M; S/ R0 }  
  5.303038
+ J( z  [# E3 t7 j" D6 {  
  /Rack4
+ H( }! D9 i' y6 s1 T9 x  
  Trigger: Place in Level% C1 `5 |3 g( c8 c. C
  
  /Rack4/Box! C) \$ K+ s! H4 z8 y2 G
  
  bay: 3.0, }! ?! [; H$ p2 C
  
  5.303038
+ M* q  z, o; h6 [9 s8 L  
  /Rack4# H( r; c( V* _
  
  Trigger: OnEntry
- ?$ I9 ^% ~9 q" J/ m+ _  
  /Rack4/Box9 {7 i: u' R- I
  
  port: 1.03 {) {2 w2 ~. n: Y1 s
  
  5.3030389 K7 l: ?9 b  h
  
  /Rack4! g% l# @) Q% D( c0 M
  
  Trigger: Minimum Dwell Time/ Z& e" g' u+ a; P/ w0 [. \
  
  /Rack4/Box
2 A# T9 ]* U- l7 H3 x* P. j  C  
  port: 1.0
- g/ E) H5 f5 R$ }. U  
  5.303038; `. N) Y0 W' a; X
  
  /Rack4
6 Q& P1 r% g- \+ s' ^* a6 U  
  Engine: Timed Event: F9 a1 y4 g3 b9 I
  
  /Rack4/Box; a9 K/ A+ N% q
  
  EVENT_PROCESSFINISH% E" e1 I& ~: `4 J
  
  5.303038; q, D. `" u  ^6 l! A8 U
  
  /Rack4! Q8 p% {1 c7 x+ N" g; M5 i/ h' x
  
  Trigger: OnEndDwellTime
& x8 \0 x$ X. _2 n' f; S  
  /Rack4/Box0 ]  P+ [3 \( s$ U9 S2 s
  
  
7 O- T$ S6 {  m% F6 |9 l% M, _% m9 b
  
  5.303038- n+ O: b! w! n8 H2 F+ o$ M+ T5 S
  
  /Rack4
' G9 d& @+ l  _* ~. S; t$ d  
  Trigger: Send To Port
9 o( T1 N  N: X2 d  
  /Rack4/Box* Q& z9 z& E: S* d2 ^( d4 A
  
  
4 `, P7 E  C9 [% a* D' r/ F7 t: D
  
接收临时实体之后依次判断应该放置在哪一列、哪一层,然后激发进入触发,临时实体进入货架之后需要获取其在货架最短停留时间,由于这里设置的最短停留时间是0,所以随即激发定时事件PROCESSFINISH(如果是停留结束会更合理、更便于理解),再激发“停留时间结束触发,最后获取发送端口。由于本例中并没有为货架指定下游端口,所以这里没有执行”Send Object“事件,也没有离开触发。8 p) k6 ]) Y$ `' U' ?4 ]
接下来的其他时间节点都是在重复着同样的事件和触发,直到货架被摆满。
4 _% p4 e% S2 U0 s/ w通过Event Log工具,我们可以详细的分析每一个实体的工作机制。比如可以分析推式策略、拉式策略的不同,比如可以调用运输工具,添加任务序列,来分析任务的优先级别、先占级别的处理机制等等。
2 A2 X/ d0 _' b# F" I
0 ^, e4 {, d: y8 b! p( @

- }% H+ ^' M4 y  x' C
' R* c2 `+ {" O& }8 |

本帖子中包含更多资源

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

x
2#
1010265352 发表于 2015-9-23 14:04:53 | 只看该作者
学习啦
3#
FFFrenk 发表于 2015-9-24 12:04:12 | 只看该作者
感谢分享event log的使用方法!讲得很详细!
$ c0 T: k9 T, X* d, x
/ y. g( R/ Z# n& d8 o( W$ E; q' o) M5 ^6 Q- V
文中出现其了一处与我理解不同的地方,我贴上来,一起讨论讨论~" h3 Z# R7 I. ^- O' @" ~' L

* i- \5 ~7 h- O* F' T“重置的顺序并不是按照模型逻辑,而是按照实体创建的顺序。”. Z; {. N( J" f
并不是实体创建的顺序,flexsim中并没有一个节点存放实体创建的时候(临时实体有)。$ Z5 f3 z* e4 X
这是因为,先拉到模型中的实体的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 | 只看该作者
我也说一点:  K! Q* D8 V; p4 B$ F
在事件日志中,涉及的实体一般都是box,这样我们很难区分到底是哪一个触发的,如果需要,我们可以对产生的临时实体进行重命名,编号处理,这样就可以知道就哪一个临时实触发了什么。
9#
manaijin 发表于 2016-4-12 11:04:30 | 只看该作者
对软件的运行机制学习很重要。
10#
慧娴亚伦 发表于 2016-4-13 09:32:49 | 只看该作者
我也说一点:
* F7 J. s7 d1 S) |5 t在事件日志中,涉及的实体一般都是box,这样我们很难区分到底是哪一个触发的,如果需要,我们可以对产生的临时实体进行重命名,编号处理,这样就可以知道就哪一个临时实触发了什么。. G) @" f/ l( _9 {2 T+ I; f
657776724 发表于 2015-9-26 18:00

+ T. t% R9 u6 N6 _: D
) [2 g% r6 E9 _2 [$ w一个好消息:最新的2016版本已经自动区分在不同实体上面不同rank的实体了,这样就使得debug的过程更加简单方便快速~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-5-7 01:32 , Processed in 0.076940 second(s), 14 queries .

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

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