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

MATLAB&Si金宝appmulink的ユーザーコミュニティー向け日本语ブログ

金宝appSimulink的API MATLABでからSimulink的を操る② ~モデルの編集~

こんにちは,トレーニングエンジニアの远藤です。

このブログでは「MATLABとSi金宝appmulink的を系ぐ」をテーマとして,MATLABとSimulink的を连携させる机能に关して技术的な记事を书いております。今回もこのテーマに则り,MATLABとSimulink的を系ぐ代表的な机能の一つである「金宝appSimulink的API」について书いていきたいと思います。

金宝appSimulink的APIについては,以前投稿した「金宝appSimulink的API MATLABでからSimulink的を操る」という记事でも绍介しました。その记事では,モデルのブロックパラメータやコンフィグレーションパラメータを取得·変更する方法を解说しましたが,今回の记事では,ブロックの追加や信号线の结线など,モデルの构造そのものをプログラムで编集する方法を绍介したいと思います。

プログラムでモデルを编集する方法は,

  • 复数のモデルに共通するミスを修正する
  • テスト用のモデルを自动で生成する
  • モデルを规格に准拠した构造に修正する

といったように,决まった编集方法を何度も缲り返さなければならない场合や,ブロックの见落とし,修正忘れなどのヒューマンエラーを防ぎたい场合に有效です。その分少し复雑なコードを书く必要がありますが,プログラミング好きなS金宝appimulink的使いの方は,新たなモデル编集方法に惹かれること间违いなし(?)です!

今回の目标

今回の记事では,MATLABにデフォルトで入っているVDPというモデルを题材とし,Sim金宝appulink的APIを使って出力端子1の直前に死区ブロックを插入してみたいと思います。

>> VDP%VDPモデルを起动

マウス操作では一瞬でできてしまう作业ですが,プログラムで行おうとすると结构手间がかかります。具体的には,以下の操作を顺番に行っていく必要があります。

  1. 死区ブロックをモデルに追加する
  2. モデル上の外港ブロックを検出する
  3. 検出した外港ブロックに系がっている信号线を取得する
  4. 取得した信号线の接続元を保存し,信号线を削除する
  5. 新しい信号线を死区ブロックに系ぐ

これらの操作をS金宝appimulink的APIでどうやって行うか,顺番に确认してみましょう!

こちらのドキュメントも合わせてご确认いただくと,よりわかりやすいかと思います。

1.ブロックの追加

まずはS金宝appimulink的モデルにブロックを追加する方法について说明します。モデル上にブロックを追加したい场合,add_block.という关数を使います。

>> add_block('追加したいブロック名''モデル名/つけたい名前');1つ目の入力は追加したいブロック名,2つ目の入力はモデル名と追加するブロックにつけたい名前を指定します。一见简単な关数に见えますが,これが意外と厄介です。例えば,以下のようなコードはエラーとなります。

>> add_block('盲区''VDP /死区');

“死区”という名前のブロックがありません。

実は,add_blockで追加したいブロック名を指定する场合,そのブロックが入っているライブラリの阶层も明示的に指定する必要があるのです。今回追加したい死区ブロックは,SIMULINK /不金宝app连续というライブラリファイルの中に入っています。そのため,死区を追加する场合は,

>> add_block(的金宝appSimulink /间断/死区“'VDP /死区');%死区ブロックを盲区という名前でVDPモデルに追加

のように,ライブラリの阶层まできっちり指定しなくてはいけません。

死区ブロックが,盲区という名前で追加されました!

提示

数学运算や的信号属性など,Simulink的ライブラリブラウザー上で名前が改行金宝appされているようなライブラリは,ライブラリ名に改行文字が含まれています。

このようなライブラリ名を指定する场合は,新队关数を使うなどの方法で改行コードを文字列の中に插入する必要があるので注意が必要です。例えば,数学运算ライブラリーに入っている增益ブロックを追加する际,ブロック名を以下のようにして作成します。

>>名称= ['数学'新队“运营/增益”]

名称=
'数学
操作/增益

2.モデル上のブロックの検出

次は,モデル上のOUTPORTブロックを検出します。モデル上の特定のブロックを検出するには,find_system.关数を使用します。こちらの关数は前回の记事でも绍介しましたね.find_system关数は,モデル名,パラメータ名,パラメータ値を指定することで,モデル内の特定のパラメータ値を持つブロックを検出することができます。

>>块= find_system('モデル名''パラメータ名1''パラメータ値1''パラメータ名2''パラメータ値2',...);

よく使うパラメータはBlockTypeで,特定の种类のブロックを简単に検出することができます。

>> outports = find_system('vdp''blocktype''外港'%VDPモデル内の外港ブロックを検出

outports =
2×1の细胞配列
{“VDP /输出1”}
{“VDP /输出2”}

VDPモデル内の2つのOUTPORTブロックを検出できました。中身はセル配列になっているので,outports {1}とすれば1个目のOUTPORTブロックにアクセスできます。

提示

検出の际に使用可能なブロックのプロパティについては,共通のブロックプロパティブロック固有のパラメータのページをご参考ください。

3.ブロックに系がっている信号线の取得

次に,検出したOUTPORTブロックの入力端子に系がっている信号线を取得します。そのためには,まず前回の记事でも绍介したget_param.关数を使い,外港ブロックのPortHandlesパラメータを指定を取得します.PortHandlesパラメータには,そのブロックが持つ端子情报が格纳されています。

>> ph_outport = get_param(outports {1},'porthandles'%1つ目のOUTPORTブロックの端子情报を取得

pH值=
フィールドをもつ结构:
运行轨迹:451.0006
外港:[]
使能够: []
扳机: []
状态: []
LConn:[]
RConn:[]
Ifaction:[]
重启: []

INPORTフィールドに「451.0006」という数値が格纳されていますね。これはOurportブロックの入力端子の「ハンドル」を表しています。ハンドルとは,モデル上のブロックや信号,端子などのオブジェクト1つ1つに割り振られたID番号のようなものです。

この入力端子のハンドルに対して再度get_param关数を使用することで,入力端子のプロパティにアクセスできます。例えば,线プロパティを指定すれば,その端子に接続されている信号线を取得できます。

>>线= get_param(ph_outport.Inport,'线'%外港ブロックの入力端子に接続されている信号线を取得

行=
425.0007

またも数値が返ってきました。これが信号线のハンドルになります。ちなみに,このハンドルはモデルを开く度に値が変わるので注意が必要です。

提示

得られたオブジェクトのハンドルに対して得到关数を使用すると,そのオブジェクトが持つプロパティの一覧を表示することができます。

>> GET(行)%线オブジェクトのプロパティ一覧を表示

数据记录:0
DataLoggingNameMode:“使用信号名称”
DataLoggingName:”
DataLoggingDecimateData:0
DataLoggingDecimation:“2”
DataLoggingSampleTime:“-1”


4.信号线の接続元を保存し,信号线を削除する

次に,取得した信号线の接続元の情报を保存してから削除します。本当は既存の信号线を盲区ブロックに系ぎ変えられればよいのですが,残念ながらSimulink的金宝appAPIでは信号线の系ぎ変えはできません。そのため,信号线の接続元の情报を保存し,その信号线を削除し,新しい信号线を接続する必要があります。

さて,それではまず信号线の接続元の情报を取得します。入力端子と同様,信号线もget_param关数を使うことでプロパティにアクセスできます。今回は接続元の情报が欲しいので,SrcPortHandleプロパティを指定します。

>> SRC = get_param(线,'SrcPortHandle'%信号线の接続元を取得

SRC =
447.0006

信号线の接続元のハンドルを取得することができました。それではこの信号线を削除してしまいましょう。信号线の削除はdelete_line.关数を使用します。

>> delete_line(线);%信号线を削除

Ourpotに系がっていた信号线が削除されました。

5.信号线を系ぐ

あとは削除した信号線の接続元と,追加した死区ブロックの入力端子,死区ブロックの出力端子と外港ブロックの入力端子をそれぞれ接続するだけです。信号線を接続するときは,接続元と接続先の端子のハンドルが必要です。接続元と外港の入力端子のハンドルは既に取得していますので,死区の入出力端子をget_param関数で取得しましょう。

>> ph_deadzone = get_param('VDP /死区''porthandles'%盲区ブロックの端子情报を取得

ph_deadzone =
フィールドをもつ结构:
尺寸:118.0002
外港:120.0001
使能够: []
扳机: []
状态: []
LConn:[]
RConn:[]
Ifaction:[]
重启: []

INPORTが入力端子のハンドル,外港が出力端子のハンドルです。どちらも问题なく取得できてそうですね。

それでは信号线を接続していきましょう。add_line.关数を使うことで,端子间に信号线を系ぐことができます。先ほど取得した,削除した信号の接続元ポートSRCと盲区ブロックの入力端子を接続します。

>> add_line('vdp',SRC,ph_deadzone.Inport);%接続元から死区ブロックに信号を接続

死区ブロックと外港ブロックの接続も同様です。

>> add_line('vdp',ph_deadzone.Outport,ph_outport.Inport);%死区ブロックから外港ブロックに接続

盲区ブロックに信号が接続されました!

オプション:ブロックの移动

以上の操作でモデル内にブロックを插入することができました。モデルとしてはこれで正常に実行可能なのですが,追加したブロックが変なところにあって,见栄えが悪いですね。追加した死区ブロックを适当な位置に配置してみましょう。

ブロックの位置は,位置パラメータによって定まっています。现在の盲区ブロックの位置を,get_paramで确认してみましょう。

>> POS = get_param('VDP /死区''位置'%盲区ブロックの位置を取得

POS =
160 45 190 75

4要素のベクトルが返ってきました。これらは[左端上端右端下端]の位置を表しています。これを使うことで,所望の位置にブロックを配置することが可能です。

pos_outport = get_param(outports {1},'位置');
左= pos_outport(1)-50;%外港ブロックより50だけ左
中间=(pos_outport(2)+ pos_outport(4))/ 2;%外港ブロックと同じ高さ
大小= 30;%30の大きさ
set_param('VDP /死区''位置',[左中等尺寸/ 2左+尺寸+中间尺寸/ 2]);

いい感じの位置に配置することができました。マウス操作でブロックを追加したときと逊色のないモデルが完成しましたね!

提示

金宝appsimulink.blockdiagram.ArrangeSystem.关数や金宝appsimulink.blockdiagram.routeline.关数を使うと,ブロックや信号线をいい感じに配置してくれます。具体的な位置を求める必要がない场合はこちらの方が手軽に位置调整ができるのでオススメです。详しい使い方については各关数のドキュメントをご确认ください。

おわりに

今回の记事では,金宝appSimulink的APIの关数を駆使してモデルの特定の场所にブロックを插入する方法を绍介しました。もちろんマウス操作で编集したほうが楽な场合が多いですが,冒头でも记载した通り,単纯な编集作业の缲り返しや修正ミスを防ぎたい场合は重宝します。

また,GUI的な操作をCUI的に行うというのには何とも言えぬロマンがありますよね。プログラムが得意な人は,スクリプトから华丽にモデルを编集することで,周りの人をあっと惊かせることができるかもしれませんよ!

|

注释

要发表评论,请点击这里在您的帐户MathWorks公司签署或创建一个新的。