Engee 文档
Notebook

软件模型管理的应用

此示例演示模型管理工具之一-软件管理。

软件管理允许您创建,运行和保存模型,以及使用特殊命令在脚本编辑器中更改其参数。

In [ ]:
cd( @__DIR__ ) # Переместимся в каталог, где лежит текущий скрипт
homePath = string(@__DIR__)
Out[0]:
"/user/start/examples/base_simulation/command_control"

创建和保存模型

In [ ]:
# Для повторного запуска команды create
if "model" in [m.name for m in engee.get_all_models()]
    engee.close("model", force=true)
end
Out[0]:
Model(
	name: newmodel_1
	id: 44f96846-5a38-40ef-bb8a-53aed569e391
)

创建模型:

In [ ]:
engee.create("model")
Out[0]:
Model(
	name: model
	id: b1ef1997-a2a6-4c65-8f4d-8c251ab2e2c0
)

查看打开模型的名称由函数执行:
``'茱莉亚
恩吉。get_current_model()::模型
恩吉。gcm()::模型


In [ ]:
m = engee.gcm()
Out[0]:
Model(
	name: model
	id: b1ef1997-a2a6-4c65-8f4d-8c251ab2e2c0
)
使用函数保存模型 save():
In [ ]:
engee.save( "model", "$homePath/model.engee"; force=true )
Out[0]:
Model(
	name: model
	id: b1ef1997-a2a6-4c65-8f4d-8c251ab2e2c0
)

使用指定的路径保存模型。:

image.png

您可以使用该函数查看打开的模型列表 get_all_models():

In [ ]:
engee.get_all_models()
Out[0]:
3-element Vector{Engee.Types.Model}:
 Model(
	name: model
	id: b1ef1997-a2a6-4c65-8f4d-8c251ab2e2c0
)

 Model(
	name: newmodel_1
	id: 44f96846-5a38-40ef-bb8a-53aed569e391
)

 Model(
	name: program_control_model
	id: b27bcfc6-48bb-4546-b400-dc7fa3e7c3ad
)

加载模型并更改仿真参数

image1.png

如果模型还没有在编辑器中打开,那么我们使用函数加载模型 load(). 如果它已经打开,那么您需要使用该功能 open(). 然后我们使用命令获取仿真参数 get_param():

In [ ]:
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" ) # получение параметров моделирования
Out[0]:
ModelParameters(
  :EnableMultiTasking => false
  :GenerateComments => true

  #Параметры интегратора:
  :StartTime => 0.0
  :StopTime => 10
  :SolverName => Tsit5
  :SolverType => variable-step
  :MaxStep => auto
  :MinStep => auto
  :InitialStep => auto
  :RelTol => auto
  :AbsTol => auto
  :OutputOption => true
  :OutputTimes => 1e-2
)

可以使用函数更改仿真参数 set_param!():

In [ ]:
engee.set_param!("program_control_model", "SolverName" => "Tsit5", "SolverType" => "variable-step") #= меняем постоянный шаг решателя
                                                                  на переменный и изменяем сам решатель =#
engee.get_param("program_control_model") # выводим параметры с внесёнными изменениями
Out[0]:
ModelParameters(
  :EnableMultiTasking => false
  :GenerateComments => true

  #Параметры интегратора:
  :StartTime => 0.0
  :StopTime => 10
  :SolverName => Tsit5
  :SolverType => variable-step
  :MaxStep => auto
  :MinStep => auto
  :InitialStep => auto
  :RelTol => auto
  :AbsTol => auto
  :OutputOption => true
  :OutputTimes => 1e-2
)
In [ ]:
engee.set_param!("program_control_model", "MinStep" => "auto", "MaxStep" => "auto") #= меняем постоянный шаг решателя
                                                                  на переменный и изменяем сам решатель =#
engee.get_param("program_control_model") # выводим параметры с внесёнными изменениями
Out[0]:
ModelParameters(
  :EnableMultiTasking => false
  :GenerateComments => true

  #Параметры интегратора:
  :StartTime => 0.0
  :StopTime => 10
  :SolverName => Tsit5
  :SolverType => variable-step
  :MaxStep => auto
  :MinStep => auto
  :InitialStep => auto
  :RelTol => auto
  :AbsTol => auto
  :OutputOption => true
  :OutputTimes => 1e-2
)

运行模拟

``'茱莉亚
run([m::Model];verbose=false)


  开始执行模型。 如果未指定模型,则启动对当前模型的模拟。 如果模型未打开,则抛出NoModelOpenedException。

  争论:

* `verbose`:是否打印进度,默认情况下 `verbose=false`.

* `m::Model`:为其执行操作的默认模型是当前模型。

  例子::
``'茱莉亚
      engee>m=engee。负载("开始/示例/powersystems/models/power_line_apv。engee")
      恩吉>恩吉。跑(m)
      带有6个条目的Dict{String,DataFrame}:
         "Va"=>40001×2数据帧…
         "Ia"=>40001×2数据帧…
         "Ib"=>40001×2数据帧…
         "Ic"=>40001×2数据帧…
         "Vc"=>40001×2数据帧…
         "Vb"=>40001×2数据框…

使用仿真进度输出运行模型:

In [ ]:
engee.run(m, verbose=true)
Building...
Progress 100%
Out[0]:
Dict{String, DataFrames.DataFrame} with 3 entries:
  "Add.1"         => 1001×2 DataFrame…
  "Sine Wave-1.1" => 1001×2 DataFrame…
  "Sine Wave.1"   => 1001×2 DataFrame

查看模拟结果

使用该函数可以获得仿真结果 get_results():

``'茱莉亚
恩吉。get_results(model_name::String)
恩吉。get_results(模型::模型)
恩吉。get_结果()

以字典的形式返回模型的最后一次模拟的结果 `Dict{String, DataFrame}`,其中键是被监视端口的名称。

如果模型未打开,则引发异常。 `NoModelOpenedException`.

如果模拟未运行,则引发异常。 `ModelIsNotRunningException`.


争论:

* `m::Model`:为其执行操作的默认模型是当前模型。

  例子::
``'茱莉亚
      engee>m=engee。负载("开始/示例/powersystems/models/power_line_apv。engee")
      engee>结果1=engee。跑(m);
      engee>结果2=engee。get_结果(m)
      带有6个条目的Dict{String,DataFrame}:
        "Va"=>40001×2数据帧…
        "Ia"=>40001×2数据帧…
        "Ib"=>40001×2数据帧…
        "Ic"=>40001×2数据帧…
        "Vc"=>40001×2数据帧…
        "Vb"=>40001×2数据框…
      结果>结果1==结果2
      真的 

显示仿真过程中获得的结果:

In [ ]:
results = engee.get_results( "program_control_model" )
Out[0]:
Dict{String, DataFrames.DataFrame} with 3 entries:
  "Add.1"         => 1001×2 DataFrame…
  "Sine Wave-1.1" => 1001×2 DataFrame…
  "Sine Wave.1"   => 1001×2 DataFrame

将仿真结果记录到变量中,并显示包含结果的汇总表:

In [ ]:
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 значений получившейся таблицы
Out[0]:

10 rows × 4 columns

timevaluex1x1_1
Float64Float64Float64Float64
10.00.00.8414710.841471
20.010.009999830.8468320.856832
30.020.01999870.8521080.872107
40.030.02999550.8572990.887294
50.040.03998930.8624040.902394
60.050.04997920.8674230.917402
70.060.0599640.8723550.932319
80.070.06994280.8772010.947143
90.080.07991470.8819580.961873
100.090.08987850.8866270.976505

我们绘制了作为模拟结果获得的值的变化。:

In [ ]:
using Plots
plot(table[:,1], table[:,2])
plot!(table[:,1], table[:,3])
plot!(table[:,1], table[:,4])
Out[0]:

结论:

在这个例子中,我们演示了使用软件模型控制从脚本运行模拟。

在执行代码的过程中,创建并保存了一个新模型,加载了完成的模型,更改了仿真参数,并且使用图形库显示了仿真结果并将其转换为方便的形式。

示例中使用的块