全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2015-9-23 13:53:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2015-9-23 16:05 编辑
7 {2 `8 V6 x/ D  {6 h
2 |; `, a  s% P& s" f: E
以货架随机摆放临时实体为例学习Flexsim事件及触发机制
: U. x* J0 z) {/ z+ }
很多初学者都对flexsim的事件及触发不太理解,到底先执行什么后执行什么,先触发什么后触发什么?用户手册中也没有相关的说明。如何才能把这件事情弄明白?其实并没有想象中那么难,只要稍稍花一点时间,你就能彻底掌握其中的奥妙。' M( s5 T$ L: _; w
接下来我们以货架随机摆放临时实体为例,来看一下在flexsim中,各种事件、触发的发生顺序。
2 z0 i: s7 D1 A( L! N. {5 |flexsim中依次拖入货架、发生器、暂存区,软件会将这三个实体自动命名为Rack2Source3Queue4(请注意这三个实体的拖入顺序)。依次A连接发生器、暂存区、货架。双击打开货架属性,勾选“Floor Storage”,设置最大库存为50,设置列和行随机摆放,每个货位内最大摆放量为1,设置货架为510行。8 J8 U% k  @( ^3 l5 I
         
7 R' [& h. r0 @3 q3 x( J; m, F0 w' r) L6 n- h
重置视图,最终效果图如下所示:6 c. W  [" P" a* X7 r, g2 B5 f

; u8 O9 k. Q9 z1 zdebug菜单中选择EventLog,打开Event Log窗口。
* v& n+ S9 q+ x2 G6 }/ j5 k% Y% O* E1 Z
点击settings按钮,我们可以看到flexsim可以记录的事件类型和事件列表。& |7 `! c/ z$ x& W5 ~: n

- Y, L0 ~, [4 r0 e9 n+ z) N/ _Flexsim把事件分为了四大类:EngineTriggerTaskSequenceBeginTask
' f6 g* {' ~, d5 |
4 F5 m- ?) ~/ y3 ]" N2 _, b引擎事件包括了创建实体、摧毁实体,打开输入/输出端口,接收实体,发送实体,发送消息,定时事件。
+ N8 }, u; S$ M5 i
- Y" j/ j: `0 V% |3 _触发事件就多了,我们在实体属性的触发选项卡中见到各种触发都可以在这里找到,还有属性窗口中的一些设置项也可以视为触发。比如发生器的到达时间间隔,处理器的“预置时间”等,flexsim也将其归类为触发事件。
; m% i+ R( l) n  L
0 J9 e7 i$ ~* `  |  zTaskSequenceBeginTask其实都属于任务事件,flexsim将其细化,分为两类。" u& g0 Z$ t: \. N
任务序列事件只包括开始任务序列、结束任务序列、接收任务序列。8 o! x  e! L% x6 L
! c- F9 l3 B7 z$ }+ ~" G
开始任务事件则是任务序列的具体过程,比如装载、行走,卸载、中断、移动实体等。
4 M8 I% g- k; o: _
7 B( v6 x1 ]2 r& y/ Q3 M3 \* J1 ?" SEvent Log窗口勾选”EnabelLogging”,运行模型一段时间后,点击”Export”,将事件日志导出保存。也可以自己指定运行的时间段,比如设置Start Time0End Time15
- i! O0 |6 R. X打开保存的日志文件,就可以看到flexsim模型在运行过程中各种事件、触发的顺序。% c0 a+ [8 d# g) S2 m3 L! m
, C2 a5 ~0 R' H/ k" \0 z6 D
先看一下0时刻模型发生了什么:
1 N( \/ W: t! j. _: ?$ E7 S" X( y
  Time
0 {+ e3 p( }* g8 R0 S  
  Object- H! W% e/ P7 G! t5 u
  
  Event
% I& Y' X* t; o, H# `9 }  
  0
/ p' {. c6 N3 o. A! y* ]: q" U  
  /FlexsimModelFloor4 B2 M" N5 [4 z7 j
  
  Trigger: OnReset
* F9 o: ~' ?! i5 n; h$ b% E4 Q  
  0
8 J. j; R  M3 F2 R5 B' n  
  /Rack42 g1 u- K1 i6 S  F
  
  Trigger: OnReset
2 q& \, G6 c( ~* n. M/ K6 g* `! _' b  
  0# p& M3 p3 K, f- I& M
  
  /Source3& j( _& ?$ X/ V7 ~* {
  
  Trigger: OnReset  W# B' ?- d4 E6 j4 Y8 j
  
  0
' N: Q5 D% X+ X3 \. l! {- l2 W  
  /Source3
1 k/ {4 l2 N7 x5 v9 \& Y  m  
  Trigger: Inter-Arrival Time9 d3 A) f: \$ h$ c
  
  0
* X3 p' v: r, j/ H4 k1 s+ u  
  /Queue48 b$ A; d2 z- i
  
  Trigger: OnReset
4 F3 j, e" q6 L& a0 l# M  x  
0秒的时候各种实体会激发OnReset触发。本例中依次激发了FlexsimModelFloorRack2Source3Queue4的重置,重置的顺序并不是按照模型逻辑,而是按照实体创建的顺序。在创建模型的时候我们最先拖入的实体是货架,所以货架在发生器和暂存区之前被重置。而在货架之前,flexsim自动创建了ModelFloor实体,所以货架的命名是从2开始的。这一点可以打开树结构验证。5 H& _6 h3 h( `6 l

3 |% D& ?$ O4 c2 ~在发生器被重置之后,马上触发的到达时间间隔触发,这是为了决定什么时间创建第一个临时实体。8 d5 A3 H( z/ q1 }
5.303038时刻,发生器创建了第一个临时实体,并由此引发了接下来的一系列事件和触发:3 L9 L* X: V. B0 R9 h" _
  Time
' s% C; ^2 K' E* B  |  
  Object
8 L; i8 P6 ~! Q  
  Event
5 _( k, k) n5 Q8 E+ [  
  Involved
. F8 h6 i+ l2 Z" S  
  P1/ U0 L4 \6 y& ?
  
  5.303038
2 t5 z, G5 S! M( q9 v  
  /Source35 s6 s% V6 y8 I/ @
  
  Engine: Timed Event8 D3 T3 ^6 G  _3 K( \4 [, B4 O4 `( O
  
  /Source3
' u3 B# I0 \/ e7 [: `  
  EVENT_CREATEPART5 ?1 w8 n- N( |7 N, f
  
  5.303038
- Y( u. v; i6 V$ R6 r. r  
  /Source32 z/ v! K7 n: A
  
  Trigger: OnCreation$ Q* W# F7 f- L$ j6 Y2 k" s
  
  /Source3/Box0 k; r3 \. ]  d
  
  rownum: 0.0
# D& I( G' |$ `. D5 k% C# U  
  5.303038# p$ f. z* {& U" m  _" S$ \
  
  /Source3
/ _7 E5 t: z1 V$ @7 ]1 z; q& ~( e  
  Trigger: Send To Port- y# U: z6 r  o
  
  /Source3/Box% O" f/ ^4 f* U9 [
  
  
8 i( X8 ~6 C$ e% n; E) X& q5 }& e( r+ B8 @
  
  5.303038
2 K! j. }0 h$ V1 y- g. q; x  
  /Source3; b# v1 A" |2 P5 x
  
  Engine: Send Object
. O9 J& I* [: r: y7 \1 \  
  /Source3/Box# [% N2 C3 l: S3 U: ~& y
  
  ; s: \2 m7 O$ k8 x5 ^
! b* b1 `6 W/ g1 f+ i# V
  
  5.303038$ D9 d/ M: g% N" M- l  C
  
  /Source3
2 u1 ~& D' ~! }9 C5 B  
  Trigger: Inter-Arrival Time* ^- Q  p$ r( N9 A
  
  6 i( ?# p( r8 K6 O6 L) p

) @% E6 s) h; t5 b0 x% A; l2 ~" S- Y& r1 ?  
  
  R: d  X, `- d0 N2 A7 p  H- X  H5 P: @& ^# t  q! Y
  
  5.3030389 U; ?; A4 k0 M7 s1 P
  
  /Source3
. p, i  [+ Y2 R. \  
  Trigger: OnExit( ?! l  Z, t% [. q
  
  /Source3/Box0 n& [( g3 |( L% r0 x# o- d
  
  port: 1.02 @2 U( [+ @( K1 n2 J3 j
  
当临时实体被创建时,首先执行的是定时事件:CREATEPART,然后才激发创建触发,临时实体被创建后,还要决定其从哪一个端口发送,然后执行发送,临时实体离开发生器。而在临时实体离开之前,发生器还激发了到达时间间隔触发。
( h/ l& C* G- ^1 X本例中的每个实体都是以Engine事件开始,要么创建,要么接收。暂存区正是以接收实体事件开始:) l% A9 {3 m- c! @
Time" a0 [; [/ N% K
  
  Object4 p% x" @' n4 _: v6 K. ?7 t: L
  
  Event' B: Q) R" _' J5 v7 v2 S0 N
  
  Involved, P% ~7 q4 p1 I
  
  P1! u" W" r9 p  @
  
  5.303038
& `! A; S9 t4 ~& @" v  
  /Queue4
/ d2 V0 j# `% H. u( ?  
  Engine: Receive Object
- T& x6 L+ [* f. \+ y  
  /Queue4/Box0 i7 ^! J" d/ N( X* i# ?5 i
  
  
4 X. |4 s0 e& o) K
2 u) [. T' b' u7 U% d  
  5.303038
9 M! X0 I; a+ q# x% E2 @# E  
  /Queue4. x& N/ d" t. n1 o# U' U' ]
  
  Trigger: OnEntry
7 C9 K5 ]5 _+ I' q3 |/ i  
  /Queue4/Box) w7 V4 C+ _- v5 W
  
  port: 1.0% w8 t. k; ?7 b) Y
  
  5.303038# a- C/ W& ~8 F3 f& T
  
  /Queue4# t- s" F" F) ]
  
  Trigger: OnEndCollecting
  Z: {2 P+ @2 C: ~2 ?* v! u  
  /Queue4/Box, Y+ F+ C0 Y, z) e
  
  batchsize: 1.0) t: O' S6 ^3 [( o
  
  5.3030386 a0 Y$ A& e2 u5 ^, l3 T
  
  /Queue4
, c; c/ [1 f. E2 k  d+ S& Y  
  Trigger: Send To Port2 C  d0 H( A/ p' f( y$ t% C9 J; s
  
  /Queue4/Box
' H. V+ y3 ?7 Q  
  
% Q8 ]9 h) c. X- b  x4 y0 H5 f
% q1 [$ W6 {. P( s( i# z  
  5.303038
: ]: U0 W) d1 ]! O2 W  b  
  /Queue4
! k6 D1 Y& `; e$ Z  
  Engine: Send Object
: Z" G3 ^% z; }4 Y  
  /Queue4/Box3 e' [7 C/ \5 M6 O2 q
  
  
2 [* G5 N2 ?& X0 b. i$ O4 C; D/ _, }: M4 W& a2 S
  
  5.3030386 K# k# K- I& v0 c& y" e
  
  /Queue4
- g" g) v% g/ H" F7 C# C# e2 N2 X  
  Trigger: OnExit
" i; A/ `. p! S  
  /Queue4/Box( x: C& [7 f6 e$ D' a2 d! I
  
  port: 1.0+ b! y/ p* o0 q+ [, N8 ^
  
接收实体之后激发了进入触发,然后判断批次,获取发送端口,执行发送,最后离开暂存区。
# Y2 w7 G  u5 _& V4 N2 I货架同样以接收临时实体开始:
* L6 M0 @3 q" u3 x% j7 A; Q' g
  Time
0 i* v8 W3 j7 Y# R7 w5 H  
  Object6 m) R0 r% g5 p0 N( w) e1 \
  
  Event5 {8 {7 s$ j# {! j- `
  
  Involved
  j9 X$ Q6 G7 R% d- t  
  P12 h. f. e/ i( Q# Q% p
  
  5.303038
* c: @  ?# u; n2 o  
  /Rack4) D& g* B3 i2 M
  
  Engine: Receive Object9 q, @2 [! [! ~1 V+ D) B" U& K# a7 t6 h
  
  /Rack4/Box
) d8 c5 e2 B8 j% D, a  
  
) r% l* a; j" }: z9 E7 [+ Q) I3 Y, r% z, o0 g
  
  5.303038, i" e' {) h$ n5 ~
  
  /Rack4' B$ c. \* t$ D# T5 U8 d; G3 Q# g
  
  Trigger: Place in Bay- q5 d& ~+ X" B4 Y+ j
  
  /Rack4/Box! z! _! _2 F# {1 H+ ?
  
  
- R; C/ X& g; ]6 W- S$ k# P; f) j4 \6 B3 e$ H
  
  5.303038+ q$ \6 v$ x4 R, v
  
  /Rack4% ]- ?) N9 T9 V5 L. J9 y
  
  Trigger: Place in Level+ K& S. B$ r( R( j9 `; \
  
  /Rack4/Box
( U! I* Y# |. w  Z  
  bay: 3.01 h/ E- }/ B/ {
  
  5.303038
. n6 L' [0 z! w" g  
  /Rack4: L3 g) J' `, d: t+ n& Y( n
  
  Trigger: OnEntry
1 e/ t* \' P; r& m4 G  
  /Rack4/Box$ V" n/ ]5 r2 z
  
  port: 1.0
+ B2 d+ Y4 s4 o6 R4 B  
  5.303038* |* P( \- z- g2 i# ]* W
  
  /Rack4
: _- b; z0 _( M. X4 W+ F8 C. i  
  Trigger: Minimum Dwell Time
) s, M% u, D! a% s8 k2 F  
  /Rack4/Box( {1 _1 N. D5 m3 Q
  
  port: 1.0' z" f. {' Q  `: b, N; S
  
  5.303038) k8 T; ?6 j" F- S  v& I& @2 B
  
  /Rack4" E# f% _+ _7 m$ P: t
  
  Engine: Timed Event, ?; K- h" g+ x. c6 S  ~
  
  /Rack4/Box9 |+ Y! Q2 {' u/ S
  
  EVENT_PROCESSFINISH0 b: I+ M6 n: K; E
  
  5.3030389 U" w  z9 Z+ [
  
  /Rack4
) `5 R" H; a& @  
  Trigger: OnEndDwellTime
3 g5 Q+ Y1 q  S  
  /Rack4/Box
5 R  b+ _- N5 F, V, w  
  
8 h- x! B# e1 }, h; s- b+ w4 ?. w$ W, o
  
  5.303038) t' @& j6 S) e! y/ G
  
  /Rack4% Z7 Q% K: J7 M" P6 R2 c4 W
  
  Trigger: Send To Port
/ r/ S$ U' \$ a$ i  
  /Rack4/Box
+ u4 k; p' F* X& n) M  
  
" W/ F. S9 r! g4 L/ e( K. o2 E6 y  T* J9 ]: }2 b/ J; C; e. C
  
接收临时实体之后依次判断应该放置在哪一列、哪一层,然后激发进入触发,临时实体进入货架之后需要获取其在货架最短停留时间,由于这里设置的最短停留时间是0,所以随即激发定时事件PROCESSFINISH(如果是停留结束会更合理、更便于理解),再激发“停留时间结束触发,最后获取发送端口。由于本例中并没有为货架指定下游端口,所以这里没有执行”Send Object“事件,也没有离开触发。+ t1 X# p& b7 L7 s4 Y& X
接下来的其他时间节点都是在重复着同样的事件和触发,直到货架被摆满。9 q2 h5 Q4 y) a1 _
通过Event Log工具,我们可以详细的分析每一个实体的工作机制。比如可以分析推式策略、拉式策略的不同,比如可以调用运输工具,添加任务序列,来分析任务的优先级别、先占级别的处理机制等等。
1 G" u5 n( H# ]0 G# \1 L
6 }+ \  {3 L  u3 X
& l, w' e6 d$ J

: F) o  {% u6 }6 \, a

本帖子中包含更多资源

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

x
2#
1010265352 发表于 2015-9-23 14:04:53 | 只看该作者
学习啦
3#
FFFrenk 发表于 2015-9-24 12:04:12 | 只看该作者
感谢分享event log的使用方法!讲得很详细!: n! t% c+ l: G0 m/ C! P0 ?
, M1 x1 `! C, V+ b( Z
: N- ~- W4 I0 s8 g' |6 \! d
文中出现其了一处与我理解不同的地方,我贴上来,一起讨论讨论~
$ r. Y8 O+ p% h6 m' E2 g
) y* \: U# d6 ?2 I“重置的顺序并不是按照模型逻辑,而是按照实体创建的顺序。”
' Q8 l; l/ T* L/ k( J$ i/ F: Y并不是实体创建的顺序,flexsim中并没有一个节点存放实体创建的时候(临时实体有)。. ]- c8 f: G3 v/ C* `
这是因为,先拉到模型中的实体的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 | 只看该作者
我也说一点:
2 N3 U, r& Z$ b- H+ a在事件日志中,涉及的实体一般都是box,这样我们很难区分到底是哪一个触发的,如果需要,我们可以对产生的临时实体进行重命名,编号处理,这样就可以知道就哪一个临时实触发了什么。
9#
manaijin 发表于 2016-4-12 11:04:30 | 只看该作者
对软件的运行机制学习很重要。
10#
慧娴亚伦 发表于 2016-4-13 09:32:49 | 只看该作者
我也说一点:6 [; |3 _# n" C' a7 e+ E& K
在事件日志中,涉及的实体一般都是box,这样我们很难区分到底是哪一个触发的,如果需要,我们可以对产生的临时实体进行重命名,编号处理,这样就可以知道就哪一个临时实触发了什么。
# H2 i' e9 y9 Z/ ~- \: g6 o; ~657776724 发表于 2015-9-26 18:00

4 I# F$ q/ s* p! c# t: a" u  N* a
一个好消息:最新的2016版本已经自动区分在不同实体上面不同rank的实体了,这样就使得debug的过程更加简单方便快速~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-5-7 02:02 , Processed in 0.071581 second(s), 14 queries .

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

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