MATLABのコマンドを単純なスクリプトとして呼び出す場合はベースワークスペースに定義されている変数等にアクセスすることができます。
しかし、関数内ではそれぞれのワークスペースにしかアクセスできないため、ベースワークスペースの変数には通常アクセスすることができません。
しかし、ベースワークスペースに定義されている変数等を参照したいというケースが結構出てきます。
ここでは関数内からベースワークスペースに定義されている変数等にアクセスする具体例を紹介します。
固定された名前の変数にアクセス
以下のようにベースワークスペースに”CONST1″というSimulink.Parameterオブジェクトが定義されているとします。

“CONST1″の値を取得する場合、通常は以下のようにアクセスします。

今度は以下のように関数内でベースワークスペースに定義されているCONST1を参照してみます。
function get_const
disp(CONST1.Value);
この関数を実行するとベースワークスペースの定義にアクセスできず、以下のようにエラーとなります。

関数内からベースワークスペースの変数を使用するためにはevalin関数を使用します。
具体的には以下のように記載します。
function get_const_new
evalin('base', 'CONST1.Value');
evalin関数の第1引数にはアクセスしたいワークスペース名を指定します。ベースワークスペースにアクセスしたい場合は‘base’とします。
第2引数にはコマンド文字列を指定します。
このコマンド(関数)を実行してみます。

無事ベースワークスペースの変数にアクセスできました。
変数名が可変の場合のアクセス方法
変数の値が決まっていれば先ほどの方法で問題ないのですが、関数を準備するような場合は取得したい変数名が文字列変数やセル配列に入っていることが多いと思います。
例えば以下のように変数に”CONST1″という文字列が入っている場合、単純に”変数名.Value”とするとエラーとなります。
function get_const_ng
name = 'CONST1';
val = evalin('base', 'name.Value');
disp(val);

この場合どうするかですが、スクリプトの文字列を事前に作成することで解決できます。
具体的には以下のようにします。
str = sprintf('%s.Value;', name);
val = evalin('base', str);
disp(val);
このように事前にスクリプトの文字列を作成しておき、それをevalin関数に渡してあげればOKです。

無事実行することができました。
変数やセル配列に入っている場合、ひと手間加える必要はありますが、問題なくベースワークスペースの変数にアクセスすることができます。
関数からベースワークスペースにアクセスする方法まとめ
今回は関数内からベースワークスペースにアクセスする方法を確認しました。
モデルのシミュレーションを行う際、モデルで使用する定数や信号の情報をベースワークスペースに展開することが多いと思いますが、その情報を取得する関数を作りたい場合に役立つと思います。
ここで紹介した方法が参考になれば幸いです。
コメント