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

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

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

はじめに

FMILibraryで実際にexportしたFMUの読み込みは成功。
変数リストによるパラメータ情報の列挙もできた。

あとは実際に動作させるために、
シミュレーションループに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

シミュレーションループにvalueReferenceを渡す改造

太郎くん
太郎くん

FMILibrary側サンプルプロジェクトfmi2_import_cs_testのソースコードの修正って終わった?

フクさん
フクさん

一応終わった。
予想よりも手間はかからなかった感じだな。
事前にいろいろ実験していたのが効いてたね。

太郎くん
太郎くん

おー。
じゃー、どんな感じか見せてもらおう。

フクさん
フクさん

こんな感じだ。

ソースコード

	const char *szVarName[] = {
		"target",
		"voltage",
		"current",
		"speed",
	};
	fmi2_import_variable_t *varHandle[sizeof(szVarName) / sizeof(szVarName[0])];
	fmi2_value_reference_t compare_real_variables_vr[sizeof(szVarName) / sizeof(szVarName[0])];


	for (i = 0; i < sizeof(szVarName) / sizeof(szVarName[0]); i++) {
		varHandle[i] = fmi2_import_get_variable_by_name(fmu, szVarName[i]);
		if (varHandle[i] == NULL) {
			printf("fmi2_import_get_variable_by_name failed\n");
			do_exit(CTEST_RETURN_FAIL);
		}
		compare_real_variables_vr[i] = fmi2_import_get_variable_vr(varHandle[i]);
		printf("%s:valueReference is %d\n", szVarName[i], compare_real_variables_vr[i]);
	}


        fmistatus = fmi2_import_exit_initialization_mode(fmu);
    if(fmistatus != fmi2_status_ok) {
        printf("fmi2_import_exit_initialization_mode failed\n");
        do_exit(CTEST_RETURN_FAIL);
    }        

	tcur = tstart;
	for (int i = 0; i < sizeof(szVarName) / sizeof(szVarName[0]); i++) {
		printf("%s,", szVarName[i]);
	}
	printf("\n");
	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_real_t val[sizeof(compare_real_variables_vr) / sizeof(fmi2_value_reference_t)];
			fmi2_import_get_real(fmu, compare_real_variables_vr, sizeof(compare_real_variables_vr) / sizeof(fmi2_value_reference_t), val);
			for( int i = 0; i < sizeof(compare_real_variables_vr) / sizeof(fmi2_value_reference_t); i++){
				printf("%10g,", val[i]);
			}
			printf("\n");
		}

		tcur += hstep;
	}
	fmistatus = fmi2_import_terminate(fmu);

	fmi2_import_free_instance(fmu);

	return 0;

ソースコード解説

太郎くん
太郎くん

流れとしては、

  • 欲しいパラメータ名文字列列挙
  • fmi2_import_get_variable_by_nameで変数オブジェクト取得
  • fmi2_import_get_variable_vrでvalueReference取得
  • compare_real_variables_vrに各valueReferenceを格納しているのでシミュレーションループで利用
太郎くん
太郎くん

って感じか。

フクさん
フクさん

正解だ。

フクさん
フクさん

一応、事前に動作確認はしたが、
なんとなく動くって程度だから、
もう少しちゃんと確認する必要はあるだろう。

まとめ

フクさん
フクさん

まとめだよ。

  • シミュレーションループにvalueReferenceを渡すためのfmi2_import_cs_testのソースコード修正を確認。
  • 流れは以下。
    • 欲しいパラメータ名文字列列挙。
    • 変数オブジェクト取得。
    • valueReference取得。
    • valueReferenceをシミュレーションループで利用。

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

コメント

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