バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
前回でOpenModelicaからexportしたFMUをFMILibraryで制御できることがおおよそわかった。
しかし、制御したというより、出力値を参照したって程度。
固定値に相当するパラメータ変更も可能なのか?
登場人物
博識フクロウのフクさん
イラスト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
固定値パラメータの変更について
前回でFMUの制御ができるそうってところまでは分かったけれど・・・。
そうだね。
FMILibraryのサンプルFMUのボールが跳ねるやつの時は固定値っぽいのも修正していたと思ってたんだけど、今回はそういうのなかったなーって。
うん。
そうだね。
そこら辺もやってみるか。
やり方はシンプル?
まぁここでやったことと同じことをすれば良いだけだな。
修正コード
というわけで一撃で追加コードを書いた。
const char *szCalibVarName[] = {
"ramp.duration",
"ramp.startTime",
};
fmi2_import_variable_t *calibVarHandle[sizeof(szCalibVarName) / sizeof(szCalibVarName[0])];
fmi2_value_reference_t calibVrTmp[sizeof(szCalibVarName) / sizeof(szCalibVarName[0])];
for (i = 0; i < sizeof(szCalibVarName) / sizeof(szCalibVarName[0]); i++) {
calibVarHandle[i] = fmi2_import_get_variable_by_name(fmu, szCalibVarName[i]);
if (calibVarHandle[i] == NULL) {
printf("fmi2_import_get_variable_by_name failed\n");
do_exit(CTEST_RETURN_FAIL);
}
calibVrTmp[i] = fmi2_import_get_variable_vr(calibVarHandle[i]);
printf("%s:valueReference is %d\n", szCalibVarName[i], calibVrTmp[i]);
}
fmi2_real_t iniTmp[sizeof(calibVrTmp) / sizeof(calibVrTmp[0])];
fmistatus = fmi2_import_get_real(fmu, calibVrTmp, sizeof(calibVrTmp) / sizeof(calibVrTmp[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(calibVrTmp) / sizeof(calibVrTmp[0]); k++) {
printf("vr:%d,iniTmp is %lf\n", calibVrTmp[k], iniTmp[k]);
}
iniTmp[0] = 1.5;
iniTmp[1] = 0.3;
fmistatus = fmi2_import_set_real(fmu, calibVrTmp, sizeof(calibVrTmp) / sizeof(calibVrTmp[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(calibVrTmp) / sizeof(calibVrTmp[0]); k++) {
printf("vr:%d,iniTmp is %lf\n", calibVrTmp[k], iniTmp[k]);
}
修正コード解説
これは、
“ramp.duration”
“ramp.startTime”
と言う名前のパラメータを変更してるんだよね?
これってなんだっけ?
これはRampによる目標値の指令を変化させるパラメータだね。
“ramp.duration”
が0から1に至るまでの期間。
“ramp.startTime”
がrampの開始タイミング。
OpenModelicaとしては
“ramp.duration”が\(0.8[s]\)
“ramp.startTime”が\(0.2[s]\)
だったものを\(1.5[s]\)、\(0.3[s]\)に書き換えてる。
ほう。
これは大きく挙動が変わりそうだ。
まぁそこらへんは次回確認してみよう。
まとめ
まとめだよ。
- FMU内部の固定値パラメータの変更ができるか?
- 以前やった方法で実現可能。
- これのソースコード改造実施。
- Rampの開始タイミング、\(0→1\)の期間を設定できるように改造。
- “ramp.duration”が\(0.8[s] → 1.5[s]\)。
- “ramp.startTime”が\(0.2[s] → 0.3[s]\)。
- Rampの開始タイミング、\(0→1\)の期間を設定できるように改造。
バックナンバーはこちら。
コメント