一、案例描述
书籍《eM-Plant仿真技术教程》第十一章的综合应用案例
二、学习感受
因为刚刚接触Plant Simulation软件,所以以下内容必定存在理解不到位或者知识点错误的情况,请各位看官自行甄别!
刚开始接触在网上搜索了一遍,没找到什么适合入门的文章或者教程,只有一堆乱七八糟、自作高深的文章,所以决定还是以官方教程和案例为主。
练习本文案例前,我只学过官方入门案例,却意外的感觉没有任何难点,也许是因为这个案例实在一般,没太多知识点。
至于为什么选择这个案例,主要是它的介绍比较详细,后期的分析也能让我感受到这软件的价值所在。
但是仿真结果也让我百思不得其解,不知道是不是初学者理解不到位的情况,我会在文末标明。
另外,该案例有些许错误的地方,但不影响阅读。
三、建模
本文不打算把原文内容搬过来,各位可自行根据书本练习,此处仅记录个人在意的地方。因为书籍年代较早,使用的版本是V8.1版本,本文使用的是V14版本,所以代码部分需要稍稍改动下,其余的内容基本无差别。
接下来仅粘贴代码部分(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
四、结果分析
书籍的后半部分都是在介绍仿真分析的方法,也是我最感兴趣的地方,可我运行仿真后,结果却和原文大不一样!
原文介绍说多次运行得出的仿真结果不一致,原因是输入数据的随机性带来了输出结果的随机性。这句话非常赞同,可我运行仿真后,却每次都能得到完全一致的仿真结果
我使用的输入源同样是时间为13的负指数分布,但调试发现每次生产的随机数据都是一致的,肯定是我哪里做错了,但目前的水平还发现不了,只能留待以后解决了!
现在把V14版本的工程文件放在结尾,如果您发现了我的错误,欢迎给我解惑~
已有 5597 位网友参与,快来吐槽:
发表评论