我有一个模型,在该模型中,我使用CombiTable1D从.txt文件中检索外部输入。该文件目前由Python脚本生成,但在项目的最后阶段,它将每秒钟更新一次。目前,模拟是在没有问题的情况下进行的,因为.txt文件是静态的。只需读取文件,并根据所写的数据进行模拟。
我想要做的是模拟一个模型,直到一定的时间,比如100到200,然后让它等待一个实时事件,通过这个事件更新.txt文件,以便下一个外部输入值在100-200之间更新。在接下来的100秒钟内,通过获取这些新值,模拟应该继续进行。
由于我已经在使用OMPython,所以使用.txt编辑.txt文件是非常实用的,假设每10秒实时编辑一次。现在我可以模拟模型,直到我定义为外部输入的刷新点的time实例为止。但我想不出如何保持模拟的状态,并让它再次读取文件。
发布于 2017-08-26 13:23:07
实际上,对我来说,这听起来像是一个共同模拟的场景。无论如何,您可以做的是从CombiTable1D扩展,并有类似的
block CombiTable1DWithUpdate
extends Modelica.Blocks.Tables.CombiTable1D(final tableOnFile=true);
algorithm
when sample(0, 10) then
readTableData(tableID, /* force update */ true, verboseRead);
end when;
end CombiTable1DWithUpdate;发布于 2017-09-01 08:04:50
此外,我接受的答案,我想给出另一个解决办法,不是那么有效。对于一个带有电容和电阻的简单模型,我做了成功的测试,但是对于更复杂的模型,它不能正常工作。在Modelica脚本中,realTimeSimulation.mos:
outputFile := "stepResult.mat";
simulation_step := 1;
start_time := 0;
stop_time := start_time+simulation_step;
loadFile("WhereverTheFileIs.mo");
buildModel(myTestModel);
system("myTestModel-override=startTime="+String(start_time)+",stopTime="+String(stop_time)+" -r="+outputFile);将建立模型并进行第一步仿真,直到仿真时间达到t=1s。稍后,使用Python更新文本文件。t=1s和t=2s之间时间的新数据被写入到文本文件中,我将在该文本文件中获取模型的输入。然后对t=1s和t=2s之间的时间进行了仿真。作为一个循环,它继续就像:实现数据,为新的时间间隔做新的仿真。诀窍是,读取每个步骤末尾创建的输出文件,并使用以下脚本将所有变量值作为新的初始条件提供给仿真:
valueList := readSimulationResultVars(outputFile);
start_time := start_time+simulation_step;
stop_time := stop_time+simulation_step;
value := val(OpenModelica.Scripting.stringVariableName(valueList[1]),start_time,outputFile);',
variableString := valueList[1] + "=" + String(value);
for i in 2:size(valueList,1) loop
value := val(OpenModelica.Scripting.stringVariableName(valueList[i]),start_time,outputFile);
variableString := variableString + "," + valueList[i] + "=" + String(value);
end for;
system("myTestModel-override startTime="+String(start_time)+",stopTime="+String(stop_time)+",variableString+" -r="+outputFile);https://stackoverflow.com/questions/45759880
复制相似问题