全球FlexSim系统仿真中文论坛

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

作者: zorsite    时间: 2016-3-22 11:18
标题: 【讨论】flexsim发生器生成临时实体的机制分析
本帖最后由 zorsite 于 2016-3-22 12:19 编辑 , M* b3 y: I+ d3 @
$ L/ h) X& C  e- a  T
目标:
* S" ]5 K  R' f- i1.首先要搞清楚Source的工作原理
- P2 l! o! g' f, [$ E* a2.根据原理编写代码,让Source成批次的生成某个数量的临时实体。9 d: r" r# q$ F/ A  Y# q
试验模型如下图所示:
. ]  V8 E/ E+ X[attach]2997[/attach] , x* D7 r+ ^! P  f9 v; C
使用Event Log工具,分析Source的工作原理。
3 Z6 H6 E1 ~- }/ ] [attach]2998[/attach]
8 x. m- W. O0 l! f由日志文件可以看出,Source遵循以下工作原理:  P7 a7 V. N% h+ r- s; O
模型重置时:激发Inter-Arrival Time触发,获取第一次生成临时实体的时间t1- o4 ]2 H2 g5 \5 f6 V0 x
当模型时间到达t1时,激发Engine事件Timed Event: CREATEPART,生成一个临时实体,在被创建的临时实体离开Source之前,再一次激发Inter-Arrival Time触发,获取下一次生成临时实体的时间t2
: {# X/ S- A* J6 t( D当模型时间到达(t1+t2)时,重复上一步骤2 w! [$ h$ H  ~0 B* p0 _! `
循环执行以上步骤,直到某些条件得到满足(比如下游暂存区达到最大容量无法接收临时实体)* l  B: \$ {7 j
如何让Source一次性生成多个临时实体?
7 n, h( E! K0 r3 Q- ?7 c/ ]7 n经过分析我们知道了Source的触发机制:3 o% P% {$ M5 F  `5 i  `* s
0时刻获取t12 u  Y. y, c% Z# k8 l) Y& T8 ~& \
t1时刻获取t22 V: D* u4 L3 Y  O
(t1+t2)时刻获取t3
  I3 W& Y1 q( ]3 ?/ h(t1+t2+t3)时刻获取t4  v; [# g/ c1 ?6 q8 y7 K3 a
……
& j8 g5 g% a! K% s1 O8 n
9 G  N2 P0 u3 f6 }! d以本模型为例:每2个时间单位生成一个临时实体。
7 M+ d4 T  E1 P& `$ y0 ?9 H! A第0时刻返回t1=2
1 J  g1 ^2 h7 L# b9 `第(t1时刻)生成1个临时实体,同时返回t2=20 H8 {7 x4 j. p" f8 S9 ?
第(t1+t2时刻)生成1个临时实体,同时返回t3=29 X% W/ M- ]- G* n$ L3 \& V
第(t1+t2+t3时刻)……
( q) t( e6 ^6 R" K8 ~* u如果第(t1时刻)时返回t2=0呢?4 N6 {- q. E9 s: a, t* X
第0时刻返回t1=2, ?" u$ C, |4 S
第t1时刻返回t2=08 W0 j0 h, m% k) x% {+ k$ r
第(t1+t2)时刻返回t3=2  g. B$ G9 L: A- {2 z
你会发现在第2时间单位的时候生成了2个临时实体/ V9 G( w9 S" _0 [1 L, d5 T/ ]

9 x! w* o9 O% K思路' y9 y0 W2 c* i! ]( p: k0 `* H1 p0 |1 m
引入一个计数器,让计数器来控制返回时间=0的次数,就可以控制批次数量。假设批次数量为5:/ U, P- n5 f8 p
[attach]3003[/attach]
; F- a6 I+ X/ C' {' I1 s代码
  1. int batchnumber = 5;
    ( l; |9 V  j6 l5 f' Z& m, \+ M
  2. double cycletime = exponential(0,10);
    - s! h. M+ }) R9 K( ~! J" ?! m2 y
  3. string labelName = "批次数量";% a' }9 P$ W' ~& s
  4. treenode curlabel = assertlabel(current, labelName, DATATYPE_NUMBER);1 M' W8 N  T% ^& B( Z
  5. ! n  l5 ]9 L. R& \* h) T
  6. if (time()==0 || getnodenum(curlabel)==1)
    ) W" j- {/ T: l& d1 n
  7. {  setnodenum(curlabel,batchnumber);& G4 u# E& I/ p, Q% r
  8.   return cycletime;}% A$ E, j% E/ M% {" E; B
  9. else
    2 Y0 V, f  o3 ?$ e
  10. {  inc(curlabel,-1);/ S$ C. Y5 U1 G5 [
  11.   return 0;}  d: i. K' Q2 O# \4 L( |6 K1 ~. I9 B
复制代码
PS:
1 S- Y: S: n+ x, @$ U# B3 ^# S; }" l1.本段代码有不完善之处。" m# c* Z8 L' V% E
2.发生器产生临时实体的三种方式,其内部逻辑有一些差别。
) j2 p$ f- O& j8 q$ c% v3.请参考我的另一篇帖子:如何手动控制临时实体的产生http://flexsim.asia/viewthread.php?tid=6171&
作者: 慧娴亚伦    时间: 2016-3-22 12:20
加老师对于发生器产生临时实体的机制研究比较深入。: m  V( u4 W9 ]$ i
我个人觉得对于正式版用户而言,如果只是让发生器产生一个间隔的话,直接下面搭配一个分解器,就可以了在一个间隔产生多个产品了,这是一个更简单的建模思路。




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