Применение программного управления моделью
Данный пример демонстрирует один из инструментов управления моделью - программное управление.
Программное управление позволяет создавать, запускать и сохранять модели, а также изменять их параметры в редакторе скриптов с помощью специальных команд.
cd( @__DIR__ ) # Переместимся в каталог, где лежит текущий скрипт
homePath = string(@__DIR__)
Создание и сохранение модели
# Для повторного запуска команды create
if "model" in [m.name for m in engee.get_all_models()]
engee.close("model", force=true)
end
Создание модели:
engee.create("model")
Просмотр имени открытой модели осуществляется функцией:
engee.get_current_model()::Model
engee.gcm()::Model
m = engee.gcm()
Сохранение модели с помощью функции save()
:
engee.save( "model", "$homePath/model.engee"; force=true )
Модель была сохранена по указанному пути:

Просмотр списка открытых моделей можно произвести с помощью функции get_all_models()
:
engee.get_all_models()
Загрузка модели и изменение параметров моделирования

Если модель еще не открыта в редакторе, то мы загружаем модель с помощью функции load()
. Если уже открыта, то нужно пользоваться функцией open()
. Затем получаем параметры моделирования с помощью команды get_param()
:
if "program_control_model" in [m.name for m in engee.get_all_models()]
m = engee.open( "program_control_model" ) # загрузка модели
else
m = engee.load( "$homePath/program_control_model.engee" ) # если модель уже открыта, выполните эту строчку
end
m_param = engee.get_param( "program_control_model" ) # получение параметров моделирования
Параметры моделирования можно изменить с помощью функции set_param!()
:
engee.set_param!("program_control_model", "SolverName" => "Tsit5", "SolverType" => "variable-step") #= меняем постоянный шаг решателя
на переменный и изменяем сам решатель =#
engee.get_param("program_control_model") # выводим параметры с внесёнными изменениями
engee.set_param!("program_control_model", "MinStep" => "auto", "MaxStep" => "auto") #= меняем постоянный шаг решателя
на переменный и изменяем сам решатель =#
engee.get_param("program_control_model") # выводим параметры с внесёнными изменениями
Запуск симуляции
run([m::Model]; verbose=false)
Запускает исполнение модели. Если модель не указана, запускает симуляцию текущей модели. Если модель не открыта, то бросается исключение NoModelOpenedException.
Аргументы:
-
verbose
: выводить ли прогресс на печать, по умолчаниюverbose=false
. -
m::Model
: модель, относительно которой выполняется операция, по умолчанию текущая модель.Пример:
engee> m = engee.load("start/examples/powersystems/models/power_line_apv.engee")
engee> engee.run(m)
Dict{String, DataFrame} with 6 entries:
"Va" => 40001×2 DataFrame…
"Ia" => 40001×2 DataFrame…
"Ib" => 40001×2 DataFrame…
"Ic" => 40001×2 DataFrame…
"Vc" => 40001×2 DataFrame…
"Vb" => 40001×2 DataFrame…
Запуск модели с выводом прогресса симуляции:
engee.run(m, verbose=true)
Просмотр результатов симуляции
Результаты симуляции можно получить с помощью функции get_results()
:
engee.get_results(model_name::String)
engee.get_results(model::Model)
engee.get_results()
Возвращает результаты последней симуляции модели в виде словаря Dict{String, DataFrame}
, где ключ - имя отслеживаемого порта.
Если модель не открыта, то выводится исключение NoModelOpenedException
.
Если симуляция не запущена, то выводится исключение ModelIsNotRunningException
.
Аргументы:
-
m::Model
: модель, относительно которой выполняется операция, по-умолчанию, текущая модель.Пример:
engee> m = engee.load("start/examples/powersystems/models/power_line_apv.engee")
engee> results1 = engee.run(m);
engee> results2 = engee.get_results(m)
Dict{String, DataFrame} with 6 entries:
"Va" => 40001×2 DataFrame…
"Ia" => 40001×2 DataFrame…
"Ib" => 40001×2 DataFrame…
"Ic" => 40001×2 DataFrame…
"Vc" => 40001×2 DataFrame…
"Vb" => 40001×2 DataFrame…
engee> results1 == results2
true
Отображение результатов, полученных в ходе симуляции:
results = engee.get_results( "program_control_model" )
Запись результатов моделирования в переменные и вывод итоговой таблицы с результатами:
sin1 = engee.get_results("program_control_model")["Sine Wave.1"]
sin2 = engee.get_results("program_control_model")["Sine Wave-1.1"]
sum_signal = engee.get_results("program_control_model")["Add.1"]
table = hcat(hcat(sin1, sin2[:,2], makeunique=true), sum_signal[:,2], makeunique=true) # используя сложение массивов по горизонтали (hcat()), составляем таблицу
first(table, 10) # выводим первые 10 значений получившейся таблицы
Строим график изменения величин, полученных в результате симуляции:
using Plots
plot(table[:,1], table[:,2])
plot!(table[:,1], table[:,3])
plot!(table[:,1], table[:,4])
Вывод:
В данном примере было продемонстрировано применение программного управления моделью для запуска симуляции из скрипта.
В ходе выполнения кода, была создана и сохранена новая модель, загружена готовая модель, изменены параметры симуляции, а также, с помощью графической библиотеки, были выведены результаты моделирования и преобразованы в удобный вид.