|
本帖最后由 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 i在flexsim中依次拖入货架、发生器、暂存区,软件会将这三个实体自动命名为Rack2、Source3、Queue4(请注意这三个实体的拖入顺序)。依次A连接发生器、暂存区、货架。双击打开货架属性,勾选“Floor Storage”,设置最大库存为50,设置列和行随机摆放,每个货位内最大摆放量为1,设置货架为5列10行。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 G在debug菜单中选择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把事件分为了四大类:Engine、Trigger、TaskSequence、BeginTask。
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 oTaskSequence和BeginTask其实都属于任务事件,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: O在Event Log窗口勾选”EnabelLogging”,运行模型一段时间后,点击”Export”,将事件日志导出保存。也可以自己指定运行的时间段,比如设置Start Time为0,End Time为15。; 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触发。本例中依次激发了FlexsimModelFloor、Rack2、Source3、Queue4的重置,重置的顺序并不是按照模型逻辑,而是按照实体创建的顺序。在创建模型的时候我们最先拖入的实体是货架,所以货架在发生器和暂存区之前被重置。而在货架之前,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
|