全球FlexSim系统仿真中文论坛
标题:
【讨论】flexsim发生器生成临时实体的机制分析
[打印本页]
作者:
zorsite
时间:
2016-3-22 11:18
标题:
【讨论】flexsim发生器生成临时实体的机制分析
本帖最后由 zorsite 于 2016-3-22 12:19 编辑
% C- v+ o" ]8 ~6 X$ s
( r5 O9 k/ _# x2 |# a% }
目标:
7 M! @4 A% m6 A6 N: w
1.首先要搞清楚Source的工作原理
; A1 T; ^! t& u9 V" V
2.根据原理编写代码,让Source成批次的生成某个数量的临时实体。
9 ]" V2 ?8 d8 o. i
试验模型如下图所示:
+ g9 v; F) c4 h8 v
[attach]2997[/attach]
3 T: n4 k7 h7 P8 r
使用Event Log工具,分析Source的工作原理。
) k( q" U% T7 Q3 ^5 n
[attach]2998[/attach]
, k0 ^ z0 D) Q8 O& ~# y, b o
由日志文件可以看出,Source遵循以下工作原理:
. ?$ H, j7 V. C; g
模型重置时:激发Inter-Arrival Time触发,获取第一次生成临时实体的时间t1
* F/ l6 D( m' L- R h# P/ ]1 T8 q9 b
当模型时间到达t1时,激发Engine事件Timed Event: CREATEPART,生成一个临时实体,在被创建的临时实体离开Source之前,再一次激发Inter-Arrival Time触发,获取下一次生成临时实体的时间t2
+ D& r3 F# Y0 _# j/ k7 ]" U7 r
当模型时间到达(t1+t2)时,重复上一步骤
" A1 W- Z9 X U
循环执行以上步骤,直到某些条件得到满足(比如下游暂存区达到最大容量无法接收临时实体)
9 R7 \- j p, w/ D
如何让Source一次性生成多个临时实体?
! ~. a7 g, A* F% {; M( ?
经过分析我们知道了Source的触发机制:
5 ]+ @6 [7 r5 u1 q9 R) u
0时刻获取t1
+ L, R2 Z& l3 }; {
t1时刻获取t2
5 _; Y3 r2 l( h9 t" R5 T# V" o
(t1+t2)时刻获取t3
* i! _4 }% ]4 L6 x7 s3 s N% L. R
(t1+t2+t3)时刻获取t4
( h7 I0 l2 |; C
……
5 ^& ^1 X- ?$ D/ h/ d
# C$ B: e- z+ D
以本模型为例:每2个时间单位生成一个临时实体。
. `- x4 {% m& Q( ?+ {# Y2 T* E% _' y
第0时刻返回t1=2
) a/ v0 w" p9 _: U9 \
第(t1时刻)生成1个临时实体,同时返回t2=2
9 R) @7 _1 w$ `/ H% ^6 b
第(t1+t2时刻)生成1个临时实体,同时返回t3=2
7 b' w+ [8 o: D5 M: {
第(t1+t2+t3时刻)……
, H- i1 M1 u3 i4 l8 e
如果第(t1时刻)时返回t2=0呢?
: T. _* c& S$ J/ U& D8 _1 p/ z
第0时刻返回t1=2
# t: M c( W' z/ Q- g$ `
第t1时刻返回t2=0
3 ^ B l8 y! U1 e* h7 c
第(t1+t2)时刻返回t3=2
1 L3 w8 m& f0 u: q8 P; m
你会发现在第2时间单位的时候生成了2个临时实体
- j6 d7 K1 z, a
4 }: {8 p: i% n8 G
思路
0 u, f) O* c% m9 k7 t
引入一个计数器,让计数器来控制返回时间=0的次数,就可以控制批次数量。假设批次数量为5:
4 R! q* w3 b, N' K: O5 k* g
[attach]3003[/attach]
0 M( l, s% X2 i5 U& U+ i
代码
int batchnumber = 5;
- i' P0 d& l6 ^( o7 @( r, [% n
double cycletime = exponential(0,10);
H( ~1 W4 I) ?" Z$ C% i
string labelName = "批次数量";
! u$ q# T$ S4 Q0 U$ h
treenode curlabel = assertlabel(current, labelName, DATATYPE_NUMBER);
$ z+ g* f1 a( J. M
]- S& j* I. A! j6 j8 u
if (time()==0 || getnodenum(curlabel)==1)
' S/ `# [1 j+ b
{ setnodenum(curlabel,batchnumber);
# d7 \; b G2 S5 X( f2 Y
return cycletime;}
6 ^' X" t% {2 _% J
else
: i# _: B0 [ E8 t( |
{ inc(curlabel,-1);
3 ]" ? H7 y0 u' \
return 0;}
& W; b5 h7 ?+ ~% Z
复制代码
PS:
- |3 }$ Y! l9 l& T" v
1.本段代码有不完善之处。
/ B/ u! y! w. c% l3 P
2.发生器产生临时实体的三种方式,其内部逻辑有一些差别。
. d3 r. E' g3 K! m/ \
3.请参考我的另一篇帖子:如何手动控制临时实体的产生
http://flexsim.asia/viewthread.php?tid=6171&
作者:
慧娴亚伦
时间:
2016-3-22 12:20
加老师对于发生器产生临时实体的机制研究比较深入。
4 y; a; J7 r- [5 K; j8 p5 V
我个人觉得对于正式版用户而言,如果只是让发生器产生一个间隔的话,直接下面搭配一个分解器,就可以了在一个间隔产生多个产品了,这是一个更简单的建模思路。
欢迎光临 全球FlexSim系统仿真中文论坛 (http://www.flexsimasia.com/)
Powered by Discuz! X3.3