【FMU】最小構成のMBD事例 第2章 その66【FMILibrary㉓】

【FMU】最小構成のMBD事例 第2章 その66【FMILibrary㉓】 事例
【FMU】最小構成のMBD事例 第2章 その66【FMILibrary㉓】

バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/

はじめに

前回はFMILibraryの内部定義しているenumを文字列変換してくれるちょっと便利APIを紹介。

今回は、いよいよmodelDescription.xml内の変数情報を列挙するソースコードの確認となる。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1

エンジニア歴8年の太郎くん

技術者太郎

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1

処理手順確認

フクさん
フクさん

前回の最後でも書いたけど、処理手順を列挙しておく。

  • fmi2_import_parse_xmlによるモデル記述オブジェクトの取得
  • fmi2_import_get_variable_listによる変数リストの取得
  • fmi2_import_get_variable_list_sizeによる変数リスト数の取得
  • fmi2_import_get_variableによる変数オブジェクトの取得
  • fmi2_import_get_variable_vrによるvalueReferenceの取得
  • fmi2_import_get_variable_nameによる変数名の取得
  • fmi2_import_get_variable_description、fmi2_import_get_variability、fmi2_import_get_causality、fmi2_import_get_initialによる各種詳細情報の取得
太郎くん
太郎くん

これに則ってソースコードを追加してくれたんだよね。

フクさん
フクさん

そうそう。
追加場所は
fmi2_import_parse_xmlのAPIから取得した、
fmi2_import_t* fmu
を参照できるところならどこでもOKだが、
とりあえずは、
fmi2_import_cs_testプロジェクトの
test_simulate_cs関数内の
fmi2_import_enter_initialization_mode

fmi2_import_exit_initialization_mode
の間に入れてみた。

太郎くん
太郎くん

あ、以前のFMU内部パラメータを書き換えたところだね。

フクさん
フクさん

その通り。
というわけで追加コードを提示!

追加コード

	fmi2_import_variable_list_t* vl = fmi2_import_get_variable_list(fmu, 0);
	size_t nv = fmi2_import_get_variable_list_size(vl);

	int i;
	for( i = 0; i < nv; i++ ){
		printf("==============================\n");
		fmi2_import_variable_t* var = fmi2_import_get_variable(vl, i);
		size_t vr = fmi2_import_get_variable_vr(var);
		printf("Variable name: %s\n", fmi2_import_get_variable_name(var));
		printf("Description: %s\n", fmi2_import_get_variable_description(var));
		printf("VR: %u\n", (unsigned)vr);
		printf("Variability: %s : %d \n", fmi2_variability_to_string(fmi2_import_get_variability(var)), fmi2_import_get_variability(var));
		printf("Causality: %s : %d \n", fmi2_causality_to_string(fmi2_import_get_causality(var)), fmi2_import_get_causality(var));
		printf("Initial: %s : %d \n", fmi2_initial_to_string(fmi2_import_get_initial(var)), fmi2_import_get_initial(var));
		printf("base_type: %s : %d \n", fmi2_base_type_to_string(fmi2_import_get_variable_base_type(var)), fmi2_import_get_variable_base_type(var));
	}
	printf("==============================\n");

追加コード解説

太郎くん
太郎くん

おー?
思ったほどの追加量じゃないねー?

フクさん
フクさん

まぁ変数リストを取得したら、あとはfor文で回すだけだからねー。

太郎くん
太郎くん

前回までに紹介したAPIを全部使ってる感じか。
あと、enumを文字列に変換するAPIも使ってるね。

フクさん
フクさん

うん。
具体的なパラメータ内容が見れた方が良いと思って追加している。

太郎くん
太郎くん

あとは、これを実行するのみか。

フクさん
フクさん

一応、コンパイルエラーみたいなのは無いことは確認しているから
実行結果を見て考察するってくらいかな。

まとめ

フクさん
フクさん

まとめだよ。

  • modelDescription.xml内部変数列挙の処理手順確認。
  • コード追加箇所説明。
    • fmi2_import_enter_initialization_modeとfmi2_import_exit_initialization_modeの間。
  • コード提示。
    • 前回までに説明したAPI(文字列変換含む)を全部使用した。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました