全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-3-22 11:18:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-3-22 12:19 编辑 7 k/ U" J$ q7 i0 W. \
  D& X4 k/ H4 T- n/ u! t) O
目标:
. W# J( s$ l4 M1.首先要搞清楚Source的工作原理* }/ F. a# Y, u+ W
2.根据原理编写代码,让Source成批次的生成某个数量的临时实体。
- ~8 C! J! q& |5 f试验模型如下图所示:
# c. b& g3 |- B& D/ r: n8 ^7 T 3 u; s7 {. A1 k* M' h9 a) v
使用Event Log工具,分析Source的工作原理。
6 ^  I% U. C9 n# o1 }
: }- A" ]/ T& N" R8 c5 b由日志文件可以看出,Source遵循以下工作原理:
- l2 v9 k$ \/ u  ?4 p模型重置时:激发Inter-Arrival Time触发,获取第一次生成临时实体的时间t1
8 P7 K) T2 K" c# z当模型时间到达t1时,激发Engine事件Timed Event: CREATEPART,生成一个临时实体,在被创建的临时实体离开Source之前,再一次激发Inter-Arrival Time触发,获取下一次生成临时实体的时间t2
& y$ |0 Q! _, u! u: n( f当模型时间到达(t1+t2)时,重复上一步骤
; a' Y- i, p" q1 f2 J+ k5 O" s循环执行以上步骤,直到某些条件得到满足(比如下游暂存区达到最大容量无法接收临时实体)
/ _* C8 N; ~; O) Y: C如何让Source一次性生成多个临时实体?5 i) ?1 _! i) u+ u7 v
经过分析我们知道了Source的触发机制:+ b8 x, d& Z/ H3 u$ Z
0时刻获取t1/ B  _7 I2 V# W/ \  w0 z9 U; \( v* j5 F
t1时刻获取t2, S$ }$ U0 _7 H. J
(t1+t2)时刻获取t3
* v( S5 O3 e  F3 L) j# r(t1+t2+t3)时刻获取t4
' R- s4 H) Y+ l/ T……. X* A6 S4 _8 ^% u

2 @! t( u2 i2 I6 Z& }8 @以本模型为例:每2个时间单位生成一个临时实体。6 \( H! `6 O3 Q1 t. S% M
第0时刻返回t1=2
+ T9 s. A  A7 N8 U8 D/ ^第(t1时刻)生成1个临时实体,同时返回t2=27 c% s6 S1 P0 d$ j1 Y# C* \
第(t1+t2时刻)生成1个临时实体,同时返回t3=2
- T9 {2 S3 v5 A: h8 v1 U第(t1+t2+t3时刻)……
% }" i4 ?% f2 F3 a如果第(t1时刻)时返回t2=0呢?3 }' q3 _  U2 ^- i0 V$ D
第0时刻返回t1=2
4 ^+ n. _6 z9 l0 {8 F2 V  b第t1时刻返回t2=0# u8 F- D9 K( g
第(t1+t2)时刻返回t3=2# w4 V3 \$ c; n! s( R$ w( q
你会发现在第2时间单位的时候生成了2个临时实体
. ^4 y. {" h; \% u5 V2 Y% B
. z- p% f/ u- J  F+ r- O3 m思路
- t4 O4 M+ W6 j' f) I' X引入一个计数器,让计数器来控制返回时间=0的次数,就可以控制批次数量。假设批次数量为5:
$ f- P# g) t  W% Y+ y, W
& X' s4 r# Q9 g5 n5 J. _" {( @代码
  1. int batchnumber = 5;
    3 E3 ^. m# R0 n2 I( X
  2. double cycletime = exponential(0,10);
    * f. M5 q9 a# G% Y6 [3 J
  3. string labelName = "批次数量";
    * _8 X% R3 h( |! \: u. C4 I2 I2 a
  4. treenode curlabel = assertlabel(current, labelName, DATATYPE_NUMBER);: G# Z, O6 n& K, R
  5. 6 K. ~* ]. n$ Q& W, p# k
  6. if (time()==0 || getnodenum(curlabel)==1) + {+ n8 D+ l  I% g! D, D  y
  7. {  setnodenum(curlabel,batchnumber);
    * m) X9 t- o4 K7 m* J" a; O
  8.   return cycletime;}2 ?4 D! `- p. H- h- Y
  9. else + z+ q5 t8 J  K, K. \- ^1 x
  10. {  inc(curlabel,-1);) c, X, e8 l4 P6 r; I
  11.   return 0;}
    " h% S0 e- C) G  P" v) V
复制代码
PS:
/ p% a6 P# D9 f1.本段代码有不完善之处。; Z/ P% [$ M; J3 s0 L
2.发生器产生临时实体的三种方式,其内部逻辑有一些差别。
' L8 m; `2 b: b& p/ W3.请参考我的另一篇帖子:如何手动控制临时实体的产生http://flexsim.asia/viewthread.php?tid=6171&

本帖子中包含更多资源

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

x

评分

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

查看全部评分

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

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2025-9-6 12:49 , Processed in 0.091156 second(s), 15 queries .

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

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