全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-3-22 11:18:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-3-22 12:19 编辑 # h5 y2 w2 O0 ^/ I' k0 h; t, R
, {- [7 Y4 O  z0 r! ^
目标:
) v! [7 F. Y1 C: t* ^/ }0 ]8 C# E' d& Y1.首先要搞清楚Source的工作原理
9 N" f& h! F7 `2 y1 k2.根据原理编写代码,让Source成批次的生成某个数量的临时实体。
: h" R  Y6 j" q7 `1 j试验模型如下图所示:
9 W+ ^/ e7 c! D* e) |3 k/ X, A) { 8 p0 R$ e: {1 a) z  C0 f) P
使用Event Log工具,分析Source的工作原理。3 ~/ F1 u2 j+ r8 h( `- n
% H6 t1 ^: m* `4 X8 _& u
由日志文件可以看出,Source遵循以下工作原理:/ B7 S/ D; B7 [6 }  Q
模型重置时:激发Inter-Arrival Time触发,获取第一次生成临时实体的时间t10 Z3 F- w. e% |4 |/ g+ P4 y8 I
当模型时间到达t1时,激发Engine事件Timed Event: CREATEPART,生成一个临时实体,在被创建的临时实体离开Source之前,再一次激发Inter-Arrival Time触发,获取下一次生成临时实体的时间t22 u4 _8 y/ S# ^8 u+ D! j4 K
当模型时间到达(t1+t2)时,重复上一步骤, p4 v7 q# q# o, w4 k9 y! j  |4 I
循环执行以上步骤,直到某些条件得到满足(比如下游暂存区达到最大容量无法接收临时实体)6 I9 a% \0 S2 g
如何让Source一次性生成多个临时实体?; w8 D& P* ?7 f+ _7 I
经过分析我们知道了Source的触发机制:
. e8 p, s5 r, `+ f0时刻获取t1
# o( E( K  I; c. ht1时刻获取t21 l) N3 Q4 W1 D1 d
(t1+t2)时刻获取t38 Q7 r1 }5 ~1 E
(t1+t2+t3)时刻获取t4
0 ~5 J. p- r1 H0 `……
+ K$ Y! E3 `" a2 v+ @
  Y) c0 S7 h# C8 f以本模型为例:每2个时间单位生成一个临时实体。/ s; K& f9 E& m3 K' c
第0时刻返回t1=20 r4 N! d7 D+ W+ Q
第(t1时刻)生成1个临时实体,同时返回t2=2
' Z/ q& @# y3 [第(t1+t2时刻)生成1个临时实体,同时返回t3=2
( |7 }9 A7 M! T4 {; Y第(t1+t2+t3时刻)……
4 w3 w2 ?$ O$ s- @; L如果第(t1时刻)时返回t2=0呢?
: T6 C" y' N3 y第0时刻返回t1=23 b2 }; e4 d9 c) N2 i) l8 j6 {
第t1时刻返回t2=0
  E9 `) V; ?  u& G# }# N第(t1+t2)时刻返回t3=2
3 l3 e( Q+ M8 j2 ~  z你会发现在第2时间单位的时候生成了2个临时实体6 |8 s5 L! U' N5 ~& |: y  v) u+ O
- l* b) o5 U1 D7 _$ \
思路- p" K5 w" I' ~. E4 j, |2 N* m
引入一个计数器,让计数器来控制返回时间=0的次数,就可以控制批次数量。假设批次数量为5:
$ n3 _1 E$ I( @3 c" s0 j
) t) g% G' ]) E+ l& s0 M代码
  1. int batchnumber = 5;
    8 A7 u% r: P$ u0 \+ o6 H0 A7 a( O
  2. double cycletime = exponential(0,10);
    9 ]' Q/ u7 A( d
  3. string labelName = "批次数量";
    : J5 P* O/ O- ?' ~2 c8 K
  4. treenode curlabel = assertlabel(current, labelName, DATATYPE_NUMBER);
    % @( v+ l' y: J3 K
  5. + }7 v$ A" ]7 n7 Q
  6. if (time()==0 || getnodenum(curlabel)==1)
    , M4 M3 W, Z3 a* P! v
  7. {  setnodenum(curlabel,batchnumber);
    5 X3 F- D' Y  \+ n) Y$ }$ M& [4 c  }
  8.   return cycletime;}
    # Y8 I: v* Q3 B  m
  9. else - z4 j* a1 y; s8 S
  10. {  inc(curlabel,-1);/ |$ f, R9 `  A$ ?+ x9 w
  11.   return 0;}
    / B0 N% w- P' O- t
复制代码
PS:- p5 Z; X' P" l& s0 @+ W
1.本段代码有不完善之处。& i2 u7 \* n2 A2 k: Q9 m
2.发生器产生临时实体的三种方式,其内部逻辑有一些差别。
5 _+ O  l! H" w) R3.请参考我的另一篇帖子:如何手动控制临时实体的产生http://flexsim.asia/viewthread.php?tid=6171&

本帖子中包含更多资源

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

x

评分

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

查看全部评分

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

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2025-10-24 07:42 , Processed in 0.078982 second(s), 15 queries .

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

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