これまでのところ、Wolfram System Modeler 4.3および5.1を使用すると、次の最小限の例がエラーなしでコンパイルされます。
model UnitErrorModel
MyComponent c( hasUnit = "myUnit" );
block MyComponent
parameter String hasUnit = "1";
output Real y( unit = hasUnit );
equation
y = 10;
end MyComponent;
end UnitErrorModel;
しかし、WSM 12.0の新しいリリースでは(バージョンの急増は、Wolframの主力製品であるMathematicaの現在のリリースとの整合性によるものです)、エラーメッセージが表示されます。
内部エラー:Codegen.getValueString:非定数式:c.hasUnit
(注:エラーはWSMLink'WSMSimulate
、System Modeler12.0を内部で実行しているMathematica12.0で発生します。ここ"InternalValues"
では、現在WSM 12.0をインストールしていないため、上記のモデルのプロパティを要求します)。
上記のモデルをOpenModelica [OMEditv。1.13.2(64ビット)]でシミュレートしようとすると、次のことがわかります。
SimCodeUtil.mo:8492:9-8492:218]:内部エラー予期しない式(おそらくフロントエンドで以前に処理されているはずです。Unit/ displayUnit式は文字列リテラルではありません:c.hasUnit
では、単位属性を設定するために、パラメーターの変動性を持つ変数を使用できないようです。これはなぜですか?結局のところ、実行時にコンパイルするときにコンパイラーがユニットをハードワイヤードできるだけで十分ではありません(すべての指定されたモデルはWSM 4.3および5.1でエラーなしで実行されます)?
編集:私の古い質問への回答から、少なくとも最終的なパラメータを使用して単位属性を設定できると信じていました。変更を最終的にする(たとえばc( final hasUnit = "myUnit" )
、問題を解決しない)。
私は与えられたヴォルフラムコミュニティに関するフィードバックを、この問題に関してヴォルフラムカオティック・ハードコアから誰かによって:
仕様に違反していないという点で正しいですが、シミュレーションの構築後にユニットを変更できるかどうかを確認するすべての静的ユニットを無効にするため、定数にする方が理にかなっています。これに関する仕様に関する問題を提出しました(Modelica仕様問題#2362)。
そのため、MatheCoreは、すでに実装されているModelica仕様の変更を提案する点で、ゲームよりも少し進んでいます。;-)
注:Wolfram System Modeler(12.0)では、アノテーションEvaluate = true
を使用しても問題は解決しません(@matthによる上記のコメントを参照)。
回避策として、unit
属性の設定に使用される変数は一定の 変動性を持つ必要がありますが、それでもユーザーダイアログに含めることで、を使用してインタラクティブに変更できますannotation(Dialog(group = "GroupName"))
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加