1

我的问题类似于janpeter的问题。我研究了Tiller 的电子书,并尝试使用OpenModelicaJModelica模拟示例“架构驱动方法”。我在 OpenModelica 中尝试了最小的示例“BaseSystem”,它工作正常。但是对于 JModelica 1.14 版,我在编译过程中遇到错误并且我的脚本失败。我的python脚本是:

import matplotlib.pyplot as plt
from pymodelica import compile_fmu
from pyfmi import load_fmu

# Variables: modelName, modelFile, extraLibPath
modelName = 'BaseSystem'
modelFile = 'BaseSystem.mo'
extraLibPath = 'C:\Users\Tom\Desktop\Tiller2015a\ModelicaByExample\Architectures'
compilerOption = {'extra_lib_dirs':[extraLibPath]}

# Compile model
fmuName = compile_fmu( modelName, modelFile, compiler_options=compilerOption)

# Load model
model = load_fmu( fmuName)

# Simulate model
res = model.simulate( start_time=0.0, final_time=5.0)

# Extract interesting values
res_w = res['sensor.w']
res_y = res['setpoint.y']
tSim = res['time']

# Visualize results
fig = plt.figure(1)
ax1 = fig.add_subplot(111)
ax2 = ax1.twinx()
ax1.plot(tSim, res_w, 'g-')
ax2.plot(tSim, res_y, 'b-')
ax1.set_xlabel('t (s)')
ax1.set_ylabel('w (???)', color='g')
ax2.set_ylabel('y (???)', color='b')
plt.title('BaseSystem')
plt.legend()
plt.grid(True)
plt.show()

我的问题是如何编译和模拟作为包一部分的模型?

4

2 回答 2

1

我不是 jModelica 用户,但我认为我在您的脚本中看到了一些混乱。你写了:

modelName = 'BaseSystem'
modelFile = 'BaseSystem.mo'
extraLibPath = 'C:\Users\Tom\Desktop\Tiller2015a\ModelicaByExample\Architectures'

但这意味着(对我而言)编译器应该打开存储在C:\Users\Tom\Desktop\Tiller2015a\ModelicaByExample\Architectures. 但是顶层包是ModelicaByExample,你想要的模型是Architectures.BaseSystem. 所以我认为这样的事情可能更合适:

modelName = 'Architectures.BaseSystem'
modelFile = 'package.mo'
extraLibPath = 'C:\Users\Tom\Desktop\Tiller2015a\ModelicaByExample'

这里的要点是您应该打开ModelicaByExample(特别是目录package.mo中的ModelicaByExample文件)。即打开ModelicaByExample包装。您需要打开此包,因为它是顶级包。你不能只加载一个子包(这就是你想要做的)。然后,一旦你已经ModelicaByExample加载,你可以要求编译器专门编译Architectures.BaseSystem.

我怀疑 OpenModelica 无论如何都会通过打开顶级包来“帮助”你,即使你要求它打开子包。

但同样,我不太了解 jModelica,而且我绝对没有测试过这些建议中的任何一个。

于 2015-06-04T14:09:51.903 回答
1

谢谢迈克尔·蒂勒。在您的支持下,我找到了解决方案。

首先,modelName必须是完全合格的。其次,正如您所提到的,应该以库ModelicaByExampleextraLibPath的顶级目录结束。但后来我得到了错误,即 JModelica 找不到属于Modelica 标准库 (MSL)的组件或声明。

所以我将它添加modelicaLibPath到 MSL 中,但错误消息保持不变。经过多次尝试,我以管理员权限启动了命令行,任何错误都消失了。

这是可执行的 python 脚本:BaseSystem.py

###  Attention!
# The script and/or the command line must be
# started with administrator privileges

import matplotlib.pyplot as plt
from pymodelica import compile_fmu
from pyfmi import load_fmu

# Variables: modelName, modelFile, extraLibPath
modelName = 'Architectures.SensorComparison.Examples.BaseSystem'
modelFile = ''
extraLibPath = 'C:\Users\Tom\Desktop\Tiller2015a\ModelicaByExample'
modelicaLibPath = 'C:\OpenModelica1.9.2\lib\omlibrary\Modelica 3.2.1'
compileToPath = 'C:\Users\Tom\Desktop\Tiller2015a'

# Set the compiler options
compilerOptions = {'extra_lib_dirs':[modelicaLibPath, extraLibPath]}

# Compile model
fmuName = compile_fmu( modelName, modelFile, compiler_options=compilerOptions, compile_to=compileToPath)

# Load model
model = load_fmu( fmuName)

# Simulate model
res = model.simulate( start_time=0.0, final_time=5.0)

# Extract interesting values
res_w = res['sensor.w']
res_y = res['setpoint.y']
tSim = res['time']

# Visualize results
fig = plt.figure(1)
ax1 = fig.add_subplot(111)
ax2 = ax1.twinx()
ax1.plot(tSim, res_w, 'g-')
ax2.plot(tSim, res_y, 'b-')
ax1.set_xlabel('t (s)')
ax1.set_ylabel('sensor.w (rad/s)', color='g')
ax2.set_ylabel('setpoint.y (rad/s)', color='b')
plt.title('BaseSystem')
plt.legend()
plt.grid(True)
plt.show()

于 2015-06-05T17:08:49.000 回答