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
)

使用函数查看已打开模型的名称:

    engee.get_current_model()::Model
    engee.gcm()::Model
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.load("start/examples/powersystems/models/power_line_apv.engee")
      engee> engee.run(m)
      Dict{String, DataFrame}  6 个条目:
         "Va" => 40001×2 DataFrame....
         "Ia" => 40001×2 DataFrame...
         "Ib" => 40001×2 DataFrame...
         "Ic" => 40001×2 DataFrame...
         "Vc" => 40001×2 DataFrame...
         "Vb" => 40001×2 DataFrame...

运行模型并输出模拟进度:

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() 检索模拟结果:

    engee.get_results(model_name::String)
    engee.get_results(model::Model)
    engee.get_results()

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

如果模型未打开,则会打印一个异常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}  6 个条目:
        "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> 结果 1 == 结果 2
      true 

显示模拟结果

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]:

结论

本例演示了如何使用软件模型控制来运行脚本模拟。

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

示例中使用的块