根据您拥有的工具,这可能意味着大量的工作。
第一个问题是 MSL 允许您检索系统时间,但没有包含任何内容来轻松计算时间增量。因此,Dymola 中的测试库包含操作员记录DateTime
and Duration
。请注意,计划将它们集成到未来的 MSL 版本中,但目前只能通过 Dymola 用户的测试库使用。
第二个问题是没有标准化的方法来翻译和模拟模型。每个工具都有自己的脚本方式来实现这一点。因此,在不知道您使用的是什么工具的情况下,不可能给出准确的答案。
Modelica 在 MSL 中提供什么
在当前的 Modelica 标准库版本 3.2.3 中,您可以通过以下方式读取实际系统时间Modelica.Utilities.System.getTime()
.
这个小例子展示了如何使用它:
function printSystemTime
protected
Integer ms, s, min, h, d, mon, a;
algorithm
(ms, s, min, h, d, mon, a) := Modelica.Utilities.System.getTime();
Modelica.Utilities.Streams.print("Current time is: "+String(h)+":"+String(min)+":"+String(s));
end printSystemTime;
您会看到它通过 7 个返回值给出了当前系统日期和时间。如果您想计算时间增量,这些变量不太好处理,因为您最终会得到 14 个变量,每个变量都有自己的值范围。
一般如何测量翻译和模拟时间
With gettime()
您可以构建一个函数:
- 读取系统时间为 t_start
- 平移模型并模拟 0 秒
- 再次读取系统时间并作为 t_stop
- 计算 t_start 和 t_stop 的差值。
步骤 2 取决于工具。在迪莫拉,你会打电话给
DymolaCommands.SimulatorAPI.simulateModel("path-to-model", 0, 0);
它会翻译你的模型并模拟它 0 秒,因此它只运行初始化部分。
对于 Dymola 用户
测试库包含函数Testing.Utilities.Simulation.timing
,这几乎完全符合您的要求。
要翻译和模拟您的模型,请按如下方式调用:
Testing.Utilities.Simulation.timing(
"Modelica.Blocks.Examples.PID_Controller",
task=Testing.Utilities.Simulation.timing.Task.fullTranslate_simulate,
loops=3);
这将转换您的模型并模拟 3 次 1 秒并计算平均值。
要模拟 0,请复制该函数并更改它
if simulate then
_ :=simulateModel(c);
end if;
to
if simulate then
_ :=simulateModel(c, 0, 0);
end if;