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

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

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

はじめに

前回はFMILibraryのサンプルをベースにボールがバウンドする様子のシミュレーションを確認した。
出力されたボールの高さ、ボールの速度をExcel上でグラフにすることで確認。

このシミュレーションの状況をもう少しカスタマイズできるといろいろ遊べそうである。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラスト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のシミュレーションstep

太郎くん
太郎くん

FMILibraryでボールのバウンドのシミュレーションは見れたけど、
結構サンプリングが荒いよねー。

フクさん
フクさん

そうだね。
100ms周期のサンプリングになってる。

太郎くん
太郎くん

あと、シミュレーション時間も2秒くらいなのかな?
もう少し長くても良い気がするねー。

フクさん
フクさん

じゃー、そこら辺を弄ってみよう。

太郎くん
太郎くん

え?
調整できるの?

フクさん
フクさん

まぁシミュレーションの時間管理はFMU側じゃなくてfmi2_import_cs_test側でやってるから
それほど難しくはないよ。

サンプリングとシミュレーション時間の調整

太郎くん
太郎くん

で、どこを調整すれば良いの?

フクさん
フクさん

fmi2_import_cs_test.cのソースコード内で実際にFMU側の演算処理をよびだしてるところがある。
関数名としてはfmi2_import_do_stepなんだけど、
whileルールで複数回呼び出すような実装になってる。

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_value_reference_t vr = compare_real_variables_vr[k];
		fmi2_real_t rvalue;
		fmistatus = fmi2_import_get_real(fmu, &vr, 1, &rvalue);
	}
	{
		fmi2_real_t val[2];
		fmi2_import_get_real(fmu, compare_real_variables_vr, 2, val);
		printf("%10g %10g\n", val[0],val[1]);
	}

	tcur += hstep;
}
太郎くん
太郎くん

ほう!
ここが実際にシミュレーションを実施しているループか。

フクさん
フクさん

時間に関係する変数は以下3つ

  • tcur:現在時間
  • tend:終了時間
  • hstep:ステップ時間
太郎くん
太郎くん

なんとなくわかってきたぞ。
今回の目的に合わせて修正するには、
tend:終了時間

hstep:ステップ時間
を調整すれば良いのか。

フクさん
フクさん

そうそう。

実際に修正する場所

フクさん
フクさん

で、実際の修正箇所だが、
test_simulate_cs関数の先頭で各種変数定義をしているところがあるのだが、
その変数定義の中の以下を修正すればよい。

fmi2_real_t hstep = 0.1;
fmi2_real_t tend = 2.0;
フクさん
フクさん

例えば、20ms周期で3秒間のシミュレーションをするなら以下。

fmi2_real_t hstep = 0.02;
fmi2_real_t tend = 3.0;
フクさん
フクさん

時間の単位は「秒」であることに注意が必要かな。

太郎くん
太郎くん

今回のは結構チョロい感じだったな。

まとめ

フクさん
フクさん

まとめだよ。

  • シミュレーション時間とシミュレーションステップはFMUの外側の制御の仕方次第で確定する。
    • FMU処理自体はfmi2_import_do_stepという関数の中で指定時間分実施する動き。
  • サンプルプロジェクトfmi2_import_cs_testの場合はhstepとtendを調整すればOK。
    • 時間は「秒」である点に注意。

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

コメント

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