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

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

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

はじめに

FMULibrary経由で内部パラメータを変更する方法は大体わかってきた。
fmi2_import_set_realを使用して、modelDescription.xmlに記載されている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

修正コードは出来たか?

太郎くん
太郎くん

fmi2_import_cs_testを修正して、FMUの内部パラメータを変更できるコードを用意するって言ってたけど。

太郎くん
太郎くん

できた?

フクさん
フクさん

一応できたよ。
まぁある程度汎用性を確保するためそこそこ前回提示したコードに付け足しした感じにはなったけど。

太郎くん
太郎くん

ほー。
じゃー、見せてもらおう。

フクさん
フクさん

(なぜ、そんな偉そうな態度になってるんだ?)

修正コード

フクさん
フクさん

コードの追加部分は
fmi2_import_enter_initialization_mode

fmi2_import_exit_initialization_mode
を呼び出しているところの間に入れる。

太郎くん
太郎くん

イニシャルモード中ってやつだね。

フクさん
フクさん

こんな感じのコードになる。

	const fmi2_value_reference_t vrTmp[] = { 0,1,2,3,};
	fmi2_real_t iniTmp[sizeof(vrTmp) / sizeof(vrTmp[0])];
	fmistatus = fmi2_import_get_real(fmu, vrTmp, sizeof(vrTmp) / sizeof(vrTmp[0]), iniTmp);
	if (fmistatus != fmi2_status_ok) {
		printf("fmi2_import_set_real failed.err code=%d\n", fmistatus);
		do_exit(CTEST_RETURN_FAIL);
	}

	printf("Initial Parameters.\n");
	for (k = 0; k < sizeof(vrTmp) / sizeof(vrTmp[0]); k++) {
		printf("vr:%d,iniTmp is %lf\n", vrTmp[k], iniTmp[k]);
	}

	iniTmp[0] = 2.0;

	fmistatus = fmi2_import_set_real(fmu, vrTmp, sizeof(vrTmp) / sizeof(vrTmp[0]), iniTmp);
	if (fmistatus != fmi2_status_ok) {
		printf("fmi2_import_set_real failed.err code=%d\n", fmistatus);
		do_exit(CTEST_RETURN_FAIL);
	}
	printf("Modified parameters.\n");
	for (k = 0; k < sizeof(vrTmp) / sizeof(vrTmp[0]); k++) {
		printf("vr:%d,iniTmp is %lf\n", vrTmp[k], iniTmp[k]);
	}

修正コード解説

太郎くん
太郎くん

予想以上にいろいろ追加してるなー。

フクさん
フクさん

まぁそんなに複雑はことはしていない。

フクさん
フクさん

まず以下で使用するvalueReferenceを定義する。
ここでは0,1,2,3の4つで、

  • HIGHT:ボールの初期の高さ\([m]\)
  • HIGHT_SPEED:ボールの初速度\([m/s]\)
  • BOUNCE_COF:ボールの反発係数
  • HIGHT_ACC:ボールの初期加速度\([m/s^2]\)
	const fmi2_value_reference_t vrTmp[] = { 0,1,2,3,};
フクさん
フクさん

そしてfmi2_import_get_realでFMU内部で設定されてる初期値を取得して、printfで表示。
iniTmpに値が格納されるので、
valueReference=0のHIGHTを\(1[m]\)から\(2[m]\)に変更

	iniTmp[0] = 2.0;
フクさん
フクさん

そして、iniTmpfmi2_import_set_realで書き戻す。

フクさん
フクさん

って感じで説明としては以上だ。

太郎くん
太郎くん

一応、読み出しもしてたわけね。
しかも配列で一気に取得と設定ができるのか。
一個ずつ制御するのかと思ってた。

フクさん
フクさん

ここらへんの考え方は数値解析ツール由来ベクトルの性質が強いね。
渡せるパラメータはベクトルで一気に渡すって文化だ。

太郎くん
太郎くん

MATLABとかもそんな感じだよね。

フクさん
フクさん

次回はこれを実際に動かしてみよう。

まとめ

フクさん
フクさん

まとめだよ。

  • 修正コードができたので確認。
  • 内容の詳細説明。
    • 読み出すvalueReference群の定義。
    • fmi2_import_get_realで一気に読み出し。
    • ボールの初期の高さだけ変更。
    • fmi2_import_set_realで一気に書き戻し。
  • 数値解析ツール由来のベクトルで一気に制御する方式になっている。

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

コメント

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