1. 株式会社PALTEK
  2. TECHブログ
  3. 技術情報
  4. MATLAB®スクリプトでSimulink®モデルを修正してみた【第2回】Simulink® APIの基本2 (モデル編集のAPI)

TECHブログ

MATLAB®スクリプトでSimulink®モデルを修正してみた【第2回】Simulink® APIの基本2 (モデル編集のAPI)

MATLAB®スクリプトでSimulink®モデルを修正してみた【第2回】Simulink® APIの基本2 (モデル編集のAPI)

このブログでは、自動車業界で普及している、モデルベース設計ツールのMathWorks社のSimulink®で作成したモデルを、MATLAB® スクリプトで修正することを試みます。

今回は全3回のうちの第2回目で、Simulink® APIの基本2(モデル編集のAPI)と題して、Simulink®モデルを編集する際に使用するSimulink® APIについて説明します。

なお、全3回の内容は以下の通りです。
第1回:Simulink® APIの基本1(基礎の基礎)
第2回:Simulink® APIの基本2(モデル編集のAPI)
第3回:実際にモデルを修正してみた

実行した環境は以下の通りです。

OS Microsoft Windows 10 Pro
MathWorks社製 MATLAB® バージョン 9.9 (R2020b)
Simulink® バージョン 10.2 (R2020b)

目次

モデルを編集する際に使用するSimulink® API

Simulink®モデルを編集する際に使用するSimulink® APIには、以下のようなものがあります。
これらを使用することでSimulink®モデルをコマンドベースで編集できます。

new_system 空のモデルを作成する
open_system 既存のモデルを読み込んで表示する
load_system 既存のモデルを読み込む(表示はしない)
add_block 新規のブロックを追加する
add_line 新規のラインを追加する
delete_block 任意のブロックを削除する
delete_line 任意のラインを削除する
Simulink.Annotation 注釈を追加する
Simulink.BlockDiagram.arrangeSystem ブロック線図のレイアウトを改良する
Simulink.findBlocks モデルでブロックを検索する
Simulink.BlockDiagram.createSubsystem 指定されたブロックのセットを含むサブシステムを作成する
save_system モデルを保存する
close_system モデルをクローズする

Simulink® APIでモデルを作成する

Simulink® APIでモデルを作成するには、図1に示した手順で対応したSimulink® APIを実行していきます。
今回は、「第1回:Simulink® APIの基本1(基礎の基礎)」で使用した、2入力の加算器とGainの各々1個からなるサブシステムをもつモデル、all_add.slx(図2参照)と同じ構成のall_add_new.slxをSimulink APIの実行で、実際に作成しながら説明していきます。

Simulink® APIでモデルを作成する手順

図1 Simulink® APIでモデルを作成する手順

 

all_add.slxの構成

図2 all_add.slxの構成

Step1. モデル作成

new_system(モデルの名前)で空のモデルが作成されます。ただ、これだけではモデルは表示されません。sys_newという任意の変数を使用して、'all_add_new'というモデルの名前を設定してモデルを作成しました。

今回、モデルの作成過程が見えるようにモデルを表示させるため、open_system(sys_new)も併せて実行しています。実際に実行した様子を図3に示します。

なお、既存のモデルを読み込む場合も、load_system(sys_new)だけではモデルは表示されません。
モデルを表示させるには、open_system(sys_new)もあわせて実行します。

モデル作成の様子

図3 モデル作成の様子

Step2. ブロック追加

ブロック追加には、add_block(コピー元, コピー先)というAPIを使用します。
図2のようにall_add.slxには、ブロックとして定数、加算器、ゲイン、Displayが存在します。これらを、add_blockを使用して追加します。

まず、図4のように定数ブロック追加のAPIを実行し、Constant1の値に2を設定します。
ここでコピー元には、Simulink®ライブラリのパスを含めて対象とするブロックを指定します。コピー先にも、モデルのパスを含めて追加するブロックの置き先を指定します。

図3で変数sys_new ='all_add_new'をセットしているので、「sys_new+"/Constant1"」とすることで、「’all_add_new/Constant1’」が指定されます。
第1回で学んだ、set_paramを使用してConstant1の値を2に設定しました。モデルでの追加結果は図5の通りです。

定数ブロック追加のAPI実行

図4 定数ブロック追加のAPI実行

 

定数ブロック追加結果

図5 定数ブロック追加結果

 

続いて同様に加算器、ゲイン、Displayの追加を図6のようにAPI実行します。
実行結果は図7の通りです。

 

加算器、ゲイン、Displayブロック追加のAPI実行

図6 加算器、ゲイン、Displayブロック追加のAPI実行

 

加算器、ゲイン、Displayブロック追加結果

図7 加算器、ゲイン、Displayブロック追加結果

 

最後に注釈は、Simulink.Annotation(配置する階層のパス,'注釈の内容')を使用して追加します。
今回は、ルート階層に追加するので、第1回で学んだ、bdroot(ルートレベルの階層の名前を取得する)を使用して、図8のように配置するパスを指定しています。実行結果は図9の通りです。

 

注釈追加のAPI実行

図8 注釈追加のAPI実行

 

注釈追加結果

図9 注釈追加結果

Step3. 結線

結線をするには、add_lineというAPIを使用します。add_line(結線する階層のパス,結線ブロックの出力端子名,結線するブロックの入力端子名)と引数を指定して使用します。

 

まず、定数の1の出力端子と加算器Add_1の入力端子1を結線します。図10のようにAPIを実行します。実行結果は図11の通りです。

 

定数の1の出力端子と加算器の入力端子1の結線のAPI実行

図10 定数の1の出力端子と加算器の入力端子1の結線のAPI実行

 

定数の1の出力端子と加算器の入力端子1の結線結果

図11 定数の1の出力端子と加算器の入力端子1の結線結果

 

続いて同様に、定数の2の出力端子と加算器Add_1の入力端子2の間、加算器Add_1の出力端子とGain_1の入力端子の間、Gain_1の出力端子とDisplayの入力端子の間をadd_lineで結線します。図12のようにAPIを実行します。実行結果は図13の通りです。

 

定数、加算器、ゲイン、Displayとの結線のAPI実行

図12 定数、加算器、ゲイン、Displayとの結線のAPI実行

 

定数、加算器、ゲイン、Displayとの結線結果

図13 定数、加算器、ゲイン、Displayとの結線結果

Step4. レイアウト整形

結線を完了した時点では、図13のようにブロック線図のレイアウトは整形されていない状態です。Simulink.BlockDiagram.arrangeSystemというAPIを使用することで、レイアウトを整形してくれます。図14のようにAPIを実行します。実行結果は図15の通りです。

 

レイアウト整形のAPI実行

図14 レイアウト整形のAPI実行

 

レイアウト整形結果

図15 レイアウト整形結果

Step5. サブシステム作成

指定されたブロックを含むサブシステムの作成をするには、Simulink.BlockDiagram.createSubsystemというAPIを使用します。

Simulink.BlockDiagram.createSubsystem(サブシステムに含めたいブロックハンドル, ‘Name’,’サブシステムの名前’)と引数を指定することで、指定したブロックをひとまとまりにして、指定した名前でサブシステム化します。ここで新たに出てきたハンドルについては後ほど補足の項で説明します。ここでは、対象を指定する方法の一つとしてご理解いただき先にお進みください。

今回、図15の’Add_1’と‘Gain_1’のブロックを含む、名前が’Adds’のサブシステムを作成します。
まず、サブシステムに含めたい、ブロックハンドルを取得します。
Simulink.findBlocks(対象のブロックがあるパス,'Name','対象のブロック名')とすることで対象のブロックハンドルを取得します。複数のブロックをサブシステムに含めたい場合は、個々のブロックについてSimulink.findBlocksを行い、結合して配列データとしてブロックハンドルを取り扱います。実際の実行の様子が図16の通りです。

 

ブロックハンドル取得のAPI実行

図16 ブロックハンドル取得のAPI実行

 

図16で取得した、ブロックハンドルbhを使用して、名前が’Adds’のサブシステムを作成します。Simulink.BlockDiagram.createSubsystemを図17のように実行すると図18のようにサブシステムが作成されます。

 

サブシステム作成のAPI実行

図17 サブシステム作成のAPI実行

 

サブシステム作成結果

図18 サブシステム作成結果

 

図18のようにサブシステム作成時レイアウトが崩れていますので、Step.4同様にSimulink.BlockDiagram.arrangeSystemを図19のように実行すると、図20のようにレイアウトを整形できます。

 

レイアウト整形のAPI実行

図19 レイアウト整形のAPI実行

 

レイアウト調整結果

図20 レイアウト調整結果

Step6. モデル保存

save_system(モデルの名前)とすることで、指定した名前でモデルを保存できます。今回は、図21のようにAPIを実行し保存しました。最後に、close_system(モデルの名前)とすることでモデルをクローズします。図22のようにAPIを実行しモデルをクローズします。
これですべての手続きが完了しました。

 

モデル保存のAPI実行

図21 モデル保存のAPI実行

 

モデルクローズのAPI実行

図22 モデルクローズのAPI実行

補足(ハンドルについて)

ハンドルは先に説明した通り、対象を指定する方法の一つです。対象を指定するには、2つの方法があります。

一つは、これまで使用してきた、対象ブロックが置かれている階層やブロック名でパスを指定する方法(例:'all_add_new/Adds/Add_1‘)です。指定できる対象は、block_diagram, blockのみになります。関連するコマンドに、「最後に選択したブロックのパス名を取得できる」gcbがあります。

もう一つが、ハンドルによる指定方法です。ハンドルはシステムを構成する、すべての対象block_diagram, block, port, line, annotationに割り当てられるユニークな数値で指定します。(例:78.0001)尚、ハンドルとして割り当てられる数値はモデルを閉じて開くたびに代わります。関連するコマンドに「最後に選択したブロックのハンドルを取得できる」gcbhがあります。
図23の加算器ブロックをパス、ハンドルの両方で表示してみました。図24のようになります。

 

パスとハンドルの両方で表示する対象の加算器

図23 パスとハンドルの両方で表示する対象の加算器

 

同一ブロックをパスで表示した場合とハンドルで表示した場合

図24 同一ブロックをパスで表示した場合とハンドルで表示した場合

おわりに

今回は「MATLAB®スクリプトでSimulink®モデルを修正してみた」の第2回目で、「Simulink® APIの基本2(モデル編集のAPI)」と題して、Simulink®モデルを編集する際に使用する13個のSimulink® APIについて、実際に簡単なSimulink®モデルを作成しながら説明しました。

次回の第3回目は、「実際にモデルを変更してみた」と題して、第1回、第2回で学んだ内容を活用して、既存のSimulink®モデルをSimulink® APIで変更していきます。

もし、モデルベースデザイン設計委託やお手元にあるSimulink®モデルのHDL化のご要望がございましたら、お気軽にお問い合わせください。

 

お問い合わせはこちら

最後までお付き合いいただきありがとうございました。

 

参考文献
[1]:MathWorks社 「Simulink API トレーニング」テキスト, 2019年
[2]: MathWorks社Webサイト,「プログラムによるモデル編集」

このブログのシリーズ

関連ブログ