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