MATLAB ユーザーコミュニティー

MATLAB & Simulink ユーザーコミュニティー向け日本語ブログ

Simulink の「ワークスペース」についてざっくり解説!

皆様、あけましておめでとうございます!

今年も我々 MATLAB ユーザーコミュニティメンバーはイベント紹介やユーザーの紹介、技術的な解説など様々な情報発信をしていきたいと思いますので、2021 年もどうぞよろしくお願いいたします!

 

ということで、2021 年 1 発目の記事を担当することになりました、トレーニングエンジニアの遠藤と申します。去年は「Simulink と MATLAB をつなぐ」をコンセプトとしていくつか技術的な記事を書いてきましたので、今回もその流れで技術的な記事を書いていきたいと思います。

具体的には、Simulink と MATLABを連携させるうえでしばしば問題になる「ワークスペース」についてのお話になります。

ちょっとニッチな内容ではありますが、特に以下のような方はワークスペース関係の問題に直面しやすいので、ぜひ参考にしていただければと思います。

  • モデル内で使用しているパラメータ変数が多いため、m スクリプトや .mat ファイルを使ってパラメータを管理している方
  • コンポーネントごとにモデルを作成し、最後にモデル同士を統合することを考えている方
  • App Designer などを使っていて、MATLAB 関数の中でモデルのシミュレーションを行う必要のある方

 

ワークスペースとは?

Simulink をメインで使っている方の中にはワークスペースのことをあまりよく知らない、という方もいらっしゃるかと思いますので、本題に入る前に「そもそもワークスペースとは何か」について簡単に説明します。「そんなこと知ってるよ!」という方は次のセクションまで読み飛ばしていただければと思います。

ワークスペースとは MATLAB 上で作成された変数が格納される場所です。例えば MATLAB のコマンドウィンドウで

>> x = 10

と実行すると MATLAB 上の「ワークスペース」のところに x という変数が格納されます。

このMATLAB 上に表示されているワークスペースは ベースワークスペース 呼ばれます。mスクリプトやコマンドウィンドウで定義した変数は全てこのベースワークスペースに格納され、それらから自由にアクセスできます。

しかし、MATLAB 関数の中で作成した変数についてはベースワークスペースに格納されず、その関数用の一時的なワークスペースに保存されます。

この一時的なワークスペースを 関数ワークスペース と呼びます。MATLAB 関数はこの関数ワークスペースにしかアクセスできないため、MATLAB 関数内からベースワークスペース上の変数を参照することはできません。また、関数ワークスペースは一時的なものですので、その関数の実行が終わると格納されていた変数はすべて削除されます。

ワークスペースについてはこちらのドキュメントにも詳細が記載されていますので、合わせてご確認いただければと思います。

 

Simulinkとワークスペースの関係

上述した通り、m スクリプトやコマンドウィンドウはベースワークスペース、MATLAB 関数は専用の関数ワークスペースにアクセスすることができます。それでは、Simulink のモデルはどのワークスペースにアクセスすることができるのでしょうか?

何も特別な操作を行わない場合、Simulink のモデルはベースワークスペースに自動でアクセスします。ゲインブロックのゲイン値に変数を設定し、その値を MATLAB のスクリプトで定義しておく、といったことができるのも、Simulink がベースワークスペースの変数を自動で参照してくれているからです。

逆に言うと、Simulink のモデルはそのままでは関数ワークスペースの変数にアクセスすることはできません。関数の中でsim関数を使ってシミュレーションを実行しようとしたら、「変数が定義されていません」というエラーが出てきてしまった、という経験をしたことがある方もいらっしゃるのではないでしょうか?

 

Simulink とワークスペースに関する主要なトラブル

上述の通り、Simulink のモデルは MATLAB のベースワークスペースの変数を自動で参照してくれますので、ベースワークスペースに変数を作成してさえいれば、多くの場合問題が生じることはありません。

しかし、例えば以下のような状況では、ベースワークスペースへの参照が問題となってしまいます。

 

【ケース1】

AさんとBさんは、共同でモデルの開発をしています。Bさんは自分が担当している箇所のモデルを作成し終えたので、必要なパラメーターのデータファイルとセットでAさんに渡しました。早速Aさんはそれをモデル参照で自分のモデルに統合すると、Bさんからもらったデータファイルを読み込んでシミュレーションを実行しました。

しかし、シミュレーションが思い通りの結果になりません。原因を調査してみたところ、いつの間にかモデル内で使用している変数 K の値が書き換わっていることに気づきました。実はBさんが作ったモデルの中でも変数 K が使用されていたため、データファイルを読み込んだときに上書きされてしまったのです。2人はモデル内のいろいろな場所で変数 K を使用しているので、変数名を変えるとなると大変です。どうすれば2つのモデルの同じ変数の値を使い分けることができるでしょうか?

【ケース2】

A さんは、モデルをシミュレーションするための関数を開発することになりました。Aさんは、モデルが関数ワークスペース上の変数を参照できないことを知っていたため、assignin 関数を用いてモデル内で使用されている変数 K をベースワークスペース上に定義することにしました。

しかし、後日 A さんの開発した関数を使った B さんから「シミュレーションしたらワークスペース上の解析結果が勝手に上書きされた」とクレームが来ました。B さんはシミュレーションの入力信号を作成するために MATLAB 側でデータ解析を行っており、そこで K という変数を使っていたのです。どうすればベースワークスペース上の変数の上書きを防ぐことができるでしょうか?

ケース1の対処法:モデルワークスペースを利用して変数のバッティングを防ぐ

 

ケース1の問題点は、2つのモデルがどちらもベースワークスペースを参照していることにあります。ベースワークスペース上には同じ名前の変数を複数用意しておくことはできませんので、2つのモデルがベースワークスペースを参照している限りは同じ値が参照されてしまいます。逆に言うと、各モデルが別々のワークスペースを参照してくれれば、同じ変数名であっても別の値を使用することができます。

そこで登場するのが モデルワークスペース です。モデルワークスペースとは、モデルごとに専用に用意されているワークスペースのことで、各モデルからしか参照することができません。そのため、そのモデル内でしか使わない変数を格納する際に便利なワークスペースとなります。

モデルワークスペースは Simulink の「モデルエクスプローラー」から確認することができます。Simulink エディタの「モデル化」タブから「モデルエクスプローラー」を起動すると、現在開いているモデルが表示されます。ここでモデルの下の階層を開くと、それぞれのモデルに Model Workspace が用意されていることがわかるかと思います。

このモデルワークスペースには、ワークスペースと同様に自由に変数を格納しておくことができます。新規で変数を作成したい場合は、上部の「MATLAB 変数の追加」をクリックします。自動で変数が作成されますので、変数名や値、データ型などを自由に設定できます。

もしベースワークスペースで既に作成してある変数をモデルワークスペースに移動したい場合は、ドラッグ&ドロップで移動できます。

モデルワークスペースは各モデルからしか参照できないため、別のモデルとの変数のバッティングを防ぐことができます。さらに、ベースワークスペースよりも優先的に参照されるため、ベースワークスペース上に同じ名前の変数があってもそちらが参照されることはありません。ケース1の場合は、Bさんが変数 K を自身のモデルのモデルワークスペースに格納しておけば、A さんがベースワークスペースで使用している変数 K ではなくモデルワークスペース上の変数 K が参照されるため、別々の値を使用することができる、というわけです。

 

ただし、モデルワークスペースに作成した変数は、他のモデルから参照することができません。もし別のモデルでもその変数の値を使いたい、という場合はちゃんとベースワークスペース上に作っておく必要があります。他にも、変数がどこで管理されているのかわかりにくい、といった欠点もありますので、個人的には基本はベースワークスペースを使用し、変数のバッティングが怖い場合はモデルワークスペースを使う、というような使い分けがいいかなと思っています。

 

※パラメータをより詳細に管理したい場合

Simulink Data Dictionary という機能を使うと、モデルごとに独立して参照してほしいデータ群や複数のモデルで共有してほしいデータ群を Data Dictionary という形式でそれぞれまとめて管理することができます。パラメータ数やモデル数の多い大規模モデルの開発においては特に有用な機能となっています。

Data Dictionary の概念や使い方については、英語ですが以下の動画がわかりやすいので、興味のある方はこちらもぜひご参照いただければと思います。

ケース2の対処法:モデルが関数ワークスペースの変数を参照するように設定する

ケース2の問題点は、モデルが関数ワークスペースの変数を参照できないことにあります。関数内で定義した変数をモデルが参照してくれれば、ベースワークスペース上の変数の上書きは起こりません。

ここで使用するのが、sim 関数の SrcWorkspace オプション になります。

sim 関数を実行する際は様々なオプションを指定することができますが、この SrcWorkspace プロパティは「モデルがどのワークスペースを参照するか」を設定できるオプションです。

既定の設定ではこの SrcWorkspace は ’base’ に設定されているため、モデルはベースワークスペースの変数を参照し、関数ワークスペースは参照しません。これを ‘current’ に変更することで、sim 関数が実行された時に使用されているワークスペースが参照されるようになります。すなわち、mスクリプトやコマンドウィンドウ上で実行された時はベースワークスペース、MATLAB 関数内で呼ばれた時は関数ワークスペースが参照されます。

function myfun
K = 5;
sim('myModel','SrcWorkspace', 'current'); %呼び出された場所のワークスペースを参照
end

これを使えば、A さんは変数 K をわざわざベースワークスペース上に用意する必要はなくなりますので、B さんの解析結果を上書きせずに済みます。

ただし、参照先として設定できるワークスペースは1つだけです。関数ワークスペースに作成されている変数はそれを用いる、ない場合はベースワークスペースの変数を用いる、というようなことはできないので注意が必要です。また、関数ワークスペースの変数は関数実行後に消えてしまいますので、後からその変数はどんな値だったのかを確認することができない点も注意が必要です。

 

※関数内でシミュレーションを実行しなければならない状況

ケース 2 だけ見ると、「そもそも関数じゃなくてスクリプトでモデルをシミュレーションすればいいんじゃない?」と思う方もいらっしゃるかと思います。確かに、通常モデルをシミュレーションするだけであればわざわざ関数を使用する必要はありません。

しかし、例えばシミュレーションアプリを作成する場合、アプリの動作は全て関数で記述する必要があるため、必然的に関数の中でシミュレーションを実行することになります。

そのため、アプリ内でパラメータの値を設定しそれを用いてシミュレーションする場合はこの SrcWorkspace オプションが非常に重要になってきますので、シミュレーションアプリを作成する人はぜひ覚えておきましょう。

(シミュレーションアプリの作成については、App Designer で Simulink モデルのシミュレーションアプリを作るの記事もご参照ください)

 

まとめ

今回は Simulink とワークスペースの関係によって生じる主要なトラブルとその対処法ついて解説しました。Simulink のワークスペースへのアクセスの仕方は少し癖があるので、MATLAB のスクリプトや関数と連携させる際に問題が生じやすいです。逆に、Simulink が参照する場所を自在に操ることができると 、MATLAB との連携だけでなく大規模モデルの管理も効率的に行えるようになりますので、頭の片隅に置いておくと意外な場面で役立つかもしれませんよ!

 

 

|
  • print

Comments

To leave a comment, please click here to sign in to your MathWorks Account or create a new one.