全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2015-9-23 13:53:11 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 zorsite 于 2015-9-23 16:05 编辑 6 ?" X1 Z8 P) q! |6 b

8 n9 H7 Z5 b1 g) D+ [
以货架随机摆放临时实体为例学习Flexsim事件及触发机制
3 o" l4 d+ e+ y9 r! }2 J& p
很多初学者都对flexsim的事件及触发不太理解,到底先执行什么后执行什么,先触发什么后触发什么?用户手册中也没有相关的说明。如何才能把这件事情弄明白?其实并没有想象中那么难,只要稍稍花一点时间,你就能彻底掌握其中的奥妙。/ o4 Y8 Y4 N/ w" k% U' t/ M
接下来我们以货架随机摆放临时实体为例,来看一下在flexsim中,各种事件、触发的发生顺序。
* Q# P6 P1 R) s  X3 j8 iflexsim中依次拖入货架、发生器、暂存区,软件会将这三个实体自动命名为Rack2Source3Queue4(请注意这三个实体的拖入顺序)。依次A连接发生器、暂存区、货架。双击打开货架属性,勾选“Floor Storage”,设置最大库存为50,设置列和行随机摆放,每个货位内最大摆放量为1,设置货架为510行。9 u: I5 J8 v8 x/ w0 K8 \
         5 d% C6 E/ Q' }

, G- h" v& g$ t5 l重置视图,最终效果图如下所示:+ X1 _) U. c/ c; G. X' Q3 U1 ^3 M

: a+ j6 F3 q% x& R0 ^/ g8 Gdebug菜单中选择EventLog,打开Event Log窗口。% l/ p. l/ }' F9 p& M
5 R# \/ A. N( v2 T; ]3 e
点击settings按钮,我们可以看到flexsim可以记录的事件类型和事件列表。
; i) ^3 l+ E& W4 d) y/ G# l5 n/ Z2 s7 i7 l
Flexsim把事件分为了四大类:EngineTriggerTaskSequenceBeginTask
2 n% A" E; K1 V3 k, e
+ R/ y8 T. T- p* F) p6 C2 G. p& d引擎事件包括了创建实体、摧毁实体,打开输入/输出端口,接收实体,发送实体,发送消息,定时事件。2 I5 n  A! C) X4 b; T
( m2 q" a5 j) B0 q
触发事件就多了,我们在实体属性的触发选项卡中见到各种触发都可以在这里找到,还有属性窗口中的一些设置项也可以视为触发。比如发生器的到达时间间隔,处理器的“预置时间”等,flexsim也将其归类为触发事件。' I! ?8 r; a$ ^

% }5 }  K. ~- ?3 oTaskSequenceBeginTask其实都属于任务事件,flexsim将其细化,分为两类。  [$ g8 M$ j" C# H
任务序列事件只包括开始任务序列、结束任务序列、接收任务序列。
: b6 z0 B7 j( p; w4 [; C7 ~$ R
' A* t/ |: ~& v) v; c开始任务事件则是任务序列的具体过程,比如装载、行走,卸载、中断、移动实体等。
" S* o* r4 J! ~7 C+ w
) Y2 x2 ?' a/ J% ^; N: OEvent Log窗口勾选”EnabelLogging”,运行模型一段时间后,点击”Export”,将事件日志导出保存。也可以自己指定运行的时间段,比如设置Start Time0End Time15; w$ z4 @: q! N, N* \
打开保存的日志文件,就可以看到flexsim模型在运行过程中各种事件、触发的顺序。; Z  A) b  ~6 ]2 S# j6 i4 q

- q; [! P5 z' F先看一下0时刻模型发生了什么:
$ q( o2 P4 ?  ]5 k2 a8 L& v; h, e
  Time# C& b0 H8 }# g$ S, ]
  
  Object
& \# N4 j2 K& {  
  Event6 u  N" o$ s, _" r  }) m0 g
  
  0
6 T- p9 u* x. ?  ]3 Z  
  /FlexsimModelFloor- ^% o) Q+ I9 V0 V! t9 Y
  
  Trigger: OnReset2 [: D# p) Z3 `. h! c+ U
  
  0
5 v0 y, d( F: S2 L- i+ s  
  /Rack47 e9 p. l/ j# x  _+ G
  
  Trigger: OnReset
% V* p& d) q, z. G2 B  
  0
4 E9 N" F0 Z: e6 e# z* i  
  /Source3/ \$ E" x( L5 d0 c- M
  
  Trigger: OnReset
6 Y) p4 O9 v, v- x  
  0
3 E2 H1 y# u9 _: C& B( G  
  /Source3
- {, G# Z$ N9 l. Q' d! d& }" B  
  Trigger: Inter-Arrival Time
4 S% _5 O) ]' }  
  0' e$ ]! l% u+ s  Y5 ]
  
  /Queue4. A" b9 B% @; V3 q) K
  
  Trigger: OnReset
* H) F1 q' V. {& a1 t3 ^. d: k$ `  
0秒的时候各种实体会激发OnReset触发。本例中依次激发了FlexsimModelFloorRack2Source3Queue4的重置,重置的顺序并不是按照模型逻辑,而是按照实体创建的顺序。在创建模型的时候我们最先拖入的实体是货架,所以货架在发生器和暂存区之前被重置。而在货架之前,flexsim自动创建了ModelFloor实体,所以货架的命名是从2开始的。这一点可以打开树结构验证。% i$ ?$ i6 F6 r# [! c
; q, S" G1 @. F8 S8 G
在发生器被重置之后,马上触发的到达时间间隔触发,这是为了决定什么时间创建第一个临时实体。
/ P9 p& e. G2 M# D# N5 V% [5.303038时刻,发生器创建了第一个临时实体,并由此引发了接下来的一系列事件和触发:
7 J8 S, s* S/ ~- Q" H
  Time
0 I* V  |8 H4 K( t3 g9 P9 x  
  Object' m! @9 _. m1 v& M
  
  Event
- W. \" [8 x6 K7 k' B+ u2 B  
  Involved
, ^$ b. P; @, C& R# h: z  
  P1
3 n* K$ x1 I. w, w  
  5.303038, V' m0 Y2 b$ l% O! o. c
  
  /Source3' e$ p5 V! W) k- k# l% V
  
  Engine: Timed Event/ [% t6 Q9 c3 r' z
  
  /Source3
4 D! x7 ^; ~9 c5 q, P) t5 z  
  EVENT_CREATEPART
9 J, F& J& U  C. S$ n" h1 |% G$ e8 J% c  
  5.303038
1 M8 E4 ]* L0 J, B' n& X  
  /Source3
: Y/ U4 Q7 z+ J2 O+ t  |  
  Trigger: OnCreation. d5 ]# B* P  d/ G4 p% E0 H
  
  /Source3/Box' a- B0 ]7 r: o6 D5 ?0 d
  
  rownum: 0.09 I" S: {' t7 v5 p2 G/ p
  
  5.303038
. r5 n+ Q4 y* q) f5 {5 a6 V  
  /Source33 d3 ^& h5 y, l- B. r1 o" J
  
  Trigger: Send To Port: F7 T- u9 y( x% X$ U
  
  /Source3/Box
6 [" x/ C: V2 J! Q  
  
' n( j+ H3 x% j% W' Q" D. f( p7 ?5 B
- h; u. @' E' v9 G. A$ V# t9 n  
  5.303038, P+ I# O* W# u3 y
  
  /Source3
* J. f  d; u. E2 D  
  Engine: Send Object
4 ~. ~% D, b4 l/ G8 H# C  
  /Source3/Box1 C. D$ E: p$ b) ~( M3 I, U
  
  . Y/ s7 R, R; p. Y% J
3 @4 e, u7 v* s
  
  5.303038
. K4 _/ q% D  k/ G  
  /Source3
+ `2 z) e' t0 V  o0 f1 j" w  
  Trigger: Inter-Arrival Time: t/ b/ ?9 j) Q, P
  
  
& \2 i1 o0 x, I. n' T7 s1 _0 d7 b" _% d! F9 r
  
  5 u  n0 d' V/ E; U( U, x# P0 q
, S, ^9 A9 h0 g
  
  5.3030380 x$ p1 x+ y+ H- B/ `6 E
  
  /Source3$ C2 n# D) M8 E; b1 }
  
  Trigger: OnExit. x/ |6 m7 h7 t' H1 e8 i# ]0 n
  
  /Source3/Box. L! @7 w8 j, W8 |; J. j  ^% C# j* t
  
  port: 1.0( s6 N  o3 G: B2 v8 K
  
当临时实体被创建时,首先执行的是定时事件:CREATEPART,然后才激发创建触发,临时实体被创建后,还要决定其从哪一个端口发送,然后执行发送,临时实体离开发生器。而在临时实体离开之前,发生器还激发了到达时间间隔触发。
  ^" R. G. Z/ N: u: z4 ]本例中的每个实体都是以Engine事件开始,要么创建,要么接收。暂存区正是以接收实体事件开始:8 B& p( X! u8 ]$ w
Time) n1 T. ]6 t- }8 s, d
  
  Object
4 N& ]9 y4 h3 m) I( I- h: ?  
  Event3 `" f0 d* W+ y% j* s1 h7 }( \
  
  Involved; I) ^  g0 T* r% F$ k9 |
  
  P1" X5 S- q: p  W7 `
  
  5.303038& Q! T+ O# z$ {& K0 f9 W% Z
  
  /Queue4; V2 M4 E7 c( C2 g0 J2 d5 {; k8 O5 G
  
  Engine: Receive Object
. Z4 ]6 q  m2 Y% t, U  
  /Queue4/Box- Y4 c3 h1 k& r
  
  
  j* F5 g! c6 v* X5 W5 x( c
' \% C/ `) @( j0 B. Z0 }  
  5.3030385 |3 ~+ K* \( q# y7 n
  
  /Queue4. Y: T- q. d+ _9 ^2 {) J% Y9 b
  
  Trigger: OnEntry
$ N- H! u! I7 M7 R# K1 y9 X  
  /Queue4/Box# ?- U: F3 X: S; y; d" v
  
  port: 1.0( |* u; {; V, ~, `+ f9 u
  
  5.303038$ x' h/ J. r; u4 D
  
  /Queue4' j) ^6 |6 a" \8 D3 ]" O
  
  Trigger: OnEndCollecting1 @+ s+ P% m/ ~) T/ j2 Y: x; d
  
  /Queue4/Box. f/ @' y  }! N7 d9 C8 k8 o
  
  batchsize: 1.0
( `/ T6 \7 C+ Q1 L- \  
  5.303038
# G$ }- Y6 U5 m) d- l8 {0 R  
  /Queue4
* V/ X8 B# {' B/ W; }9 e, }  K$ C" ^  
  Trigger: Send To Port
! L) C3 {, B: j1 y# b  
  /Queue4/Box' x: d, p9 s5 x6 Y! R: }6 P6 y4 h0 m
  
  ( i3 c0 p" H3 E9 z6 b4 u3 `

  W/ l, G- i, H8 I) d- ]* N  
  5.303038
4 @/ |1 R, B, w& u2 X  }! [3 a' O  
  /Queue4. J% Y6 Y0 w3 N# E& R: ^
  
  Engine: Send Object
- S: f. B. N7 H1 w5 s$ k  M$ ?  
  /Queue4/Box0 i3 f% d- b. O4 N; W: o% o) D  L
  
  & R( ^! p; o, z% t. ~
  a% E4 |- {/ x' _% q2 W
  
  5.303038
  f/ ^4 h" W# U0 V8 G  
  /Queue4, S+ F. ?; O  H& p. J6 Y
  
  Trigger: OnExit& N" L9 @/ S6 U/ b% v
  
  /Queue4/Box. t2 I3 J3 d0 |0 Z0 o- Y9 S
  
  port: 1.0! K$ r3 ]1 `: B1 C" Q: H
  
接收实体之后激发了进入触发,然后判断批次,获取发送端口,执行发送,最后离开暂存区。: w" o) j/ ~( o, I
货架同样以接收临时实体开始:
" F! `/ b3 l% D( r& V5 T8 X
  Time
$ P0 o0 D' l5 t* c8 j  
  Object
# B, ?; q- k* B, x: y& U  
  Event
' c; t' x+ w1 \( p  Y; M3 E/ X( H5 L  
  Involved6 I& _8 _2 m3 x1 c4 t. _
  
  P1- T% ?3 ~5 t! d
  
  5.303038. ]9 A$ G9 o9 I% j" p2 k/ \$ r
  
  /Rack4
, F) X* I; \& J7 W! ^! A0 h  @/ ]% c  
  Engine: Receive Object/ h5 n8 x/ [) D  W
  
  /Rack4/Box9 y1 \+ y' Q# p8 k( S
  
  1 k- U& k: p! v/ ~
8 G; f# [( E; W. w
  
  5.303038
6 q( C/ X/ o' d; C. s+ K, J. g  
  /Rack4/ G% C( b4 E% y) t* x: C' i! ?
  
  Trigger: Place in Bay+ {# f7 z/ E" z
  
  /Rack4/Box2 k4 a& z$ u9 l0 K% _4 T7 {9 _5 r
  
  
7 g9 U3 [; Q+ J0 Y8 t
* e! m0 i1 `, ?# u- ^: k2 I# \9 t+ L  
  5.303038
- `' E4 Q: u- Q+ n& x  
  /Rack40 b6 r9 z2 @3 z5 D3 x* H$ I
  
  Trigger: Place in Level
1 ~, w. K. M. Z" P  
  /Rack4/Box
; C* ]" [6 j& v" g: ?) Z  
  bay: 3.0
2 b/ J4 x9 x& B- I5 m  F! {# b, Q  
  5.303038; |* i: q* g: k
  
  /Rack4
+ j, w$ E( d* q! g$ S, u" O% `0 a8 U  
  Trigger: OnEntry3 F& _7 ]( V; `5 r) ~& i" r4 n9 j
  
  /Rack4/Box
  b2 N* \1 q, `3 J9 K! J  
  port: 1.0, J: H2 v+ m. h) f
  
  5.303038) G1 h4 u6 _" W6 E
  
  /Rack4
. h4 c8 t2 ?, P6 i& S9 J  
  Trigger: Minimum Dwell Time! i7 v- l/ F- l' z. o- B% i* ]' D4 v
  
  /Rack4/Box
' [, o' M& B' B  ~# i  
  port: 1.0
- S& G/ l8 P$ q4 u+ p5 J, e. ]6 @, k  
  5.303038
5 _* y! g5 x8 D* A% V0 y1 j  
  /Rack4
6 r4 U5 s5 Y+ C0 `- Z9 m& c  p  
  Engine: Timed Event) A. Y& g/ L2 t% D5 Z$ s+ p- @$ U% x) Z
  
  /Rack4/Box! J( I* f# C7 z5 a$ b6 a. [" I
  
  EVENT_PROCESSFINISH
' Z) {, J9 E- F8 ~: e  
  5.303038
$ ]% j4 `: E# f2 [, D3 R  
  /Rack4* y- n) o0 l9 B; d( X' ?
  
  Trigger: OnEndDwellTime
. S0 S5 U' D, l) y. j  
  /Rack4/Box5 ^7 a9 K& b4 _5 t
  
  
* L+ `" f# N6 W3 m4 V7 X* j+ [* F6 [6 H. I' d# B  o
  
  5.303038
: H0 ], |+ W) a6 _* {8 b  
  /Rack4
" R( [" F# n) _+ F; j# y- ]  
  Trigger: Send To Port
0 n+ d7 I: y) Z6 L0 @  
  /Rack4/Box
7 z! k, x; v7 a# c# u" r2 a2 |  
  & j2 V5 ~3 Z5 Q
* u4 `# [$ q+ s' I0 t
  
接收临时实体之后依次判断应该放置在哪一列、哪一层,然后激发进入触发,临时实体进入货架之后需要获取其在货架最短停留时间,由于这里设置的最短停留时间是0,所以随即激发定时事件PROCESSFINISH(如果是停留结束会更合理、更便于理解),再激发“停留时间结束触发,最后获取发送端口。由于本例中并没有为货架指定下游端口,所以这里没有执行”Send Object“事件,也没有离开触发。
; T, ~7 N7 T  C& G+ P接下来的其他时间节点都是在重复着同样的事件和触发,直到货架被摆满。
+ \0 ]0 A) j( \4 X# G2 i通过Event Log工具,我们可以详细的分析每一个实体的工作机制。比如可以分析推式策略、拉式策略的不同,比如可以调用运输工具,添加任务序列,来分析任务的优先级别、先占级别的处理机制等等。& P1 ~7 W9 y" @' H7 r
, z$ F# `* v# \2 W; Z2 v
' u( y+ [) }- S; D. E1 x: i
, ^$ s- g9 `2 H4 X& ?) ~

本帖子中包含更多资源

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

x
15#
liuzhifan 发表于 2017-4-11 09:25:38 | 只看该作者
点赞,好好学习
14#
lulu-luka 发表于 2017-4-11 06:16:53 | 只看该作者
mark~先把Flexsim的运行机制搞清楚~磨刀不误砍柴工
13#
gree 发表于 2016-6-1 15:52:13 | 只看该作者
赞,借鉴学习了
12#
4a415007 发表于 2016-5-23 15:51:17 | 只看该作者
感謝
11#
木土 发表于 2016-5-16 21:23:21 | 只看该作者
学习了 谢谢
10#
慧娴亚伦 发表于 2016-4-13 09:32:49 | 只看该作者
我也说一点:! D. {8 a7 T8 p
在事件日志中,涉及的实体一般都是box,这样我们很难区分到底是哪一个触发的,如果需要,我们可以对产生的临时实体进行重命名,编号处理,这样就可以知道就哪一个临时实触发了什么。
- g/ h7 H6 G0 ?' _! e9 F657776724 发表于 2015-9-26 18:00

! U7 d) i: Q) e& t5 R1 Y4 I# F' h* ~8 B4 I# i  |# Y7 {
一个好消息:最新的2016版本已经自动区分在不同实体上面不同rank的实体了,这样就使得debug的过程更加简单方便快速~
9#
manaijin 发表于 2016-4-12 11:04:30 | 只看该作者
对软件的运行机制学习很重要。
8#
657776724 发表于 2015-9-26 18:00:20 | 只看该作者
我也说一点:
0 q9 j' s4 ]+ A: F, l在事件日志中,涉及的实体一般都是box,这样我们很难区分到底是哪一个触发的,如果需要,我们可以对产生的临时实体进行重命名,编号处理,这样就可以知道就哪一个临时实触发了什么。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-31 14:28 , Processed in 0.077772 second(s), 16 queries .

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

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