CANoeでは、複数のシミュレーションプログラムやテストプログラム間で内部的に通信を行う必要がよくあります。そのためのインターフェイスを定義するには、vCDL記述言語を使用することができ、これにより強力かつ汎用性の高い関数呼び出しメカニズムを実現できます。
この機能で何ができますか?|どのような課題を解決できますか?
CANoeの構成には通常、テスト、アプリケーションモデル、シミュレーションノードなど、いくつかの、あるいは多数のプログラムが含まれています。これらのプログラムは名目上は独立していますが、それでもしばしば、プログラム間の内部通信を使用する必要があります:
- テストでは、モデルを別の内部モードに切り替える必要があります。
- 特定の機能をモックするモデルがあり、テストではそのモデルにどのデータを提供すべきかを指定する必要があります。
- モデルは主にCAPLで記述されていますが、バックグラウンドタスクで一部の処理を行うために、C#で記述された補助的なアプリケーションモデルが使用されています。
- このモデルは主にPythonでプログラミングされていますが、より低レベルのバス機能にアクセスするためには、CAPLで記述された補助的なアプリケーションモデルが使用されます。
- このテストでは、ILフォールトインジェクション機能を使用したいと考えており、シミュレーションノードにあるCAPLプログラムに対し、対応する関数を呼び出すよう指示する必要があります。
内部通信のために1つ以上のシステム変数を使用することで、こうしたケースのいくつかはすでに対処済みかもしれません。vCDL記述言語は、それよりもはるかに強力な仕組みを提供しています。つまり、そこで関数を宣言し、あるプログラムで実装して、別のプログラムから呼び出すことができるのです。
CANoeのどこにこの機能がありますか?|どのように操作を開始しますか?
まず、CANoeの「Communication Setup」で、「新しいデータソース」としてvCDLファイルを作成します。そのファイル内に、内部メソッドメンバーを持つオブジェクトを追加します。例えば、次のようなものです。
namespace Example {
object TestHelpers {
internal method int32 SwitchModelMode(uint16 newMode);
}
}
パラメータには、文字列、列挙型、リスト、構造体など、vCDLが提供するすべてのデータ型を使用できます。
CAPL、C#、Pythonでは、関数呼び出しハンドラーを使用して、1つのプログラム内でメソッドを実装することができます。CAPLでの実装例は以下の通りです:
on fct_call Example::TestHelpers.SwitchModelMode {
Write("新しいモデルモード: %d", this.newMode);
// ...
this.Result = 0;
}
別のプログラムからこのメソッドを呼び出します。これも、あらゆる対応言語で可能です。C#での記述例は以下の通りです:
var result = Example.TestHelpers.SwitchModelMode.Call(1);
また、メソッドを非同期で呼び出すことも可能です(「Call」の代わりに「CallAsync」を使用します)。その場合、後で戻り値を待機するか、別のハンドラーを使用して戻り値を使用することができます。
さらに、トレースWindowに関数の呼び出しとその戻り値を表示することも可能です。
CANoeの関連トピック



