全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-3-22 11:18:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-3-22 12:19 编辑 $ Y* \, F' [! r0 `( w8 L
7 M& r8 P' f) l, U/ x# f4 \( ^
目标:* n* P, I/ e' u) r" l
1.首先要搞清楚Source的工作原理0 d/ O# x9 R& @5 O
2.根据原理编写代码,让Source成批次的生成某个数量的临时实体。9 K3 E! \# t5 A$ |7 k2 E# M
试验模型如下图所示:
  g- h' N1 W2 [3 q. ? * ^3 p6 D. \5 h" b& \5 u
使用Event Log工具,分析Source的工作原理。
7 h& r! K' h7 a; E0 d  N ) n5 J$ M6 t6 ]+ ?7 _1 w
由日志文件可以看出,Source遵循以下工作原理:
* ^4 v! o% T- a0 ]8 D7 V# R; ^模型重置时:激发Inter-Arrival Time触发,获取第一次生成临时实体的时间t13 e: a, v* I8 ~* b
当模型时间到达t1时,激发Engine事件Timed Event: CREATEPART,生成一个临时实体,在被创建的临时实体离开Source之前,再一次激发Inter-Arrival Time触发,获取下一次生成临时实体的时间t22 M+ i# D2 n3 W4 x; D7 C- z* ?% s
当模型时间到达(t1+t2)时,重复上一步骤
, f: }! a# H1 h& l5 i1 D' B循环执行以上步骤,直到某些条件得到满足(比如下游暂存区达到最大容量无法接收临时实体)
. R0 I0 B: H) j如何让Source一次性生成多个临时实体?7 d% L/ ?& a* u% q# Q5 m
经过分析我们知道了Source的触发机制:8 g) _3 a  g/ W$ V# J
0时刻获取t1
" N7 W5 z0 u2 ?8 ^% Jt1时刻获取t2
& A: e4 _. Q6 n(t1+t2)时刻获取t3
' d; }& \+ B1 k(t1+t2+t3)时刻获取t4
, D6 x5 W' P; _……
# F  o1 g% H2 m
* I3 K; f# L8 P以本模型为例:每2个时间单位生成一个临时实体。9 c) w; @, ~  s# ]) g$ y* Z5 _
第0时刻返回t1=21 h/ R; a. t7 H1 A6 s% C* J, R
第(t1时刻)生成1个临时实体,同时返回t2=2
$ Q! y- Y" P* R6 r) ~第(t1+t2时刻)生成1个临时实体,同时返回t3=2
, ]1 _, T4 p' {/ T& y! L+ g第(t1+t2+t3时刻)……
3 F! g# i9 ^# L* F! p如果第(t1时刻)时返回t2=0呢?
" m* V( _6 J. v+ ?5 g5 c第0时刻返回t1=2. b, |, E" C: L& m$ q
第t1时刻返回t2=0
7 r  L% H# k- c. V, O$ N6 k/ j第(t1+t2)时刻返回t3=2
$ T& s  p! d5 v; R) H; t你会发现在第2时间单位的时候生成了2个临时实体0 F  F; e$ K7 U1 r" Y7 d

% G7 g7 M  ]. v- V( P. I思路
, R- I5 r* e9 @8 S$ D) \引入一个计数器,让计数器来控制返回时间=0的次数,就可以控制批次数量。假设批次数量为5:
6 a9 S6 y- G7 }* D0 R: T! g6 _
4 m% {# S, x& m0 W% j8 D5 W, L代码
  1. int batchnumber = 5;
    9 u+ |& G+ Q8 `0 u! A5 K2 E' j1 j
  2. double cycletime = exponential(0,10);5 W. Z5 _' \. H* p
  3. string labelName = "批次数量";2 r; E  W# q. U; R) u% ~. m5 d
  4. treenode curlabel = assertlabel(current, labelName, DATATYPE_NUMBER);: K' Z# g7 R' D9 g3 A
  5. % x& {" T& W, z' a* |! m
  6. if (time()==0 || getnodenum(curlabel)==1)
    9 q+ u0 I+ `5 x3 a  K3 X
  7. {  setnodenum(curlabel,batchnumber);
    / ~8 q; k' a. @" i0 {
  8.   return cycletime;}
    " A6 U3 U* `; H
  9. else
    & W. l/ E3 s! T
  10. {  inc(curlabel,-1);8 I+ o5 N5 h" Z1 S0 z% ?
  11.   return 0;}. `6 i4 k! t* B& n9 W! ~) {
复制代码
PS:
' \# q* L6 ?. B( ^0 `6 l) o1.本段代码有不完善之处。
8 n$ c0 x6 b/ G8 @( i9 V2.发生器产生临时实体的三种方式,其内部逻辑有一些差别。
# D9 t. H8 @' I6 V* L- j# G$ u/ {0 w9 _3.请参考我的另一篇帖子:如何手动控制临时实体的产生http://flexsim.asia/viewthread.php?tid=6171&

本帖子中包含更多资源

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

x

评分

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

查看全部评分

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

评分

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

查看全部评分

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

本版积分规则

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

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

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

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