バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
FMILibraryで実際にexportしたFMUの読み込みは成功。
変数リストによるパラメータ情報の列挙もできた。
あとは実際に動作させるために、
シミュレーションループにvalueReferenceを渡す改造をすれば動きそうではある。
登場人物
博識フクロウのフクさん
イラスト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
シミュレーションループにvalueReferenceを渡す改造
太郎くん
FMILibrary側サンプルプロジェクトfmi2_import_cs_testのソースコードの修正って終わった?
フクさん
一応終わった。
予想よりも手間はかからなかった感じだな。
事前にいろいろ実験していたのが効いてたね。
太郎くん
おー。
じゃー、どんな感じか見せてもらおう。
フクさん
こんな感じだ。
ソースコード
const char *szVarName[] = {
"target",
"voltage",
"current",
"speed",
};
fmi2_import_variable_t *varHandle[sizeof(szVarName) / sizeof(szVarName[0])];
fmi2_value_reference_t compare_real_variables_vr[sizeof(szVarName) / sizeof(szVarName[0])];
for (i = 0; i < sizeof(szVarName) / sizeof(szVarName[0]); i++) {
varHandle[i] = fmi2_import_get_variable_by_name(fmu, szVarName[i]);
if (varHandle[i] == NULL) {
printf("fmi2_import_get_variable_by_name failed\n");
do_exit(CTEST_RETURN_FAIL);
}
compare_real_variables_vr[i] = fmi2_import_get_variable_vr(varHandle[i]);
printf("%s:valueReference is %d\n", szVarName[i], compare_real_variables_vr[i]);
}
fmistatus = fmi2_import_exit_initialization_mode(fmu);
if(fmistatus != fmi2_status_ok) {
printf("fmi2_import_exit_initialization_mode failed\n");
do_exit(CTEST_RETURN_FAIL);
}
tcur = tstart;
for (int i = 0; i < sizeof(szVarName) / sizeof(szVarName[0]); i++) {
printf("%s,", szVarName[i]);
}
printf("\n");
while (tcur < tend) {
fmi2_boolean_t newStep = fmi2_true;
fmistatus = fmi2_import_do_step(fmu, tcur, hstep, newStep);
for (k = 0; k < sizeof(compare_real_variables_vr)/sizeof(fmi2_value_reference_t); k++) {
}
{
fmi2_real_t val[sizeof(compare_real_variables_vr) / sizeof(fmi2_value_reference_t)];
fmi2_import_get_real(fmu, compare_real_variables_vr, sizeof(compare_real_variables_vr) / sizeof(fmi2_value_reference_t), val);
for( int i = 0; i < sizeof(compare_real_variables_vr) / sizeof(fmi2_value_reference_t); i++){
printf("%10g,", val[i]);
}
printf("\n");
}
tcur += hstep;
}
fmistatus = fmi2_import_terminate(fmu);
fmi2_import_free_instance(fmu);
return 0;
ソースコード解説
太郎くん
流れとしては、
- 欲しいパラメータ名文字列列挙
- fmi2_import_get_variable_by_nameで変数オブジェクト取得
- fmi2_import_get_variable_vrでvalueReference取得
- compare_real_variables_vrに各valueReferenceを格納しているのでシミュレーションループで利用
太郎くん
って感じか。
フクさん
正解だ。
フクさん
一応、事前に動作確認はしたが、
なんとなく動くって程度だから、
もう少しちゃんと確認する必要はあるだろう。
まとめ
フクさん
まとめだよ。
- シミュレーションループにvalueReferenceを渡すためのfmi2_import_cs_testのソースコード修正を確認。
- 流れは以下。
- 欲しいパラメータ名文字列列挙。
- 変数オブジェクト取得。
- valueReference取得。
- valueReferenceをシミュレーションループで利用。
バックナンバーはこちら。
コメント