全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2015-9-23 13:53:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2015-9-23 16:05 编辑 / u% [5 z# i5 k
1 t9 v$ H' x6 R7 a+ g! A. B6 w" E
以货架随机摆放临时实体为例学习Flexsim事件及触发机制
, F5 p9 g- {) d
很多初学者都对flexsim的事件及触发不太理解,到底先执行什么后执行什么,先触发什么后触发什么?用户手册中也没有相关的说明。如何才能把这件事情弄明白?其实并没有想象中那么难,只要稍稍花一点时间,你就能彻底掌握其中的奥妙。- T6 Z5 O1 x% L0 P4 e0 Q5 E
接下来我们以货架随机摆放临时实体为例,来看一下在flexsim中,各种事件、触发的发生顺序。
1 d8 Y+ L, C, y3 rflexsim中依次拖入货架、发生器、暂存区,软件会将这三个实体自动命名为Rack2Source3Queue4(请注意这三个实体的拖入顺序)。依次A连接发生器、暂存区、货架。双击打开货架属性,勾选“Floor Storage”,设置最大库存为50,设置列和行随机摆放,每个货位内最大摆放量为1,设置货架为510行。
, P% c& c, E' v- s         ! O; l! B: E8 H- p! G
! f: z, I+ }5 s. S6 y1 F. C3 I, V
重置视图,最终效果图如下所示:2 R' ^' u8 s1 Y4 V4 y) R; E: y
; |9 a2 E0 p! T( e0 V: r' i
debug菜单中选择EventLog,打开Event Log窗口。" W- p' f5 H  q6 G! I6 W

! I/ |' e3 h5 M点击settings按钮,我们可以看到flexsim可以记录的事件类型和事件列表。* b2 B: |0 M' m: w

6 {1 f  ~! Q. h- c6 [* X* ]+ NFlexsim把事件分为了四大类:EngineTriggerTaskSequenceBeginTask
( L5 @; S4 h& S$ k/ x$ a- Z
+ Y1 T* H4 V9 ^引擎事件包括了创建实体、摧毁实体,打开输入/输出端口,接收实体,发送实体,发送消息,定时事件。9 M$ F7 E# O# |- E+ c, y# C0 t

% d0 K! {0 z: |; Y/ z* R  R触发事件就多了,我们在实体属性的触发选项卡中见到各种触发都可以在这里找到,还有属性窗口中的一些设置项也可以视为触发。比如发生器的到达时间间隔,处理器的“预置时间”等,flexsim也将其归类为触发事件。) A/ V+ H) f4 U1 T% a; F7 J! L  x# c

1 F) F' ~, @. `6 H" jTaskSequenceBeginTask其实都属于任务事件,flexsim将其细化,分为两类。
! q* a: S( I$ m( c) E7 B4 O9 x任务序列事件只包括开始任务序列、结束任务序列、接收任务序列。- o. a' N) o( v- `! w6 v# \
1 y! x$ R8 w) e4 n; S4 G
开始任务事件则是任务序列的具体过程,比如装载、行走,卸载、中断、移动实体等。$ t4 y8 U. |3 [; _" V4 P! ]
" Z7 D; `6 O$ @1 r2 ~  A5 g, F
Event Log窗口勾选”EnabelLogging”,运行模型一段时间后,点击”Export”,将事件日志导出保存。也可以自己指定运行的时间段,比如设置Start Time0End Time15
1 N' ?& Z6 N; H4 N8 C: {: L' p打开保存的日志文件,就可以看到flexsim模型在运行过程中各种事件、触发的顺序。
" t2 d" K  N9 l: U  t$ X" W' A  C" g- S4 e7 J& W, C3 U0 ?+ B
先看一下0时刻模型发生了什么:
* x* m2 Z; P/ `, V3 q  d! r7 i
  Time9 R8 a/ r0 f) S+ Z3 n8 ?
  
  Object& B9 D# [/ A! P: K/ O
  
  Event
; R3 K. S  ^7 f6 C  
  0( `/ h0 l' h! g0 B
  
  /FlexsimModelFloor
' L* U" b1 @) D; r8 ~  
  Trigger: OnReset4 k! S* V3 q! \
  
  0
$ R- H  n4 O4 T- V5 g  r, r1 _  
  /Rack48 u9 j8 L. T  L- A' |
  
  Trigger: OnReset
3 I1 s8 h4 {( q  
  0% Q. |& B3 W6 y0 o& v2 ?% @
  
  /Source3
+ p/ F9 @  T# w  K' u  
  Trigger: OnReset7 m; ]; l# R0 t- ?$ a9 c5 b
  
  0" z- w8 O. x% _* k$ z% M, t( x
  
  /Source3) q# }% B& K* c% h0 [: K
  
  Trigger: Inter-Arrival Time
! t! C* S3 T  R# U0 C* g  
  00 y5 }4 ?: R+ `5 ]5 \9 x
  
  /Queue4% G( J5 T$ i/ c& X/ h7 [: i! _; y( B+ S
  
  Trigger: OnReset
& m& k! Z& H2 X' q% O3 D8 |  
0秒的时候各种实体会激发OnReset触发。本例中依次激发了FlexsimModelFloorRack2Source3Queue4的重置,重置的顺序并不是按照模型逻辑,而是按照实体创建的顺序。在创建模型的时候我们最先拖入的实体是货架,所以货架在发生器和暂存区之前被重置。而在货架之前,flexsim自动创建了ModelFloor实体,所以货架的命名是从2开始的。这一点可以打开树结构验证。
3 e( J/ s6 Y4 E) Q3 p" ?3 e" v
0 Z! q) X* i  j4 z, l在发生器被重置之后,马上触发的到达时间间隔触发,这是为了决定什么时间创建第一个临时实体。, f- [  \; x2 k
5.303038时刻,发生器创建了第一个临时实体,并由此引发了接下来的一系列事件和触发:
7 R! _4 q) w+ k) j7 Q# ?; o
  Time6 U/ Y7 f5 k( P# g
  
  Object% g1 l' w( d0 c6 I8 i' H3 a, k
  
  Event
0 I+ k8 ^  S% K6 I  
  Involved, r5 i3 {1 x4 B& C" G7 [! L# N
  
  P16 p' g- z5 w9 ?8 [4 y- J
  
  5.3030384 e8 P, L8 B' I1 S  Y- p
  
  /Source3
3 k* }4 O- B( ^/ O% n: D$ L  ]  
  Engine: Timed Event
3 W7 G. _1 u9 W( D2 E9 u+ C  
  /Source3
" j3 E3 s2 L) g6 y# b1 Q  
  EVENT_CREATEPART
$ Y- I9 Z. n! s  
  5.303038
& O; \3 ~& b. h9 C+ T4 M8 |  
  /Source3
/ J$ |7 W- Z2 ?  C1 s# o5 |; S4 `  
  Trigger: OnCreation) a7 X* N4 M4 t0 q* t. f
  
  /Source3/Box' e7 k! s- P6 C6 ~. r
  
  rownum: 0.0$ p, s' Y7 r7 i4 E5 ^
  
  5.303038$ \7 ^4 c$ R- @" d* n+ ]9 O
  
  /Source3
6 B; n; g! x, M( z$ V  
  Trigger: Send To Port0 o) D+ H- }6 `. H. G; }- r( r% w' ]
  
  /Source3/Box
6 G6 N5 t' w9 s' t  
  
; _8 n6 P" j7 ]5 Z* H) Y% V1 [" T0 O% Q" r1 q/ v3 a3 _
  
  5.303038
  R9 M. v) [* x$ G4 F# y+ J4 p5 D  
  /Source3
: N, a: p0 \- |3 g2 h+ Y  
  Engine: Send Object
+ n* c/ j+ `5 G2 B( l5 f1 E  
  /Source3/Box
; N! t( ?! }: ?  
  
! X8 z6 L0 q: A) W, y) |: N  c3 f) L) A7 I
  
  5.303038
! t2 {. @- D8 ]: B$ e# d/ }8 f  
  /Source35 m: w& D. ~( p: C
  
  Trigger: Inter-Arrival Time
( ?; d/ u* A# y' E9 `  
  : E# I' q/ a2 w9 b
$ S# g6 I! B1 ]4 W
  
  " X4 U4 V" r( J0 m# Y' B, s2 j
! ?% V, r. s8 S. h
  
  5.303038. R1 I3 N3 v: `% @  C9 b& ?
  
  /Source3$ P. W# g( l0 P' n) ]( O% J$ G
  
  Trigger: OnExit
" u0 n5 M6 {- z" f! X9 P  
  /Source3/Box
- @* I' u" M: |  
  port: 1.0
5 s& G3 D  M3 m& A5 g& a( U  
当临时实体被创建时,首先执行的是定时事件:CREATEPART,然后才激发创建触发,临时实体被创建后,还要决定其从哪一个端口发送,然后执行发送,临时实体离开发生器。而在临时实体离开之前,发生器还激发了到达时间间隔触发。4 z; A- l' m7 p1 [' s7 E! H1 M0 H# _
本例中的每个实体都是以Engine事件开始,要么创建,要么接收。暂存区正是以接收实体事件开始:
9 [+ `) Y4 d5 e3 H4 X) s$ c
Time
3 T: e) |: f; ~) z' o2 }  
  Object* W5 l! c- U% @* t, H5 t
  
  Event
$ J4 `) A- r6 O5 M/ N6 e  
  Involved5 ^+ n6 G4 o- ^9 E
  
  P1
; t7 u" ~3 O& P, v  
  5.303038
2 Q4 Y( l6 U$ d4 ~  
  /Queue4$ @3 j" \0 m; k6 S8 q0 Z) I
  
  Engine: Receive Object+ {5 z, `4 v- t* @# M/ f, x
  
  /Queue4/Box% `* {1 C4 Q; D3 |1 ]% O
  
  
6 V3 k) b/ t8 I( a1 s" g4 l+ X5 ?4 z
  
  5.3030380 N5 m* L3 L# y, j. J+ s& B, r# H
  
  /Queue4
! X' M0 O2 }, S4 n3 R% L6 K/ j% ]  
  Trigger: OnEntry
, `" d0 O! c" E. W  
  /Queue4/Box
9 S# O. j& f0 J& ~# t  
  port: 1.03 ?& d& x2 c$ a
  
  5.303038
# i: ?: X; j5 z) ?* x" P  
  /Queue4
3 t' D5 h( N) S. P8 a  
  Trigger: OnEndCollecting- b/ l% e  X' s: `' R7 _
  
  /Queue4/Box+ u! n% ?; i6 f6 W# t8 X& X
  
  batchsize: 1.0
/ D3 ~2 }- q. Z0 `) y# S! W  
  5.303038
# a) j4 p7 ]# [: ]# H3 i  
  /Queue4
) U! O( K# |( s& J+ P" J$ A  
  Trigger: Send To Port
4 a$ B4 I7 m! {% T& l2 E) `( F( S  
  /Queue4/Box. L  c! @  L. S3 n" c) |* C/ T3 e
  
  ; d9 s/ s$ j+ P' _0 j4 Z

: ]- U1 e. D& o! m2 {6 f! X# y# @  
  5.303038+ W3 |4 m( [+ M( K$ f
  
  /Queue45 C/ @. U+ d  i6 E5 ~
  
  Engine: Send Object
4 u3 A5 n# u; Z' u+ q5 l. i* {  
  /Queue4/Box
0 x/ Z' Z% ^  p- I) B: `7 @  
  % r6 b: {, i3 g+ ^. x
0 z) ]1 `3 B3 }: }! W: e& m
  
  5.303038+ x# J8 c4 F5 d0 w4 g7 h6 b7 q; Y
  
  /Queue4
7 ]8 |" z, z) I! c) t  
  Trigger: OnExit
) t% T4 b- k) `7 Y: o( m# H! ~+ E! K  
  /Queue4/Box+ i$ X, E2 g* ^/ w+ M2 R- g
  
  port: 1.0
& `9 _& X7 P% |! ?) ^  
接收实体之后激发了进入触发,然后判断批次,获取发送端口,执行发送,最后离开暂存区。4 b7 m) D+ J7 b! P4 W
货架同样以接收临时实体开始:
( Q0 h/ w! W) w  X$ w3 ?8 i0 [
  Time
! y0 H5 ?' B; P2 Q8 ?' h  
  Object" N+ p5 @' M0 w; W% @
  
  Event, y( }' S; r) q/ [4 R9 V2 d  |
  
  Involved) R( D% T* Z* z  v9 r% D* S$ x, W
  
  P1# k$ P  x! [2 O6 D3 ?) B
  
  5.303038
2 `4 b8 Y" c4 p$ H7 a1 R  i  
  /Rack4* N  P; E# _! }& Z  f% {
  
  Engine: Receive Object
) L: J8 V7 K/ H# ^  
  /Rack4/Box
3 s" O4 W, b5 O( U5 t$ ~: `+ M  
  
) s  u. m0 l# H/ b$ J2 |, o+ P: a" a( P; d
  
  5.3030388 [! h- G4 I3 S( Q$ w4 K
  
  /Rack41 _' `& J' I$ ?: Z) J( L
  
  Trigger: Place in Bay
8 g* [$ O2 V, c- Q  
  /Rack4/Box
+ R$ J1 v- z2 v; p7 m' S  
  * ~& w/ v# w7 k

7 F1 ~! Q5 j& x) i  O; [  
  5.3030389 n* v' K2 |, ^) j3 Z/ Q
  
  /Rack4) f) N" S) Z# [  Y9 ?( p3 m2 e
  
  Trigger: Place in Level( F$ o# K: L. A/ ~; o2 c/ C8 s) B9 j
  
  /Rack4/Box
' E6 E6 P& h/ u% g6 I  
  bay: 3.02 B! s3 h( t7 R, q# z. b& j
  
  5.303038  G1 F% [" j$ T% d
  
  /Rack4
/ c/ n: {, t5 g* J  `1 @; |  
  Trigger: OnEntry; h- |, r; }  y2 x$ L! I
  
  /Rack4/Box! z/ F( r+ k$ ]% H
  
  port: 1.0
' ]3 Q9 l3 P9 y+ v' V2 l3 ~  
  5.303038! ]& O' a* M) e5 w' E$ J* s
  
  /Rack4: E" ?, e" X: ?* J" c
  
  Trigger: Minimum Dwell Time
! O1 Z# ~' {9 w0 A2 X, B0 ?  
  /Rack4/Box  e) |! E5 K8 t' h) n! v/ B. [  x
  
  port: 1.03 V+ v) [4 z4 H
  
  5.303038
! |  g" ^6 D. F; q- R- y  
  /Rack4
% y9 p. s# u3 N& r- i6 u  
  Engine: Timed Event
) _2 k+ h% `# F% D, Q' z0 k' a  
  /Rack4/Box. |) W6 v+ I8 W1 v7 b. F9 K2 y4 E
  
  EVENT_PROCESSFINISH8 |  u7 W2 N3 l# h
  
  5.3030389 f( v1 Q% r! W; l9 _' J
  
  /Rack4
5 x% h/ c; x0 a+ @2 N( O" I  
  Trigger: OnEndDwellTime
' U. _/ n, K% ~. ]) }  
  /Rack4/Box
# S% ~$ b/ l9 p7 o  
  3 N8 a% G( e6 [
8 u  v, O6 e' R( X' \
  
  5.3030387 y6 S0 l# f4 V: ~5 a
  
  /Rack46 S0 o' |) d% o  e4 B' o! a, x
  
  Trigger: Send To Port) m& L( \4 I: ?  p" U  X
  
  /Rack4/Box
$ e; i0 l5 Y9 J0 l  
  ; `. D! ?  M( R7 l. q

- D4 v. T6 }" u0 C* f- L' ?  
接收临时实体之后依次判断应该放置在哪一列、哪一层,然后激发进入触发,临时实体进入货架之后需要获取其在货架最短停留时间,由于这里设置的最短停留时间是0,所以随即激发定时事件PROCESSFINISH(如果是停留结束会更合理、更便于理解),再激发“停留时间结束触发,最后获取发送端口。由于本例中并没有为货架指定下游端口,所以这里没有执行”Send Object“事件,也没有离开触发。
3 H9 {/ t  x0 ~接下来的其他时间节点都是在重复着同样的事件和触发,直到货架被摆满。
7 U+ ?$ i5 R7 @; ?2 I- E通过Event Log工具,我们可以详细的分析每一个实体的工作机制。比如可以分析推式策略、拉式策略的不同,比如可以调用运输工具,添加任务序列,来分析任务的优先级别、先占级别的处理机制等等。
7 }. C1 u+ ^! Z- U8 a5 x6 j& F, z# H+ K: ~. J

! e  a0 S1 i' j& C% H' I- t2 S( _3 J/ H4 {

本帖子中包含更多资源

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

x
2#
1010265352 发表于 2015-9-23 14:04:53 | 只看该作者
学习啦
3#
FFFrenk 发表于 2015-9-24 12:04:12 | 只看该作者
感谢分享event log的使用方法!讲得很详细!
( q: M8 m/ W  B( h, I: I6 \. ], ?
/ u' M# [7 ]6 J& }. N* v8 F7 |* N
文中出现其了一处与我理解不同的地方,我贴上来,一起讨论讨论~; J& ?6 v# N0 F' Z# `# K. h6 p

$ t/ p4 U5 ]4 Q* M1 F3 a* ^" f8 w3 j0 Y“重置的顺序并不是按照模型逻辑,而是按照实体创建的顺序。”5 H: ]( D3 Z) r/ G
并不是实体创建的顺序,flexsim中并没有一个节点存放实体创建的时候(临时实体有)。3 N) J9 M; N% o6 o; g
这是因为,先拉到模型中的实体的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 | 只看该作者
我也说一点:( [; i) {$ y  ]& f& F
在事件日志中,涉及的实体一般都是box,这样我们很难区分到底是哪一个触发的,如果需要,我们可以对产生的临时实体进行重命名,编号处理,这样就可以知道就哪一个临时实触发了什么。
9#
manaijin 发表于 2016-4-12 11:04:30 | 只看该作者
对软件的运行机制学习很重要。
10#
慧娴亚伦 发表于 2016-4-13 09:32:49 | 只看该作者
我也说一点:
. l9 P% g5 g1 N- c* N' J' \在事件日志中,涉及的实体一般都是box,这样我们很难区分到底是哪一个触发的,如果需要,我们可以对产生的临时实体进行重命名,编号处理,这样就可以知道就哪一个临时实触发了什么。
7 C0 k0 D" l; I3 f# l8 \8 e9 I657776724 发表于 2015-9-26 18:00
. l0 M  {1 Z% o; T( z9 [

' L& J. F2 O/ ^8 S7 |1 n/ U6 ~3 P一个好消息:最新的2016版本已经自动区分在不同实体上面不同rank的实体了,这样就使得debug的过程更加简单方便快速~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-5-6 23:18 , Processed in 0.087177 second(s), 14 queries .

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

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