金宝appMATLAB仿真软件APIでから仿真软件を操る②~モデルの編集~
こんにちは,トレーニングエンジニアの遠藤です。
このブログでは「MATLABとSi金宝appmulink的を系ぐ」をテーマとして,MATLABとSimulink的を连携させる机能に关して技术的な记事を书いております。今回もこのテーマに则り,MATLABとSimulink的を系ぐ代表的な机能の一つである「金宝appSimulink的API」について书いていきたいと思います。
金宝appSimulink的APIについては,以前投稿した「金宝appMATLAB仿真软件APIでから仿真软件を操る“という記事でも紹介しました。その記事では,モデルのブロックパラメータやコンフィグレーションパラメータを取得・変更する方法を解説しましたが,今回の記事では,ブロックの追加や信号線の結線など,モデルの構造そのものをプログラムで編集する方法を紹介したいと思います。
プログラムでモデルを编集する方法は,
- 複数のモデルに共通するミスを修正する
- テスト用のモデルを自動で生成する
- モデルを規格に準拠した構造に修正する
といったように,决まった编集方法を何度も缲り返さなければならない场合や,ブロックの见落とし,修正忘れなどのヒューマンエラーを防ぎたい场合に有效です。その分少し复雑なコードを书く必要がありますが,プログラミング好きなS金宝appimulink的使いの方は,新たなモデル编集方法に惹かれること间违いなし(?)です!
今回の目标
今回の记事では,MATLABにデフォルトで入っているVDPというモデルを题材とし,Sim金宝appulink的APIを使って出力端子1の直前に死区ブロックを插入してみたいと思います。
> > vdp%VDPモデルを起动
マウス操作では一瞬でできてしまう作业ですが,プログラムで行おうとすると结构手间がかかります。具体的には,以下の操作を顺番に行っていく必要があります。
- 死区ブロックをモデルに追加する
- モデル上の外港ブロックを検出する
- 検出した外港ブロックに繋がっている信号線を取得する
- 取得した信号線の接続元を保存し,信号線を削除する
- 新しい信号線を死区ブロックに繋ぐ
これらの操作を模金宝app型APIでどうやって行うか,順番に確認してみましょう!
※こちらのドキュメントも合わせてご確認いただくと,よりわかりやすいかと思います。
1.ブロックの追加
まずは仿金宝app真软件モデルにブロックを追加する方法について説明します。モデル上にブロックを追加したい場合,add_blockという关数を使います。
> > add_block ('追加したいブロック名','モデル名/つけたい名前');
1つ目の入力は追加したいブロック名,2つ目の入力はモデル名と追加するブロックにつけたい名前を指定します。一见简単な关数に见えますが,これが意外と厄介です。例えば,以下のようなコードはエラーとなります。
> > add_block (“死区”,'VDP /死区');
“死区”という名前のブロックがありません。
実は,add_blockで追加したいブロック名を指定する场合,そのブロックが入っているライブラリの阶层も明示的に指定する必要があるのです。今回追加したい死区ブロックは,SIMULINK /不金宝app连续というライブラリファイルの中に入っています。そのため,死区を追加する场合は,
> > add_block (“金宝app仿真软件/不连续/死区”,'VDP /死区');%死区ブロックを盲区という名前でVDPモデルに追加
のように,ライブラリの階層まできっちり指定しなくてはいけません。
死区ブロックが,死区という名前で追加されました!
提示
数学操作や信号属性など,仿真软件ライブラリブラウザー上で名前が改行されているよ金宝appうなライブラリは,ライブラリ名に改行文字が含まれています。
このようなライブラリ名を指定する場合は,新队関数を使うなどの方法で改行コードを文字列の中に挿入する必要があるので注意が必要です。例えば、数学操作ライブラリーに入っている获得ブロックを追加する際,ブロック名を以下のようにして作成します。
>> name = [“数学”新队“操作/增益”]
名称=
'数学
操作/增益
2.モデル上のブロックの検出
次は,モデル上のOUTPORTブロックを検出します。モデル上の特定のブロックを検出するには,find_system関数を使用します。こちらの関数は前回の記事でも紹介しましたね。find_system関数は、モデル名、パラメータ名、パラメータ値を指定することで、モデル内の特定のパラメータ値を持つブロックを検出することができます。
>>块= find_system('モデル名',“パラメータ名1 ',“パラメータ値1 ',“パラメータ名2》,“パラメータ値2》,...);
よく使うパラメータはBlockTypeで,特定の種類のブロックを簡単に検出することができます。
>> outports = find_system('VDP','BlockType',“输出港”)%VDPモデル内の外港ブロックを検出
外港=
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: []
重启: []
轮廓尺寸フィールドに“451.0006”という数値が格納されていますね。これはOurportブロックの入力端子の”ハンドル”を表しています。ハンドルとは,モデル上のブロックや信号,端子などのオブジェクトつ1つに割り振られたID番号のようなものです。
この入力端子のハンドルに対して再度get_param関数を使用することで,入力端子のプロパティにアクセスできます。例えば、线プロパティを指定すれば,その端子に接続されている信号線を取得できます。
>> line = get_param(ph_outport. php);轮廓尺寸,“行”)%外港ブロックの入力端子に接続されている信号線を取得
行=
425.0007
またも数値が返ってきました。これが信号線のハンドルになります。ちなみに,このハンドルはモデルを開く度に値が変わるので注意が必要です。
提示
得られたオブジェクトのハンドルに対して得到関数を使用すると,そのオブジェクトが持つプロパティの一覧を表示することができます。
> > get(线)%线オブジェクトのプロパティ一覧を表示
数据记录:0
DataLoggingNameMode: '使用信号名称'
DataLoggingName:“
DataLoggingDecimateData:0
DataLoggingDecimation:‘2’
DataLoggingSampleTime: ' 1 '
.
.
.
4.信号线の接続元を保存し,信号线を削除する
次に,取得した信号線の接続元の情報を保存してから削除します。本当は既存の信号線を死区ブロックに繋ぎ変えられればよいのですが,残念ながら模型APIでは信号金宝app線の繋ぎ変えはできません。そのため,信号線の接続元の情報を保存し,その信号線を削除し,新しい信号線を接続する必要があります。
さて,それではまず信号線の接続元の情報を取得します。入力端子と同様,信号線も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(外港{1},'位置');
左= pos_outport(1)-50;%外港ブロックより50だけ左
中间= (pos_outport (2) + pos_outport (4)) / 2;%外港ブロックと同じ高さ
大小= 30;% 30の大きさ
set_param('VDP /死区','位置',[left middle-size/2 left+size middle+size/2]);
いい感じの位置に配置することができました。マウス操作でブロックを追加したときと遜色のないモデルが完成しましたね!
提示
金宝appSimulink.BlockDiagram.arrangeSystem関数や金宝appSimulink.BlockDiagram.routeLine关数を使うと,ブロックや信号线をいい感じに配置してくれます。具体的な位置を求める必要がない场合はこちらの方が手軽に位置调整ができるのでオススメです。详しい使い方については各关数のドキュメントをご确认ください。
おわりに
今回の记事では,金宝appSimulink的APIの关数を駆使してモデルの特定の场所にブロックを插入する方法を绍介しました。もちろんマウス操作で编集したほうが楽な场合が多いですが,冒头でも记载した通り,単纯な编集作业の缲り返しや修正ミスを防ぎたい场合は重宝します。
また,GUI的な操作をCUI的に行うというのには何とも言えぬロマンがありますよね。プログラムが得意な人は,スクリプトから华丽にモデルを编集することで,周りの人をあっと惊かせることができるかもしれませんよ!
评论
要发表评论,请点击此处登录到您的MathWorks公司帐户或创建一个新帐户。