MATLAB R2009b新機能
ちょっと前に、MATLAB/Simulinkの最新版であるR2009bが公開されました。
Simulinkに対する新機能のうち、特に2つばかり気になる物がありましたので、調べてみました。
- モデルバリアントの効果的な管理
- モデル実行中に、サイズが変化する信号線
話題的には、モデルバリアントの話がホットかと思います。
一方、サイズが変化する信号線は、モデルの構造がガラっと変わる可能性もあります。私は、MATLAB/Simulinkに対するアドオンのカスタマイズツール作成で食べています。ですから、こちらのほうが気になるところです。
<宣伝>MATLAB/Simulinkのカスタマイズに関するご用命は、までお気軽にどうぞ!</宣伝>
モデルバリアントの効果的な管理
概要
モデルバリアント(Model Variant)とは、こういう話です。
図1 「要件」から必要な「機能」が導き出される
システムを作る時には、「どんな要件があるのかな?」を調べます。
それが分かったら次に「どんな機能が必要かな?」と調べます。
そうして抽出した「機能」たちを、1つ1つ実装していくわけです。
しかし、自動車部品などは似た機能の組み合わせを変えるだけ、という事もよくあります。ですから「機能」を作りこんでおいて、あとはいかにそれを組み合わせるか?を考える、という手法を取ります。
いま、システムをSimulinkモデルで作っているとしましょう。(仕様を表現するため、もしくは、自動コード生成するためのモデル)
ベースとなるモデルに穴をあけておいて、実際にそこに何をハメるかは、ケースバイケースで考える。こういう風にすると、「機能」を寄せ集めるのがちょっぴりラクになります。
図2 リファレンスブロックは、他のモデル(mdl)を参照できる
このようにして、1つの「機能」に対して1つの「モデル」を用意していきます。あとは、どのモデルをどこにハメるかは、車種や発売地域によって変えて行きます。こうすることで、世界中で販売するための自動車部品を、効果的に管理できるようになります。
図1のうち「どんな要件?」とか、「どんな機能?」という所を管理するのは、別ツールが良いです。DOORS なり、 pure::variants なりを使用する事で、効果的に管理が出来るでしょう。
図1のうち「機能をあつめたモデル」をいかにラクに作るか?これが、R2009bで追加された機能です。
使い方
実際にどう使うのか、やってみましょう。
いま、エコドライブなんて言葉が流行っていますね。「燃費向上」というキーワードにバンバン予算が付く、なんて話も聞きます。
ところでこの燃費というやつ、単位は何なんでしょうか?日本だと、 km/リッター が一般的です。一方たとえば北米では、マイル/ガロン ですね。
さてさて。燃費をはかるには、走行距離 / 消費燃料 を計算する必要があります。走行距離というのは、車輪が回るたびにパルスが発生するようになっていて、そいつをカウントします。燃料のほうは、どういうセンサーが付いてるのか知りませんが、なにかセンサーでもって測定しているのでしょう。
いずれにせよ、パルスあるいはセンサーからの値を、kmあるいはマイル、そしてリッターあるいはガロン、に変換しないといけませんね。
それ以外の部分は国内向け、北米向け、ともに共通だとすると、この単位変換のところだけをうまく切り分けたいところです。
そこで、新しく導入されたVariantオブジェクトというのを使います。これと「機能」を表すモデルとをヒモ付けすることで、モデルを切り分けられるようになります。
図3 Variantオブジェクトと、モデルとをヒモ付けする
Variantオブジェクトには、いくつかの条件式が含められます。その条件式が「真」であるとき、ヒモ付けされたモデルが有効になります。
論より証拠、やってみましょう。
MATLABのワークスペースに、unit_length, unit_fuel という2つの変数を作ってみます。
図4 unit_length , unit_fuel 、という2つの変数を定義
ここで、unit_length は、1のときkm、2のときマイル。 unit_fuelは、1のときリッター、2のときガロンとします。
さていよいよ、Variantオブジェクトを作成します。
図5 Variantオブジェクト JPとUSを作成
これで、Variantオブジェクトの準備は完了です。次に、ベースモデルに穴をあけましょう。これは、新しく追加されたModel Variantsブロックを使用します。
図6 Model Variantsブロック
(さいきんのMATLABはグラフィックがきれいになりました。たぶん、JavaオンリーからQtに切り替えたおかげでしょうね。)
これをモデルに配置してダブルクリックすると、次のような画面が出ます。
図7 Model Variantsブロック設定画面
ここで、次の設定を行います。「JPのとき、unit_jp.mdl を参照せよ」、そして「USのとき、unit_us.mdlを参照せよ」。設定後の画面は、こんな感じです。
図8 JP、USと入力した。そして、それぞれにモデル名を入力した。
すると、Model Variantsブロックの外見はこんな感じになります。
図9 JPが有効
ここで、MATLABのコマンドプロンプトから、unit_length = 2; unit_fuel = 2; としてみましょう。すると・・・
図10 USが有効
こんな感じに変わります。
ここでソフト屋さんなら、「unit_length = 1; unit_fuel = 2;」にしたらどうなるの?とか、usとjpでポートの数が違ったらどうなるの?とか、いろいろ考えられた事でしょう。面白いので、やってみてください。
さらに応用
さきほどの例では、国内向けと北米向けで、モデルを変えていました。
しかし、こう思われた方もいらっしゃるでしょう。
「この程度なら、モデル切り分けなくても良くない?」
はい、その通りです。そこで、1つのモデルを使用して国内向け、北米向けを切り分ける方法をご紹介します。
図11 1つのモデルを、パラメータを変えて参照する
モデルを参照するさい、パラメータを変えて参照する事ができます。kmとマイル、たんなる掛け算の係数が違うだけです。ですから、それをパラメータ化してやると便利です。
まず、参照される側にパラメータ定義をしてやりましょう。次のように、変換係数を「 p2l 」という変数名にしたとします。
図12 変数 p2l を使用
あとは、この p2l を、JPで参照するときと、USで参照するときとで変えたいわけです。そこで、参照される側のモデルで、「表示」>「モデルエクスプローラ」をクリックしましょう。
図13 Model Workspaceにて、モデル引数を指定できる
そこから、モデルの「Model Workspace」をクリックします。すると、「モデル引数」を指定する所があります。ここに、パラメータ化したい変数を、コンマで区切って入力していけばOKです。
また、同ワークスペースにて、 p2l という変数を作っておく事も忘れてはいけません。(図13中央の、黄色い田が、p2lの定義になります)
さて、次にModel Variants側の設定もしましょう。
図14 モデル引数の値を設定する
先ほどは設定しなかった「モデル引数の値」があります。ここに、設定したい値を入力します。(複数あるばあいはコンマで区切る)
JPとUSとで「モデル引数の値」を変える事で、おなじモデルを別々のパラメータ値でもって実行する事が可能です。
これを実行すると、次のようになります。
図15 unit_length = 1; unit_fuel = 1; の場合
図16 unit_length = 2; unit_fuel = 2; の場合
同じモデルを参照していても、パラメータが違うために、挙動が違ってきています。
まとめ
Model Variantsブロックを使用する事で、さまざまなモデルを、さまざまなパラメータでもって参照できます。
いつ、どのモデルを参照するかは、Variantsオブジェクトと、Model Variantsブロックのパラメータ設定画面でもって定義できます。
これによって、ModelのVariant管理が、ちょっぴり楽になります。
次回
なんだか予定外に長くなってしまいました。次回は、今回の続きとして「モデル実行中に、サイズが変化する信号線」についてまとめます。