バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
FMULibraryのfmi2_import_set_realについて掘り下げ。
API仕様、FMI status、モデル記述オブジェクトについては確認できた。
モデル記述オブジェクトはFMUのインターフェースを定義ファイルであるmodelDescription.xmlを読み込んで作成されるもので、FMU自体のハンドルとも言えるもの。
まだ少し厄介なパラメータが残っているので、それも確認していこう。
登場人物
博識フクロウのフクさん
イラスト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
value referenceの配列
前回のfmi2_import_set_realのAPI仕様を書くと・・・。
fmi2_status_t fmi2_import_set_real(fmi2_import_t* fmu, const fmi2_value_reference_t vr[], size_t nvr, const fmi2_real_t value[])
fmu:モデル記述オブジェクト
vr:value referenceの配列
nvr:配列要素数う
value:変数の値
戻り値:FMI status
value referenceの配列はどうすれば良いのかな?
value reference自体はここらへんでやった話ではあるのだけど。
まぁ手っ取り早い方法としてはmodelDescription.xmlを見てみることだね。
modelDescription.xml
とりあえず、modelDescription.xmlの一部を引っ張ってきた。
<ScalarVariable name="HIGHT" valueReference="0" initial="exact" causality="output" description="Hight of the ball">
<Real start="1.0" />
</ScalarVariable>
<ScalarVariable name="HIGHT_SPEED" valueReference="1" initial="exact" description="Speed of the ball">
<Real start="4.0" />
</ScalarVariable>
<ScalarVariable name="HIGHT_SPEED alias" valueReference="1" description="Speed of the ball">
<Real />
</ScalarVariable>
<ScalarVariable name="HIGHT_ACC" valueReference="4" description="Speed of the ball">
<Real />
</ScalarVariable>
<ScalarVariable name="A variable" valueReference="100" initial="exact" description="Speed of the ball">
<Real start="4.0" />
</ScalarVariable>
<ScalarVariable name="GRAVITY" valueReference="2" description="Gravity constant" initial="exact">
<Real start="-9.81"/>
</ScalarVariable>
<ScalarVariable name="BOUNCE_COF" valueReference="3" initial="exact" description="Bouncing coefficient">
<Real start="0.5" />
そうそう。
こんな感じのxmlの中からvalueReferenceが分かるんだよね。
端的に言うと、ここに記載されてるvalueReferenceの値を配列形式で渡してあげればOK。
え?
そんなんでいいの?
まぁいろいろ流儀はあるが、
とりあえず、パラメータ変更だけを考えるとそれでOK。
例えば、ボールの初期位置の高さを変えたい場合は
valueReference=”0″
の
“HIGHT”
を変更すれば良いので、
const fmi2_value_reference_t vrTmp[1] = { 0,};
fmi2_real_t iniTmp[1] = 2.0;
fmistatus = fmi2_import_set_real(fmu, vrTmp, 1, iniTmp);
みたいな書き方をすればOKだね。
これだけみるとチョロそうではあるが・・・。
次回までに適当なvalueReferenceに対して読み書きするようにfmi2_import_cs_testのソースコードを弄ってこよう。
まとめ
まとめだよ。
- modelDescription.xmlでインターフェース定義を確認。
- fmi2_import_set_realに渡すvalueReferenceはmodelDescription.xmlに定義されてるvalueReferenceを渡せばOK。
- これを踏まえた上で最もシンプルと思われるコードサンプル提示。
バックナンバーはこちら。
コメント