如何在DYMOLA中为不同型号的指定时间开始模拟?

时间:2014-06-09 09:17:51

标签: modeling modelica dymola

我已经在dymola中制作了3个模型,并希望按顺序(一个接一个地)对它们进行朗读,使得一个输出应作为下一个输入传递。我的模型计算温度,一个模型的最终温度应该是下一个模型的初始温度。 你可以为此建议一个方法吗? stategraph是否可以用于此目的以及如何使用?

1 个答案:

答案 0 :(得分:1)

尽管这个问题已经很老了,但肯定是其他人也可能面临的一个问题,所以这里回答(有点晚了...)。

在Dymola中,使用功能DymolaCommands.SimulatorAPI.simulateExtendedModel可以很容易地解决所描述的问题。它允许设置模拟的开始和停止时间,初始化状态以及读取变量的最终值。

以下是一个示例Modelica函数的外观,该函数使用simulateExtendedModel将模拟结果从Model1延续到Model2。假定在两个模型中都使用温度传感器来测量目标温度,并初始化热电容器的起始温度:

function Script
protected 
  Modelica.SIunits.Temperature T[1] "Stores the final temperature at simulation end";
  Boolean ok "Indicates if simulation completed without error";
  String models[:] = {"MyLib.Model1", "MyLib.Model2"} "Full class paths for models to simulate";
algorithm 
   // Simulation 1 with model 1 from 0s to 1s  
  (ok, T) :=DymolaCommands.SimulatorAPI.simulateExtendedModel(
    models[1],
    startTime=0,
    stopTime=1,
    finalNames={"temperatureSensor.T"},
    resultFile=models[1]);

   // Simulation 2 with model 2 from 1s to 2s    
  (ok, T) :=DymolaCommands.SimulatorAPI.simulateExtendedModel(
    models[2],
    startTime=1,
    stopTime=2,
    initialNames={"heatCapacitor.T"},
    initialValues={T[1]},
    finalNames={"temperatureSensor.T"},
    resultFile=models[2]);

  // Plot temperature output of all models
  for m in models loop
    createPlot(
      id=1,
      heading="temperatureSensor.T",
      y={"temperatureSensor.T"},
      legends={m},
      filename=m+".mat",
      erase=m==models[1],
      grid=true,
      position={0, 0, 700, 400});
  end for;
end Script;

请注意,simulateExtendedModel的第二个返回值是一个向量(因为使用finalNames可以访问多个最终值),因此变量T被向量化。