如何使用 OMPython 或 Python CLI 界面编辑 modelica 模型的参数
How to edit parameters of modelica model with OMPython or Python CLI interface
我想在Python CLI 界面中编辑modelica 模型参数,但不知道如何找到正确的方法。
Modelica 型号代码:
model Syslam_Q5
HePackage.Components.Hlam hlam(
UCfile=
"C:/Users/Pikachu/Docs/i_v2/H50.txt",
A_HS_mod1 = 0.0786,
CSize_flag=false,
A_HS_mod2 = 0.0914,
A_HS_mod3 = 0.0223,
A_HS_mod4 = 0.0245)
Python代码:
from OMPython import OMCSessionZMQ
omc = OMCSessionZMQ()
cmds = [
'loadFile("HePackage.mo")',
#'removeElementModifiers(HePackage.Systems.Syslam_Q5, "component", false)',
'setElementModifierValue(HePackage.Systems.Syslam_Q5, HePackage.Components.Hlam, hlam.UCfile = C:/Users/Pikachu/Docs/i_v2/H100.txt)',
#'setParameterValue(HePackage.Systems.Syslam_Q5, hlam.UCfile, $Code(=C:/Users/Pikachu/Docs/i_v2/H100.txt))',
'saveModel("example_edit.mo", Example)',
]
for cmd in cmds:
answer = omc.sendExpression(cmd)
print(cmd, ':', answer)
在我有大约 10 个文本文件的文件夹中,我想 运行 所有文本文件的 modelica 模型。
如何使用 Python 界面做到这一点。
谢谢
有多种方法可以做到这一点。
使用设置方法
使用mod.setParameters(["radius=14","c=0.5"])
,见user's guide on OMPython。
在模拟时覆盖变量
您还可以覆盖变量,包括带有模拟标志的参数 -override and -overrideFile。
所以添加命令到cmds
simulate(example_edit, simflags=\"-override=radius=14,c=0.5\")
应该可以。
如果您有很多参数要更改,请使用覆盖文件:
radius=14
c=0.5
我在 HePackage.mo
:
制作了这个包用于测试
package HePackage
package Systems
model Syslam_Q5
HePackage.Components.Hlam hlam(
UCfile=
"C:/Users/Pikachu/Docs/i_v2/H50.txt",
A_HS_mod1 = 0.0786,
CSize_flag=false,
A_HS_mod2 = 0.0914,
A_HS_mod3 = 0.0223,
A_HS_mod4 = 0.0245,
A_HS_mod5 = {5, 4, 3, 2, 1});
end Syslam_Q5;
end Systems;
package Components
model Hlam
parameter String UCfile = "";
parameter Real A_HS_mod1 = 0.0;
parameter Real A_HS_mod2 = 0.0;
parameter Real A_HS_mod3 = 0.0;
parameter Real A_HS_mod4 = 0.0;
parameter Boolean CSize_flag = false;
parameter Real A_HS_mod5[5] = {1, 2, 3, 4, 5};
end Hlam;
end Components;
end HePackage;
然后使用这个 setModifiers.mos
脚本:
loadFile("HePackage.mo"); getErrorString();
list(HePackage.Systems.Syslam_Q5); getErrorString();
setElementModifierValue(HePackage.Systems.Syslam_Q5, hlam.UCfile, $Code(="C:/some/other/file.txt")); getErrorString();
setElementModifierValue(HePackage.Systems.Syslam_Q5, hlam.A_HS_mod1, $Code(=1.0)); getErrorString();
setElementModifierValue(HePackage.Systems.Syslam_Q5, hlam.CSize_flag, $Code(=true)); getErrorString();
setElementModifierValue(HePackage.Systems.Syslam_Q5, hlam.A_HS_mod2, $Code(=2.0)); getErrorString();
setElementModifierValue(HePackage.Systems.Syslam_Q5, hlam.A_HS_mod3, $Code(=3.0)); getErrorString();
setElementModifierValue(HePackage.Systems.Syslam_Q5, hlam.A_HS_mod4, $Code(=4.0)); getErrorString();
setElementModifierValue(HePackage.Systems.Syslam_Q5, hlam.A_HS_mod5, $Code(={1.0, 2.0, 5.0, 4.0, 3.0})); getErrorString();
list(HePackage.Systems.Syslam_Q5); getErrorString();
你通过运行获得:omc setModifiers.mos
:
adrpo33@ida-0030 MINGW64 /c/Users/adrpo33/Downloads
# omc setModifiers.mos
true
""
"model Syslam_Q5
HePackage.Components.Hlam hlam(UCfile = \"C:/Users/Pikachu/Docs/i_v2/H50.txt\", A_HS_mod1 = 0.0786, CSize_flag = false, A_HS_mod2 = 0.0914, A_HS_mod3 = 0.0223, A_HS_mod4 = 0.0245, A_HS_mod5 = {5, 4, 3, 2, 1});
end Syslam_Q5;"
""
Ok
""
Ok
""
Ok
""
Ok
""
Ok
""
Ok
""
Ok
""
"model Syslam_Q5
HePackage.Components.Hlam hlam(UCfile = \"C:/some/other/file.txt\", A_HS_mod1 = 1.0, CSize_flag = true, A_HS_mod2 = 2.0, A_HS_mod3 = 3.0, A_HS_mod4 = 4.0, A_HS_mod5 = {1.0, 2.0, 5.0, 4.0, 3.0});
end Syslam_Q5;"
""
我使用了 .mos 脚本,但您可以通过 OMPython 使用这些命令。
我不知道你需要做什么,在顶层即时构建另一个模型可能更容易,例如:
loadString("
model SomeParameterSet1
extends HePackage.Systems.Syslam_Q5(hlam(file=\"some/file\", A_HS_mod1 = 1));
end SomeParameterSet1;");
simulate(SomeParameterSet1);
saveModel("SomeParameterSet1.mo", SomeParameterSet1);
我想在Python CLI 界面中编辑modelica 模型参数,但不知道如何找到正确的方法。
Modelica 型号代码:
model Syslam_Q5
HePackage.Components.Hlam hlam(
UCfile=
"C:/Users/Pikachu/Docs/i_v2/H50.txt",
A_HS_mod1 = 0.0786,
CSize_flag=false,
A_HS_mod2 = 0.0914,
A_HS_mod3 = 0.0223,
A_HS_mod4 = 0.0245)
Python代码:
from OMPython import OMCSessionZMQ
omc = OMCSessionZMQ()
cmds = [
'loadFile("HePackage.mo")',
#'removeElementModifiers(HePackage.Systems.Syslam_Q5, "component", false)',
'setElementModifierValue(HePackage.Systems.Syslam_Q5, HePackage.Components.Hlam, hlam.UCfile = C:/Users/Pikachu/Docs/i_v2/H100.txt)',
#'setParameterValue(HePackage.Systems.Syslam_Q5, hlam.UCfile, $Code(=C:/Users/Pikachu/Docs/i_v2/H100.txt))',
'saveModel("example_edit.mo", Example)',
]
for cmd in cmds:
answer = omc.sendExpression(cmd)
print(cmd, ':', answer)
在我有大约 10 个文本文件的文件夹中,我想 运行 所有文本文件的 modelica 模型。 如何使用 Python 界面做到这一点。 谢谢
有多种方法可以做到这一点。
使用设置方法
使用mod.setParameters(["radius=14","c=0.5"])
,见user's guide on OMPython。
在模拟时覆盖变量
您还可以覆盖变量,包括带有模拟标志的参数 -override and -overrideFile。
所以添加命令到cmds
simulate(example_edit, simflags=\"-override=radius=14,c=0.5\")
应该可以。
如果您有很多参数要更改,请使用覆盖文件:
radius=14
c=0.5
我在 HePackage.mo
:
package HePackage
package Systems
model Syslam_Q5
HePackage.Components.Hlam hlam(
UCfile=
"C:/Users/Pikachu/Docs/i_v2/H50.txt",
A_HS_mod1 = 0.0786,
CSize_flag=false,
A_HS_mod2 = 0.0914,
A_HS_mod3 = 0.0223,
A_HS_mod4 = 0.0245,
A_HS_mod5 = {5, 4, 3, 2, 1});
end Syslam_Q5;
end Systems;
package Components
model Hlam
parameter String UCfile = "";
parameter Real A_HS_mod1 = 0.0;
parameter Real A_HS_mod2 = 0.0;
parameter Real A_HS_mod3 = 0.0;
parameter Real A_HS_mod4 = 0.0;
parameter Boolean CSize_flag = false;
parameter Real A_HS_mod5[5] = {1, 2, 3, 4, 5};
end Hlam;
end Components;
end HePackage;
然后使用这个 setModifiers.mos
脚本:
loadFile("HePackage.mo"); getErrorString();
list(HePackage.Systems.Syslam_Q5); getErrorString();
setElementModifierValue(HePackage.Systems.Syslam_Q5, hlam.UCfile, $Code(="C:/some/other/file.txt")); getErrorString();
setElementModifierValue(HePackage.Systems.Syslam_Q5, hlam.A_HS_mod1, $Code(=1.0)); getErrorString();
setElementModifierValue(HePackage.Systems.Syslam_Q5, hlam.CSize_flag, $Code(=true)); getErrorString();
setElementModifierValue(HePackage.Systems.Syslam_Q5, hlam.A_HS_mod2, $Code(=2.0)); getErrorString();
setElementModifierValue(HePackage.Systems.Syslam_Q5, hlam.A_HS_mod3, $Code(=3.0)); getErrorString();
setElementModifierValue(HePackage.Systems.Syslam_Q5, hlam.A_HS_mod4, $Code(=4.0)); getErrorString();
setElementModifierValue(HePackage.Systems.Syslam_Q5, hlam.A_HS_mod5, $Code(={1.0, 2.0, 5.0, 4.0, 3.0})); getErrorString();
list(HePackage.Systems.Syslam_Q5); getErrorString();
你通过运行获得:omc setModifiers.mos
:
adrpo33@ida-0030 MINGW64 /c/Users/adrpo33/Downloads
# omc setModifiers.mos
true
""
"model Syslam_Q5
HePackage.Components.Hlam hlam(UCfile = \"C:/Users/Pikachu/Docs/i_v2/H50.txt\", A_HS_mod1 = 0.0786, CSize_flag = false, A_HS_mod2 = 0.0914, A_HS_mod3 = 0.0223, A_HS_mod4 = 0.0245, A_HS_mod5 = {5, 4, 3, 2, 1});
end Syslam_Q5;"
""
Ok
""
Ok
""
Ok
""
Ok
""
Ok
""
Ok
""
Ok
""
"model Syslam_Q5
HePackage.Components.Hlam hlam(UCfile = \"C:/some/other/file.txt\", A_HS_mod1 = 1.0, CSize_flag = true, A_HS_mod2 = 2.0, A_HS_mod3 = 3.0, A_HS_mod4 = 4.0, A_HS_mod5 = {1.0, 2.0, 5.0, 4.0, 3.0});
end Syslam_Q5;"
""
我使用了 .mos 脚本,但您可以通过 OMPython 使用这些命令。
我不知道你需要做什么,在顶层即时构建另一个模型可能更容易,例如:
loadString("
model SomeParameterSet1
extends HePackage.Systems.Syslam_Q5(hlam(file=\"some/file\", A_HS_mod1 = 1));
end SomeParameterSet1;");
simulate(SomeParameterSet1);
saveModel("SomeParameterSet1.mo", SomeParameterSet1);