全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-3-22 11:18:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-3-22 12:19 编辑
& }: U2 _; ^' a* j
6 p& t# S# G) I3 C  y8 E9 E目标:4 I) ~7 e/ D# R/ J+ A1 q. N9 d
1.首先要搞清楚Source的工作原理
$ N, h6 u# \. i7 I% V/ M# v2.根据原理编写代码,让Source成批次的生成某个数量的临时实体。
' L: b; ]7 x0 q& h! A  A+ k2 j试验模型如下图所示:3 I  N- l3 y- J: A: P) n
) L1 X7 @* a5 u) Y+ [
使用Event Log工具,分析Source的工作原理。
/ `9 n9 [9 b0 J% q( v 8 U: ]& O6 [4 g; [3 \. f" f& a
由日志文件可以看出,Source遵循以下工作原理:
8 [/ D. {- s! l- ?* @6 u模型重置时:激发Inter-Arrival Time触发,获取第一次生成临时实体的时间t1- u2 J8 k: W0 d
当模型时间到达t1时,激发Engine事件Timed Event: CREATEPART,生成一个临时实体,在被创建的临时实体离开Source之前,再一次激发Inter-Arrival Time触发,获取下一次生成临时实体的时间t2* l# t/ `2 B/ }8 M
当模型时间到达(t1+t2)时,重复上一步骤
- k3 J% `$ f( K9 E( n循环执行以上步骤,直到某些条件得到满足(比如下游暂存区达到最大容量无法接收临时实体)
% o! m) a- T7 X$ r7 ]$ M  ]如何让Source一次性生成多个临时实体?: w% z. A# y4 W, g  i; I' n* q3 y
经过分析我们知道了Source的触发机制:
3 [# F( n* V" N* @% w0时刻获取t1
7 p1 x4 `2 Y- @8 ]t1时刻获取t2
9 ?9 Z( i! Q! [(t1+t2)时刻获取t3
5 g4 M7 n8 ~( ^$ L6 T(t1+t2+t3)时刻获取t4
9 b: a& o7 x* D3 l: L1 y3 \! d……2 x6 D0 Z- V" I7 j

) v9 G. u5 w. T$ d6 `' a% R" i以本模型为例:每2个时间单位生成一个临时实体。
: {, z# [4 Q- x# N& B第0时刻返回t1=20 r8 G4 k/ I7 v
第(t1时刻)生成1个临时实体,同时返回t2=2
. ~. [, l1 `) j第(t1+t2时刻)生成1个临时实体,同时返回t3=21 @1 [) a1 D' Q- E: V9 T5 l2 R9 U
第(t1+t2+t3时刻)……  k# r' `, `$ g
如果第(t1时刻)时返回t2=0呢?
2 d9 B$ f. u2 W" `& v# @# m% |第0时刻返回t1=2
; x: }% p' C  L" t5 c第t1时刻返回t2=08 G( |( _4 x0 J
第(t1+t2)时刻返回t3=2
- c. ^' F* p3 U. |  `) K你会发现在第2时间单位的时候生成了2个临时实体( [+ t  y8 @# b) n3 t
& v2 E3 d- |+ j; R/ L
思路
: {& O3 A+ T% Q5 L引入一个计数器,让计数器来控制返回时间=0的次数,就可以控制批次数量。假设批次数量为5:3 K( H( f8 y. A8 o& _+ y
0 U; P7 E5 D7 b
代码
  1. int batchnumber = 5;
    0 U* r; g! g4 ^5 o
  2. double cycletime = exponential(0,10);2 f4 f1 {$ ~6 u( m8 A7 L" W/ y! d
  3. string labelName = "批次数量";; {2 y3 S. N/ |
  4. treenode curlabel = assertlabel(current, labelName, DATATYPE_NUMBER);; r* ?" r9 D, Z$ `- d" F* I4 k

  5. 1 N$ N3 d! a) ~, u. x
  6. if (time()==0 || getnodenum(curlabel)==1)
    $ ~7 e5 l5 S0 L
  7. {  setnodenum(curlabel,batchnumber);9 W, H5 p0 s: K- J, G' j
  8.   return cycletime;}
    - b1 Q' j. n) i5 K
  9. else $ H1 p9 ~# e; Z! |0 r
  10. {  inc(curlabel,-1);# p3 e+ K$ d- n; k5 }
  11.   return 0;}
    9 a* k3 K' n# P1 i# J- N+ F* y! E
复制代码
PS:
1 k0 _4 d- ~2 r1.本段代码有不完善之处。
! b2 l) ~# q& Z  e, q4 r2.发生器产生临时实体的三种方式,其内部逻辑有一些差别。- M+ U9 x5 K* {9 X% N! Q0 s
3.请参考我的另一篇帖子:如何手动控制临时实体的产生http://flexsim.asia/viewthread.php?tid=6171&

本帖子中包含更多资源

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

x

评分

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

查看全部评分

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

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2025-7-1 11:31 , Processed in 0.076392 second(s), 16 queries .

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

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