1

JModelica で次の静かな基本的な問題が発生しました。かなり単純なモデルを考えてみましょう:

model TEST
  Real Dum(start = 0);
  parameter Integer It = 5;
algorithm
  Dum := 0;
  for i in 1:It loop
    Dum := Dum + 1;
  end for;
end TEST;

もちろん、これを python でコンパイルすると実行されます。変数 Dum の値は、想定どおり常に 5 です。問題は、コンパイルされた fmu ( test.fmu ) を次のようにロードした後、パラメーター "It" に変更したい場合です。

 test = load_fmu("test.fmu");
 test.set("It",4);

シミュレーションを実行すると、「Dum」には 4 ではなく 5 が返されます。シミュレーション後に「It」の時間曲線をプロットするとわかるように、「It」は実際には 4 に変更されます。実際にループに影響を与えるようにオンザフライで変更する方法があるかどうかは誰にもわかりませんか?

これはもちろんおもちゃの例ですが、さまざまな範囲を必死にループする必要があり、再コンパイルに時間がかかるはるかに大きなプロジェクトには、その機能が必要です。

本当にありがとう

4

1 に答える 1

2

問題は、コンパイラがパラメータ「It」を構造パラメータとして扱うことです。つまり、残念ながらコンパイル後に変更することはできません。JModelica の最新の開発バージョン (r9190) で同じ問題を実行すると、変数「It」を設定しようとすると例外が発生します。

In [9]: test.set("It", 6)
---------------------------------------------------------------------------
FMUException                              Traceback (most recent call last)
<ipython-input-9-b5b436a55add> in <module>()
----> 1 model.set("It", 6)

src\pyfmi\fmi.pyx in pyfmi.fmi.ModelBase.set (src\pyfmi\fmi.c:4648)()

src\pyfmi\fmi.pyx in pyfmi.fmi.FMUModelBase._set (src\pyfmi\fmi.c:17714)()

src\pyfmi\fmi.pyx in pyfmi.fmi.FMUModelBase.set_integer (src\pyfmi\fmi.c:15398)()

FMUException: Failed to set the Integer values.

ログを確認すると、失敗した理由がわかります。

In [10]: test.get_log()
Out[10]: ['FMIL: module = Model, log level = 2: [ERROR][FMU status:Error]    <CannotSetVariable category="error">Cannot set Integer structural parameter <value name="variable">"It"</value></CannotSetVariable>']

ですから、あなたの質問に答えるには、残念ながらそれはできません。

ただし、コンパイル呼び出し中にパラメーターを変更できます。

from pymodelica import compile_fmu
name = compile_fmu("TEST(It=6)", "test.mo")
于 2016-09-14T17:03:09.350 に答える