全球FlexSim系统仿真中文论坛

标题: 【讨论】flexsim发生器生成临时实体的机制分析 [打印本页]

作者: zorsite    时间: 2016-3-22 11:18
标题: 【讨论】flexsim发生器生成临时实体的机制分析
本帖最后由 zorsite 于 2016-3-22 12:19 编辑 5 ~. }  S  B8 ^' {1 ^3 p
0 v+ r, g0 h; x
目标:( {, p9 [3 C: G3 P( Z: \. V
1.首先要搞清楚Source的工作原理
8 X" u6 a2 O' d3 `2.根据原理编写代码,让Source成批次的生成某个数量的临时实体。0 i: Z5 r. s; M! }5 S
试验模型如下图所示:2 j) m" w7 g: ]& N, F: d6 R/ G3 |
[attach]2997[/attach] ) y! ^% b- F: \6 b4 q: s
使用Event Log工具,分析Source的工作原理。+ C9 I, i) ~/ P0 k/ B  r
[attach]2998[/attach]. P1 Z" U: J8 a) `; Y, C
由日志文件可以看出,Source遵循以下工作原理:6 L+ f( F, n7 E& [9 Y3 N
模型重置时:激发Inter-Arrival Time触发,获取第一次生成临时实体的时间t16 {" F) C2 G# @0 l3 S) r. j
当模型时间到达t1时,激发Engine事件Timed Event: CREATEPART,生成一个临时实体,在被创建的临时实体离开Source之前,再一次激发Inter-Arrival Time触发,获取下一次生成临时实体的时间t2# k$ u! O2 \" F$ z( w
当模型时间到达(t1+t2)时,重复上一步骤
+ Y% e1 l- L6 \1 W' }循环执行以上步骤,直到某些条件得到满足(比如下游暂存区达到最大容量无法接收临时实体)1 Q6 t$ k- z% n* q8 R8 ^
如何让Source一次性生成多个临时实体?0 t3 K. e+ F3 v( u' ^/ }
经过分析我们知道了Source的触发机制:) N+ G; w! W+ D- M
0时刻获取t1& Z; U( o9 B) ?; h/ J
t1时刻获取t2. @7 P+ L2 _& q% ?
(t1+t2)时刻获取t3$ L7 z, I" M2 ?5 u$ g
(t1+t2+t3)时刻获取t4
; ~) F; `) f! _. M  z1 v  p……
  A' x# @! y. Z/ `+ C7 m2 X: c
% V1 T2 a( e' m以本模型为例:每2个时间单位生成一个临时实体。
; W, E+ I& g: I第0时刻返回t1=2
8 T  \- B9 d& l  ]9 s3 y: w5 w第(t1时刻)生成1个临时实体,同时返回t2=2% o, v. q7 f. x- E" l  ]$ t
第(t1+t2时刻)生成1个临时实体,同时返回t3=2: |4 P/ s3 u, Z+ a3 ~9 I
第(t1+t2+t3时刻)……
+ C) {, l/ d  m如果第(t1时刻)时返回t2=0呢?+ I) H# \+ w) g4 K9 D
第0时刻返回t1=2/ g: r! h$ O* V8 K
第t1时刻返回t2=0
. T5 E# w1 A: a. A1 h) Z+ b第(t1+t2)时刻返回t3=2+ J0 F9 y0 x# ^, C' I
你会发现在第2时间单位的时候生成了2个临时实体( A- i, j; G: h  N" u& A- t! {
, f. @# ^, d) Z) [7 z. q
思路
( G1 z( Y  h- s: h) p7 m引入一个计数器,让计数器来控制返回时间=0的次数,就可以控制批次数量。假设批次数量为5:
$ N4 O9 R6 U9 G( d9 K[attach]3003[/attach]
/ i1 k9 u, V/ r8 _3 ~* l' R1 P代码
  1. int batchnumber = 5;
    0 e, Y1 k! _6 o2 {% o
  2. double cycletime = exponential(0,10);8 f% h" o* Z! w$ y
  3. string labelName = "批次数量";
    3 }; w+ a1 ]8 j3 u/ P% C; g8 @
  4. treenode curlabel = assertlabel(current, labelName, DATATYPE_NUMBER);
    ) u  F" d- E1 v+ K% d, m6 n
  5. " O& P2 b* `) \' k; {7 E
  6. if (time()==0 || getnodenum(curlabel)==1)
    / U1 |1 ]+ L  t
  7. {  setnodenum(curlabel,batchnumber);
    ) r- [- b) u) `2 {' ^4 H
  8.   return cycletime;}
    ! K$ V8 u; Z5 h8 w+ d% g
  9. else
    1 l4 ~* p. b0 N# K  z/ H
  10. {  inc(curlabel,-1);
    2 n. c. w2 e% T9 A& u- Y* X
  11.   return 0;}
    ( r  K# n2 X" A- p; f
复制代码
PS:7 w: R! x* n* ]* p- N: G
1.本段代码有不完善之处。+ n+ a8 I" t1 v( S' O
2.发生器产生临时实体的三种方式,其内部逻辑有一些差别。
* {  j6 P8 S; s* E/ Z4 c% `3.请参考我的另一篇帖子:如何手动控制临时实体的产生http://flexsim.asia/viewthread.php?tid=6171&
作者: 慧娴亚伦    时间: 2016-3-22 12:20
加老师对于发生器产生临时实体的机制研究比较深入。
: b9 Y. V7 T) J我个人觉得对于正式版用户而言,如果只是让发生器产生一个间隔的话,直接下面搭配一个分解器,就可以了在一个间隔产生多个产品了,这是一个更简单的建模思路。




欢迎光临 全球FlexSim系统仿真中文论坛 (http://www.flexsimasia.com/) Powered by Discuz! X3.3