全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2015-9-23 13:53:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2015-9-23 16:05 编辑 3 N" j- @$ b( \4 O4 X# A
; k& @0 O1 L! s& B, _) C6 \7 j4 y
以货架随机摆放临时实体为例学习Flexsim事件及触发机制

/ [" s9 ^, ?2 [- b2 k* ]很多初学者都对flexsim的事件及触发不太理解,到底先执行什么后执行什么,先触发什么后触发什么?用户手册中也没有相关的说明。如何才能把这件事情弄明白?其实并没有想象中那么难,只要稍稍花一点时间,你就能彻底掌握其中的奥妙。& _& k9 Y( F6 H& h7 J' t
接下来我们以货架随机摆放临时实体为例,来看一下在flexsim中,各种事件、触发的发生顺序。
# j, ~$ s% E8 d4 i2 N7 e& B2 j! qflexsim中依次拖入货架、发生器、暂存区,软件会将这三个实体自动命名为Rack2Source3Queue4(请注意这三个实体的拖入顺序)。依次A连接发生器、暂存区、货架。双击打开货架属性,勾选“Floor Storage”,设置最大库存为50,设置列和行随机摆放,每个货位内最大摆放量为1,设置货架为510行。
1 U, S! }; J; B% a! E         ; k9 d! q( [& i: q, a$ _
* @$ \( @$ G) m, U0 B  q& B
重置视图,最终效果图如下所示:% x; q8 [. v; q* D

& z9 f7 V$ v0 s8 c- ?0 j, ?debug菜单中选择EventLog,打开Event Log窗口。
9 |& `+ v3 g, [+ H4 k, Q
! Z, K7 h% V0 N2 a) n1 z/ ]点击settings按钮,我们可以看到flexsim可以记录的事件类型和事件列表。1 |# `8 _/ x4 @3 [# q) h
/ `  ~4 g) c% Q2 l) P4 p6 h* p
Flexsim把事件分为了四大类:EngineTriggerTaskSequenceBeginTask! h' j, E. E, \+ H6 W4 Q. o
+ W( J5 J( Q1 c" h6 K7 B" |
引擎事件包括了创建实体、摧毁实体,打开输入/输出端口,接收实体,发送实体,发送消息,定时事件。
7 k1 S; T4 w2 p( ~1 J
; K; i# |. k2 j2 |0 A触发事件就多了,我们在实体属性的触发选项卡中见到各种触发都可以在这里找到,还有属性窗口中的一些设置项也可以视为触发。比如发生器的到达时间间隔,处理器的“预置时间”等,flexsim也将其归类为触发事件。
" @# }+ o, Y" h$ i' d; [
8 _0 P  E$ g7 c3 a, D& |TaskSequenceBeginTask其实都属于任务事件,flexsim将其细化,分为两类。
0 T# S% ^' M) M8 ?+ I* @. A任务序列事件只包括开始任务序列、结束任务序列、接收任务序列。$ w; O( A! K1 D" H, }

0 H1 G' e0 O5 I; L开始任务事件则是任务序列的具体过程,比如装载、行走,卸载、中断、移动实体等。
# \6 G( k6 y: f, _5 y
5 i6 y2 o, j( H$ NEvent Log窗口勾选”EnabelLogging”,运行模型一段时间后,点击”Export”,将事件日志导出保存。也可以自己指定运行的时间段,比如设置Start Time0End Time15
$ C) x% E3 B$ S; }6 m4 q打开保存的日志文件,就可以看到flexsim模型在运行过程中各种事件、触发的顺序。5 h; g% }1 K, A1 ?4 \5 p2 _
" ~1 A6 A& c1 @
先看一下0时刻模型发生了什么:
- t/ S3 Q2 I0 ~6 x& X
  Time
- W  @$ y. d2 [5 ^4 P, Z3 X  
  Object
3 o0 @0 D; [' j0 U  
  Event9 |% u$ v! O4 f  r  c" U5 F
  
  0
3 V) F/ S# k& ~% U% A  
  /FlexsimModelFloor  J" G/ h) e* x# U
  
  Trigger: OnReset/ A5 ~7 Q2 d! t* h0 K. J5 o6 {
  
  08 a) q1 G6 l" ?2 Q# `" O& S
  
  /Rack4) w3 v" k2 C& ~) x
  
  Trigger: OnReset1 ~" s4 u7 D4 I$ B
  
  0
) w" W* A* d0 z; ]) o  
  /Source3  \; J& m5 G, x
  
  Trigger: OnReset
4 S; r1 n7 H* H% X3 |  
  0+ L4 x3 `% K, e, M. V5 _! ]  y
  
  /Source3' O& ^0 Z; O4 i/ P3 J" ]- G
  
  Trigger: Inter-Arrival Time9 o0 v% o. f* d0 k- ~
  
  0' V& V1 T7 j/ ~) \0 R
  
  /Queue4
- C: L! t! `6 e( m  
  Trigger: OnReset; H+ Q/ L0 g% J/ b7 s
  
0秒的时候各种实体会激发OnReset触发。本例中依次激发了FlexsimModelFloorRack2Source3Queue4的重置,重置的顺序并不是按照模型逻辑,而是按照实体创建的顺序。在创建模型的时候我们最先拖入的实体是货架,所以货架在发生器和暂存区之前被重置。而在货架之前,flexsim自动创建了ModelFloor实体,所以货架的命名是从2开始的。这一点可以打开树结构验证。
% m- m% K, d0 p  [1 p( ]6 `5 k, ]
( H% a* J& i% e" w" A  a; Z+ V在发生器被重置之后,马上触发的到达时间间隔触发,这是为了决定什么时间创建第一个临时实体。$ `+ B# F9 L1 _# w8 g
5.303038时刻,发生器创建了第一个临时实体,并由此引发了接下来的一系列事件和触发:
1 o. M# X$ n4 n3 X4 ]1 c
  Time
+ ?" @/ k: M. b& @* i' t+ r  
  Object
8 [* |! f1 X! o  
  Event5 k, s7 Y. k/ \0 S# J
  
  Involved% R. M. `% r# o
  
  P1
5 b6 n7 k* D8 J+ `2 \5 b; u" x  
  5.3030388 t, t* v4 V7 y
  
  /Source3
9 `0 u- [7 v4 H# l' \0 l' Y: e  
  Engine: Timed Event6 v+ {  l$ d! ^5 y& ~
  
  /Source30 I0 J5 ?0 u, z0 l' A
  
  EVENT_CREATEPART
- ^9 F$ t- t! _9 E. M- C  
  5.303038
  S+ f& T. W4 c: i  
  /Source3* D& _. b/ P/ R( C5 w- W& t% N$ R! c7 X
  
  Trigger: OnCreation
3 Q' N7 a3 x* i& N  F9 T0 z  
  /Source3/Box. |  n# o4 ?, ?3 [: T
  
  rownum: 0.0
- k, ]# y. Q1 O9 o, J* ~  
  5.303038
2 v) @# G3 q) n( l! i! Z) ]  
  /Source3
0 W, K: K! [8 I* s% a  
  Trigger: Send To Port
! w7 x: D* @* G6 p2 Q  
  /Source3/Box1 x- V$ c) x9 F' d4 {
  
  
+ }, N, y) `$ p4 a3 j# M- P' H% B3 W/ ?) C! \8 ~* L" @+ I
  
  5.303038
- K7 P2 X7 `; o; ^" |  
  /Source3
; |% {5 h5 M) D. q  
  Engine: Send Object
0 K- P# l' c7 U3 P# E5 v( L8 V/ E1 F  
  /Source3/Box
( u& h6 e5 r- ]# b/ q( v  
  4 ^$ ^  w4 Y& |& S: g2 o

3 f% F4 e4 ^- Z# c  
  5.303038
0 P4 D9 `  i4 M; `/ B4 K  
  /Source3
. k$ x, T0 P% J  
  Trigger: Inter-Arrival Time
4 k) l' p9 {: R& S  
  
, V9 Z9 f4 t; n9 Z' \
7 ~$ K3 S$ s* E/ ^1 L0 X  
  
. O9 A% a. P- c. |: ?, X& X6 I; ^9 m6 h
  
  5.3030389 k% m; O5 Q5 k; Q
  
  /Source38 I# ^5 |9 j! r
  
  Trigger: OnExit
2 G1 _( f! @3 u2 r5 _* g! Z  
  /Source3/Box, \# \1 i$ r" g9 e& E+ ^
  
  port: 1.0
1 m8 S1 `+ {& Q8 x% `6 i8 @  
当临时实体被创建时,首先执行的是定时事件:CREATEPART,然后才激发创建触发,临时实体被创建后,还要决定其从哪一个端口发送,然后执行发送,临时实体离开发生器。而在临时实体离开之前,发生器还激发了到达时间间隔触发。
! G, P& X6 q* w! ~) r本例中的每个实体都是以Engine事件开始,要么创建,要么接收。暂存区正是以接收实体事件开始:
/ |8 d) f/ W; l8 Z
Time) S& p; y# ]- h! b5 }
  
  Object
0 K; F, j$ G) [7 F2 E9 x) o: I  
  Event/ U# K" ]' t; F$ b6 i) D
  
  Involved& Y. ]. Y) Y# v( c# K
  
  P1  t, n/ g" `9 |4 B, \# q8 u  V
  
  5.303038
0 K2 i. F' Y% ~+ J2 ?  
  /Queue4
; w0 s9 T% K: l( R9 A' c" Z  
  Engine: Receive Object4 w; G$ s9 L8 h3 D
  
  /Queue4/Box
5 U9 t- R$ b3 ?  
  
7 V: g' |6 b2 ]' H/ J/ R/ c* m7 c* X- D0 u4 Z
  
  5.303038
6 g$ Z9 t4 D$ y. s  
  /Queue4
9 P/ v6 v/ G' l" R! U, Y2 p  
  Trigger: OnEntry  p1 {7 k2 ?* F: \
  
  /Queue4/Box7 Y2 T- {* m% f0 P$ t8 M
  
  port: 1.0! x4 Z& U. a; U1 x) M0 M
  
  5.3030385 }* ^. E9 D. I2 q5 S
  
  /Queue4
8 r& I) B3 O. g. }. \  
  Trigger: OnEndCollecting2 w1 a( y4 \6 ^% R5 M1 g5 J5 D  A
  
  /Queue4/Box
  s& z- m: h% t1 X% ]' F  
  batchsize: 1.0
& ]0 T; U" Z$ L" o6 K* F! s: Q8 q  
  5.303038: }5 w7 Z# Y6 G. u/ p
  
  /Queue44 V4 q2 m1 v0 y
  
  Trigger: Send To Port5 ~" U! ]$ e  \
  
  /Queue4/Box$ D" b3 X' u: K5 |+ n# Z
  
  0 X4 A% ~' l4 l9 _
7 c* U3 p2 i& T
  
  5.3030383 w! I+ {3 m/ A5 _. H6 |* \
  
  /Queue4# i! ]9 p# F" W- h% ]- |# ]0 }& I
  
  Engine: Send Object/ E+ H: }9 v7 o& _: i
  
  /Queue4/Box) A  N0 p  [1 s. x8 A
  
    _+ x! ^/ V8 G# D

! p( C/ u( h8 P3 n8 X, ~  
  5.303038
' R3 u+ @' N! u+ b. w5 i  
  /Queue43 ^8 D7 i2 x5 {3 W
  
  Trigger: OnExit0 J; }1 H9 L+ Z  a& r! b8 _& ]$ w- B
  
  /Queue4/Box/ N6 A2 z5 _$ d  h3 @0 S* x& k5 V
  
  port: 1.0! F% q- }- h4 E5 ^
  
接收实体之后激发了进入触发,然后判断批次,获取发送端口,执行发送,最后离开暂存区。: q, S: _# J* r6 a& t' t% k; ~
货架同样以接收临时实体开始:
* C- H; D: }8 d: S
  Time& W9 P! o& r9 h' M( h. x! j
  
  Object
* c% e) I- k, r2 W) d/ W  
  Event
( a  l, C) a8 a0 C  ~+ i0 Z+ L; C  
  Involved
/ H/ n  A  S# q: d0 h: {  
  P1) u: n# R3 c/ H; o
  
  5.303038
! q8 }2 O$ d8 J. s  
  /Rack40 P2 L5 X4 R/ f! I2 x! y. ~3 c, }
  
  Engine: Receive Object; }/ C" o# I3 z$ w% Q' O
  
  /Rack4/Box
: M3 E/ @4 ^8 l  
  
3 u6 x  U: }/ e- }4 i1 P
3 u; a. X  @4 m5 ^; ]+ R$ ?3 a  
  5.303038
1 S- Q! y* k, n7 A' d/ {/ A  
  /Rack4
+ o- c- Q/ r: `1 E) ]8 C  
  Trigger: Place in Bay+ ~$ p* u: ^" N( H5 j( \
  
  /Rack4/Box
4 q/ J- E- m5 ~' v& T. q$ d" t  
  3 O! ?3 v5 v0 b3 r/ n/ s' e1 H
( [% T! g7 u. K- r
  
  5.303038- F& m& m! G$ b, b3 L
  
  /Rack4
  I% _+ t" r) p+ m: S  
  Trigger: Place in Level
0 Q( q. G& |! c& k6 }9 ]. d" C  
  /Rack4/Box# _6 {5 c- r3 s  \4 O, O% Q
  
  bay: 3.0
! F) x  j9 ]( o/ D/ Y: U8 ~  
  5.3030382 n( I( f+ A( e( V
  
  /Rack4+ F6 P/ p; h& y5 E# |' C) D* f
  
  Trigger: OnEntry
! y6 w2 {& |. D$ {9 J- M1 N- V* `  
  /Rack4/Box0 ]4 U- C  ?; E, W: u
  
  port: 1.05 t# U& t$ C2 Y& P+ N
  
  5.303038
  o7 e& U! Z$ i2 a* p, v# g% s  
  /Rack43 f) {; L3 Q  |+ j
  
  Trigger: Minimum Dwell Time
+ @/ G' N) ]: _; b8 A  
  /Rack4/Box1 o0 E/ L; D- Q" _3 A9 n* u
  
  port: 1.0
4 s6 X. ]7 H; u  o# m  
  5.303038) e! C) \( W, k( l, t
  
  /Rack4
- ]9 k8 ]: V+ m$ v/ l  
  Engine: Timed Event; K! X4 h6 [& R9 I) g
  
  /Rack4/Box4 s4 z' k! w) D3 }- S; l8 A) V
  
  EVENT_PROCESSFINISH9 w! u+ J7 A' _& E6 g% Q
  
  5.303038* h$ h; }/ P8 j9 f7 N; v# D
  
  /Rack47 u4 I; V4 t/ Y
  
  Trigger: OnEndDwellTime6 c* X- a4 ~; e8 x' r
  
  /Rack4/Box" Q9 m1 [- n/ A' `+ _- L
  
  1 l! V$ l( C( K* t- `

" \+ R; J1 T9 @$ \: x5 N  
  5.303038- h7 I1 |$ ^5 R1 a: R
  
  /Rack4
- y. q2 s" i' ~  
  Trigger: Send To Port
; @" M4 F; J1 _3 {  
  /Rack4/Box5 R: `7 F. W# K: a% Z
  
    I+ q& T  }; ?/ r. A

  B: T# z# x) |. r* Q$ j  
接收临时实体之后依次判断应该放置在哪一列、哪一层,然后激发进入触发,临时实体进入货架之后需要获取其在货架最短停留时间,由于这里设置的最短停留时间是0,所以随即激发定时事件PROCESSFINISH(如果是停留结束会更合理、更便于理解),再激发“停留时间结束触发,最后获取发送端口。由于本例中并没有为货架指定下游端口,所以这里没有执行”Send Object“事件,也没有离开触发。
  w, _# [; y/ `1 A) }9 p0 G+ Q( u5 U接下来的其他时间节点都是在重复着同样的事件和触发,直到货架被摆满。
1 x6 c1 v5 _9 g! R" K: ?8 w( F+ B8 _通过Event Log工具,我们可以详细的分析每一个实体的工作机制。比如可以分析推式策略、拉式策略的不同,比如可以调用运输工具,添加任务序列,来分析任务的优先级别、先占级别的处理机制等等。4 t9 o, `: m  W1 C, E8 D1 D

# U2 y0 {8 O; o
, |/ I; V. c2 s7 H% q

3 f3 v6 x0 ^% Y+ }/ r

本帖子中包含更多资源

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

x
2#
1010265352 发表于 2015-9-23 14:04:53 | 只看该作者
学习啦
3#
FFFrenk 发表于 2015-9-24 12:04:12 | 只看该作者
感谢分享event log的使用方法!讲得很详细!0 n/ \) T9 P2 G! ^

0 O' i5 c5 p9 Z: H& `7 E5 h$ {' ^: ^! K% U
文中出现其了一处与我理解不同的地方,我贴上来,一起讨论讨论~/ x$ h& l) k. O8 g
4 \- E' k* B, @4 c8 B% t
“重置的顺序并不是按照模型逻辑,而是按照实体创建的顺序。”2 L) r* l) a3 j$ y4 n
并不是实体创建的顺序,flexsim中并没有一个节点存放实体创建的时候(临时实体有)。0 q# ]3 O7 g/ M( I$ w& Q# G0 C, M' Z
这是因为,先拉到模型中的实体的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 | 只看该作者
我也说一点:5 S6 m) K2 T  b
在事件日志中,涉及的实体一般都是box,这样我们很难区分到底是哪一个触发的,如果需要,我们可以对产生的临时实体进行重命名,编号处理,这样就可以知道就哪一个临时实触发了什么。
9#
manaijin 发表于 2016-4-12 11:04:30 | 只看该作者
对软件的运行机制学习很重要。
10#
慧娴亚伦 发表于 2016-4-13 09:32:49 | 只看该作者
我也说一点:- J' U9 {, i$ J1 Y+ H- u4 h# k1 n$ ?* M
在事件日志中,涉及的实体一般都是box,这样我们很难区分到底是哪一个触发的,如果需要,我们可以对产生的临时实体进行重命名,编号处理,这样就可以知道就哪一个临时实触发了什么。2 p/ J8 p( \7 d1 W% y6 [6 Y" S
657776724 发表于 2015-9-26 18:00
2 a- z5 N  U& |: Y

" X0 _+ a. B: C; O一个好消息:最新的2016版本已经自动区分在不同实体上面不同rank的实体了,这样就使得debug的过程更加简单方便快速~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-28 02:58 , Processed in 0.086831 second(s), 14 queries .

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

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