MATLABスクリプトにはSimulinkブロックを作成するための関数が準備されており、モデルをスクリプトを使って自動で作成することができます。
これは決まったルールでモデルを作る際にとても有効です。
例えばConstantとOutportを結線したものを1000個配置するようなモデルを手動で作成していては日が暮れてしまいますが、スクリプトを組めばモデル作成が一瞬で終わります。
ここではブロックの配置の仕方、ブロックとブロックの結線の方法を解説します。
ブロックの置き方
ブロックはadd_block関数を使用します。
例として、モデル’add_block_test.slx’の最上位階層にConstantブロックを配置してみます。その際ですが、Constantブロックのブロック名を”TestConst”とします。
add_block('simulink/Sources/Constant', 'add_block_test/TestConst');
関数の第1引数には置きたいブロックのパスを、第2引数には配置先を指定します。
第2引数の配置先はサブシステムのパスだけでなく、ブロックの名前まで指定します。
第1引数のブロックパスですが、Simulinkライブラリブラウザーに表示されるパスです。Constantブロックであれば以下のようにSimulink->Sourcesの下にあるので’simulink/Sources/Constant’となります。
スクリプトの実行結果は以下の通りです。
TestConstという名前のConstantブロックが配置されました。
それではもう一つConstantブロックを配置してみます。もう一度同じスクリプトを実行してみます。
今度はエラーになりました。
これは既に”TestConst”という名前のブロックが同じ階層に既に存在するためです。
エラーを回避するため、第2引数(配置先)の後に以下のオプションを追加します。
add_block('simulink/Sources/Constant', 'add_block_test/TestConst', 'MakeNameUnique', 'on');
今度はエラーにならずConstantブロックを置くことができました。また、ブロック名が’TestConst1’となっています。
このように’MakeNameUnique’オプションを’on’にすることで名前の後ろに自動的に連番が振られるようになります。
連番が自動で振られて困ることも特にないので基本的にはadd_block関数は’MakeNameUnique’オプションを有効にしておいた方が良いです。
また、add_block関数でブロックを配置する際にはブロックプロパティも同時に設定することができます。
例えば配置するConstantブロックの値を’10’とするには以下のようにします。
add_block('simulink/Sources/Constant', 'add_block_test/TestConst', 'MakeNameUnique', 'on', 'Value', '10');
値が10のConstantブロックが配置されました。
add_block関数の戻り値について
add_block関数は配置されたブロックのハンドルを返してきます。以下のようにすれば配置されたブロックのハンドルを変数に格納できます。
blkH = add_block('simulink/Sources/Constant', 'add_block_test/TestConst', 'MakeNameUnique', 'on');
ブロックのハンドルがあれば以下のようにset関数でプロパティを変更することができます。
set(blkH, 'Value', '10');
様々なプロパティをadd_block関数内で変更すると長々となってしまいますし、ブロックハンドルは後述するブロックの結線にも使用できるので戻り値を受け取っておいて損はありません。
ブロックの結線
ブロックとブロックの結線にはadd_line関数を使用します。
例として以下モデルのConstantブロックの出力ポートとProductブロックの2番目の入力ポートを結線してみます。
add_line('add_line_test', 'TestConst/1', 'Product/2');
第1引数には結線したいブロックが置かれているサブシステムのパス、第2引数には接続元のブロック名とポート番号、第3引数には接続先のブロック名とポート番号という形にします。
実行結果は以下の通りです。
ブロックとブロックが結線されました。
ブロックの指定方法
上記ではブロックの指定方法としてブロック名+ポート番号としましたが、もう一つの方法としてポートハンドルを指定する方法があります。
この方法で以下のモデルで結線を行います。
まずは赤丸部のポートハンドルと青丸部のポートハンドルを取得します。
% 接続元のポートハンドルを取得
srcPH = get_param('add_line_test/TestConst', 'PortHandles');
srcOutPH = srcPH.Outport(1);
% 接続先のポートハンドルを取得
dstPH = get_param('add_line_test/Product', 'PortHandles');
dstInPH = dstPH.Inport(2);
接続元と接続先のポートハンドルが取得出来たらadd_line関数で線を結びます。
add_line('add_line_test', srcOutPH, dstInPH);
実行結果は以下の通りです。
ブロック名+ポート番号で指定した場合と同じように結線できました。
add_line関数の戻り値について
add_line関数は結線したラインのハンドルを返してきます。以下のようにすれば配置されたラインのハンドルを変数に格納できます。
lineH = add_line('add_line_test', srcOutPH, dstInPH);
ラインハンドルもブロックハンドルと同じようにset関数でプロパティを操作できるので、こちらも取得しておいて損はありません。
コメント