MATLABプログラミング Simulink基礎編(6)

MATLABプログラミング Simulink基礎編6回目です。(忙しい忙しいって言ってたら、前回の基礎編5から、もう3か月も経ってるんですねぇ。お盆休み中も、結局ずっと仕事してました。ハッハッハ。ともあれ、この企画、もうちょっと続ける予定です。)

これまでは、対象となるモデルやブロックの名前が存在している状態で、それらのパラメータを読み書きしていました。

しかしたとえば、「そもそもブロックが無いから、追加したいんだけど・・・」という場合、パラメータの読み書きではどうにもなりません。

そこで、今回からはブロックなどを追加したり削除したりしてみましょう。

ブロックを追加する

さて、突然ですが手でブロックを追加するときは、どうするでしょう?

Simulinkライブラリブラウザからドラッグ&ドロップするか

モデルからCtrlキー押しながらドラッグ&ドロップするか

といった所ですよね。ドラッグ&ドロップですから、追加というより「コピー」と言った方がしっくり来ます。

さて、SimulinkのAPIを使う場合も、これと同じ考え方をします。ブロックを追加するには、add_block コマンドを使いますが、その構文は次の通りです。

上記の例では、Constantブロックをモデル untitled の上に、Constantという名前で配置します。addといいつつ、やっている事はコピーですね。

ブロックを削除する

手でブロックを削除するときは、ブロックを選択したうえでDeleteキーを押したりしますよね。

APIの場合は、delete_block コマンドを使います。

これは本当に直観的ですね。削除対象を指定するだけです。

演習:Constantブロックを2つ追加し、次にそれらを削除する

事前準備

モデル ex1_8.mdl を作成します。中身はからっぽでOKです。

次に、Simulinkライブラリブラウザを立ち上げておきます。(重要)

手順1

手順1:MATLABコマンドウィンドウにて、Constantブロックを1つ追加します

>> add_block( ‘simulink/Sources/Constant’, ‘ex1_8/Constant’ )

結果1:Constantブロックが1つ追加されました

手順2

手順2:MATLABコマンドウィンドウにて、Constantブロックをもう1つ追加します

>> add_block( ‘simulink/Sources/Constant’, ‘ex1_8/Constant’ )

結果2:エラーが出てしまいました

手順3

手順3:MATLABコマンドウィンドウにて、Constantブロックを「名前を変えて」追加します

>> add_block( ‘simulink/Sources/Constant’, ‘ex1_8/Constant2’ )

ポイントは、 Constant の代わりに、Constant2 にしたところです。

結果3:Constantブロックがもう1つ追加されました

ちょっと見にくいですが、同じ場所にConstantブロックが2つ重なっています。

手順4

手順4:MATLABコマンドウィンドウにて、Constantブロックを2つ削除します

>> delete_block( ‘ex1_8/Constant’ )
>> delete_block( ‘ex1_8/Constant2’ )

結果4:Constantブロックがキレイさっぱり無くなりました

ふりかえり

add_block コマンドでは、コピー元 ‘simulink/Sources/Constant’ からのコピーを2回繰り返しました。delete_block コマンドでは、これらを削除しました。

ここでちょっと気になるのが先ほどのエラー。コピー先の名前が重複していたらエラーになる。当たり前といえば当たり前ですが、なんとも不便な仕様です。

ところが、さすがはマスワークスさん、そのあたりの抜かりはありません。実は、「重複していたら、勝手に名前変えといて?」という指定ができます。たとえば、モデルに何もない状態で以下のコマンドを実行するとこうなります。

>> add_block( ‘simulink/Sources/Constant’, ‘ex1_8/Constant’, ‘MakeNameUnique’, ‘on’ )
>> add_block( ‘simulink/Sources/Constant’, ‘ex1_8/Constant’, ‘MakeNameUnique’, ‘on’ )
>> add_block( ‘simulink/Sources/Constant’, ‘ex1_8/Constant’, ‘MakeNameUnique’, ‘on’ )

うん。すばらしい。

ポイントは、追加の引数 ‘MakeNameUnique’, ‘on’ の部分です。これがあると、名前が重複してエラーが出そうな時、自動的にブロック名を変えて配置してくれます。

コピー元の準備

これまでさらっと、「コピー元 ‘simulink/Sources/Constant’ 」などという表現を使ってきましたが、これには補足が必要です。たとえば、Gainブロックを追加するには、どうすればいいの?という問題が残っています。

‘simulink/Sources/Constant’ というのは、Simulinkライブラリブラウザ中にある、Constantブロックの位置です。Gainブロックの位置も、調べようとすれば簡単に調べられます。

しかし、これには1つ大きな問題があります。というのも、Simulinkライブラリブラウザの構造は、MATLABバージョンアップ時にたまーに変更される事があるため、安定ではないのです。

その問題を避けるには、「パーツ準備用のモデル」を自前で用意するのが一番です。たとえば、次のようなモデル add_block_parts.mdl を用意したとしましょう。

すると、コピー元の指定は、 ‘add_block_parts/Constant’ で済みます。Simulink標準ブロックに限らず、どんな種類のブロックでもこの手で「コピー元」にすることができます。これであれば、MATLABのバージョンが上がっても、まず大丈夫です。

あとは、add_block を始める前に必ず、

>> load_system( ‘add_block_parts’ )

として、コピー元モデルの準備をするようにしておけば完璧です。(コピー元のモデルをロードしておかないと、add_blockが失敗します)

もう1つ、 ‘/built-in/ブロックタイプ’ をコピー元として指定するという方法もあります。ただし、上記の方法の方が応用の幅がひろいため、built-in 形式は使ったことがありません。まぁ、このあたりは好みの問題と思いますので、どっちでも良いと思います。

まとめ

見てきたように、ブロックの追加・削除は比較的簡単です。

一方、信号線の追加・削除はちょっぴり分かりにくい仕様になっています。そこで、次回からは信号線の取り扱いについてご説明します。