全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-3-22 11:18:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-3-22 12:19 编辑
9 F: q. O9 I: N; T, s8 z% n6 @% G; l; D) U
目标:' Q! @. M) g4 d; T1 e4 Q8 }
1.首先要搞清楚Source的工作原理2 @4 d& z3 N% z: i
2.根据原理编写代码,让Source成批次的生成某个数量的临时实体。
( }& P4 q! T9 b- A试验模型如下图所示:- C. B7 o, {9 X8 C8 z! O' L2 W; _9 v
: g8 b3 Y; l1 D4 O! ^: H+ `
使用Event Log工具,分析Source的工作原理。4 Q# _; y% i$ g/ b! T
- m4 K, W  S8 K
由日志文件可以看出,Source遵循以下工作原理:
. j9 s( G9 j2 A7 z模型重置时:激发Inter-Arrival Time触发,获取第一次生成临时实体的时间t10 c' F) g* Y, O) e& C& n1 F& M
当模型时间到达t1时,激发Engine事件Timed Event: CREATEPART,生成一个临时实体,在被创建的临时实体离开Source之前,再一次激发Inter-Arrival Time触发,获取下一次生成临时实体的时间t2
4 g4 u9 j# B  |当模型时间到达(t1+t2)时,重复上一步骤6 K7 M& F( b, s8 u3 b
循环执行以上步骤,直到某些条件得到满足(比如下游暂存区达到最大容量无法接收临时实体)! \2 I3 z& v* q5 Y. n
如何让Source一次性生成多个临时实体?
! H/ v& O+ v$ d4 H& y5 W经过分析我们知道了Source的触发机制:
: p2 w" k3 M5 p, H. S( _0 ]& E# d6 X0时刻获取t16 s6 j5 P8 T# s
t1时刻获取t2- i& U' I& z" _8 o, M) {, i2 u
(t1+t2)时刻获取t3
* A; O  I, e1 b$ \8 o' j(t1+t2+t3)时刻获取t40 G) p, a, |& M" _
……5 K7 K6 U0 C1 C% _! Y
" p6 C/ ^5 F8 S
以本模型为例:每2个时间单位生成一个临时实体。
9 F- V! S/ [( }6 D4 b, e第0时刻返回t1=2
; E) f, h; @2 U. {7 E1 g* b% u4 v第(t1时刻)生成1个临时实体,同时返回t2=2
% _/ l! T7 r+ v0 w第(t1+t2时刻)生成1个临时实体,同时返回t3=2+ P6 V" a6 F- u% m
第(t1+t2+t3时刻)……  f) C% p( t. N0 q
如果第(t1时刻)时返回t2=0呢?
* L8 ^  P$ H) q* H4 D第0时刻返回t1=2
" J8 Q8 T* n' r2 h* P4 x第t1时刻返回t2=0: ~4 V  g" @! V! |
第(t1+t2)时刻返回t3=2
2 Y; h. r7 n: H" ~& {$ \你会发现在第2时间单位的时候生成了2个临时实体
' s( i$ D( v, f2 v" d. [; A+ D$ R! z% M% R
思路) ]& V. y9 r' J# T0 M" S
引入一个计数器,让计数器来控制返回时间=0的次数,就可以控制批次数量。假设批次数量为5:( ]! d$ J: x- k; E, B

  _+ R7 ?& j& V  i4 _/ p* l代码
  1. int batchnumber = 5;
    4 h9 o8 c: T# h& j& H
  2. double cycletime = exponential(0,10);
    4 m! |9 M& d0 R( P: S, J
  3. string labelName = "批次数量";
    2 K, C4 ^4 r. X' ]
  4. treenode curlabel = assertlabel(current, labelName, DATATYPE_NUMBER);
    % u# `4 L2 o: ^! a- C& F
  5. . R( w! U1 j4 h7 ^, v
  6. if (time()==0 || getnodenum(curlabel)==1)
    7 O/ ^% K' R; h0 a4 Q
  7. {  setnodenum(curlabel,batchnumber);
    9 m' R% u+ U% H. P" E
  8.   return cycletime;}
    % n# R6 F5 D. v; Y+ m8 G; F4 x
  9. else
    1 R: z! Q# s  v+ f# u# Y5 H1 K
  10. {  inc(curlabel,-1);" W8 W7 x( c6 n2 p4 B2 ~9 |$ T3 k
  11.   return 0;}
    7 z4 n' Q$ I; R7 j- z8 t' f' U
复制代码
PS:
8 v4 p7 J2 q0 Z+ [4 M- H5 r. V1.本段代码有不完善之处。/ H0 U4 }9 p* Q! ^" K
2.发生器产生临时实体的三种方式,其内部逻辑有一些差别。
3 R$ s; i: @6 e- H6 Q( D9 ^3.请参考我的另一篇帖子:如何手动控制临时实体的产生http://flexsim.asia/viewthread.php?tid=6171&

本帖子中包含更多资源

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

x

评分

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

查看全部评分

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

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2025-6-30 23:44 , Processed in 0.075175 second(s), 15 queries .

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

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