发帖
 找回密码
 立即注册
搜索
1 0 0

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

技术交流2 1 1 2016-3-22 11:18:14
[i=s] 本帖最后由 zorsite 于 2016-3-22 12:19 编辑 [/i]

目标:
1.首先要搞清楚Source的工作原理
2.根据原理编写代码,让Source成批次的生成某个数量的临时实体。
试验模型如下图所示:

使用Event Log工具,分析Source的工作原理。

由日志文件可以看出,Source遵循以下工作原理:
模型重置时:激发Inter-Arrival Time触发,获取第一次生成临时实体的时间t1
当模型时间到达t1时,激发Engine事件Timed Event: CREATEPART,生成一个临时实体,在被创建的临时实体离开Source之前,再一次激发Inter-Arrival Time触发,获取下一次生成临时实体的时间t2
当模型时间到达(t1+t2)时,重复上一步骤
循环执行以上步骤,直到某些条件得到满足(比如下游暂存区达到最大容量无法接收临时实体)
如何让Source一次性生成多个临时实体?
经过分析我们知道了Source的触发机制:
0时刻获取t1
t1时刻获取t2
(t1+t2)时刻获取t3
(t1+t2+t3)时刻获取t4
……

以本模型为例:每2个时间单位生成一个临时实体。
第0时刻返回t1=2
第(t1时刻)生成1个临时实体,同时返回t2=2
第(t1+t2时刻)生成1个临时实体,同时返回t3=2
第(t1+t2+t3时刻)……
如果第(t1时刻)时返回t2=0呢?
第0时刻返回t1=2
第t1时刻返回t2=0
第(t1+t2)时刻返回t3=2
你会发现在第2时间单位的时候生成了2个临时实体

思路
引入一个计数器,让计数器来控制返回时间=0的次数,就可以控制批次数量。假设批次数量为5:

代码[code]int batchnumber = 5;
double cycletime = exponential(0,10);
string labelName = "批次数量";
treenode curlabel = assertlabel(current, labelName, DATATYPE_NUMBER);

if (time()==0 || getnodenum(curlabel)==1)
{  setnodenum(curlabel,batchnumber);
  return cycletime;}
else
{  inc(curlabel,-1);
  return 0;}
[/code]PS:
1.本段代码有不完善之处。
2.发生器产生临时实体的三种方式,其内部逻辑有一些差别。
3.请参考我的另一篇帖子:如何手动控制临时实体的产生[url=http://flexsim.asia/viewthread.php?tid=6171&]http://flexsim.asia/viewthread.php?tid=6171&[/url]
──── 0人觉得很赞 ────

本帖子中包含更多资源

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

x
2016-3-22 12:20:51
加老师对于发生器产生临时实体的机制研究比较深入。
我个人觉得对于正式版用户而言,如果只是让发生器产生一个间隔的话,直接下面搭配一个分解器,就可以了在一个间隔产生多个产品了,这是一个更简单的建模思路。
您需要登录后才可以回帖 立即登录
高级模式
返回
技术交流2
热门问答
查看更多
1
Flexsim初级建模工程师水平标准
Flexsim初级建模工程师水平标准
62
234
2
厂区生产线布局优化案例!新做的!
厂区生产线布局优化案例!新做的!
42
224
3
无意中找到的资料,非常适合于初学者
无意中找到的资料,非常适合于初学者
39
229
4
流水作业线的仿真
流水作业线的仿真
36
83
5
flexsim中文教程,pdf文档已整理-重新整理
flexsim中文教程,pdf文档已整理-重新整理
31
114
博主榜
+ 5