全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2015-9-23 13:53:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2015-9-23 16:05 编辑
5 g2 S! k5 _: A9 p) f( e/ c# R# Q: H5 X; r" N: W2 V
以货架随机摆放临时实体为例学习Flexsim事件及触发机制
. K. b  u. A( y8 \
很多初学者都对flexsim的事件及触发不太理解,到底先执行什么后执行什么,先触发什么后触发什么?用户手册中也没有相关的说明。如何才能把这件事情弄明白?其实并没有想象中那么难,只要稍稍花一点时间,你就能彻底掌握其中的奥妙。
; b6 M" I# Q1 j接下来我们以货架随机摆放临时实体为例,来看一下在flexsim中,各种事件、触发的发生顺序。$ v3 F9 }: V2 L& x- d( X
flexsim中依次拖入货架、发生器、暂存区,软件会将这三个实体自动命名为Rack2Source3Queue4(请注意这三个实体的拖入顺序)。依次A连接发生器、暂存区、货架。双击打开货架属性,勾选“Floor Storage”,设置最大库存为50,设置列和行随机摆放,每个货位内最大摆放量为1,设置货架为510行。
) C: a1 l+ w) n0 N5 n/ M         1 E; x0 v" f; R

: Y8 k* A2 R' I$ y重置视图,最终效果图如下所示:7 P1 ?- n) Q3 R

. U0 s1 L: [# o$ @. n# q) F' ldebug菜单中选择EventLog,打开Event Log窗口。- d# O/ b: G6 p
. w6 |* F5 b8 Q. K- X
点击settings按钮,我们可以看到flexsim可以记录的事件类型和事件列表。( v( q$ {& N# d. |! k0 j

9 P9 J4 O6 n, t9 nFlexsim把事件分为了四大类:EngineTriggerTaskSequenceBeginTask% Y9 D) w8 `) w
7 @" k' \- S* f! }# f
引擎事件包括了创建实体、摧毁实体,打开输入/输出端口,接收实体,发送实体,发送消息,定时事件。
4 m8 b) b0 Z( V( e+ }4 T, U# b- z7 T! B; |, f+ ^
触发事件就多了,我们在实体属性的触发选项卡中见到各种触发都可以在这里找到,还有属性窗口中的一些设置项也可以视为触发。比如发生器的到达时间间隔,处理器的“预置时间”等,flexsim也将其归类为触发事件。
! z3 v2 n0 A+ O4 P1 f6 q
/ N: @; S' D1 a* mTaskSequenceBeginTask其实都属于任务事件,flexsim将其细化,分为两类。
: N0 W7 C8 h* T! f任务序列事件只包括开始任务序列、结束任务序列、接收任务序列。/ i4 W- x9 r# E' B/ t3 _' g
/ H6 b5 e5 a; y6 k% J. N
开始任务事件则是任务序列的具体过程,比如装载、行走,卸载、中断、移动实体等。
8 D& q) p& }5 |* M. F3 f
' s3 K% {# o6 L% A4 B: x% zEvent Log窗口勾选”EnabelLogging”,运行模型一段时间后,点击”Export”,将事件日志导出保存。也可以自己指定运行的时间段,比如设置Start Time0End Time15. Q8 G6 \- f  \* `
打开保存的日志文件,就可以看到flexsim模型在运行过程中各种事件、触发的顺序。) U  l. c  Y0 q1 [
; U7 Y, D: V7 j& m
先看一下0时刻模型发生了什么:
2 L, W! ]# J: q
  Time+ w/ y; u. r/ }' \5 ?& N
  
  Object9 W6 v7 \' e3 \' S
  
  Event
) O! @- v$ Q' d: V  
  0: ~6 F9 v) X$ F# I! B; p/ N
  
  /FlexsimModelFloor+ T' t, g0 p9 @( Q( [
  
  Trigger: OnReset' d" h: o# x; l+ ~; X
  
  0
) o7 x9 m8 T% J0 h, G  
  /Rack4
, L+ ?0 w4 M  i) C; g6 J9 j( p  
  Trigger: OnReset+ u( |: E$ ~  U2 g4 N0 L& Z
  
  01 M* I+ j2 w% w7 ?- u; e1 N& w
  
  /Source3
) O& m* H, y+ |: `  
  Trigger: OnReset5 s/ m- h  H- E! X/ t3 \% z
  
  0: \3 I( p: m$ R* z7 C! {- K2 ]5 k" y# @7 d
  
  /Source3' @/ a  f8 y2 n: X% d# N8 F
  
  Trigger: Inter-Arrival Time# d! J% ~5 H1 S' q7 @" z
  
  04 g6 Y$ U8 r- t6 N9 X
  
  /Queue4
# |9 Q, C" a. H) M) A# F; O  
  Trigger: OnReset) U( S$ W: `% @$ Z( Q" P2 s
  
0秒的时候各种实体会激发OnReset触发。本例中依次激发了FlexsimModelFloorRack2Source3Queue4的重置,重置的顺序并不是按照模型逻辑,而是按照实体创建的顺序。在创建模型的时候我们最先拖入的实体是货架,所以货架在发生器和暂存区之前被重置。而在货架之前,flexsim自动创建了ModelFloor实体,所以货架的命名是从2开始的。这一点可以打开树结构验证。/ @7 R* l4 B" G: @( j' h6 R

1 O8 o5 ^% Y5 R' o+ Y9 N在发生器被重置之后,马上触发的到达时间间隔触发,这是为了决定什么时间创建第一个临时实体。1 \- l: c* I' l" {
5.303038时刻,发生器创建了第一个临时实体,并由此引发了接下来的一系列事件和触发:0 T# n& D! @% _
  Time, L" P( {  I1 ]- k1 {9 v! g
  
  Object
* ~; [8 D% [0 s" P  
  Event/ u3 U5 b8 L2 w  T7 D$ ~
  
  Involved1 u& L& B. B" O& m
  
  P16 o7 O! |4 O0 @3 S
  
  5.303038
/ J" C- s4 \* Q7 ?# m  
  /Source34 c  u& l3 \. b3 W, q# ^
  
  Engine: Timed Event
( d* o& s9 j: u  
  /Source3
: M9 @: s# ?/ ?: @  
  EVENT_CREATEPART$ W- @; D" S% z# g/ Z* k
  
  5.303038
# ^& Q$ ?' J% h  
  /Source3# I+ F* f3 v5 P% |! K
  
  Trigger: OnCreation3 M% m" i6 X5 K* F6 s( p" b
  
  /Source3/Box
3 R( s7 U% ^7 u+ W, A1 I  
  rownum: 0.0( d; {: p0 [; J/ M; {6 H+ l& A+ t6 B
  
  5.303038
! }6 L7 V9 Z& P& x3 h& ^$ K- h  
  /Source3% c! h7 c' x0 x1 \( r$ m
  
  Trigger: Send To Port
- k( D% L0 t- H! S  
  /Source3/Box
7 {$ L: |- W; Z2 t9 e  
  ; V- I/ K9 I" @. k. e# J* U
0 ^6 Q% x5 N! t) ?& a. j
  
  5.303038& F/ P2 c* D  n% Y
  
  /Source3
% R9 K7 A& i2 S/ n9 v  
  Engine: Send Object' |" f8 L3 Q7 J$ g
  
  /Source3/Box0 R+ k% l) A, B" @% e2 u
  
  1 }6 F7 j& p! @1 c/ D, o

9 U2 k) W. D" \, f' l# q  G1 A4 j5 ^: e. p  
  5.303038' v! i8 k2 R2 k0 b% @& N/ b
  
  /Source3
! @6 t1 m6 `' B, s9 i" \/ b  
  Trigger: Inter-Arrival Time. _2 H) g* _" s. h( t; R
  
  
/ B( _/ q, @0 R) ?1 F* N% p: ?$ w! M. o) o' Z' ^0 C1 I
  
  + [" W0 V& C5 ~( r5 w$ [

' _/ P: i3 d( f  n  
  5.3030384 ]2 w9 C. B. s8 }5 C
  
  /Source3
( s# L; R' y% Y. p5 @7 n8 r  
  Trigger: OnExit7 q! [0 i" r' |3 N1 s
  
  /Source3/Box* ?# {3 ?3 c6 h/ O$ j
  
  port: 1.0" T. v( i" h9 }
  
当临时实体被创建时,首先执行的是定时事件:CREATEPART,然后才激发创建触发,临时实体被创建后,还要决定其从哪一个端口发送,然后执行发送,临时实体离开发生器。而在临时实体离开之前,发生器还激发了到达时间间隔触发。
2 p. W: Q" ~9 n本例中的每个实体都是以Engine事件开始,要么创建,要么接收。暂存区正是以接收实体事件开始:
7 M  K1 c' E* A
Time
2 A7 P; X0 e( ~! @- |3 M  
  Object
* k1 a6 r! D4 |& S; W4 \; d  
  Event
: a1 c3 F4 N7 I3 V# d" K/ {4 O  
  Involved
$ k& b' w7 {9 e5 A3 q  
  P1
& _! n+ d/ G1 J4 p8 t- r9 a  
  5.303038
, N, z/ t% ]0 ^7 R5 {# [# i9 \2 x  
  /Queue4
' {9 a6 j! h7 z. Y' d1 b  
  Engine: Receive Object; O: s0 r7 y, A7 q1 }
  
  /Queue4/Box$ i* ?( r, A! Z5 y
  
  
0 G2 E4 z  X! x" f! [& B
3 E7 O, `6 H6 i/ p  
  5.303038) ?) O+ ?& m4 q9 J- j# c7 y+ q
  
  /Queue4
" B( f9 }4 _/ u# q" o4 v  
  Trigger: OnEntry" P) ~8 j% N( M
  
  /Queue4/Box! g" v& g3 [, y2 U( ?! S* w2 S+ |
  
  port: 1.0
' {/ C$ l8 z# ?0 o5 J) j8 W  
  5.3030387 c/ T7 }: i2 t
  
  /Queue4  _6 Z' d2 R, H$ Q! d7 C
  
  Trigger: OnEndCollecting
# g$ |; j, x8 h  
  /Queue4/Box
$ n6 T5 ]( F$ l  e. f6 ?( W+ ~7 J  
  batchsize: 1.06 R/ Q0 Y( R3 s' z! P( F5 S! `
  
  5.303038
/ I& w( F9 O) t7 `' V. G  
  /Queue4
% x5 u7 X5 }5 a3 S  
  Trigger: Send To Port" `  A6 L5 f; ]& b$ K
  
  /Queue4/Box' |6 i( s& F( o
  
  
7 o+ E0 q& A# c6 w6 E, t
6 K+ O! t4 P5 H. C) y  
  5.303038
( r! F& R) X' X% `! p  
  /Queue4/ d+ {* T; d9 d- Y. W, g7 A& S
  
  Engine: Send Object# p+ S* z% ~: U' T9 d1 ^: a
  
  /Queue4/Box! u0 l, M# B" s4 B
  
  $ K' O$ m7 g4 g( r
0 R+ M& O4 a2 U) _8 `" ?
  
  5.303038& z0 a( [. V; G" R% p0 k
  
  /Queue4- t6 m3 h0 u) H  |
  
  Trigger: OnExit
) g+ E$ Y# ]! o7 M. v: t8 D  
  /Queue4/Box
. v8 Y" [) O0 g" K+ x; H% c  
  port: 1.0( e% l$ S& j  m6 v8 s
  
接收实体之后激发了进入触发,然后判断批次,获取发送端口,执行发送,最后离开暂存区。" q$ G2 b; ~+ P- X+ }0 \& K5 ~' J
货架同样以接收临时实体开始:
" i; m* j0 w" {, C! ?5 M& Z
  Time
( p2 q% C2 r6 g  ^$ Y6 H  
  Object
/ V( W4 T( n/ Y( l# p  
  Event
' T+ }2 G0 E; u9 J3 c+ u  
  Involved$ P6 H9 E7 \# G- V
  
  P1% ?& P& d) |  b: G" ?/ g) u
  
  5.3030386 I0 q  _+ W) Q
  
  /Rack40 y. T7 e, K2 A
  
  Engine: Receive Object0 y# D# [/ }, ?8 ?
  
  /Rack4/Box
" ?1 [+ g, f+ q9 F. W. S" q  
  
0 W. d3 p4 ]# ], D$ X" s2 |; E$ I5 c4 d/ i( w
  
  5.303038
* S0 n; c9 i  Q7 g0 D  
  /Rack4
# C& B# N5 ?' T+ p5 j# q+ T/ U  R  
  Trigger: Place in Bay6 d! x4 S, r7 {7 s" O' J3 x
  
  /Rack4/Box
# y  y) G2 o2 j  
  
! c. Z! d8 |& q6 L( h" a
8 [& {8 _0 \1 T4 V0 [2 G  
  5.303038
) ~+ ^' Y/ R9 S/ s  
  /Rack4, u# h' C1 A' P9 p: b
  
  Trigger: Place in Level
8 t9 [$ @* k. P9 d% f7 b+ Z  
  /Rack4/Box
! ?2 [$ O5 x, Y+ E6 L3 F& x  
  bay: 3.0
, X. H% w% ^; m6 Y7 H  
  5.303038# E, [$ G) @" l+ T% m
  
  /Rack4
$ m5 D( d9 p  X+ Q' ~  
  Trigger: OnEntry
* j5 [' i% @% I& k. c2 L: ]) O1 p  
  /Rack4/Box
0 c' ^' M# X- ?  
  port: 1.0+ A( g: P: ?7 T! e" _8 p7 M
  
  5.3030383 `" }! K% K% r5 t
  
  /Rack4
: P: R" D$ M, i! g  
  Trigger: Minimum Dwell Time4 f. H* e( W4 x- x! k) f/ N0 z
  
  /Rack4/Box0 E0 f( J, g/ S! V: u( l
  
  port: 1.0" W& `9 d) B. C  g: j0 x
  
  5.303038
0 f/ k5 W; h4 ^2 P! A' P% }7 i0 n  
  /Rack4
: X& {8 |' }% l( m9 G, O  
  Engine: Timed Event* l  S" |  d7 d" n3 o3 _, |, k
  
  /Rack4/Box7 G( }% D& L3 g! v. a
  
  EVENT_PROCESSFINISH
) D, A$ W# a! O  
  5.303038
( Q6 h5 s+ u. o9 G  B2 N, u  
  /Rack40 U- y6 R7 I4 W) Z# N: U
  
  Trigger: OnEndDwellTime$ q# o! ]* ~1 ^& j! @6 J# i
  
  /Rack4/Box
3 X1 g2 f, \9 a) F; ]$ J: q  
  
7 I; O# k: E2 ^5 ]/ S
( M" q% n6 v0 S6 G, K: j% x  
  5.303038  N% l; |. [4 [# g: u- [
  
  /Rack4
6 Q2 F# ~$ Y. v- P$ ^  
  Trigger: Send To Port) G# b7 f5 a# {2 Z+ |, P
  
  /Rack4/Box
! C: `5 d& m8 j6 O, q  
  . r# n: H) x7 `  J. C
% T: M# N. s0 M' h- k' L: _  s
  
接收临时实体之后依次判断应该放置在哪一列、哪一层,然后激发进入触发,临时实体进入货架之后需要获取其在货架最短停留时间,由于这里设置的最短停留时间是0,所以随即激发定时事件PROCESSFINISH(如果是停留结束会更合理、更便于理解),再激发“停留时间结束触发,最后获取发送端口。由于本例中并没有为货架指定下游端口,所以这里没有执行”Send Object“事件,也没有离开触发。; ^4 Q& w: n1 f& G5 b: z
接下来的其他时间节点都是在重复着同样的事件和触发,直到货架被摆满。, r* @2 _( g3 c, @# p. D
通过Event Log工具,我们可以详细的分析每一个实体的工作机制。比如可以分析推式策略、拉式策略的不同,比如可以调用运输工具,添加任务序列,来分析任务的优先级别、先占级别的处理机制等等。
: J% I* U/ g3 f# ~. t( ~
( `& x/ N# T1 x; U' [
6 P3 `2 F( f: x/ M
' Z. p- V/ U$ p/ g' v

本帖子中包含更多资源

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

x
2#
1010265352 发表于 2015-9-23 14:04:53 | 只看该作者
学习啦
3#
FFFrenk 发表于 2015-9-24 12:04:12 | 只看该作者
感谢分享event log的使用方法!讲得很详细!% ]6 O4 A, ?+ \! [' x/ Z
, P2 w) q# I& e
) p: u  b  P0 U$ ~% x
文中出现其了一处与我理解不同的地方,我贴上来,一起讨论讨论~4 s& q5 x. h! c+ N

$ T  F9 m8 F( O“重置的顺序并不是按照模型逻辑,而是按照实体创建的顺序。”
1 }8 }+ o. E+ P. r并不是实体创建的顺序,flexsim中并没有一个节点存放实体创建的时候(临时实体有)。+ c* u. z* \1 b, ?1 \2 x/ S
这是因为,先拉到模型中的实体的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 | 只看该作者
我也说一点:4 e, l- @2 p/ s2 s. e! @  Q
在事件日志中,涉及的实体一般都是box,这样我们很难区分到底是哪一个触发的,如果需要,我们可以对产生的临时实体进行重命名,编号处理,这样就可以知道就哪一个临时实触发了什么。
9#
manaijin 发表于 2016-4-12 11:04:30 | 只看该作者
对软件的运行机制学习很重要。
10#
慧娴亚伦 发表于 2016-4-13 09:32:49 | 只看该作者
我也说一点:
' |2 p& `! s2 H% Z  U* y  o; S; l在事件日志中,涉及的实体一般都是box,这样我们很难区分到底是哪一个触发的,如果需要,我们可以对产生的临时实体进行重命名,编号处理,这样就可以知道就哪一个临时实触发了什么。; Q% K2 ^* K! w" N
657776724 发表于 2015-9-26 18:00
0 @- N7 K, J2 J% m$ T( f

2 o3 q; p' W( F( Z( ?一个好消息:最新的2016版本已经自动区分在不同实体上面不同rank的实体了,这样就使得debug的过程更加简单方便快速~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-28 04:48 , Processed in 0.074594 second(s), 14 queries .

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

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