OpenModelica 实时更新 CombiTable 输入

OpenModelica updating CombiTable input in real time

我有一个模型,我在其中使用 CombiTable1D 从 .txt 文件中检索外部输入。该文件目前由 Python 脚本生成,但在项目的最后阶段,它将每秒更新一次。目前,由于 .txt 文件是静态的,所以模拟没有问题。只需读取文件并根据其中写入的数据进行模拟即可。

我想做的是模拟一个模型直到某个时间,比方说 100s,然后让它等到 .txt 文件的实时事件针对 100-200 之间的下一个外部输入值进行更新。模拟应该通过在接下来的 100 秒内获取这些新值来继续。

因为我已经在使用 OMPython,所以使用 Python 编辑 .txt 文件对我来说真的很实用,比方说实时每 10 秒。我现在可以模拟模型,直到我定义为外部输入刷新点的时间实例。但我不知道如何保持模拟状态并让它再次读取文件。

实际上,这对我来说听起来像是一个联合仿真场景。无论如何,您可以做的是从 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;

除了我接受的答案之外,我想给出另一个不太有效的解决方案。对于带有电容器和电阻器的简单模型,我进行了成功的测试,但对于更复杂的模型,它无法正常工作。在 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);