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

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

金宝appMATLAB仿真软件APIでから仿真软件を操る②~モデルの編集~

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

このブログでは「MATLAB」と 金宝app模拟を繋ぐ」をテーマとして、MATLABと 模拟を連携させる機能に関して技術的な記事を書いております。今回もこのテーマに則り、MATLABと 模拟を繋ぐ代表的な機能の一つである「Simulink API」について書いていきたいと思います。

金宝appSimulinkAPIについては、以前投稿した「金宝appMATLAB仿真软件APIでから仿真软件を操る“という記事でも紹介しました。その記事では,モデルのブロックパラメータやコンフィグレーションパラメータを取得・変更する方法を解説しましたが,今回の記事では,ブロックの追加や信号線の結線など,モデルの構造そのものをプログラムで編集する方法を紹介したいと思います。

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

  • 複数のモデルに共通するミスを修正する
  • テスト用のモデルを自動で生成する
  • モデルを規格に準拠した構造に修正する

といったように、決まった編集方法を何度も繰り返さなければならない場合や、ブロックの見落とし、修正忘れなどのヒューマンエラーを防ぎたい場合に有効です。その分少し複雑なコードを書く必要がありますが、プログラミング好きな 金宝app模拟使いの方は、新たなモデル編集方法に惹かれること間違いなし(?)です!

今回の目標

今回の記事では、MATLABにデフォルトで入っている vdpというモデルを題材とし、Si金宝appmulinkAPIを使って出力端子1.の直前に 死区ブロックを挿入してみたいと思います。

>>vdp%vdpモデルを起動

マウス操作では一瞬でできてしまう作業ですが、プログラムで行おうとすると結構手間がかかります。具体的には、以下の操作を順番に行っていく必要があります。

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

これらの操作を模金宝app型APIでどうやって行うか,順番に確認してみましょう!

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

1.ブロックの追加

まずは仿金宝app真软件モデルにブロックを追加する方法について説明します。モデル上にブロックを追加したい場合,add_blockという関数を使います。

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

> > add_block (“死区”“vdp/死区”);

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

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

> > add_block (“金宝app仿真软件/不连续/死区”“vdp/死区”);%死区ブロックを 死区という名前で vdpモデルに追加

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

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

提示

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

このようなライブラリ名を指定する場合は,新线関数を使うなどの方法で改行コードを文字列の中に挿入する必要があるので注意が必要です。例えば、数学操作ライブラリーに入っている获得ブロックを追加する際,ブロック名を以下のようにして作成します。

>> name = [“数学”新线“操作/增益”

名字=
”“数学
操作/增益'

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

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

>>块=查找系统('モデル名'“パラメータ名1 '“パラメータ値1 '“パラメータ名2》“パラメータ値2》,...);

よく使うパラメータは 块状で、特定の種類のブロックを簡単に検出することができます。

>> outports = find_system(“vdp”“块类型”“输出港”%vdpモデル内の 外埠ブロックを検出

外港=
2×1の细胞配列
{'vdp/Out1'}
{'vdp/Out2'}

vdpモデル内の 2.つの 外埠ブロックを検出できました。中身はセル配列になっているので、输出站{1}とすれば1個目の 外埠ブロックにアクセスできます。

提示

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

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

次に、検出した 外埠ブロックの入力端子に繋がっている信号線を取得します。そのためには、まず前回の記事でも紹介した获取参数関数を使い,外港ブロックのPortHandlesパラメータを指定を取得します。PortHandlesパラメータには,そのブロックが持つ端子情報が格納されています。

>>ph_outport=get_param(outport{1},“端口句柄”% 1 つ目の 外埠ブロックの端子情報を取得

ph值=
フィールドをもつ结构:
尺寸:451.0006
外港:[]
启用:[]
触发:[]
国家:[]
LConn:[]
RConn:[]
Ifaction: []
重置:[]

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

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

>> line = get_param(ph_outport. php);轮廓尺寸,“行”%外港ブロックの入力端子に接続されている信号線を取得

行=
425.0007

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

提示

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

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

数据记录:0
DataLoggingNameMode: '使用信号名称'
数据记录名称:“
数据记录抽取数据:0
DataLoggingDecimation:‘2’
DataLoggingSampleTime: ' 1 '


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

次に,取得した信号線の接続元の情報を保存してから削除します。本当は既存の信号線を死区ブロックに繋ぎ変えられればよいのですが,残念ながら模型APIでは信号金宝app線の繋ぎ変えはできません。そのため,信号線の接続元の情報を保存し,その信号線を削除し,新しい信号線を接続する必要があります。

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

>>src=获取参数(第行,“SrcPortHandle”% 信号線の接続元を取得

src=
447.0006

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

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

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

5.信号線を繋ぐ

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

>> ph_deadzone = get_param(“vdp/死区”“端口句柄”%死区ブロックの端子情報を取得

ph_deadzone =
フィールドをもつ结构:
输入端口:118.0002
输出端口:120.0001
启用:[]
触发:[]
国家:[]
LConn:[]
RConn:[]
Ifaction: []
重置:[]

输入が入力端子のハンドル、外埠が出力端子のハンドルです。どちらも問題なく取得できてそうですね。

それでは信号線を接続していきましょう。添加线関数を使うことで,端子間に信号線を繋ぐことができます。先ほど取得した,削除した信号の接続元ポートsrcと死区ブロックの入力端子を接続します。

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

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

> > add_line (“vdp”,PHU死区。输出端口,PHU输出端口。输入端口);%死区ブロックから外港ブロックに接続

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

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

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

ブロックの位置は、位置パラメータによって定まっています。現在の死区ブロックの位置を,get_paramで確認してみましょう。

>>pos=获取参数(“vdp/死区”“位置”%死区ブロックの位置を取得

位置=
160 45 190 75

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

pos_outport = get_param(外港{1},“位置”);
左=位置输出端口(1)-50;%外埠ブロックより 50だけ左
中间= (pos_outport (2) + pos_outport (4)) / 2;%外埠ブロックと同じ高さ
大小= 30;% 30の大きさ
设置参数(“vdp/死区”“位置”,[left middle-size/2 left+size middle+size/2]);

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

提示

金宝appSimulink.BlockDiagram.arrangeSystem関数や金宝appSimulink.BlockDiagram.routeLine関数を使うと、ブロックや信号線をいい感じに配置してくれます。具体的な位置を求める必要がない場合はこちらの方が手軽に位置調整ができるのでオススメです。詳しい使い方については各関数のドキュメントをご確認ください。

おわりに

今回の記事では、金宝appSimulinkAPIの関数を駆使してモデルの特定の場所にブロックを挿入する方法を紹介しました。もちろんマウス操作で編集したほうが楽な場合が多いですが、冒頭でも記載した通り、単純な編集作業の繰り返しや修正ミスを防ぎたい場合は重宝します。

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

|

コメント

コメントを残すには,ここをクリックしてMathWorksアカウントにサインインするか新しいMathWorksアカウントを作成します。