バックナンバーはこちら。
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(文字列変換含む)を全部使用した。
バックナンバーはこちら。
コメント