全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-3-22 11:18:14 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 zorsite 于 2016-3-22 12:19 编辑
$ |+ D7 f; ]5 @: R7 Q0 }& _. E  o" z8 y* p4 L
目标:
0 s6 I+ y) o6 c' ?0 c+ ~5 m2 `1.首先要搞清楚Source的工作原理# z0 |8 j6 U" [9 R) T$ ]
2.根据原理编写代码,让Source成批次的生成某个数量的临时实体。9 G$ y! z/ s3 [( ?, V- v" l" L* J* H4 \
试验模型如下图所示:
/ J  |7 N3 v7 d( M6 `* d! e: p5 Y ' Z1 n0 Y0 P; z6 R9 n  H4 T
使用Event Log工具,分析Source的工作原理。9 ?( I1 a9 }% w1 j/ R

3 z6 K+ n8 T4 l9 R* b) s& K由日志文件可以看出,Source遵循以下工作原理:: s# @. H4 I( D' S' }
模型重置时:激发Inter-Arrival Time触发,获取第一次生成临时实体的时间t1
! r2 m8 r( F% n6 V8 @当模型时间到达t1时,激发Engine事件Timed Event: CREATEPART,生成一个临时实体,在被创建的临时实体离开Source之前,再一次激发Inter-Arrival Time触发,获取下一次生成临时实体的时间t2( ?' n9 k  k3 y( d' B6 J
当模型时间到达(t1+t2)时,重复上一步骤4 `" l( x8 Y  [  Z
循环执行以上步骤,直到某些条件得到满足(比如下游暂存区达到最大容量无法接收临时实体)
& _/ ~3 z( ?6 G如何让Source一次性生成多个临时实体?
) s$ e* \+ v  _' S2 @" I, G经过分析我们知道了Source的触发机制:" A1 s% x* M0 l
0时刻获取t1
  j7 Y( \; p. {5 m& g6 ?( v, kt1时刻获取t2
( A2 j+ ^: h7 I7 {: h$ L& @(t1+t2)时刻获取t38 _2 J5 g3 A$ F$ F3 f
(t1+t2+t3)时刻获取t4
4 l! a# r8 ~* ]……
6 Z& x: Y+ r7 R0 N7 h% j8 T7 H( B- c2 B1 O
以本模型为例:每2个时间单位生成一个临时实体。
2 |. P2 Q9 m( v% R4 p第0时刻返回t1=2
. n3 H. r. A% `  E第(t1时刻)生成1个临时实体,同时返回t2=2
* K( a# ]+ Y/ d4 @, U1 N7 N第(t1+t2时刻)生成1个临时实体,同时返回t3=2
, Y! `% i# p9 m8 ?' }9 y9 M# e第(t1+t2+t3时刻)……
+ k# I8 L9 B& n* n) Z; n% j' S) q/ p如果第(t1时刻)时返回t2=0呢?$ @* K7 L8 v9 x8 d5 l3 e) J
第0时刻返回t1=2& c* s/ S- m) @( q7 d0 o$ e1 `
第t1时刻返回t2=0
7 \. C- I& V8 V第(t1+t2)时刻返回t3=2! v* Q* s/ F$ i0 V* i3 k
你会发现在第2时间单位的时候生成了2个临时实体4 v- K0 U! R5 ~3 g

3 p! J1 `7 L7 d思路
1 U4 N  G1 L9 |+ {7 \. D% A5 i引入一个计数器,让计数器来控制返回时间=0的次数,就可以控制批次数量。假设批次数量为5:
3 k1 f  q5 u* v8 Q" l# F3 o3 I. d% r8 b0 n1 v: \2 U7 x. J, D
代码
  1. int batchnumber = 5;
    ) }6 M% g4 F1 a4 G* N- K9 B% Z
  2. double cycletime = exponential(0,10);
    ! i  u7 ]; [1 |" m3 ]
  3. string labelName = "批次数量";
    9 o- h9 \& @2 ?. `- |
  4. treenode curlabel = assertlabel(current, labelName, DATATYPE_NUMBER);
    % t/ `- P  a+ n# L  K7 H

  5. : _2 z8 b; B- |* c7 d" s" K* J7 B
  6. if (time()==0 || getnodenum(curlabel)==1)
    ( Z3 k. o( V- P
  7. {  setnodenum(curlabel,batchnumber);
    # S( X1 O6 e% S' u( g
  8.   return cycletime;}$ W  P0 I2 B0 M
  9. else - J* J9 m6 l' Y: {. _" W
  10. {  inc(curlabel,-1);
    ! S' J; c$ I- Q+ g+ |
  11.   return 0;}
    . ]3 Y4 y& f) u
复制代码
PS:  B# m8 ]4 n* h* h# Y% U' D
1.本段代码有不完善之处。
9 }/ i/ d$ ^7 O9 L/ C! m2.发生器产生临时实体的三种方式,其内部逻辑有一些差别。' s6 X& r- F2 @/ O
3.请参考我的另一篇帖子:如何手动控制临时实体的产生http://flexsim.asia/viewthread.php?tid=6171&

本帖子中包含更多资源

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

x

评分

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

查看全部评分

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

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2025-10-24 08:10 , Processed in 0.077119 second(s), 16 queries .

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

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