全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-3-22 11:18:14 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 zorsite 于 2016-3-22 12:19 编辑 8 c7 b: r( O5 Q, G1 q) m/ k
0 X9 {7 l$ c& w5 P0 J
目标:% B$ h& K0 n- b4 O! e( Q
1.首先要搞清楚Source的工作原理
8 T/ P# Y  b! K$ p2.根据原理编写代码,让Source成批次的生成某个数量的临时实体。
! j* x  R- _0 v+ |3 S试验模型如下图所示:: `2 z2 ?6 I. `

- J) O* N2 L! f0 \- @# U使用Event Log工具,分析Source的工作原理。6 h) ?- N1 T. e( [8 ]

4 P+ d5 F! o  X# U由日志文件可以看出,Source遵循以下工作原理:; _5 j- A5 D4 j$ ]7 G' X
模型重置时:激发Inter-Arrival Time触发,获取第一次生成临时实体的时间t1; z0 t+ g( ]+ L7 }6 }, i' k5 g
当模型时间到达t1时,激发Engine事件Timed Event: CREATEPART,生成一个临时实体,在被创建的临时实体离开Source之前,再一次激发Inter-Arrival Time触发,获取下一次生成临时实体的时间t2
' X  Y; }/ g  P# T" H1 S! D1 [当模型时间到达(t1+t2)时,重复上一步骤1 P5 S$ a- Z1 q& l* @
循环执行以上步骤,直到某些条件得到满足(比如下游暂存区达到最大容量无法接收临时实体)
, ^# ]- X* Q: o1 q, W  C如何让Source一次性生成多个临时实体?
" `4 x& Q4 g2 F3 p经过分析我们知道了Source的触发机制:2 z6 |) u; s3 A, |+ G; D% k( U
0时刻获取t1* j& A& a4 k% S
t1时刻获取t2
9 X& ^7 V6 t# i- b(t1+t2)时刻获取t3
$ Q( y( H7 x" o" k* b6 X(t1+t2+t3)时刻获取t4
# w8 d- e& P' c$ P) f1 @3 [  j……
5 G1 {, \" W- M6 m8 K# S# ]+ K% u4 q. m. H% A
以本模型为例:每2个时间单位生成一个临时实体。
5 k" e* w0 Z# ?% Q第0时刻返回t1=28 m% a/ q/ k+ t) z% Q4 F$ h. ?; w
第(t1时刻)生成1个临时实体,同时返回t2=2
3 [7 i/ i- F& X! ]8 J第(t1+t2时刻)生成1个临时实体,同时返回t3=2
  ~: z# v. S1 `3 @" I5 W4 _9 _9 G第(t1+t2+t3时刻)……( q) G) ?0 z9 V0 q
如果第(t1时刻)时返回t2=0呢?: G2 e, C0 b: g6 s1 Y
第0时刻返回t1=24 K, l  b& _! m/ S$ s* A
第t1时刻返回t2=0) Q8 y9 O9 T! Y! c6 q' n
第(t1+t2)时刻返回t3=2! [" a1 ]- ~7 D& }2 N
你会发现在第2时间单位的时候生成了2个临时实体; C; w/ V. I) |1 k

8 X( t: ?' D& @% ?$ _思路
8 G9 C2 B5 G" e2 A4 [+ O. O- i引入一个计数器,让计数器来控制返回时间=0的次数,就可以控制批次数量。假设批次数量为5:; C! [7 z  {6 x" s3 o* O% G

' M6 J3 \  u- q' I& W" t代码
  1. int batchnumber = 5;$ }$ p' Z: d, E+ z% ~5 {
  2. double cycletime = exponential(0,10);" }4 Y# M* a+ F+ F* M; Q0 m5 A6 T
  3. string labelName = "批次数量";
    * S1 y+ @2 s3 A+ c  k6 L, @! g
  4. treenode curlabel = assertlabel(current, labelName, DATATYPE_NUMBER);
    % ~# E0 }( j9 U$ f# z

  5. ) u$ E% n  W" u0 \
  6. if (time()==0 || getnodenum(curlabel)==1)
    3 P+ F) O; f9 q) f; O- o6 ?# i
  7. {  setnodenum(curlabel,batchnumber);: J# `% N2 z8 f" O1 O  s( C
  8.   return cycletime;}2 \6 Z- |8 q3 u9 R  T; X/ n
  9. else   s% n% [# t# u2 a( ~% M" Y( \) S
  10. {  inc(curlabel,-1);& ~3 c; `* K5 \3 w+ a" Q! }4 ~
  11.   return 0;}, m: C( K# Y$ ]0 P+ i4 Y; _
复制代码
PS:
7 A" x4 ]8 Y7 o1.本段代码有不完善之处。+ b7 d, z6 p6 a1 }$ H) s
2.发生器产生临时实体的三种方式,其内部逻辑有一些差别。- w& v# F9 N( v  c* r! ?
3.请参考我的另一篇帖子:如何手动控制临时实体的产生http://flexsim.asia/viewthread.php?tid=6171&

本帖子中包含更多资源

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

x

评分

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

查看全部评分

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

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2025-9-6 10:36 , Processed in 0.080942 second(s), 16 queries .

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

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