全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-3-22 11:18:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-3-22 12:19 编辑   ?' L6 N% Q) h% q

0 f: l& V0 F! L' o: m- z目标:+ L* T3 y" g# o- K
1.首先要搞清楚Source的工作原理
0 g" c& X6 P+ _; D* V2.根据原理编写代码,让Source成批次的生成某个数量的临时实体。# a, b6 n. w! w5 V
试验模型如下图所示:; ~" _# U" ]( I( j  D& y  U
+ Q7 R& C# t7 V7 u' I9 P
使用Event Log工具,分析Source的工作原理。8 }2 a) N/ l  E  O' ^5 Z
! J3 u5 e# o$ v7 }
由日志文件可以看出,Source遵循以下工作原理:3 D" ~9 L% U3 |9 }7 n& [3 _
模型重置时:激发Inter-Arrival Time触发,获取第一次生成临时实体的时间t1
! E8 B- I. s7 x. ~( |当模型时间到达t1时,激发Engine事件Timed Event: CREATEPART,生成一个临时实体,在被创建的临时实体离开Source之前,再一次激发Inter-Arrival Time触发,获取下一次生成临时实体的时间t2
) c' m! `& V3 R* T当模型时间到达(t1+t2)时,重复上一步骤+ B) }% W2 W) S0 c( d
循环执行以上步骤,直到某些条件得到满足(比如下游暂存区达到最大容量无法接收临时实体)
5 |6 w9 |8 E* Y" F如何让Source一次性生成多个临时实体?) y  G9 ]6 R  B2 M
经过分析我们知道了Source的触发机制:
) |$ \6 A9 k, G0 b0时刻获取t1
  r& _; @5 l+ H9 [t1时刻获取t2+ O' x; u/ b1 c$ @6 }% t" Y* d
(t1+t2)时刻获取t3, B5 Y& j  g% b
(t1+t2+t3)时刻获取t43 V+ ]! X( ~* M# g6 o/ D
……
( S3 P$ Q' g3 A: D9 V: Q4 N/ @  S; H! n/ p  Y. M
以本模型为例:每2个时间单位生成一个临时实体。
( O2 r5 e! j! w2 T8 B  c第0时刻返回t1=2
! _8 m6 Z- i& e4 i第(t1时刻)生成1个临时实体,同时返回t2=2: ~3 u6 k5 [4 Z1 I' X: |# Q
第(t1+t2时刻)生成1个临时实体,同时返回t3=2
1 `0 g. a" Q, K3 I8 O  E. J第(t1+t2+t3时刻)……9 j: \7 V# l  c- w
如果第(t1时刻)时返回t2=0呢?9 k8 C; ], C- }0 x* G- O+ M
第0时刻返回t1=2
4 Y: n1 P) V! I( @第t1时刻返回t2=0% W! [, j8 h3 G# H: s
第(t1+t2)时刻返回t3=2
7 ]8 f3 g$ a8 q; V你会发现在第2时间单位的时候生成了2个临时实体
8 W  V- N4 x9 L& m% ?6 F) \7 G
7 a9 ^& h; D* k* I6 A! B, Y思路
" E; x! T+ K+ X! S# `$ [# {引入一个计数器,让计数器来控制返回时间=0的次数,就可以控制批次数量。假设批次数量为5:" O- q5 p3 i( z7 B1 m
9 A/ r8 K7 k" d+ v, j" F" u: H. U
代码
  1. int batchnumber = 5;' m( W8 o8 U4 X2 [2 y# p
  2. double cycletime = exponential(0,10);8 J' I. Q* p& g' e& k( w- M8 E
  3. string labelName = "批次数量";
    / k; A, g" y3 W2 I: q9 H. J
  4. treenode curlabel = assertlabel(current, labelName, DATATYPE_NUMBER);
    % r5 t" J( L# w" I1 \, z/ }

  5. 2 @$ u5 l2 }5 t  w$ t
  6. if (time()==0 || getnodenum(curlabel)==1)
    - c# A+ t3 N0 G8 x! M- ~
  7. {  setnodenum(curlabel,batchnumber);0 E, L6 u. I$ k" v+ p; b5 l. ~
  8.   return cycletime;}3 A6 a2 u6 }! N* w6 K: F- X
  9. else
    / C! ~2 Z+ |8 s: I0 l
  10. {  inc(curlabel,-1);/ t5 l: I; I4 V. f; c. t, }
  11.   return 0;}
    ! X0 n9 J- K2 t% q! A; i3 }5 u- @
复制代码
PS:5 X1 R+ ^! P# G, C) j' f2 K
1.本段代码有不完善之处。
% }/ s/ {" `( s$ O2.发生器产生临时实体的三种方式,其内部逻辑有一些差别。# [" Q! p3 ]' ?/ G/ b
3.请参考我的另一篇帖子:如何手动控制临时实体的产生http://flexsim.asia/viewthread.php?tid=6171&

本帖子中包含更多资源

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

x

评分

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

查看全部评分

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

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2025-7-1 10:03 , Processed in 0.087414 second(s), 15 queries .

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

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