全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2015-9-23 13:53:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2015-9-23 16:05 编辑 , d1 q7 c" W9 ?  |7 M8 s

& D& a9 f' |6 R9 [/ V) A
以货架随机摆放临时实体为例学习Flexsim事件及触发机制
  G$ I5 `3 a/ W" A4 s  h4 V. j
很多初学者都对flexsim的事件及触发不太理解,到底先执行什么后执行什么,先触发什么后触发什么?用户手册中也没有相关的说明。如何才能把这件事情弄明白?其实并没有想象中那么难,只要稍稍花一点时间,你就能彻底掌握其中的奥妙。
- ?  k8 T9 Z0 K/ X3 m接下来我们以货架随机摆放临时实体为例,来看一下在flexsim中,各种事件、触发的发生顺序。9 o+ W6 d8 C* R4 M  G* h" o
flexsim中依次拖入货架、发生器、暂存区,软件会将这三个实体自动命名为Rack2Source3Queue4(请注意这三个实体的拖入顺序)。依次A连接发生器、暂存区、货架。双击打开货架属性,勾选“Floor Storage”,设置最大库存为50,设置列和行随机摆放,每个货位内最大摆放量为1,设置货架为510行。: ~+ P. C( Q& Y; U
         ; p1 p' {2 F2 B9 ?! H2 q
3 K- L' e9 T* X( X. H
重置视图,最终效果图如下所示:4 P6 g, U( K6 h& j$ ^
% w$ o5 y3 q/ P8 Z* C4 S; ?
debug菜单中选择EventLog,打开Event Log窗口。& x- j$ ?* x9 u, ^0 v
8 g& q' O$ {& e, p7 f  W# o) Y1 }
点击settings按钮,我们可以看到flexsim可以记录的事件类型和事件列表。! y7 m% _  _0 r4 R1 q/ d1 o

) ~. d4 J! Q) PFlexsim把事件分为了四大类:EngineTriggerTaskSequenceBeginTask: F1 B% U/ S; ?4 b

) y+ R0 [( T' k5 X0 i8 Q引擎事件包括了创建实体、摧毁实体,打开输入/输出端口,接收实体,发送实体,发送消息,定时事件。
. V' L, s, J; t& b3 T: o* b  H4 l  K6 i) U) t
触发事件就多了,我们在实体属性的触发选项卡中见到各种触发都可以在这里找到,还有属性窗口中的一些设置项也可以视为触发。比如发生器的到达时间间隔,处理器的“预置时间”等,flexsim也将其归类为触发事件。
; Y2 B7 }6 n* I9 i: E
$ @$ m2 y. v6 l2 F( i5 rTaskSequenceBeginTask其实都属于任务事件,flexsim将其细化,分为两类。' I- g, F" R3 m9 k& ^: F
任务序列事件只包括开始任务序列、结束任务序列、接收任务序列。$ X7 V+ g( e1 `* M  x+ c
9 Q( U$ e$ p0 T2 l
开始任务事件则是任务序列的具体过程,比如装载、行走,卸载、中断、移动实体等。
# E+ D; A/ g' G+ ~6 O; P
. p: v! i( x; h/ N! Q0 L' eEvent Log窗口勾选”EnabelLogging”,运行模型一段时间后,点击”Export”,将事件日志导出保存。也可以自己指定运行的时间段,比如设置Start Time0End Time15
2 _9 B; A/ r# i; c, t  ^( c) V打开保存的日志文件,就可以看到flexsim模型在运行过程中各种事件、触发的顺序。
" K; @. M$ x/ `0 r9 a/ m- B0 O0 o/ h( |) e( C- H1 _9 V
先看一下0时刻模型发生了什么:$ X- C* c" I8 F2 |4 F% D  y8 t7 n. C
  Time/ x5 Q2 \" a$ C- V3 i1 }& k. S6 m' \
  
  Object
8 n* q5 O1 f  V1 \- W1 P  
  Event
) p; N- y) i$ Q: }# G  
  0
, \5 j% [0 Y; |  
  /FlexsimModelFloor& S: x) ]7 w+ U; e4 W) I
  
  Trigger: OnReset
$ L( c3 [0 u4 @  
  02 ]7 _" Z- O& L6 n4 I8 ?
  
  /Rack4: s* Q% A* Q4 P% @, N7 M
  
  Trigger: OnReset
! u9 A" p4 ~* d/ O+ s  
  05 H' J/ z) V4 y4 @3 _5 P* |
  
  /Source3( \3 [* _+ b. g
  
  Trigger: OnReset. y" J1 z  [/ U+ Q3 t5 r. c$ M
  
  0
8 K, D( U5 V$ e# C6 |: H  
  /Source39 T4 K9 `: [9 T; u& j5 Q! X
  
  Trigger: Inter-Arrival Time
- `4 m: j' k. t  
  0/ G2 a/ G: r- l, h1 z, l: B9 q
  
  /Queue4
2 s& a; |% y" j" C  
  Trigger: OnReset
4 {: h2 }5 L9 B* s. V6 l) O- ]  
0秒的时候各种实体会激发OnReset触发。本例中依次激发了FlexsimModelFloorRack2Source3Queue4的重置,重置的顺序并不是按照模型逻辑,而是按照实体创建的顺序。在创建模型的时候我们最先拖入的实体是货架,所以货架在发生器和暂存区之前被重置。而在货架之前,flexsim自动创建了ModelFloor实体,所以货架的命名是从2开始的。这一点可以打开树结构验证。# E# f3 z8 ]( I/ |9 d' M6 s
5 g6 }( y9 G: m% }( }8 F
在发生器被重置之后,马上触发的到达时间间隔触发,这是为了决定什么时间创建第一个临时实体。% l: w, j, }, W
5.303038时刻,发生器创建了第一个临时实体,并由此引发了接下来的一系列事件和触发:
2 T6 k7 n9 L: T8 f4 [0 X
  Time
* `2 b, H0 A$ _- [0 B7 i  
  Object
6 `+ ~* P6 {7 `- `* `, }7 N* e  
  Event
( c4 ~8 I# F- _9 ]9 B  
  Involved4 ?) b# s8 j. m1 `# R! u; N" j
  
  P18 e( S) M0 ]& |
  
  5.303038, W0 ^) `1 e9 \  J* g
  
  /Source3
( {4 J$ A3 y. c- a& }: Y  
  Engine: Timed Event
5 L3 g4 f) n; W1 q! Q  
  /Source3
- T2 D$ W8 t7 t% x  
  EVENT_CREATEPART
7 v; Q6 h# N9 ~' [  
  5.303038" `/ N( ^- A  p+ R
  
  /Source3+ C. ^) u7 K. s7 b
  
  Trigger: OnCreation
" c- G! p: W/ \, o: E$ T: W  
  /Source3/Box
0 u6 R. o7 }! i- m( q  
  rownum: 0.0! S; l- d$ u$ A+ |
  
  5.303038
, Q* ]4 j# {" Z, p  
  /Source3
3 ?, f# {, N6 J% @% L/ V  
  Trigger: Send To Port
( l  u! q8 d+ M  
  /Source3/Box
' q" s( s# B! Z' H3 L, Y  
  
8 q( W& K& k* x! _; c2 G. U: G2 j6 e4 }$ {) l  q
  
  5.303038
, ?5 U! d; D- X# y$ Q  
  /Source3( Z+ O3 T& b1 |& D4 k! L
  
  Engine: Send Object
2 {, q/ W' B) q1 c4 X  
  /Source3/Box
: @% o  q) X8 N  
  / w" ?' P5 u$ q+ Z

" H; }% D3 t& D0 C4 i: b6 b2 B  
  5.303038! J  F, N5 E* y2 x7 m1 c
  
  /Source31 `* H2 }2 `. T* K, Z4 `
  
  Trigger: Inter-Arrival Time& @- a: r% Z5 |( O
  
  ' T3 u, I5 V1 K3 p) [! Z0 p0 P

+ [& {& O& B9 }* ?  
  
9 t9 k$ n" H$ f1 \! i! M; O( L1 }5 Z4 S8 h% A- \% o4 v- G" h9 [
  
  5.303038
. h; R+ Q8 m6 F5 r9 Q$ {  
  /Source3
# S/ y% x; \2 [# e- _  
  Trigger: OnExit
; x+ Q3 J- q3 r& X  
  /Source3/Box9 @( `8 T4 \0 D
  
  port: 1.06 I8 O( [  Z5 J
  
当临时实体被创建时,首先执行的是定时事件:CREATEPART,然后才激发创建触发,临时实体被创建后,还要决定其从哪一个端口发送,然后执行发送,临时实体离开发生器。而在临时实体离开之前,发生器还激发了到达时间间隔触发。* l6 e2 c; ]# j
本例中的每个实体都是以Engine事件开始,要么创建,要么接收。暂存区正是以接收实体事件开始:
& i! {' G' s8 U  X2 a
Time
4 H+ r( O$ J6 g3 w4 R, l- _6 |  
  Object; F% h) Q/ e' R6 n2 N( F/ J
  
  Event+ L3 i- \& l; r$ Q& c0 }2 u- T
  
  Involved5 G# g& F4 z3 O
  
  P1
( Z. ~$ v* O9 S7 }8 e6 e  
  5.303038, k+ ~" d5 b- e
  
  /Queue4
8 K( g  \- ]  i; \  
  Engine: Receive Object7 B2 }; W# M' N4 }  h# a; W
  
  /Queue4/Box! `+ h4 Q1 m! g
  
  
% J8 G' i/ D6 O$ w5 P/ H! R" h& W
2 v% T& P2 `; U* v  
  5.303038
; Z5 C+ B$ S, H7 @; b' H  
  /Queue4
8 u- J( B+ N3 p, v; S: h7 c6 `  
  Trigger: OnEntry
" c" i1 a9 e/ N( ~( l  
  /Queue4/Box
8 P) i$ t. V: P5 `1 ?  
  port: 1.04 p$ {! S" v+ N! c/ h: B! j% b, G
  
  5.303038/ q& T7 U  R/ l% P
  
  /Queue4
. l8 J, Q: p0 X+ H- v) }# p  
  Trigger: OnEndCollecting$ w  o4 J/ K) c4 C" D
  
  /Queue4/Box
, F3 y9 Q! ^& t8 d1 `' Z& z7 V  
  batchsize: 1.0! m* ]2 N0 m( f
  
  5.303038& {: M6 T! d4 Q6 L
  
  /Queue4$ U; g# V* |5 K% B- X" u
  
  Trigger: Send To Port
' o5 M! o7 o9 J1 y, c8 e  
  /Queue4/Box9 Z9 o- q( S8 I1 u' L
  
  ! _! a8 R0 H" `) L& {' e
. x- s1 `* T2 M5 e. G
  
  5.303038
* D! H+ H" [' o* E+ f  
  /Queue42 p9 E3 m0 w0 C5 N
  
  Engine: Send Object' V$ f( ^) x! E& I& z# |+ k
  
  /Queue4/Box
. X5 @2 R9 C+ E! L3 N, R  
  # r! C' g% J" T0 U( c2 \. @- e. c+ Y
! e, ^# B' Q+ {" s1 E3 Z
  
  5.303038) Q( A- K. N  p& z
  
  /Queue44 q; o$ l/ N# @$ [9 K+ N' n7 q
  
  Trigger: OnExit; K; }/ b9 n# k0 j3 i
  
  /Queue4/Box. E- Y2 l1 {$ d4 w% a
  
  port: 1.0
/ y( F. X& x# {  
接收实体之后激发了进入触发,然后判断批次,获取发送端口,执行发送,最后离开暂存区。3 C  g9 D* d9 r0 q( t# `6 d
货架同样以接收临时实体开始:
! D+ j; d! x4 n3 |5 V
  Time6 W2 d8 X1 P, u( z! |
  
  Object. J; a+ {  q7 ^1 G7 V" @
  
  Event
! }0 ^9 b% U9 T6 n  
  Involved9 k/ ~* x4 k8 L9 |& g- Z: m  q8 s
  
  P1" ?# _1 ^0 x" s6 Z8 h
  
  5.303038
3 ]5 @/ r$ n: N/ g  
  /Rack4
8 u9 O* A8 C4 w# `  
  Engine: Receive Object. u1 H! B( R) s/ R* R
  
  /Rack4/Box) S- ~* ]5 @# N) m
  
  & K" M  s3 s3 d/ k
# }. [  r; E' P) V! A
  
  5.303038! I( I4 n; \3 J  M3 t9 H
  
  /Rack4  r/ K% l3 h2 v3 L) q( y7 K
  
  Trigger: Place in Bay) |6 {4 L) j% C+ c
  
  /Rack4/Box# b, I9 F; W8 ^$ J) A* I" B0 i' S
  
  " W9 J% R1 X) `

0 d" D; z& ~+ g3 _0 N  
  5.303038
0 u9 Z- x( f) B4 U6 G1 w+ y6 S* W7 }  
  /Rack4
# F1 n& p$ y& n6 `' U  
  Trigger: Place in Level4 J- n) j* u  |( Z% C" a) Y
  
  /Rack4/Box
4 O9 U8 R/ E3 d% `* K; S. V  
  bay: 3.0
8 `. G( I1 ~4 b6 {2 i8 F8 E  
  5.3030384 ]; Y( b( E/ r0 v9 h  [9 d1 \
  
  /Rack4
7 B5 C0 {$ H0 l7 W# g7 u  
  Trigger: OnEntry
. d0 L1 C  ]5 n& o3 R" W  
  /Rack4/Box
( b3 T+ D4 n) N" g2 o9 j  
  port: 1.03 g# Y5 i1 J( h+ l) V
  
  5.303038
+ h. {" _0 o% k5 F  
  /Rack4
! |& `* R. P9 j9 {# L5 J  
  Trigger: Minimum Dwell Time
7 f' j1 T( H# Y5 ]  
  /Rack4/Box8 p  v# a) f1 V3 ^
  
  port: 1.0
. R) r4 h. c5 p. I+ u  
  5.303038
( y9 H, w" I: z/ u( ?+ O$ f  
  /Rack4; V" i$ M# r! x, m* D( M
  
  Engine: Timed Event$ n8 t3 j( A5 r. T4 q2 G
  
  /Rack4/Box* Z* b) f* x; ~3 J
  
  EVENT_PROCESSFINISH9 \1 x% P6 y& j- A& k3 C* g
  
  5.303038
0 ?; N" G$ R' n5 Z3 Y9 F7 I0 a  
  /Rack4% E; G5 D% U8 F5 Q+ W& q
  
  Trigger: OnEndDwellTime
6 v6 W/ j+ {7 Z$ U* ~9 p  A' _: H  
  /Rack4/Box
" ?) @) I% A  I, A9 V  
  - ^" G' K4 w, V

0 N9 {: O8 l, K- s! w  
  5.303038
3 ?7 t3 }' I$ v, G/ L% T$ `  
  /Rack4
( K# _5 {; ]& r, V  
  Trigger: Send To Port) O' w7 I3 z+ [1 s- I" a8 O
  
  /Rack4/Box
# v* J# V2 ?2 v& b  
  8 i/ m* a/ K+ q3 G5 e
, O1 M! y: ^. b( i
  
接收临时实体之后依次判断应该放置在哪一列、哪一层,然后激发进入触发,临时实体进入货架之后需要获取其在货架最短停留时间,由于这里设置的最短停留时间是0,所以随即激发定时事件PROCESSFINISH(如果是停留结束会更合理、更便于理解),再激发“停留时间结束触发,最后获取发送端口。由于本例中并没有为货架指定下游端口,所以这里没有执行”Send Object“事件,也没有离开触发。4 ?8 _( U0 G* P5 Y9 }9 B1 G, r
接下来的其他时间节点都是在重复着同样的事件和触发,直到货架被摆满。& Q- i7 ]6 I8 v7 P& U
通过Event Log工具,我们可以详细的分析每一个实体的工作机制。比如可以分析推式策略、拉式策略的不同,比如可以调用运输工具,添加任务序列,来分析任务的优先级别、先占级别的处理机制等等。
8 ]% \0 ^3 o7 @& }
2 L) n* {3 n7 o( _

0 d0 @; T: l( h& o% E, P' r) ~0 x
& Z0 |# O; m- H# P8 k. c

本帖子中包含更多资源

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

x
2#
1010265352 发表于 2015-9-23 14:04:53 | 只看该作者
学习啦
3#
FFFrenk 发表于 2015-9-24 12:04:12 | 只看该作者
感谢分享event log的使用方法!讲得很详细!, G9 ?- _( \. x( H! F  [2 T9 A

, `& _1 |2 N- |- B0 \# M/ @6 D$ I, V$ `. @$ N( z
文中出现其了一处与我理解不同的地方,我贴上来,一起讨论讨论~
' R7 }% b% `8 A$ o- x5 q8 v
4 J: A. N2 y1 @; e% l( q' w4 ?“重置的顺序并不是按照模型逻辑,而是按照实体创建的顺序。”
4 ^1 [/ c5 F4 T  c4 W并不是实体创建的顺序,flexsim中并没有一个节点存放实体创建的时候(临时实体有)。
  }% T+ {1 J: q0 T这是因为,先拉到模型中的实体的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 | 只看该作者
我也说一点:7 J9 B( l+ V; z
在事件日志中,涉及的实体一般都是box,这样我们很难区分到底是哪一个触发的,如果需要,我们可以对产生的临时实体进行重命名,编号处理,这样就可以知道就哪一个临时实触发了什么。
9#
manaijin 发表于 2016-4-12 11:04:30 | 只看该作者
对软件的运行机制学习很重要。
10#
慧娴亚伦 发表于 2016-4-13 09:32:49 | 只看该作者
我也说一点:! Y. Q& d4 A1 `5 n0 x
在事件日志中,涉及的实体一般都是box,这样我们很难区分到底是哪一个触发的,如果需要,我们可以对产生的临时实体进行重命名,编号处理,这样就可以知道就哪一个临时实触发了什么。
" v- Q2 U0 g8 O( x' k657776724 发表于 2015-9-26 18:00
% W5 |% y* J3 Z. X
% ~5 i, D% V4 h# q/ @6 m  o
一个好消息:最新的2016版本已经自动区分在不同实体上面不同rank的实体了,这样就使得debug的过程更加简单方便快速~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-9-1 16:53 , Processed in 0.072983 second(s), 14 queries .

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

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