全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-3-22 11:18:14 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 zorsite 于 2016-3-22 12:19 编辑
& _; @2 Y8 `( p3 b/ y& Q
3 _% L1 n+ T5 l& l+ P" J) m; Z目标:9 u' q* o1 s! z( g& m# X1 J9 E
1.首先要搞清楚Source的工作原理) b' z0 E+ a* ~6 ^# Q0 Y
2.根据原理编写代码,让Source成批次的生成某个数量的临时实体。3 n/ n% o6 t. T* @! U
试验模型如下图所示:& z5 l# H0 K. N5 _! F

4 e/ G" d( j6 X使用Event Log工具,分析Source的工作原理。
1 o# B; x6 H# I4 b" s' f0 \ 3 @4 X- Z5 ~, R9 B" C9 k# L
由日志文件可以看出,Source遵循以下工作原理:
5 |0 x: h' S8 \! o模型重置时:激发Inter-Arrival Time触发,获取第一次生成临时实体的时间t1- h5 y9 O6 ?! I: G
当模型时间到达t1时,激发Engine事件Timed Event: CREATEPART,生成一个临时实体,在被创建的临时实体离开Source之前,再一次激发Inter-Arrival Time触发,获取下一次生成临时实体的时间t2
/ [# w/ Z# {1 `0 [当模型时间到达(t1+t2)时,重复上一步骤
) C: X( {; ?4 o! i循环执行以上步骤,直到某些条件得到满足(比如下游暂存区达到最大容量无法接收临时实体)" y. O$ j: V' U. x# S% m, y
如何让Source一次性生成多个临时实体?
6 F: l& T& V7 C. M$ `经过分析我们知道了Source的触发机制:& W+ W/ ]  r! ]! K/ `
0时刻获取t1! _2 i9 B& K# g( L; F
t1时刻获取t2" ?7 x4 D  C8 J
(t1+t2)时刻获取t3! v* w( _; c% ~* z
(t1+t2+t3)时刻获取t4
+ ^# u2 t+ B4 y……' m) j( k7 Q& n- l; k6 a+ b' x' |

0 m, X$ o7 `$ m% X5 Z以本模型为例:每2个时间单位生成一个临时实体。
+ ~9 D7 W, d8 |第0时刻返回t1=2: a& i$ g2 o. e2 z  ]* c" v2 D
第(t1时刻)生成1个临时实体,同时返回t2=21 I. l  W5 e% X* _9 ~0 v
第(t1+t2时刻)生成1个临时实体,同时返回t3=2' f" \8 P% ~- S9 Y1 D& a1 C* n
第(t1+t2+t3时刻)……/ L& ?) t: X- B( `/ ^3 ?& V- Z1 H
如果第(t1时刻)时返回t2=0呢?7 L0 r6 a; m4 s# ?' p2 y; T
第0时刻返回t1=2
; j* j  Q: B7 a3 _第t1时刻返回t2=06 X& p- {/ M) H: o( G! e
第(t1+t2)时刻返回t3=2) ?3 T- q6 w2 L# G! I3 h0 m
你会发现在第2时间单位的时候生成了2个临时实体# W8 D. c  Y$ W2 B( z/ Y- Z; b
4 O6 v2 P8 A1 P4 ^3 P! K
思路0 L+ R7 t$ A, {# t
引入一个计数器,让计数器来控制返回时间=0的次数,就可以控制批次数量。假设批次数量为5:
$ T7 W; ~$ F- d: v  F( z. s  m! `9 y
代码
  1. int batchnumber = 5;
    & q. ]! h, b4 D3 o& f; [
  2. double cycletime = exponential(0,10);
    - U9 I( h9 ?( j8 t+ L; b
  3. string labelName = "批次数量";# p) A1 i; u4 V3 N% g! Z
  4. treenode curlabel = assertlabel(current, labelName, DATATYPE_NUMBER);
    8 J3 H& u$ c' h5 I+ l

  5. $ ~3 y  s7 {- `8 ?$ \  \
  6. if (time()==0 || getnodenum(curlabel)==1) % O! J7 R& ]" N8 I! i
  7. {  setnodenum(curlabel,batchnumber);  Y; k4 u$ d  b9 A
  8.   return cycletime;}
      T+ s1 {9 {9 F3 ^& [% W5 d* S
  9. else
    ( P- u0 b- z0 q  _3 |) P0 `- {9 L
  10. {  inc(curlabel,-1);" l9 E" C7 a4 k+ \/ `/ h$ F
  11.   return 0;}# @, c6 B" L; v& }7 q- l: h, y
复制代码
PS:! X6 ]! I3 A0 R. w' a' A# a& x/ \
1.本段代码有不完善之处。2 i7 _0 ~# S5 P/ @
2.发生器产生临时实体的三种方式,其内部逻辑有一些差别。
) |: N3 k- R! c0 H7 M; }  V3.请参考我的另一篇帖子:如何手动控制临时实体的产生http://flexsim.asia/viewthread.php?tid=6171&

本帖子中包含更多资源

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

x

评分

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

查看全部评分

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

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2025-7-1 04:42 , Processed in 0.065439 second(s), 16 queries .

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

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