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

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

Simulink API で MATLAB から Simulink を操る

こんにちは、テクニカルサポートエンジニアの遠藤と申します。
このブログでは以前 Lightning Talk の発表者として制作物について語らせていただきました。

今回はゲストブログとしての投稿ということで何について書こうか色々迷ったのですが、私は仕事では Simulink、趣味では MATLAB をよく使っているので、その間を取った Simulink API について書いていきたいと思います。

 

Simulink は基本的に Simulink エディタ上でマウス操作によってモデルを編集していきますが、何度も同じような操作を行う場合や大規模モデルで特定の種類のブロックの設定を一度に変更するような場合など、マウス操作よりもプログラムから操作してしまった方が楽なことがあります。

このような場合に便利なのが Simulink API です。

Simulink API とは

Simulink API とは、MATLAB から Simulink の機能を使用するためのコマンド群のことで、Simulink のエディタ上で行っている操作の一部(ブロックの追加やパラメータの変更など)をMATLAB からプログラム的に行うための機能です。

Simulink API の基本的な使い方は「プログラムによるモデル化の基礎 」で紹介されています。

 

Simulink API の関数一覧

プログラムによるモデル編集」に、用意されている関数の一覧がまとめられています。

Simulink を起動するコマンドからブロックを追加するコマンドまで様々なコマンドが用意されていることがわかりますが、さすがにこれらすべてを一度に解説することはできないので、今回は個人的に使用頻度の高いと思われる「パラメータの変更」について詳しく解説していきたいと思います。

 

ブロックのパラメータの変更

モデルを編集していく中で、

  • 条件によってモデル上のブロックのパラメータを m スクリプトから変更したい
  • 特定のブロックの設定を一括して変更するような m スクリプトが欲しい

というような需要は一定数あるかと思います。

このようなスクリプトを作成するときに便利なのが

 get_param
 set_param

という 2 つの関数になります。

get_param, set_param は、ブロックやモデルのパラメータの取得および変更をするための関数です。
使うときは、

p = get_param(ブロックパス, 'パラメータ名');
set_param(ブロックパス, 'パラメータ名', パラメータ値);

という構文を使用します。第一引数のブロックオブジェクトには、基本的に階層を含んだブロック名(’model/Scope’ など)を文字列で指定します。

 

例えば、以下のような’myModel.slx’ というモデルがあったとします。

このモデルの Gain ブロックのゲイン値を取得してみましょう。上記の構文に従うと、

>> gain = get_param('myModel/Gain','Gain')

によってゲイン値が取得できるはずです。実際に実行すると……

gain =
'5'

ゲイン値が文字列として取得できました。

間違いやすいポイントとして、Gain ブロックのゲイン値などブロックダイアログ上で入力するパラメータは基本的に文字列となります。
そのため、取得したパラメータを数値に直すためには str2num 関数などをセットで使用しましょう。

>> value = str2num(gain)
value =
5

 

次に、ゲイン値を 10 に変更してみましょう。set_param の構文に従って、

>> set_param('myModel/Gain','Gain','10');

を実行すると、

ゲイン値が変更されました。

get_param の時と同様に、set_param でもゲイン値は文字列として与える必要があります。
例えば次のようなコードだとエラーになってしまうので注意です。

>> set_param('myModel/Gain','Gain',10); % 数値を直接与えるのは間違い!
パラメーター 'Gain' に対する Gain block 'Gain' 内の設定が無効です

 

それでは、今度は Gain ブロックの「乗算」の部分を「要素単位(K.*u)」から「行列(K*u)」にコマンドで変更してみましょう。

前述した通り、set_param でパラメータを変更するにはパラメータ名が必要になります。
「乗算」のパラメータ名はどうやって調べればよいのでしょうか……?

このようなときに便利なのが「これはなに?」機能です。「乗算」の部分を右クリックすると、「これはなに?」というポップアップが出てきます。

これをクリックすると……

このように、パラメータの説明に加えて、パラメータ名、データ型、取り得る値などを確認することができます。
「乗算」は “Multiplication” というパラメータ名のようなので、以下のようなコマンドを実行してみます。

set_param('myModel/Gain','Multiplication','Matrix(K*u)');

「乗算」を変更することができました!

ちなみに、パラメータ名などの情報は各ブロックのヘルプドキュメントから確認することもできます。
複数のパラメータをまとめて確認するときなどはヘルプを見た方が楽ですね
(各ブロックのヘルプはダイアログの「ヘルプ」ボタンからチェックできます)。

 

ダイアログにないブロックパラメータ

前述した通り、ブロックのダイアログにあるパラメータは「これはなに?」機能やヘルプドキュメントでパラメータ名や取りうる値を調べることができます。

しかし、ブロックの位置や背景色などの一般的なパラメータについてはこの方法では確認することができません。
ここで役立つのが、「共通のブロックプロパティ」ドキュメントです。

このドキュメントを見れば、設定できるパラメータおよびその名前を確認することができます。
例えば、先ほど例に挙げたブロックの位置は “Position”、背景色は “BackgroundColor” であることがわかります。

ちなみに、上記の共有のブロックプロパティの中に “ObjectParameters” というプロパティがあるのですが、これを get_param することでそのブロックのパラメータ名をすべて構造体として取得することができます。

lists = get_param('myModel/Gain','ObjectParameters');

また、各ブロックが固有で持っているパラメータについては「ブロック固有のパラメーター」に一覧があります。

 

ブロックの検索

さて、set_param や get_param ではブロックパスを指定してパラメータを取得、変更しますが、例えば「モデル上の特定の条件を満たすブロックすべてのパラメータを変更したい」というような場合、複数のブロックを手動で指定するのは非常に手間がかかってしまいます。
せっかくプログラム的にパラメータを設定できるのですから、ブロックパスの取得も自動でやりたいですよね。

ここで登場するのが  find_system という関数です。

blocks = find_system(検索対象モデル, パラメータ名, パラメータ値);

という構文で、パラメータが特定の値となっているブロックを検索することができます。

よく検索で使うパラメータとしては、ブロックの種類が設定されている “BlockType” パラメータがあげられます。
例えば、Gain ブロックが 3 つあるモデル “myModel2.slx” を考えます。

このモデル上のすべてのゲインブロックを取得したい場合は、”BlockType” パラメータが “Gain” になっているブロックを検索すればよいので、

>> gainBlocks = find_system('myModel2','BlockType','Gain')

となります。実行結果は、

gainBlocks =
3×1 の cell 配列
{'myModel2/Gain' }
{'myModel2/Gain1'}
{'myModel2/Gain2'}

セル配列で全てのブロックパスを取得できました。

また、検索条件は複数指定できるので、乗算が「Matrix(K*u)」に設定されているゲインブロックを取得したければ、

>> gainBlocks = find_system('myModel','BlockType','Gain','Multiplication','Matrix(K*u)');

とすれば大丈夫です。

ただし、set_param や get_param はブロック 1 つに対してのみ使用可能です。
そのため、もし複数取得したブロックのパラメータを変えたい場合は、

for i = 1:length(gainBlocks)
set_param(gainBlocks{i},'Gain','10');
end

のように、for ループなどで 1 つずつ設定しなければなりません。
この部分はグラフィックスオブジェクトの set や get と異なるので、注意が必要です。

その他、検索オプションもいろいろあるので、詳しくは「find_system」をチェックしてみてください。

 

 

ちなみに、直近でクリックしたブロックはわざわざ find_system を使用しなくても gcb というコマンドで取得することができます。

>> type = get_param(gcb,'BlockType'); % 直近にクリックしたブロックのタイプを取得

コマンドウィンドウ上で動作を確かめる際などに便利なので、覚えておきましょう。

 

コンフィギュレーション パラメーター の変更

ここまではブロックのパラメータ変更の話でしたが、get_param や set_param はブロックだけでなくモデルにも使うことができます。
よく使うのは、モデルのコンフィギュレーション パラメーターの設定を変更する時です。

コンフィギュレーションパラメーターはソルバーやログ、コード生成などモデルに関する様々な設定を行うためのものです。
エディタ上では、「モデル化」タブの「モデル設定」を押す、または Ctrl+E で開くことができます。

モデルのパラメータにアクセスする場合はブロックパスではなくモデル名を指定します。

>> solver = get_param('myModel2','Solver') % myModel2.slx のソルバー情報を取得

solver =
'VariableStepAuto'

 

現在アクティブになっているモデル名は gcs というコマンドで取得できます。

>> solverType = get_param(gcs,'SolverType'); % 現在のモデルのソルバータイプを取得

solverType =
'Variable-step'

 

また、コンフィギュレーションパラメーターでも「これはなに?」機能が使用できます。
コンフィギュレーションパラメーターは複雑なパラメータ名が多いので、積極的に活用していきましょう。

「コード生成」の「コードとアーティファクトのパッケージ化」は “PackageGeneratedCodeAndArtifacts” というパラメータ名みたいです
(長い……)

 

おわりに

今回は set_param, get_param の使い方について解説しました。

本当は App Designer との連携などについても書こうかと思っていたのですが、API の使い方だけで結構な量になってしまったのでまた別の機会にしようと思います。

 

普段 Simulink を起動するときにしか MATLAB を触ってないという方も、これを機に MATLAB Simulink の連携を試してみてはいかがでしょうか?

 

(おまけ)
コマンドでオブジェクトの位置を変更するって見るとついこんなものを作りたくなります。

 

|
  • print

Comments

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