• 本站域名:OceanCoder.cn 若您喜欢本站,请添加至收藏夹!
  • 网站少部分资源来源自网络,如有侵犯您的权益,请联系站长删除!
  • 本站所有文章,除特殊标明外,皆为本人原创,转载请注明出处,谢谢合作!
  • 本站所下载的资源,若无特殊说明,使用统一解压密码:oceancoder.cn
  • 本站已实现布局自适应,支持手机端、pad端访问,欢迎体验
  • 本站部分资源可通过微信公众号留言获取,欢迎体验

[PlantSimulation]#C005#精选案例01

PlantSimulation OceanCoder 2020-04-16 5555 次浏览 0个评论

一、案例描述

书籍《eM-Plant仿真技术教程》第十一章的综合应用案例

image.png


二、学习感受

因为刚刚接触Plant Simulation软件,所以以下内容必定存在理解不到位或者知识点错误的情况,请各位看官自行甄别!

刚开始接触在网上搜索了一遍,没找到什么适合入门的文章或者教程,只有一堆乱七八糟、自作高深的文章,所以决定还是以官方教程和案例为主。

练习本文案例前,我只学过官方入门案例,却意外的感觉没有任何难点,也许是因为这个案例实在一般,没太多知识点。

至于为什么选择这个案例,主要是它的介绍比较详细,后期的分析也能让我感受到这软件的价值所在。


但是仿真结果也让我百思不得其解,不知道是不是初学者理解不到位的情况,我会在文末标明。

另外,该案例有些许错误的地方,但不影响阅读。


三、建模

本文不打算把原文内容搬过来,各位可自行根据书本练习,此处仅记录个人在意的地方。因为书籍年代较早,使用的版本是V8.1版本,本文使用的是V14版本,所以代码部分需要稍稍改动下,其余的内容基本无差别。

image.png

接下来仅粘贴代码部分(simtalk 2.0)

--Leave方法
--OceanCoder.Cn

@.JobStep := @.Sequence[1,1]
if ?.Name = "source"
@.StartTime := EventController.SimTime
print @.name ,"--", @.StartTime
end
if ?.Name = "drain"
@.OutTime := EventController.SimTime
Sumstaytime := Sumstaytime +@.OutTime-@.StartTime;
end
--Distribute方法
--OceanCoder.Cn

param r : integer -> integer
if @.JobStep = 0 and ?.Name="FC3"
return 3
end
if @.JobStep = str_to_num(copy(?.Name,3,1))
@.WaitStart := eventController.simTime
return 1
else
return 2
end
--SetCell1方法
--OceanCoder.Cn

@.Sequence.cutrow(1)
switch @.name
case "part1"
cell1.procTime.setparam("triangle",1,8*60,6*60,10*60)
case "part2"
cell1.procTime.setparam("triangle",1,13*60,11*60,15*60)
case "part3"
cell1.procTime.setparam("triangle",1,10*60,7*60,13*60)
else
end
@.WaitEnd := eventController.simTime
SumCell1Time := SumCell1Time+@.WaitEnd-@.WaitStart;
--SetCell2方法
--OceanCoder.Cn

@.Sequence.cutrow(1)
switch @.name
case "part1"
cell2.procTime.setparam("triangle",1,8*60,5*60,10*60)
case "part2"
if @.SecondProc = false
cell2.procTime.setparam("triangle",1,6*60,4*60,8*60)
@.SecondProc := true
else
cell2.procTime.setparam("triangle",1,9*60,6*60,12*60)
end
case "part3"
cell2.procTime.setparam("triangle",1,9*60,7*60,11*60)
else
end
@.WaitEnd := eventController.simTime
SumCell2Time := SumCell2Time+@.WaitEnd-@.WaitStart;
--SetCell3方法
--OceanCoder.Cn

@.Sequence.cutrow(1)
switch @.name
case "part1"
cell3_old.procTime.setparam("triangle",1,20*60,15*60,25*60)
cell3_new.procTime.setparam("triangle",1,20*60*0.8,15*60*0.8,25*60*0.8)
case "part2"
cell3_old.procTime.setparam("triangle",1,33*60,27*60,39*60)
cell3_new.procTime.setparam("triangle",1,33*60*0.8,27*60*0.8,39*60*0.8)
case "part3"
cell3_old.procTime.setparam("triangle",1,23*60,18*60,28*60)
cell3_new.procTime.setparam("triangle",1,23*60*0.8,18*60*0.8,28*60*0.8)
else
end
@.WaitEnd := eventController.simTime
SumCell3Time := SumCell3Time+@.WaitEnd-@.WaitStart;
--SetCell4方法
--OceanCoder.Cn

@.Sequence.cutrow(1)
switch @.name
case "part1"
cell4.procTime.setparam("triangle",1,12*60,8*60,16*60)
case "part2"
cell4.procTime.setparam("triangle",1,18*60,15*60,21*60)
else
end
@.WaitEnd := eventController.simTime
SumCell4Time := SumCell4Time+@.WaitEnd-@.WaitStart;
--EndSim方法
--OceanCoder.Cn

Avgstaytime:=Sumstaytime/drain.StatNumOut
AvgCell1Time := SumCell1Time/Buffer1.StatNumOut
AvgCell2Time := SumCell1Time/Buffer2.StatNumOut
AvgCell3Time := SumCell1Time/Buffer3.StatNumOut
AvgCell4Time := SumCell1Time/Buffer4.StatNumOut


四、结果分析

书籍的后半部分都是在介绍仿真分析的方法,也是我最感兴趣的地方,可我运行仿真后,结果却和原文大不一样

原文介绍说多次运行得出的仿真结果不一致,原因是输入数据的随机性带来了输出结果的随机性。这句话非常赞同,可我运行仿真后,却每次都能得到完全一致的仿真结果

image.png


我使用的输入源同样是时间为13的负指数分布,但调试发现每次生产的随机数据都是一致的,肯定是我哪里做错了,但目前的水平还发现不了,只能留待以后解决了

image.png


现在把V14版本的工程文件放在结尾,如果您发现了我的错误,欢迎给我解惑~


资源下载地址    资源编号是为规范管理本站资源所做的尝试,希望您理解并给予支持
资源编号[ID]oc010008百度网盘  (提取密码请关注本站#微信公众号#并回复左侧【资源ID】获取-查看教程
解压密码oceancoder.cn如无特殊说明,本站使用统一解压密码oceancoder.cn


已有 5555 位网友参与,快来吐槽:

发表评论