是否可以使用python创建dymola模型(.mo)?

时间:2017-10-06 13:23:03

标签: python interface model dymola

我知道可以使用python dymola接口进行参数研究。然而,这假设已经存在现有模型。我特别感兴趣的是在python中编写modelica方程。但我没有找到任何关于此的文件。有没有人有一些饲料?谢谢!

2 个答案:

答案 0 :(得分:2)

正如matth指出的那样,最干净的方法可能是使用模板引擎。 但是要开始,简单的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类的代码

getClassText(fullName, includeAnnotations=True, formatted=False)

其中fullName是Dymolas包浏览器中Modelica类的完整路径。

编写模型

Dymola没有提供更新模型部分的任何内容,但是如果该类已经存在,则有一个命令可以创建新类或覆盖整个类文本:

setClassText(parentName, fullText)

parentName是父类的路径,通常是一个包(如果类应位于顶层,则为空字符串),新类文本为fullText

至于阅读,你也可以在文件的基础上进行操作,只需创建一个.mo文件并在Dymola中加载。

非python开发人员的注意事项

函数setClassTextgetClassText也适用于java接口和DymolaCommands库中的Dymola。

答案 1 :(得分:1)

Dymola Python界面的文档在您的本地计算机上,对于Windows用户来说就是这里(只需将URL复制到您的webbrowser):

file:///C:/Program Files (x86)/Dymola 2018/Modelica/Library/python_interface/doc/index.html

快速扫描我看不到任何功能,例如从字符串创建模型。 我以为我在OpenModelica scripting documentation看到了这样的功能,但我再也找不到了。

但是你当然可以将该字符串写入.mo文件,然后模拟该文件。 也许使用像MakoJinja2这样的模板引擎对你来说是个有趣的选择吗?您必须编写一个只替换少量变量的模型模板。或者使用f-strings introduced with Python 3.6执行相同操作。

在此基础上,您还可以为具有参数,属性,方法,构造函数等的模型编写自己的面向对象的Python类。还有一个抽象层,以便可以在Dymola,OpenModelica,SimulationX或FMU中模拟模型。

或者Modelica-related packages on PyPI中的一个可以做你需要的事情吗?