全球FlexSim系统仿真中文论坛

搜索
查看: 6401|回复: 1
打印 上一主题 下一主题

【讨论】flexsim发生器生成临时实体的机制分析

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-3-22 11:18:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-3-22 12:19 编辑
) s3 K3 D1 A- R7 S! Q0 x. J" U, y* z. @! v8 y: @
目标:' z( U" ?0 Q1 N& D
1.首先要搞清楚Source的工作原理
* c, k* B, ], i" M* x9 C9 }4 B( \2.根据原理编写代码,让Source成批次的生成某个数量的临时实体。
* y- x5 [! Y; |) P试验模型如下图所示:) K& A! }0 m6 s6 N
" G' H' g8 i# ~
使用Event Log工具,分析Source的工作原理。+ D% `* G/ Y$ N" ]3 j
& g- K1 r! B, `' D& n
由日志文件可以看出,Source遵循以下工作原理:3 [3 v7 w4 d0 m1 z. T) o8 P; A& f
模型重置时:激发Inter-Arrival Time触发,获取第一次生成临时实体的时间t1/ D$ J* A& \8 v: ?) }$ R
当模型时间到达t1时,激发Engine事件Timed Event: CREATEPART,生成一个临时实体,在被创建的临时实体离开Source之前,再一次激发Inter-Arrival Time触发,获取下一次生成临时实体的时间t28 |9 u3 f3 i2 z* \5 h% C- a+ @5 `
当模型时间到达(t1+t2)时,重复上一步骤
  S0 E  u9 `9 h0 R) _循环执行以上步骤,直到某些条件得到满足(比如下游暂存区达到最大容量无法接收临时实体)
; U# b" U- m8 _如何让Source一次性生成多个临时实体?6 @& N  N& |8 n! x
经过分析我们知道了Source的触发机制:( a/ K* z6 J) M0 S, `
0时刻获取t18 N+ U. @9 X, V% D) g" X
t1时刻获取t2) z6 ~, f, f) B7 d( L# A( J0 F+ o% L
(t1+t2)时刻获取t3- Z& E( U4 x0 B5 @. B9 Y% \
(t1+t2+t3)时刻获取t4! g5 C5 G' }! A- ^8 |( d8 F3 P
……
$ O! p2 ?+ z8 f8 `5 B
' A2 O0 z9 H" d9 K: Q. p以本模型为例:每2个时间单位生成一个临时实体。
. h2 c5 ~$ N6 t) }: t* I9 }第0时刻返回t1=2
2 b  \! {+ k2 R. G第(t1时刻)生成1个临时实体,同时返回t2=24 X4 P! `5 z+ W. A) i
第(t1+t2时刻)生成1个临时实体,同时返回t3=2
0 I3 T% k5 w( n1 o: }第(t1+t2+t3时刻)……0 l- K# B0 K; j5 A8 G2 P$ C
如果第(t1时刻)时返回t2=0呢?
7 _5 ?% f! `0 V7 w6 X第0时刻返回t1=2
2 S$ L% V; N) L7 t第t1时刻返回t2=0: W. D. v! Q# n; P. Z, Y2 f8 o
第(t1+t2)时刻返回t3=22 d: O7 f( @( U) o& V6 N
你会发现在第2时间单位的时候生成了2个临时实体
# G' G0 x2 k9 {1 i$ P1 F
7 p1 f, H2 P2 y思路
& q2 W0 x2 b4 P+ f9 }引入一个计数器,让计数器来控制返回时间=0的次数,就可以控制批次数量。假设批次数量为5:* S' _* E* Y! m8 w; l7 k  {! e7 K
$ N$ H; q0 k3 w
代码
  1. int batchnumber = 5;  T" S4 T9 M& z: W# L/ R
  2. double cycletime = exponential(0,10);  Y4 {% @8 x9 B8 `) ~% v- _$ g2 I
  3. string labelName = "批次数量";* C% U$ Y- M- i  x4 j8 Y! U, }
  4. treenode curlabel = assertlabel(current, labelName, DATATYPE_NUMBER);
    " s4 @! q7 Z  y7 s' i4 g

  5. 9 R& g# k! U7 v3 N
  6. if (time()==0 || getnodenum(curlabel)==1) ' H. U9 g  t1 P; L. _! R
  7. {  setnodenum(curlabel,batchnumber);
    9 I- b( x' L: c5 I) L
  8.   return cycletime;}
    / t& }7 O% D7 A/ d% j/ L
  9. else
    . C+ q4 p. F+ d& v/ x, A
  10. {  inc(curlabel,-1);
    * [* R8 H  F7 m- f* c, {
  11.   return 0;}
    # A' T3 G' T- D
复制代码
PS:3 B$ t) V, M4 E: V0 }' l. C
1.本段代码有不完善之处。
% u5 J' }" Y* \/ r) M% O0 Z2.发生器产生临时实体的三种方式,其内部逻辑有一些差别。" ^" P6 C  a( g; x0 a: O' V
3.请参考我的另一篇帖子:如何手动控制临时实体的产生http://flexsim.asia/viewthread.php?tid=6171&

本帖子中包含更多资源

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

x

评分

参与人数 1威望 +20 收起 理由
大摸鱼 + 20

查看全部评分

2#
慧娴亚伦 发表于 2016-3-22 12:20:51 | 只看该作者
加老师对于发生器产生临时实体的机制研究比较深入。( S7 M1 J( [$ l; W
我个人觉得对于正式版用户而言,如果只是让发生器产生一个间隔的话,直接下面搭配一个分解器,就可以了在一个间隔产生多个产品了,这是一个更简单的建模思路。

评分

参与人数 1威望 +10 收起 理由
大摸鱼 + 10

查看全部评分

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-10-25 04:35 , Processed in 0.061159 second(s), 15 queries .

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

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