全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2015-9-23 13:53:11 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 zorsite 于 2015-9-23 16:05 编辑 5 w" _2 G& P& w  ?- o5 ~9 R. Z2 ^
2 w6 ^: P$ N; \& ^# g0 d
以货架随机摆放临时实体为例学习Flexsim事件及触发机制
6 ], ^# x7 E$ J; k
很多初学者都对flexsim的事件及触发不太理解,到底先执行什么后执行什么,先触发什么后触发什么?用户手册中也没有相关的说明。如何才能把这件事情弄明白?其实并没有想象中那么难,只要稍稍花一点时间,你就能彻底掌握其中的奥妙。
* b# ~2 g# r: F接下来我们以货架随机摆放临时实体为例,来看一下在flexsim中,各种事件、触发的发生顺序。/ K9 n4 |" O" j2 `& ^& m7 W- O
flexsim中依次拖入货架、发生器、暂存区,软件会将这三个实体自动命名为Rack2Source3Queue4(请注意这三个实体的拖入顺序)。依次A连接发生器、暂存区、货架。双击打开货架属性,勾选“Floor Storage”,设置最大库存为50,设置列和行随机摆放,每个货位内最大摆放量为1,设置货架为510行。6 S0 x0 j1 g# d3 b% Q  c1 V( n
         % k4 i0 ?1 _% M/ x5 D2 M) w
$ w- I  f, D) \. E
重置视图,最终效果图如下所示:. B+ ~& Z0 P' T! I" Z, Y

2 W/ j% |) D; f) hdebug菜单中选择EventLog,打开Event Log窗口。0 i% R  Q# C! Y3 j4 }

$ N& L8 V7 [% }. C/ V点击settings按钮,我们可以看到flexsim可以记录的事件类型和事件列表。0 m: \* G" `, j! A9 |0 @
& n% d0 P4 d1 _; {& I
Flexsim把事件分为了四大类:EngineTriggerTaskSequenceBeginTask
  Q2 e' ], {( }. {. b
, u+ n: L. S+ I6 ~引擎事件包括了创建实体、摧毁实体,打开输入/输出端口,接收实体,发送实体,发送消息,定时事件。
$ s% _/ N9 C9 F6 `& X2 k+ |' T
. Y% r9 ^9 E. }( h触发事件就多了,我们在实体属性的触发选项卡中见到各种触发都可以在这里找到,还有属性窗口中的一些设置项也可以视为触发。比如发生器的到达时间间隔,处理器的“预置时间”等,flexsim也将其归类为触发事件。
% q9 |( p4 f. S: W! y) f6 t5 U# ?" L8 {( Z- A7 H0 i
TaskSequenceBeginTask其实都属于任务事件,flexsim将其细化,分为两类。
5 k* C/ h* K2 P5 f+ [" Z3 R任务序列事件只包括开始任务序列、结束任务序列、接收任务序列。
, L" E8 b2 x" K) [& `
- t2 ]; t2 z; w0 p! i, R% f开始任务事件则是任务序列的具体过程,比如装载、行走,卸载、中断、移动实体等。
0 v# e2 E* \8 I0 ?( g1 a$ e
( {4 o: x, t  uEvent Log窗口勾选”EnabelLogging”,运行模型一段时间后,点击”Export”,将事件日志导出保存。也可以自己指定运行的时间段,比如设置Start Time0End Time153 W1 ?1 d: ?$ k2 |8 h# b- D
打开保存的日志文件,就可以看到flexsim模型在运行过程中各种事件、触发的顺序。
6 A1 X) ~" Q" C$ g8 R+ Z( i# Z; V, `* G$ N1 l( v$ n6 y/ ?/ ]
先看一下0时刻模型发生了什么:& `  \9 w" q  p7 I, H
  Time4 A  u- z# U( b. |4 P9 o+ \
  
  Object+ S  m0 }! n9 Q7 X7 i+ g7 r( O: P
  
  Event
* M; J8 }+ a: F  
  06 a  l1 t5 ~9 {& c0 ]
  
  /FlexsimModelFloor" u& d( g6 N( v+ }) x9 N
  
  Trigger: OnReset2 B) n5 ]1 k+ J( J5 K6 O" @
  
  0
* _+ M; l. Q! n( X) w1 f2 c  
  /Rack48 U) o0 S" ?; l$ q
  
  Trigger: OnReset
4 e# g  m; P- s9 _  
  0
. y  Y  d' Y4 H" g" J  
  /Source36 m. j2 {9 S3 r  D; \& H$ v
  
  Trigger: OnReset
4 V7 R7 d2 g% m  
  0+ Y+ z" V8 f: Q6 j  f) ]
  
  /Source34 k2 h( ?) {' P4 o" F# B+ A
  
  Trigger: Inter-Arrival Time
- l1 E* i7 j8 E  
  0
& g, e, m' ?: C( j: Y  
  /Queue4
6 F) K9 e! d4 z! t$ G. D+ }  
  Trigger: OnReset
, n+ t; x1 G: g  P/ h  
0秒的时候各种实体会激发OnReset触发。本例中依次激发了FlexsimModelFloorRack2Source3Queue4的重置,重置的顺序并不是按照模型逻辑,而是按照实体创建的顺序。在创建模型的时候我们最先拖入的实体是货架,所以货架在发生器和暂存区之前被重置。而在货架之前,flexsim自动创建了ModelFloor实体,所以货架的命名是从2开始的。这一点可以打开树结构验证。
# {2 g0 T; e, K0 O! g5 E, P( A! @6 l- n
在发生器被重置之后,马上触发的到达时间间隔触发,这是为了决定什么时间创建第一个临时实体。! ^# l) T' u& |6 A6 ^
5.303038时刻,发生器创建了第一个临时实体,并由此引发了接下来的一系列事件和触发:) v# {. y1 Y* c) H6 H! w4 T" X
  Time
5 d$ }$ V8 B: V3 [  
  Object
" L* h. F: O: F0 W: `" ^) s8 e  
  Event$ \* l4 B! D, O9 b
  
  Involved
6 ?# r% S9 p) M+ \, S" V' k, Z  
  P1( P& ~; k+ Q) B! ?# F& j
  
  5.303038
6 g/ }8 v$ D' g4 H$ e6 N  
  /Source3; B* v6 S$ @6 I7 H" J# }( D
  
  Engine: Timed Event
0 F" O! g! S8 L+ I7 W, h1 Q  
  /Source3
/ h* }2 Y' O$ _! ]  
  EVENT_CREATEPART6 o8 D) \. J2 k2 g; j
  
  5.303038
: h% m# t- `3 N/ ?+ z7 S5 v* N  
  /Source31 N3 a" ]4 `  C
  
  Trigger: OnCreation
" h- |- ~# X5 x  
  /Source3/Box* ^4 s; S$ R( ^- J) w& @, d/ p
  
  rownum: 0.0$ @0 C& ]$ d: e
  
  5.303038" V1 v) y2 E9 _' }, @4 g% }. r% v
  
  /Source3
; \$ y' F& b) G* g  
  Trigger: Send To Port
+ y. V. B! n0 r3 ~# e  
  /Source3/Box* X5 s/ ^& x# d' D  ^  s
  
  , W4 Y4 _& @& }; ~; G7 Y5 ?
" u/ D5 [5 i3 e/ u- Z
  
  5.3030389 J- V( V9 B1 `3 N
  
  /Source3
/ d! W1 {- L5 B  
  Engine: Send Object; b% @* L+ b; r. t7 v
  
  /Source3/Box/ U( J1 }; s) s8 Y% i- o
  
  
, G2 w# ], A) D
9 Y3 x4 ]1 N/ B) A) y  
  5.303038+ {6 @+ h/ V$ V: A) W! ]
  
  /Source3, g9 d4 z4 X5 n; P# u2 G% t
  
  Trigger: Inter-Arrival Time
8 D8 W7 \! q: N  ]  I0 [  
  / Q5 t7 X2 D" o$ a' e+ B

: M9 h3 Q# E+ e" D( F! b0 \% Q0 ]  
  ; `" o8 ~2 U" N" U9 D* T0 J& ~( m
& k7 e1 B" I; S) v$ b4 X
  
  5.303038
1 {3 ?# X9 V4 W$ |  y( v  
  /Source3# z. d2 O) e! ~* T- z5 y1 y
  
  Trigger: OnExit8 {3 Q/ M  R( J+ z3 w2 q$ c6 w' O
  
  /Source3/Box
8 i- D) Q1 `' [3 A7 m2 x: `  
  port: 1.0
' |& B: }6 v/ }& R  
当临时实体被创建时,首先执行的是定时事件:CREATEPART,然后才激发创建触发,临时实体被创建后,还要决定其从哪一个端口发送,然后执行发送,临时实体离开发生器。而在临时实体离开之前,发生器还激发了到达时间间隔触发。  N2 N6 C- E3 ?7 l6 K9 R0 N0 o
本例中的每个实体都是以Engine事件开始,要么创建,要么接收。暂存区正是以接收实体事件开始:, f- a' \$ `& Z# T, [( S
Time
' V" a: W& @5 v- L, e% P" O# T  
  Object
1 r" ]; b0 m1 w* w4 F' e& C  
  Event  l7 v0 i5 j. Z+ G5 A
  
  Involved
$ m3 ^2 O( t# f( M  
  P1
3 z1 Z  {. R& ?  
  5.303038  W+ ?/ `# G- j( h! o  [
  
  /Queue4' j0 m# [9 x0 |3 A
  
  Engine: Receive Object& S' ^/ c. G6 m) p, w5 J; F
  
  /Queue4/Box3 G- X6 \; x; ?% |) Y6 M$ M7 K; K1 p
  
  
# T9 s. h6 m8 r' w9 y4 U2 ]) o+ z  W# @1 [
  
  5.3030383 O8 h; x; I  B5 }! p
  
  /Queue4
* i, t: n: ^0 X+ I* M( ?" h: i  
  Trigger: OnEntry
" q/ N( d8 J7 D0 f' i  
  /Queue4/Box
4 n( w+ M5 d; E' d* l" f  
  port: 1.0  o; T( G. x. ^' l7 k7 k6 w4 k
  
  5.303038
/ g  i/ f8 g6 w, I1 c! F  
  /Queue4; ~) t6 F0 q0 o, I5 n2 e' g
  
  Trigger: OnEndCollecting+ l9 E0 l- ^3 f3 R( l! i! P
  
  /Queue4/Box
( b$ k( M( G  ?* e$ J6 j. h  
  batchsize: 1.0
1 [3 _3 p3 q/ }* G$ _  
  5.303038
5 C6 G2 e/ }( b$ g  ~6 R6 j" H  
  /Queue4, k! A: p9 v# d
  
  Trigger: Send To Port8 v1 a" I. c5 Z, l
  
  /Queue4/Box
' R! e( v0 M% T$ y% S4 N  
  
3 R6 @  D2 u7 Y5 e; M: g+ B0 g, _
  
  5.303038% k2 Y- j; Q! a, W) J
  
  /Queue4
8 U9 e7 r6 g0 ^, O, U! s; }  
  Engine: Send Object
! {8 _! V1 f% Z7 y# B  
  /Queue4/Box
* r  \/ ^% @/ l  
  
% c: M: T4 Z) n
7 G  E1 `0 J* K  a0 P  
  5.3030380 `& x' N7 R9 A% {# @
  
  /Queue4
0 e2 a+ r' k4 A  
  Trigger: OnExit
' D. [* R2 V7 t* c: E# U/ S  
  /Queue4/Box
. [$ Z1 \/ I4 Q  
  port: 1.0
+ t6 Y/ D) U5 d/ Q* r  
接收实体之后激发了进入触发,然后判断批次,获取发送端口,执行发送,最后离开暂存区。1 \/ B! E$ |5 e( C
货架同样以接收临时实体开始:
$ E. P- o) l. @
  Time  ?+ p" P/ |+ |/ E. [6 c' p6 I3 J4 K' a
  
  Object, G' @" `4 B  Z7 l5 j. J0 f" W
  
  Event
2 D3 w, D1 H$ s( R  
  Involved
8 T  s* o" `9 F' G" y/ t! s! H  
  P1
. k8 B7 q+ v- U1 ]/ d, C  
  5.303038
; \3 y$ J3 w; O# q0 N$ L  
  /Rack4( \& ~% u; G. Z  P, k( E$ g
  
  Engine: Receive Object3 C* k; D; t7 a* R1 ?- i
  
  /Rack4/Box
& W/ V  @2 {- R  I$ \$ K- i$ y5 ]  
  
) m5 m; H0 n0 F' o4 j
+ R- v+ [* H: O3 H8 Z6 D  
  5.303038; X! G, `* Z6 N' H
  
  /Rack4
0 u8 t- e. d6 v! _/ X6 w  
  Trigger: Place in Bay
$ j; ?( v: R$ I% T, G& k0 {# |  
  /Rack4/Box" E! i" o3 F$ v
  
  ( {! P1 ~3 k; G) j2 @
* J6 \3 W* J# a7 r1 A/ ?
  
  5.303038
, l5 M6 J5 P: H/ K3 P1 A: M  
  /Rack4
$ y8 b- ~  w% Y  
  Trigger: Place in Level
. |$ p6 ?/ f2 s2 W  
  /Rack4/Box
7 X  n, H2 X' ^6 {  _  
  bay: 3.0
- l) b% _3 C! @6 m0 o6 b# y  
  5.303038
# u9 T. E- F- ]! A  
  /Rack4% l' C  y8 T0 E4 u
  
  Trigger: OnEntry9 |# u$ S& f6 i/ N8 c
  
  /Rack4/Box) }( Z  O+ l# s2 ]7 X4 M! ^
  
  port: 1.0) ]; y8 i0 d" H
  
  5.303038. Z, R# [  [+ k5 M- u0 N5 Y7 t
  
  /Rack4& z9 k7 G) Y, r
  
  Trigger: Minimum Dwell Time
# {- @! t6 i' c. h3 Y" x  
  /Rack4/Box
* G, e2 S1 d( C& M6 B8 @  
  port: 1.0
# I8 v" i" O" ~" {& ~% A. e, W  
  5.303038; O. c) s) K# ^& k" Y" r
  
  /Rack4) |- J/ I5 u- Z
  
  Engine: Timed Event9 |" h1 @3 Z5 G, X$ h9 q$ d
  
  /Rack4/Box
$ V) `; a7 d+ [% i2 o' U2 g: S/ ~- }  
  EVENT_PROCESSFINISH
) j. Y5 ]: ~/ u+ l* ~2 C! E  
  5.303038: |& M# \- j. ^6 M( _
  
  /Rack4
( H9 E2 ]: s3 W3 Z- W  
  Trigger: OnEndDwellTime
# v* X3 S& Q( x9 v  
  /Rack4/Box* S' o4 ?- E2 B, n# n
  
  
1 A9 Y& f9 J. h' ~3 d
4 s3 w9 n7 F0 V7 X9 a  z  
  5.3030383 q% p! ^" r6 d: n; Z5 Q7 f
  
  /Rack44 h4 x' J9 t  e; D0 T- a1 {  F. Z
  
  Trigger: Send To Port
3 o% k3 i) n6 }+ U' d  
  /Rack4/Box
* g/ V& k- k8 }& ^0 d) r: I  
  
+ j! Z' I8 {) X, m4 B( s3 l
, q( J" s% j$ x  q' ^% G' q  
接收临时实体之后依次判断应该放置在哪一列、哪一层,然后激发进入触发,临时实体进入货架之后需要获取其在货架最短停留时间,由于这里设置的最短停留时间是0,所以随即激发定时事件PROCESSFINISH(如果是停留结束会更合理、更便于理解),再激发“停留时间结束触发,最后获取发送端口。由于本例中并没有为货架指定下游端口,所以这里没有执行”Send Object“事件,也没有离开触发。. R- t3 C" \3 f) q5 N
接下来的其他时间节点都是在重复着同样的事件和触发,直到货架被摆满。& V6 E/ a- L4 _0 T9 p: F* M! T: \
通过Event Log工具,我们可以详细的分析每一个实体的工作机制。比如可以分析推式策略、拉式策略的不同,比如可以调用运输工具,添加任务序列,来分析任务的优先级别、先占级别的处理机制等等。" N& f% x+ }  b% j7 d

: v, ^& H- B, L6 N
  u0 l' G, U  Q+ s5 I

. }8 Y. U' K* r. H) f) U

本帖子中包含更多资源

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

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 | 只看该作者
我也说一点:, v0 k0 U( z; s
在事件日志中,涉及的实体一般都是box,这样我们很难区分到底是哪一个触发的,如果需要,我们可以对产生的临时实体进行重命名,编号处理,这样就可以知道就哪一个临时实触发了什么。$ J. V; s9 I1 Z2 I
657776724 发表于 2015-9-26 18:00
1 t# |' R% e- k: N0 ]
, O. n# b, X# |+ e& _# X
一个好消息:最新的2016版本已经自动区分在不同实体上面不同rank的实体了,这样就使得debug的过程更加简单方便快速~
9#
manaijin 发表于 2016-4-12 11:04:30 | 只看该作者
对软件的运行机制学习很重要。
8#
657776724 发表于 2015-9-26 18:00:20 | 只看该作者
我也说一点:& d6 M& Q& G9 L  B! Z- g
在事件日志中,涉及的实体一般都是box,这样我们很难区分到底是哪一个触发的,如果需要,我们可以对产生的临时实体进行重命名,编号处理,这样就可以知道就哪一个临时实触发了什么。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-28 08:11 , Processed in 0.086101 second(s), 16 queries .

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

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