バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
前回はFMILibraryのサンプルをベースにボールがバウンドする様子のシミュレーションを確認した。
出力されたボールの高さ、ボールの速度をExcel上でグラフにすることで確認。
このシミュレーションの状況をもう少しカスタマイズできるといろいろ遊べそうである。
登場人物
博識フクロウのフクさん
![指差しフクロウ](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
![技術者太郎](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
fmi2_import_cs_testのシミュレーションstep
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」20アップ.png)
FMILibraryでボールのバウンドのシミュレーションは見れたけど、
結構サンプリングが荒いよねー。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
そうだね。
100ms周期のサンプリングになってる。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
あと、シミュレーション時間も2秒くらいなのかな?
もう少し長くても良い気がするねー。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
じゃー、そこら辺を弄ってみよう。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
え?
調整できるの?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
まぁシミュレーションの時間管理はFMU側じゃなくてfmi2_import_cs_test側でやってるから
それほど難しくはないよ。
サンプリングとシミュレーション時間の調整
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
で、どこを調整すれば良いの?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
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;
}
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者03アップ.png)
ほう!
ここが実際にシミュレーションを実施しているループか。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
時間に関係する変数は以下3つ
- tcur:現在時間
- tend:終了時間
- hstep:ステップ時間
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者03アップ.png)
なんとなくわかってきたぞ。
今回の目的に合わせて修正するには、
tend:終了時間
と
hstep:ステップ時間
を調整すれば良いのか。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
そうそう。
実際に修正する場所
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
で、実際の修正箇所だが、
test_simulate_cs関数の先頭で各種変数定義をしているところがあるのだが、
その変数定義の中の以下を修正すればよい。
fmi2_real_t hstep = 0.1;
fmi2_real_t tend = 2.0;
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
例えば、20ms周期で3秒間のシミュレーションをするなら以下。
fmi2_real_t hstep = 0.02;
fmi2_real_t tend = 3.0;
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
時間の単位は「秒」であることに注意が必要かな。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
今回のは結構チョロい感じだったな。
まとめ
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
まとめだよ。
- シミュレーション時間とシミュレーションステップはFMUの外側の制御の仕方次第で確定する。
- FMU処理自体はfmi2_import_do_stepという関数の中で指定時間分実施する動き。
- サンプルプロジェクトfmi2_import_cs_testの場合はhstepとtendを調整すればOK。
- 時間は「秒」である点に注意。
バックナンバーはこちら。
コメント