MATLAB R2009b新機能

ちょっと前に、MATLAB/Simulinkの最新版であるR2009bが公開されました。

Simulinkに対する新機能のうち、特に2つばかり気になる物がありましたので、調べてみました。

  • モデルバリアントの効果的な管理
  • モデル実行中に、サイズが変化する信号線

話題的には、モデルバリアントの話がホットかと思います。

一方、サイズが変化する信号線は、モデルの構造がガラっと変わる可能性もあります。私は、MATLAB/Simulinkに対するアドオンのカスタマイズツール作成で食べています。ですから、こちらのほうが気になるところです。

<宣伝>MATLAB/Simulinkのカスタマイズに関するご用命は、r2009b_mailまでお気軽にどうぞ!</宣伝>

モデルバリアントの効果的な管理

概要

モデルバリアント(Model Variant)とは、こういう話です。

r2009b_00図1 「要件」から必要な「機能」が導き出される

システムを作る時には、「どんな要件があるのかな?」を調べます。

それが分かったら次に「どんな機能が必要かな?」と調べます。

そうして抽出した「機能」たちを、1つ1つ実装していくわけです。

しかし、自動車部品などは似た機能の組み合わせを変えるだけ、という事もよくあります。ですから「機能」を作りこんでおいて、あとはいかにそれを組み合わせるか?を考える、という手法を取ります。

いま、システムをSimulinkモデルで作っているとしましょう。(仕様を表現するため、もしくは、自動コード生成するためのモデル)

ベースとなるモデルに穴をあけておいて、実際にそこに何をハメるかは、ケースバイケースで考える。こういう風にすると、「機能」を寄せ集めるのがちょっぴりラクになります。

r2009b_01

図2 リファレンスブロックは、他のモデル(mdl)を参照できる

このようにして、1つの「機能」に対して1つの「モデル」を用意していきます。あとは、どのモデルをどこにハメるかは、車種や発売地域によって変えて行きます。こうすることで、世界中で販売するための自動車部品を、効果的に管理できるようになります。

図1のうち「どんな要件?」とか、「どんな機能?」という所を管理するのは、別ツールが良いです。DOORS なり、 pure::variants なりを使用する事で、効果的に管理が出来るでしょう。

図1のうち「機能をあつめたモデル」をいかにラクに作るか?これが、R2009bで追加された機能です。

使い方

実際にどう使うのか、やってみましょう。

いま、エコドライブなんて言葉が流行っていますね。「燃費向上」というキーワードにバンバン予算が付く、なんて話も聞きます。

ところでこの燃費というやつ、単位は何なんでしょうか?日本だと、 km/リッター が一般的です。一方たとえば北米では、マイル/ガロン ですね。

さてさて。燃費をはかるには、走行距離 / 消費燃料 を計算する必要があります。走行距離というのは、車輪が回るたびにパルスが発生するようになっていて、そいつをカウントします。燃料のほうは、どういうセンサーが付いてるのか知りませんが、なにかセンサーでもって測定しているのでしょう。

いずれにせよ、パルスあるいはセンサーからの値を、kmあるいはマイル、そしてリッターあるいはガロン、に変換しないといけませんね。

それ以外の部分は国内向け、北米向け、ともに共通だとすると、この単位変換のところだけをうまく切り分けたいところです。

そこで、新しく導入されたVariantオブジェクトというのを使います。これと「機能」を表すモデルとをヒモ付けすることで、モデルを切り分けられるようになります。

r2009b_02

図3 Variantオブジェクトと、モデルとをヒモ付けする

Variantオブジェクトには、いくつかの条件式が含められます。その条件式が「真」であるとき、ヒモ付けされたモデルが有効になります。

論より証拠、やってみましょう。

MATLABのワークスペースに、unit_length, unit_fuel という2つの変数を作ってみます。

r2009b_03図4 unit_length , unit_fuel 、という2つの変数を定義

ここで、unit_length は、1のときkm、2のときマイル。 unit_fuelは、1のときリッター、2のときガロンとします。

さていよいよ、Variantオブジェクトを作成します。

r2009b_04

図5 Variantオブジェクト JPとUSを作成

これで、Variantオブジェクトの準備は完了です。次に、ベースモデルに穴をあけましょう。これは、新しく追加されたModel Variantsブロックを使用します。

r2009b_05図6 Model Variantsブロック

(さいきんのMATLABはグラフィックがきれいになりました。たぶん、JavaオンリーからQtに切り替えたおかげでしょうね。)

これをモデルに配置してダブルクリックすると、次のような画面が出ます。

r2009b_06図7 Model Variantsブロック設定画面

ここで、次の設定を行います。「JPのとき、unit_jp.mdl を参照せよ」、そして「USのとき、unit_us.mdlを参照せよ」。設定後の画面は、こんな感じです。

r2009b_07図8 JP、USと入力した。そして、それぞれにモデル名を入力した。

すると、Model Variantsブロックの外見はこんな感じになります。

r2009b_08図9 JPが有効

ここで、MATLABのコマンドプロンプトから、unit_length = 2; unit_fuel = 2; としてみましょう。すると・・・

r2009b_09図10 USが有効

こんな感じに変わります。

ここでソフト屋さんなら、「unit_length = 1; unit_fuel = 2;」にしたらどうなるの?とか、usとjpでポートの数が違ったらどうなるの?とか、いろいろ考えられた事でしょう。面白いので、やってみてください。

さらに応用

さきほどの例では、国内向けと北米向けで、モデルを変えていました。

しかし、こう思われた方もいらっしゃるでしょう。

「この程度なら、モデル切り分けなくても良くない?」

はい、その通りです。そこで、1つのモデルを使用して国内向け、北米向けを切り分ける方法をご紹介します。

r2009b_10図11 1つのモデルを、パラメータを変えて参照する

モデルを参照するさい、パラメータを変えて参照する事ができます。kmとマイル、たんなる掛け算の係数が違うだけです。ですから、それをパラメータ化してやると便利です。

まず、参照される側にパラメータ定義をしてやりましょう。次のように、変換係数を「 p2l 」という変数名にしたとします。

r2009b_11図12 変数 p2l を使用

あとは、この p2l を、JPで参照するときと、USで参照するときとで変えたいわけです。そこで、参照される側のモデルで、「表示」>「モデルエクスプローラ」をクリックしましょう。

r2009b_12
図13 Model Workspaceにて、モデル引数を指定できる

そこから、モデルの「Model Workspace」をクリックします。すると、「モデル引数」を指定する所があります。ここに、パラメータ化したい変数を、コンマで区切って入力していけばOKです。

また、同ワークスペースにて、 p2l という変数を作っておく事も忘れてはいけません。(図13中央の、黄色い田が、p2lの定義になります)

さて、次にModel Variants側の設定もしましょう。

r2009b_13図14 モデル引数の値を設定する

先ほどは設定しなかった「モデル引数の値」があります。ここに、設定したい値を入力します。(複数あるばあいはコンマで区切る)

JPとUSとで「モデル引数の値」を変える事で、おなじモデルを別々のパラメータ値でもって実行する事が可能です。

これを実行すると、次のようになります。

r2009b_14図15 unit_length = 1; unit_fuel = 1; の場合

r2009b_15図16 unit_length = 2; unit_fuel = 2; の場合

同じモデルを参照していても、パラメータが違うために、挙動が違ってきています。

まとめ

Model Variantsブロックを使用する事で、さまざまなモデルを、さまざまなパラメータでもって参照できます。

いつ、どのモデルを参照するかは、Variantsオブジェクトと、Model Variantsブロックのパラメータ設定画面でもって定義できます。

これによって、ModelのVariant管理が、ちょっぴり楽になります。

次回

なんだか予定外に長くなってしまいました。次回は、今回の続きとして「モデル実行中に、サイズが変化する信号線」についてまとめます。