是否可以使用 python 创建一个 dymola 模型 (.mo)?
Is it possible to create a dymola model (.mo) using python?
我知道可以使用 python dymola 界面进行参数研究。然而,这假设已经存在一个模型。我特别感兴趣的是在 python 中编写 modelica 方程。但是我没有找到任何关于这个的文件。有人有反馈吗?谢谢!!
Dymola Python 界面的文档在您的本地计算机上,对于 Windows 用户,它在此处(只需将 URL 复制到您的网络浏览器):
file:///C:/Program Files (x86)/Dymola 2018/Modelica/Library/python_interface/doc/index.html
快速扫描我看不到任何功能,例如从字符串创建模型。
我以为我在OpenModelica scripting documentation里看到过这样的功能,但是我找不到了。
但您当然可以始终将该字符串写入 .mo 文件,然后模拟该文件。
也许使用像 Mako or Jinja2 is an interesting option for you here? You would have to write a template of a model that just replaces few variables. Or use the f-strings introduced with Python 3.6 这样的模板引擎来做同样的事情。
在此基础上,您还可以为具有参数、属性、方法、构造函数等的模型编写自己的面向对象 Python 类。以及一个抽象层,以便可以在 Dymola、OpenModelica、SimulationX 或 FMU 中模拟模型。
或者 Modelica-related packages on PyPI 之一可以满足您的需求?
正如 所指出的,最简洁的方法可能是使用模板引擎。
但要开始,简单的 python 字符串格式化也可以。
但是,问题或多或少都比较复杂,具体取决于您是要更新现有模型的一部分还是从头开始创建新模型。
创建新模型
这里是一个示例,说明如何根据您的参数、变量和方程式创建简单的 Modelica 模型(如果它们已在 Python:
中可用)
name = 'myModel'
parameters = ['Real x=3', 'Boolean a=false']
variables = ['Real y', 'Boolean b']
equations = ['der(y) = x*time', 'b=not a']
template = """
model {name}
{parameters}
{variables}
equation
{equations}
end {name};"""
model = template.format(name=name,
parameters='parameter '+';\n parameter '.join(parameters)+';' if parameters else '',
variables=';\n '.join(variables)+';' if variables else '',
equations=';\n '.join(equations)+';' if equations else '')
如果需要,可以像处理参数一样处理常量。
更新现有模型
如果要更新现有模型的某些部分,它会变得更加复杂,因为您必须解析 Modelica 代码并确保正确识别参数、变量、方程式等。
如果您只想对某些设计为具有例如更新的方程式变得更简单。您可以标记等式部分的开始和结束,以便轻松识别它们并插入新等式。所以你会例如有这样的模型:
model myModel
equation
// #equationSectionStart
...
// #equationSectionEnd
end myModel;
然后用正则表达式替换标签之间的内容
你还必须以某种方式读写模型,所以下面有一些提示。
正在读取 Python
中的模型
您可以读取 .mo 文件的内容或使用 python 接口并使用
从 Dymola 获取加载的 Modelica class 的代码
getClassText(fullName, includeAnnotations=True, formatted=False)
其中 fullName 是 Dymolas 包浏览器中 Modelica class 的完整路径。
写作模式
Dymola 不提供任何更新部分模型的功能,但有一个命令可以创建新的 classes 或 overwrites 整个 class如果 class 已经存在,文本:
setClassText(parentName, fullText)
parentName
是父 class 的路径,它通常是一个包(如果 class 应该在顶层,则为空字符串)和新的 class 文本将是 fullText
.
关于阅读,也可以按文件操作,只需要创建一个.mo文件并加载到Dymola中即可。
非python 开发人员注意事项
函数 setClassText
和 getClassText
也可用于 java 界面和 DymolaCommands
库中的 Dymola 内部。
我知道可以使用 python dymola 界面进行参数研究。然而,这假设已经存在一个模型。我特别感兴趣的是在 python 中编写 modelica 方程。但是我没有找到任何关于这个的文件。有人有反馈吗?谢谢!!
Dymola Python 界面的文档在您的本地计算机上,对于 Windows 用户,它在此处(只需将 URL 复制到您的网络浏览器):
file:///C:/Program Files (x86)/Dymola 2018/Modelica/Library/python_interface/doc/index.html
快速扫描我看不到任何功能,例如从字符串创建模型。 我以为我在OpenModelica scripting documentation里看到过这样的功能,但是我找不到了。
但您当然可以始终将该字符串写入 .mo 文件,然后模拟该文件。 也许使用像 Mako or Jinja2 is an interesting option for you here? You would have to write a template of a model that just replaces few variables. Or use the f-strings introduced with Python 3.6 这样的模板引擎来做同样的事情。
在此基础上,您还可以为具有参数、属性、方法、构造函数等的模型编写自己的面向对象 Python 类。以及一个抽象层,以便可以在 Dymola、OpenModelica、SimulationX 或 FMU 中模拟模型。
或者 Modelica-related packages on PyPI 之一可以满足您的需求?
正如
但是,问题或多或少都比较复杂,具体取决于您是要更新现有模型的一部分还是从头开始创建新模型。
创建新模型
这里是一个示例,说明如何根据您的参数、变量和方程式创建简单的 Modelica 模型(如果它们已在 Python:
中可用)name = 'myModel'
parameters = ['Real x=3', 'Boolean a=false']
variables = ['Real y', 'Boolean b']
equations = ['der(y) = x*time', 'b=not a']
template = """
model {name}
{parameters}
{variables}
equation
{equations}
end {name};"""
model = template.format(name=name,
parameters='parameter '+';\n parameter '.join(parameters)+';' if parameters else '',
variables=';\n '.join(variables)+';' if variables else '',
equations=';\n '.join(equations)+';' if equations else '')
如果需要,可以像处理参数一样处理常量。
更新现有模型
如果要更新现有模型的某些部分,它会变得更加复杂,因为您必须解析 Modelica 代码并确保正确识别参数、变量、方程式等。
如果您只想对某些设计为具有例如更新的方程式变得更简单。您可以标记等式部分的开始和结束,以便轻松识别它们并插入新等式。所以你会例如有这样的模型:
model myModel
equation
// #equationSectionStart
...
// #equationSectionEnd
end myModel;
然后用正则表达式替换标签之间的内容
你还必须以某种方式读写模型,所以下面有一些提示。
正在读取 Python
中的模型您可以读取 .mo 文件的内容或使用 python 接口并使用
从 Dymola 获取加载的 Modelica class 的代码getClassText(fullName, includeAnnotations=True, formatted=False)
其中 fullName 是 Dymolas 包浏览器中 Modelica class 的完整路径。
写作模式
Dymola 不提供任何更新部分模型的功能,但有一个命令可以创建新的 classes 或 overwrites 整个 class如果 class 已经存在,文本:
setClassText(parentName, fullText)
parentName
是父 class 的路径,它通常是一个包(如果 class 应该在顶层,则为空字符串)和新的 class 文本将是 fullText
.
关于阅读,也可以按文件操作,只需要创建一个.mo文件并加载到Dymola中即可。
非python 开发人员注意事项
函数 setClassText
和 getClassText
也可用于 java 界面和 DymolaCommands
库中的 Dymola 内部。