全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-3-22 11:18:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-3-22 12:19 编辑
7 r& `- |* h$ G$ Z- ~
/ c& i8 A8 k; L3 U2 [9 [" y目标:& [! l6 P/ {" g% `, C
1.首先要搞清楚Source的工作原理
  _6 C$ `" l. U: V" R* y4 P2.根据原理编写代码,让Source成批次的生成某个数量的临时实体。: u* L) b2 x  z5 Y  ]  W
试验模型如下图所示:) l% ^& x& E+ t. A
" D+ A% e, P1 \- ]3 `; H
使用Event Log工具,分析Source的工作原理。2 ~1 K5 A1 R8 b- T* w8 U7 u: D
1 R6 L9 m0 B$ @: r
由日志文件可以看出,Source遵循以下工作原理:3 n( o& A: [% b3 ^
模型重置时:激发Inter-Arrival Time触发,获取第一次生成临时实体的时间t1
/ y2 y* u# v: D, k/ ^# J8 V( l2 z当模型时间到达t1时,激发Engine事件Timed Event: CREATEPART,生成一个临时实体,在被创建的临时实体离开Source之前,再一次激发Inter-Arrival Time触发,获取下一次生成临时实体的时间t27 J! a5 V! \' ]5 \" w% F2 A1 v
当模型时间到达(t1+t2)时,重复上一步骤% v4 D4 I3 f1 L/ H
循环执行以上步骤,直到某些条件得到满足(比如下游暂存区达到最大容量无法接收临时实体)
" D  v# `( ?6 D- e如何让Source一次性生成多个临时实体?
$ s! {" Z' h# J' ]$ n1 a经过分析我们知道了Source的触发机制:
; W! t6 w/ O* m( o) g0时刻获取t15 a" ?( |; w" \$ G8 s# ~. J6 }9 |
t1时刻获取t2* T$ z  w/ \" N  w& t
(t1+t2)时刻获取t3/ N- m' s. y8 a" l( V6 R3 X0 n
(t1+t2+t3)时刻获取t4
5 B6 U; I/ R0 m5 h( |; v……
3 f; d: c6 D) c( h4 Y* t0 p" p' I/ z6 I0 [) \2 ?- l
以本模型为例:每2个时间单位生成一个临时实体。0 }/ r3 _, a; @6 L& \9 ?
第0时刻返回t1=2
8 }8 h+ z8 ]# r4 S9 C( B. w" X第(t1时刻)生成1个临时实体,同时返回t2=2% h% d0 B8 I8 ]3 e7 i
第(t1+t2时刻)生成1个临时实体,同时返回t3=2' x  u6 r; f0 B8 j4 G2 v! H
第(t1+t2+t3时刻)……
3 m% g' d; I7 q% c/ T& @如果第(t1时刻)时返回t2=0呢?8 _4 |( L! w/ K
第0时刻返回t1=2
/ ~7 ?8 C& ~2 }3 R7 Z. s第t1时刻返回t2=0
1 {' j( Q7 T- R+ U- s& V: i第(t1+t2)时刻返回t3=24 f9 A( J% \5 h. z, B/ T
你会发现在第2时间单位的时候生成了2个临时实体+ y3 ^2 o3 Q3 }/ a1 n# S) c+ `* B
0 }* [) B! C! `5 c
思路# u+ |1 ], X- w8 i7 v& Z. s8 [2 W
引入一个计数器,让计数器来控制返回时间=0的次数,就可以控制批次数量。假设批次数量为5:  p) {, Z% X  j: ]

% g0 ^( j8 e7 Z- l/ p1 N( W8 H, B代码
  1. int batchnumber = 5;5 J- V# m, V; N: y/ G7 b
  2. double cycletime = exponential(0,10);
    4 \/ v. n8 u: i8 V1 v+ }
  3. string labelName = "批次数量";
    . e, f; ^: n; p
  4. treenode curlabel = assertlabel(current, labelName, DATATYPE_NUMBER);( V: h, d" @: R6 B* [

  5. $ W) h! S; B% p0 i: x
  6. if (time()==0 || getnodenum(curlabel)==1)
    : n6 R" L% i' c+ X( L
  7. {  setnodenum(curlabel,batchnumber);- ^9 {( I0 ]. d# g  Y' H( T5 I% E
  8.   return cycletime;}- m$ v7 H, M0 R( a% I' H
  9. else
    , P( G7 b) _9 [4 u1 n  I
  10. {  inc(curlabel,-1);
    - w: I/ _( O0 k5 t
  11.   return 0;}& K- _0 }$ `) f0 a6 X
复制代码
PS:
& B1 H7 b$ J/ J1.本段代码有不完善之处。' u/ K  P: u6 g/ z+ @, G
2.发生器产生临时实体的三种方式,其内部逻辑有一些差别。5 e4 P8 w- S1 T5 y8 q* ^
3.请参考我的另一篇帖子:如何手动控制临时实体的产生http://flexsim.asia/viewthread.php?tid=6171&

本帖子中包含更多资源

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

x

评分

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

查看全部评分

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

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2025-7-2 06:18 , Processed in 0.076685 second(s), 19 queries .

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

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