В зависимости от того, какой инструмент у вас есть, это может означать большую работу.
Первая проблема заключается в том, что MSL позволяет вам получать системное время, но в нем нет ничего, что могло бы легко вычислить дельты времени. Поэтому библиотека тестирования в Dymola содержит записи операторов DateTime
и Duration
. Обратите внимание, что планируется интегрировать их в будущие версии MSL, но на данный момент это доступно только через библиотеку тестирования для пользователей Dymola.
Вторая проблема заключается в том, что не существует стандартизированного способа перевода и симуляции моделей. У каждого инструмента есть свой способ сделать это из скриптов. Таким образом, не зная, какой инструмент вы используете, невозможно дать точный ответ.
Что Modelica предлагает в MSL
В текущей версии 3.2.3 Стандартной библиотеки Modelica вы можете прочитать текущее системное время через 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 переменных, каждая из которых имеет свой собственный диапазон значений.
Как измерять время перевода и моделирования в целом
С помощью gettime()
вы можете создать функцию, которая:
- читает системное время, когда t_start
- переводит модель и моделирует в течение 0 секунд
- снова считывает системное время, а t_stop
- вычисляет разницу между t_start и t_stop.
Шаг 2 зависит от инструмента. В Dymola вы вызываете
DymolaCommands.SimulatorAPI.simulateModel("path-to-model", 0, 0);
, который преобразует вашу модель и моделирует ее в течение 0 секунд, поэтому он запускает только раздел инициализации.
Для пользователей Dymola
The Testing Библиотека содержит функцию Testing.Utilities.Simulation.timing
, которая делает почти то, что вам нужно.
Чтобы перевести и смоделировать вашу модель, вызовите ее следующим образом:
Testing.Utilities.Simulation.timing(
"Modelica.Blocks.Examples.PID_Controller",
task=Testing.Utilities.Simulation.timing.Task.fullTranslate_simulate,
loops=3);
Это переведет вашу модель и смоделирует для 1 секунду три раза и вычислите среднее значение.
Чтобы смоделировать в течение 0 с, продублируйте функцию и измените значение
if simulate then
_ :=simulateModel(c);
end if;
на
if simulate then
_ :=simulateModel(c, 0, 0);
end if;