モデリカのコードを「デバッグ」する方法はあるのだろうか。つまり、コードを 1 行ずつデバッグすると、変数がどのように変化するかがわかります。
modelica のコードが C に変換されていることは知っています。何らかの形でそれを行う可能性があるかどうかを知りたいだけです。ある場合、シミュレーション環境のいずれかにとって大きな改善になると思います。ありがとう。
ハイ
これは良い質問で、よく出てきます。しかし、まず、一歩下がってみましょう。
「行単位で」デバッグするという考え方は、命令型プログラミング言語から来ています。「命令的」とは、プログラムが単に指定された順序で実行される一連の命令であることを意味します。
誰かが Java または Python をデバッグする場合、この「行ごと」のアプローチは理にかなっています。なぜなら、ステートメントは動作を表す基本的な方法だからです。この「行単位」のアプローチは、ブロック図 (Simulink など) などのモデリング形式にも拡張できます。これは、グラフィカルであると同時に必須でもある (つまり、指定された順序で実行されるステップを構成する) ためです。
しかし、Modelica は命令型言語ではありません。ステップ、ステートメント、または指示の概念はありません。代わりに、遍在する方程式があります。そのため、Modelica ではデバッグを直線的に考えることはできません。確かに、Modelica から生成された C コードをデバッグすることを考えることができますが、式に部分的にしか似ていないため、通常はあまり役に立ちません。
では、Modelica コードをどのようにデバッグするのでしょうか? まあ、Modelica コードをデバッグすることは、実際には Modelica 方程式をデバッグすることです。通常、Modelica モデルはコンポーネントで構成されています。コンポーネントが接続されたときに生成される方程式は自動的に生成されるため、Modelica コンパイラが正しく生成することを規定します。残っているのは、コンポーネント モデルの方程式です。
これにアプローチする最も簡単な方法は、各コンポーネントを個別に (または少なくとも可能な限り最小のモデルで) テストすることです。私はよく、Modelica コンポーネントを大きなモデルにまとめてデバッグしようとすることは、オーケストラを聴いて、調子がずれている 1 つの楽器を見つけようとするようなものだと言います。Modelica のこれらの方程式が連立方程式を形成する傾向があるという事実は、エラーが発生すると、すぐに多くの変数に伝播する可能性があることを意味します。
したがって、最善の策は、個々のコンポーネントごとにテストを実行して作成し、コンポーネントの動作を確認することです。私の経験では、これを行うと、バグを非常に簡単に追跡して排除できます。
更新: 他の人のコンポーネント モデルに出力を追加してデバッグする必要はありません。出力は任意のレベルで作成できます。
model SystemModel
SomeoneElsesComponent a;
SomeOtherGuysComponent b;
end SystemModel;
model SystemModel_Debug
extends SystemModel;
output Real someNestedSignalFromA = a.someSubsystem.someSubcomponent.someSignal;
output Real someOtherNestedSignalFromB = b.anotherSubsystem.anotherSignal;
end SystemModel_Debug;
もちろん、信号コンポーネントのインスタンスが複数ある場合、これは実用的ではありません。そのような場合、基礎となるモデルを変更する方が簡単であることは認めます。ただし、彼らがモデルを作成する場合はreplaceable
、上記と同じトリックを使用できます (モデルを拡張し、一連のカスタム出力を追加してredeclare
から、元のモデルの代わりにモデルを追加します)。
現在、OpenModelica には変換デバッガーがあります。ここでは、どの方程式からどの変数が評価されるかを見つけることができます。