是否可以使用 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 开发人员注意事项

函数 setClassTextgetClassText 也可用于 java 界面和 DymolaCommands 库中的 Dymola 内部。