バックナンバーはこちら。
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をシミュレーションループで利用。
 
バックナンバーはこちら。
 
 



コメント