全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2015-9-23 13:53:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2015-9-23 16:05 编辑 1 j& ~% I# v1 k* o, @) p: W

. b/ U5 [( G+ u' ]2 Q" _2 K( `: }  T
以货架随机摆放临时实体为例学习Flexsim事件及触发机制

1 V$ l) W$ `2 |/ Y3 D3 u5 Q很多初学者都对flexsim的事件及触发不太理解,到底先执行什么后执行什么,先触发什么后触发什么?用户手册中也没有相关的说明。如何才能把这件事情弄明白?其实并没有想象中那么难,只要稍稍花一点时间,你就能彻底掌握其中的奥妙。- d: i% ?% C/ u+ X  n
接下来我们以货架随机摆放临时实体为例,来看一下在flexsim中,各种事件、触发的发生顺序。+ [1 V! t, g4 p* F/ C
flexsim中依次拖入货架、发生器、暂存区,软件会将这三个实体自动命名为Rack2Source3Queue4(请注意这三个实体的拖入顺序)。依次A连接发生器、暂存区、货架。双击打开货架属性,勾选“Floor Storage”,设置最大库存为50,设置列和行随机摆放,每个货位内最大摆放量为1,设置货架为510行。
" s: O: ]$ A  C; X3 M         
% T% Z8 A, v1 \4 Q2 {2 Q  z2 M
- Y% K* l  E9 [重置视图,最终效果图如下所示:1 W5 L9 u# O( A6 {1 p& j7 \0 s3 W
# f8 y2 c* p- K7 d8 O" H. B
debug菜单中选择EventLog,打开Event Log窗口。* l) g- U1 }) f/ F( u
9 ^% H# |( N) G2 Y% Z
点击settings按钮,我们可以看到flexsim可以记录的事件类型和事件列表。- q& [& a& q' ^: @( O- x

! o6 i3 X1 J  V! b( y1 I* N# UFlexsim把事件分为了四大类:EngineTriggerTaskSequenceBeginTask8 |6 Q! o3 U( W9 L

# n; L6 u& y" B! j) {: {& b5 T引擎事件包括了创建实体、摧毁实体,打开输入/输出端口,接收实体,发送实体,发送消息,定时事件。
# }5 t6 |: L5 u. v& g$ H
% d, [% @: }0 K: [. e& P+ F触发事件就多了,我们在实体属性的触发选项卡中见到各种触发都可以在这里找到,还有属性窗口中的一些设置项也可以视为触发。比如发生器的到达时间间隔,处理器的“预置时间”等,flexsim也将其归类为触发事件。
& |; b) w! P3 A# @
  U( P1 p$ o& v  \  U! \TaskSequenceBeginTask其实都属于任务事件,flexsim将其细化,分为两类。
2 _  [- h5 Q) c4 V2 N/ m任务序列事件只包括开始任务序列、结束任务序列、接收任务序列。
7 Y1 d; j, G' K; z, Z2 C7 J; c; B5 C  ]
开始任务事件则是任务序列的具体过程,比如装载、行走,卸载、中断、移动实体等。
) x' Z8 b1 r' z# w! F; ~
( z0 \, H6 D/ r  q, J4 r- Z0 GEvent Log窗口勾选”EnabelLogging”,运行模型一段时间后,点击”Export”,将事件日志导出保存。也可以自己指定运行的时间段,比如设置Start Time0End Time157 d; g# I4 q7 B( k
打开保存的日志文件,就可以看到flexsim模型在运行过程中各种事件、触发的顺序。
5 O# F6 t3 X9 X7 S! T9 M; B$ g4 Y; d* n2 k. X& J
先看一下0时刻模型发生了什么:( ^( n+ x0 `0 r9 x9 q: J7 x+ p
  Time: O* h0 \* m7 J- j
  
  Object
$ V0 |3 {) C4 z9 v) P  ~  
  Event4 ~4 R) r6 k& C+ H0 F
  
  0
  d0 D2 o8 v2 K; O2 t" T  
  /FlexsimModelFloor
' n/ }* ^! R4 j+ c  
  Trigger: OnReset
% c/ W$ V+ d8 b  p; w$ T, D  
  0
; X) {0 ]9 ]; L: q$ s) r  
  /Rack4" t: b. v4 P* {( l  C1 L! g
  
  Trigger: OnReset
9 a' e$ M; Q, _3 ?: X  
  00 s" b1 w' D9 ]* c4 ]' d
  
  /Source30 s' q: X9 o9 Q: \
  
  Trigger: OnReset
+ [! Q" [6 M2 O: @% {, R  
  06 c' k0 |/ j: k; Y( w
  
  /Source3
7 D. X' P8 h0 b2 Y7 L  
  Trigger: Inter-Arrival Time
) x2 U* }$ A$ S9 G  
  05 @$ V  r: n) q3 u
  
  /Queue4
6 [6 L; {( s! Y. c  
  Trigger: OnReset" c, |5 `2 {" w4 {0 d) H
  
0秒的时候各种实体会激发OnReset触发。本例中依次激发了FlexsimModelFloorRack2Source3Queue4的重置,重置的顺序并不是按照模型逻辑,而是按照实体创建的顺序。在创建模型的时候我们最先拖入的实体是货架,所以货架在发生器和暂存区之前被重置。而在货架之前,flexsim自动创建了ModelFloor实体,所以货架的命名是从2开始的。这一点可以打开树结构验证。
5 ?* u/ X. }3 V4 k: F7 l! A7 b* V
在发生器被重置之后,马上触发的到达时间间隔触发,这是为了决定什么时间创建第一个临时实体。
0 {' v+ F* |' z2 i8 U! i: J, |5.303038时刻,发生器创建了第一个临时实体,并由此引发了接下来的一系列事件和触发:$ n% V. W6 {4 a
  Time
( Q& d9 p5 E7 o  
  Object8 [1 x0 t3 }% v/ n, K( C# K
  
  Event* u# y- u3 Q0 }# \
  
  Involved+ U6 g6 U0 r3 i) o# q' ^9 a
  
  P13 l/ j2 t. E% b5 M4 N) D# D2 e* e
  
  5.3030389 P+ E. W2 {' u$ z( a
  
  /Source3
, Y  X  X4 ]; v/ X8 ~$ [0 _  
  Engine: Timed Event1 d- E% a) Y( a# `' X
  
  /Source36 n6 x% q/ D7 }! }( g
  
  EVENT_CREATEPART. f; O- d/ C( o; n1 R1 L1 t9 O6 @
  
  5.3030389 _/ n6 S$ _5 U  e9 N
  
  /Source3- n; r$ ^* Z5 Z0 u/ L; o; n3 [- o) F
  
  Trigger: OnCreation
3 T5 \' H& Z9 _( j  
  /Source3/Box* F+ @. I3 G- B
  
  rownum: 0.0
3 v$ s: d6 O! y3 S  
  5.303038
) H9 \" o! B. ]  
  /Source3; w! b! M6 F/ R8 b
  
  Trigger: Send To Port" s4 K( Z7 T8 ~! }8 l: t
  
  /Source3/Box/ t2 e) b' [6 h4 f$ |
  
  
; j( S* K6 x( Q+ n( p
7 c- ~2 R% v. \  h  
  5.303038
6 ~2 f* z2 j/ r9 ~  
  /Source3; y1 Z/ |) ]" r1 s2 P1 n
  
  Engine: Send Object3 t4 n" {6 V7 m/ C4 x; g( c4 S/ ~
  
  /Source3/Box
" H- P9 V. L9 `* f  
  - \( W  [" s3 A

! g3 @9 c; j6 J$ m! H2 q  
  5.303038, u) d3 e. y7 x& a) h
  
  /Source3
* q* f$ i; m" w9 B; l  
  Trigger: Inter-Arrival Time
) G+ w$ n' ^+ Q8 I3 R  
  
. j5 n1 N: m" Z0 U! w1 ~* L% Z# P# {/ E9 }' a% D1 ]
  
  4 Q! @: N1 q  {* @) \7 h/ _

5 h1 I5 F) }: Z* k1 u  
  5.303038$ E3 q: `: U- l
  
  /Source3
0 k5 W9 O+ O0 ]) H  
  Trigger: OnExit# G4 }: R, u3 T: C
  
  /Source3/Box
; H+ @" i0 k1 W- e  
  port: 1.09 I, H: m  j( [/ Y
  
当临时实体被创建时,首先执行的是定时事件:CREATEPART,然后才激发创建触发,临时实体被创建后,还要决定其从哪一个端口发送,然后执行发送,临时实体离开发生器。而在临时实体离开之前,发生器还激发了到达时间间隔触发。) o5 p& f$ a. H1 U
本例中的每个实体都是以Engine事件开始,要么创建,要么接收。暂存区正是以接收实体事件开始:
- y. F2 m2 F5 h; K8 r" H
Time0 J' [* ]1 g- X. Z
  
  Object: L" Q& _; @1 ^) E: m7 E% b
  
  Event
+ G# y; b+ C9 A  
  Involved
& L5 r1 a! e" d4 C9 O# b& }% U" H$ \( t  
  P1
, [' T3 u& k! f) b6 ^  
  5.3030386 @% k- T# B! y0 e" z/ c* f
  
  /Queue4
" e( H  j8 [2 P0 H" Q  
  Engine: Receive Object8 I$ q5 S: `% u; j2 E% h1 h
  
  /Queue4/Box! K, |4 M( G1 h$ G; y; E( M- i
  
  ( l0 b$ n- E" |+ N
6 D( S3 b1 _# a: w' u
  
  5.303038
# Q2 [/ `' }" @6 P, n  
  /Queue4
) I0 y& r' V: H  
  Trigger: OnEntry. S2 X5 o) [" T" F7 P3 @6 u  U
  
  /Queue4/Box
/ @1 v# }9 S) i* R  
  port: 1.0* Z4 k+ ~2 j& P) P8 U0 L' I- z! F
  
  5.3030381 |. z' J$ y& P- U+ ~
  
  /Queue4
* V: N  |7 a4 {  
  Trigger: OnEndCollecting
5 ~' Z4 f+ d) [5 g) H  
  /Queue4/Box) ~8 M' E, @( ?# S9 [9 R
  
  batchsize: 1.0$ H: e+ I: |! D4 W8 l
  
  5.3030382 m% Y2 e1 f  u$ ?
  
  /Queue4+ O4 |8 J0 N' _
  
  Trigger: Send To Port" P, Q5 c& R6 B" v6 i- E
  
  /Queue4/Box( T$ }$ O! n7 F# i& }
  
  " `3 ~( G+ l! ?

$ P1 k9 U" s! B$ H3 e$ X  Q8 R  
  5.303038/ N2 _4 c* u2 w- \0 N1 J
  
  /Queue42 x& j% @; R3 d7 A) @  I
  
  Engine: Send Object
: Y2 y; J  O  I+ {" z3 D! V0 B' t  
  /Queue4/Box
0 a9 D' S3 j0 A4 U7 o3 T  
  
9 r# g% }+ `0 d5 b. `  ]2 k$ Z! f) g
  
  5.303038, M( l8 j7 |3 _" c$ C
  
  /Queue4
+ P1 z9 `4 D( {# X  x. n& @/ b  
  Trigger: OnExit! Y  n! e) r5 d9 `' z% T9 x: u
  
  /Queue4/Box
  c7 K! o. ?7 e& F) s  
  port: 1.0
8 K9 Y* p5 m( Q) a1 a  
接收实体之后激发了进入触发,然后判断批次,获取发送端口,执行发送,最后离开暂存区。& |; ~" @1 ]" R( U
货架同样以接收临时实体开始:. D5 l, Y6 P2 x
  Time# _: e: }, g& A; X& D
  
  Object
+ Q, n3 h% C, |3 g, u# f3 k% h  
  Event
/ @6 s" I9 x7 ^+ [* O( M+ L; _1 E/ U, c  
  Involved
9 C7 V' y: I6 o/ S  P8 \/ B  
  P1
9 A# J7 ~1 o' W4 I. c& r" r, s  
  5.303038- \/ k$ [8 X5 g+ {
  
  /Rack4
. o/ ^% n! I! [1 h4 w  Q  
  Engine: Receive Object  `- m( y) ~, {
  
  /Rack4/Box, ]- h! e  y( Q
  
  
$ g; t9 s6 E! o/ I" h# e* i7 q) V( V( c9 I) s; H
  
  5.3030385 B: R8 K& A' \0 t5 m& b/ ^$ s
  
  /Rack4
' d7 B7 D5 |: L5 Q: F  
  Trigger: Place in Bay9 U* h. p7 u. D0 O( J
  
  /Rack4/Box
% D0 L+ }! I2 N& J/ I" l  
  
3 {+ t1 P- W. M7 X9 \' O' a- j' a+ l% }; G8 f+ P
  
  5.3030382 {% J( v5 e$ c0 X' c& [$ e
  
  /Rack4
0 Y2 P. K6 S: f. |  
  Trigger: Place in Level
( H$ }$ \$ Q) }* g) I0 a  
  /Rack4/Box
% F" g: t$ W8 I4 {: `6 W6 b( Q  
  bay: 3.0( |2 V& m7 v: A
  
  5.303038: t% c( @- z. ?% A
  
  /Rack4  a0 N) l% F/ t! g
  
  Trigger: OnEntry
% [& X0 {, \" |. h) y9 S: v  
  /Rack4/Box
4 w/ W. y1 y; n. T$ w/ m8 w% l4 I  
  port: 1.0
( C) F" ~: Q8 L" b6 C  
  5.303038
* B) i: K9 t5 S  H1 E  
  /Rack4
1 V( A; B5 Y9 B. i. |4 j+ A. {  
  Trigger: Minimum Dwell Time
7 `) K" s; \1 T( _: i# v  
  /Rack4/Box) T3 k- F% L- _6 [9 v
  
  port: 1.0
) E$ S$ B9 ?! [+ H9 N  
  5.3030381 @5 A, g+ z1 m$ h# p
  
  /Rack4: r! `. m. m* Q' b0 x: H+ Z
  
  Engine: Timed Event
7 z, z( `! V3 e  
  /Rack4/Box' f2 P& C2 q) q# |; @
  
  EVENT_PROCESSFINISH
2 n7 _3 n& B/ q( t) B0 R  k  
  5.303038
! \2 N* ~% d6 R  
  /Rack4/ T$ G" r0 I$ z+ B& k
  
  Trigger: OnEndDwellTime# |2 D  L  B" \$ T( u
  
  /Rack4/Box# n) L7 `$ ?( F1 \
  
  
' S% m5 V& l: F0 T
2 z& W; b+ i! }& N! T" H  
  5.3030380 C# h- T- A* N
  
  /Rack4" P' J6 ]: Z1 W
  
  Trigger: Send To Port) T8 G7 }! O$ T8 |2 H* f2 ]
  
  /Rack4/Box8 n, i. ~( y. \! \8 b* Z
  
  # j7 h; u- p4 K" E" O+ U& G

* w7 l  f7 |+ s; ?& ~! S% u; `  
接收临时实体之后依次判断应该放置在哪一列、哪一层,然后激发进入触发,临时实体进入货架之后需要获取其在货架最短停留时间,由于这里设置的最短停留时间是0,所以随即激发定时事件PROCESSFINISH(如果是停留结束会更合理、更便于理解),再激发“停留时间结束触发,最后获取发送端口。由于本例中并没有为货架指定下游端口,所以这里没有执行”Send Object“事件,也没有离开触发。
# @5 v! |: C. Y$ g9 D$ w接下来的其他时间节点都是在重复着同样的事件和触发,直到货架被摆满。
# Q3 s9 h) i) H# [4 b0 F+ V通过Event Log工具,我们可以详细的分析每一个实体的工作机制。比如可以分析推式策略、拉式策略的不同,比如可以调用运输工具,添加任务序列,来分析任务的优先级别、先占级别的处理机制等等。
+ z5 x8 W( O# k$ `0 x) r" s4 ?6 ]2 Y# z. i3 k/ _1 E, r3 _( G: _  l
  X3 ~* V+ B: B9 Z! @

9 [) L( p& Y- |  v" I

本帖子中包含更多资源

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

x
2#
1010265352 发表于 2015-9-23 14:04:53 | 只看该作者
学习啦
3#
FFFrenk 发表于 2015-9-24 12:04:12 | 只看该作者
感谢分享event log的使用方法!讲得很详细!
% K8 |* h  [8 u2 ?/ [% }6 A2 U- \' \& @5 @1 w7 w7 J* h
; D" |# N  p$ o3 F
文中出现其了一处与我理解不同的地方,我贴上来,一起讨论讨论~# Z  b! P+ P3 A: E
* d: h6 f- y% V' y3 E3 U: e6 W6 I
“重置的顺序并不是按照模型逻辑,而是按照实体创建的顺序。”, ?. k5 F4 E/ R& [7 ]
并不是实体创建的顺序,flexsim中并没有一个节点存放实体创建的时候(临时实体有)。( b% a' Q  q; q9 f/ o
这是因为,先拉到模型中的实体的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 | 只看该作者
我也说一点:9 b! ?6 R2 z  a7 F+ h
在事件日志中,涉及的实体一般都是box,这样我们很难区分到底是哪一个触发的,如果需要,我们可以对产生的临时实体进行重命名,编号处理,这样就可以知道就哪一个临时实触发了什么。
9#
manaijin 发表于 2016-4-12 11:04:30 | 只看该作者
对软件的运行机制学习很重要。
10#
慧娴亚伦 发表于 2016-4-13 09:32:49 | 只看该作者
我也说一点:
  M5 K8 }5 @0 a+ D% W在事件日志中,涉及的实体一般都是box,这样我们很难区分到底是哪一个触发的,如果需要,我们可以对产生的临时实体进行重命名,编号处理,这样就可以知道就哪一个临时实触发了什么。4 D: ?1 h" n2 U! c' x9 `
657776724 发表于 2015-9-26 18:00
3 m" W. c# q0 G% F) u0 x0 h/ G% {
0 e! S! |5 G2 Y( F1 c
一个好消息:最新的2016版本已经自动区分在不同实体上面不同rank的实体了,这样就使得debug的过程更加简单方便快速~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-2 13:13 , Processed in 0.072359 second(s), 14 queries .

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

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