全球FlexSim系统仿真中文论坛

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

作者: zorsite    时间: 2016-3-22 11:18
标题: 【讨论】flexsim发生器生成临时实体的机制分析
本帖最后由 zorsite 于 2016-3-22 12:19 编辑 9 v' {$ D4 M5 R- l4 F
. o2 p5 t& d. Y2 y2 I' M- u
目标:+ x& b3 c% g% P3 p
1.首先要搞清楚Source的工作原理: L2 |" Z6 K! ~8 `' }; @/ ?
2.根据原理编写代码,让Source成批次的生成某个数量的临时实体。
) z, Q4 n! l2 e7 [; u" f, j4 W试验模型如下图所示:' ~  x8 ?4 s, d$ x. {) M
[attach]2997[/attach]
, A/ M) A8 O' w3 `% P6 P! @使用Event Log工具,分析Source的工作原理。
. m) C. D2 Z. G [attach]2998[/attach]
8 R2 x) [7 Z6 F: C+ d) ~; |) z$ @: l由日志文件可以看出,Source遵循以下工作原理:
% b/ G* N* h+ X% M. i3 f模型重置时:激发Inter-Arrival Time触发,获取第一次生成临时实体的时间t1
4 I; H( n; V, P/ k& Y  H当模型时间到达t1时,激发Engine事件Timed Event: CREATEPART,生成一个临时实体,在被创建的临时实体离开Source之前,再一次激发Inter-Arrival Time触发,获取下一次生成临时实体的时间t2
" N; [6 O5 ^) m! `当模型时间到达(t1+t2)时,重复上一步骤
' S+ l( ^; x( S6 H$ T7 F. K循环执行以上步骤,直到某些条件得到满足(比如下游暂存区达到最大容量无法接收临时实体)
1 \3 E% y) I2 d' b0 ]* c& e, o7 e如何让Source一次性生成多个临时实体?# h, z/ V, ^" Z5 |
经过分析我们知道了Source的触发机制:
6 I3 F5 h7 }) n+ }! I6 L0时刻获取t1
1 {) ?8 M8 Z$ K8 Pt1时刻获取t29 q- M3 G6 t8 l/ J
(t1+t2)时刻获取t36 u2 H4 m4 V8 U  ^: l8 z
(t1+t2+t3)时刻获取t4% s9 m" B" g( B8 a6 y0 d6 G
……  L1 D9 \# ^- ^  l; @2 }, W: ~

" J% B7 `' Q6 O4 y0 w" |以本模型为例:每2个时间单位生成一个临时实体。
& ?! D. n5 s7 D第0时刻返回t1=2% K8 R6 F' k2 E& l" d
第(t1时刻)生成1个临时实体,同时返回t2=2
0 j: T' Q0 D/ R2 b5 T% D: P第(t1+t2时刻)生成1个临时实体,同时返回t3=2
2 |0 r- q" {$ ]# {! t第(t1+t2+t3时刻)……- i* X- q: W+ x1 N+ M6 }
如果第(t1时刻)时返回t2=0呢?8 {- f$ f6 y- m4 ~7 r
第0时刻返回t1=2
/ U9 a% w8 J5 R; Q  q* F2 Y% ]第t1时刻返回t2=0# S9 d) ?. J& _; I* k2 [
第(t1+t2)时刻返回t3=2
1 e) h0 l9 V: x, M' o你会发现在第2时间单位的时候生成了2个临时实体9 ~) U. h7 O2 z/ p' D; T
& M" }! `3 b1 @" }: n
思路
8 l3 a$ F* J; ]/ b3 t; x% [引入一个计数器,让计数器来控制返回时间=0的次数,就可以控制批次数量。假设批次数量为5:
2 X9 ~2 U$ I; K  X* ?6 N5 V[attach]3003[/attach]
; l2 }, w% z' |' q, L4 q! Z代码
  1. int batchnumber = 5;# }6 t- N) }; q6 U3 N5 z1 P$ q
  2. double cycletime = exponential(0,10);- _4 t7 d# W4 T/ h: W  A
  3. string labelName = "批次数量";! h2 T; o* g$ ^* X& _3 L
  4. treenode curlabel = assertlabel(current, labelName, DATATYPE_NUMBER);! I  c* n& c0 Q
  5.   X" C* x* i% g3 C+ }# o9 L
  6. if (time()==0 || getnodenum(curlabel)==1)
    9 _% C9 g  y0 x1 a$ O1 i/ _
  7. {  setnodenum(curlabel,batchnumber);
    1 |* B- l# }+ V
  8.   return cycletime;}
    % N: U) ~1 ?3 K6 z* \1 }* a
  9. else 2 F% S- }( W$ f4 Y$ l! u$ J
  10. {  inc(curlabel,-1);
    / T7 T2 ^5 y! i) d6 h0 Z5 T
  11.   return 0;}- M) k2 v5 Y& g& ]' |
复制代码
PS:+ {' u6 ^. w) X; d  ]
1.本段代码有不完善之处。
4 ^& D1 |  i4 W/ l4 \0 c$ _2.发生器产生临时实体的三种方式,其内部逻辑有一些差别。) x7 b3 J  |& D- o
3.请参考我的另一篇帖子:如何手动控制临时实体的产生http://flexsim.asia/viewthread.php?tid=6171&
作者: 慧娴亚伦    时间: 2016-3-22 12:20
加老师对于发生器产生临时实体的机制研究比较深入。& ]' I) }( g+ L, o& ]/ t) s
我个人觉得对于正式版用户而言,如果只是让发生器产生一个间隔的话,直接下面搭配一个分解器,就可以了在一个间隔产生多个产品了,这是一个更简单的建模思路。




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