【FMIライブラリ】最小構成のMBD事例 第2章 その81【DCモータ⑨】

【FMIライブラリ】最小構成のMBD事例 第2章 その81【DCモータ⑨】 事例
【FMIライブラリ】最小構成のMBD事例 第2章 その81【DCモータ⑨】

バックナンバーはこちら。
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]\)。

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

コメント

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