万博1manbetxSimulinkAPIで MATLABから 模拟を操る② ~モデルの編集~
こんにちは、トレーニングエンジニアの遠藤です。
このブログでは”MATLABと仿真万博1manbetx软件を繋ぐ”をテーマとして,MATLABと仿真软件を連携させる機能に関して技術的な記事を書いております。今回もこのテーマに則り,MATLABと仿真万博1manbetx软件を繋ぐ代表的な機能の一つである“模型API”について書いていきたいと思います。
万博1manbetx仿真软件APIについては,以前投稿した”万博1manbetxSimulinkAPIで MATLABから 模拟を操る」という記事でも紹介しました。その記事では、モデルのブロックパラメータやコンフィグレーションパラメータを取得・変更する方法を解説しましたが、今回の記事では、ブロックの追加や信号線の結線など、モデルの構造そのものをプログラムで編集する方法を紹介したいと思います。
プログラムでモデルを編集する方法は,
- 複数のモデルに共通するミスを修正する
- テスト用のモデルを自動で生成する
- モデルを規格に準拠した構造に修正する
といったように,決まった編集方法を何度も繰り返さなければならない場合や,ブロックの見落とし,修正忘れなどのヒューマンエラーを防ぎたい場合に有効です。その分少し複雑なコードを書く必要がありますが,プログラミング好きな模万博1manbetx型使いの方は,新たなモデル編集方法に惹かれること間違いなし(?)です!
今回の目標
今回の記事では,MATLABにデフォルトで入っているvdpというモデルを題材とし,仿真软万博1manbetx件APIを使って出力端子1の直前に死区ブロックを挿入してみたいと思います。
> > vdp% vdpモデルを起動
マウス操作では一瞬でできてしまう作業ですが,プログラムで行おうとすると結構手間がかかります。具体的には,以下の操作を順番に行っていく必要があります。
- 死区ブロックをモデルに追加する
- モデル上の外港ブロックを検出する
- 検出した外港ブロックに繋がっている信号線を取得する
- 取得した信号線の接続元を保存し、信号線を削除する
- 新しい信号線を 死区ブロックに繋ぐ
これらの操作を 万博1manbetxSimulinkAPIでどうやって行うか、順番に確認してみましょう!
※こちらのドキュメントも合わせてご確認いただくと、よりわかりやすいかと思います。
1.ブロックの追加
まずは 万博1manbetx模拟モデルにブロックを追加する方法について説明します。モデル上にブロックを追加したい場合、添加块という関数を使います。
>>添加块(“追加したいブロック名”,“モデル名/つけたい名前的);
1つ目の入力は追加したいブロック名,2つ目の入力はモデル名と追加するブロックにつけたい名前を指定します。一見簡単な関数に見えますが,これが意外と厄介です。例えば,以下のようなコードはエラーとなります。
>>添加块(“死区”,“vdp /死区”);
“死区”という名前のブロックがありません。
実は,add_blockで追加したいブロック名を指定する場合,そのブロックが入っているライブラリの階層も明示的に指定する必要があるのです。今回追加したい死区ブロックは,仿真软件/不连续とい万博1manbetxうライブラリファイルの中に入っています。そのため,死区を追加する場合は,
>>添加块(“万博1manbetx模拟链路/不连续性/死区”,“vdp /死区”);%死区ブロックを死区という名前でvdpモデルに追加
のように、ライブラリの階層まできっちり指定しなくてはいけません。
死区ブロックが、死区という名前で追加されました!
提示
数学运算や 信号属性など、模拟ライブラリ ブラウザー上で名前が改行されているよ万博1manbetxうなライブラリは、ライブラリ名に改行文字が含まれています。
このようなライブラリ名を指定する場合は、换行符関数を使うなどの方法で改行コードを文字列の中に挿入する必要があるので注意が必要です。例えば、数学运算ライブラリーに入っている 获得ブロックを追加する際、ブロック名を以下のようにして作成します。
>>姓名=[“数学”换行符“操作/增益”]
name =
的数学
操作/增益”
2.モデル上のブロックの検出
次は,モデル上の外港ブロックを検出します。モデル上の特定のブロックを検出するには,查找系统関数を使用します。こちらの関数は前回の記事でも紹介しましたね。查找系统関数は、モデル名、パラメータ名、パラメータ値を指定することで、モデル内の特定のパラメータ値を持つブロックを検出することができます。
> blocks = find_system(“モデル名”,'パラメータ名1','パラメータ値1','パラメータ名2','パラメータ値2',……);
よく使うパラメータはBlockTypeで,特定の種類のブロックを簡単に検出することができます。
>>outports=查找系统(“vdp”,“BlockType”,“外埠”)% vdpモデル内の外港ブロックを検出
前哨=
2×1 の 单间牢房配列
{' vdp /着干活'}
{' vdp / Out2 '}
vdpモデル内の2つの外港ブロックを検出できました。中身はセル配列になっているので,外港{1}とすれば1個目の外港ブロックにアクセスできます。
提示
検出の際に使用可能なブロックのプロパティについては,共通のブロックプロパティやブロック固有のパラメータのページをご参考ください。
3.ブロックに繋がっている信号線の取得
次に,検出した外港ブロックの入力端子に繋がっている信号線を取得します。そのためには,まず前回の記事でも紹介したget_param関数を使い、外埠ブロックの 门把手パラメータを指定を取得します。门把手パラメータには、そのブロックが持つ端子情報が格納されています。
>> ph_outport = get_param(outports{1},“PortHandles”)% 1つ目の外港ブロックの端子情報を取得
ph值=
フィールドをもつ 结构:
尺寸:451.0006
输出端口:[]
启用:[]
触发器:[]
状态:[]
LConn: []
RConn: []
Ifaction: []
重置:[]
输入フィールドに「451.0006」という数値が格納されていますね。これは 我们的港口ブロックの入力端子の「ハンドル」を表しています。ハンドルとは、モデル上のブロックや信号、端子などのオブジェクト 1.つ 1.つに割り振られた 身份证件番号のようなものです。
この入力端子のハンドルに対して再度 获取参数関数を使用することで、入力端子のプロパティにアクセスできます。例えば、线プロパティを指定すれば、その端子に接続されている信号線を取得できます。
>>line=get_参数(ph_outport.Inport,“线路”)%外埠ブロックの入力端子に接続されている信号線を取得
线=
425.0007
またも数値が返ってきました。これが信号線のハンドルになります。ちなみに、このハンドルはモデルを開く度に値が変わるので注意が必要です。
提示
得られたオブジェクトのハンドルに対して 收到関数を使用すると、そのオブジェクトが持つプロパティの一覧を表示することができます。
>>获取(行)%线オブジェクトのプロパティ一覧を表示
数据采集:0
DataLoggingNameMode:“使用信号名称”
DataLoggingName:“
DataLoggingDecimateData: 0
数据记录抽取:“2”
DataLoggingSampleTime:“-1”
.
.
.
4.信号線の接続元を保存し,信号線を削除する
次に、取得した信号線の接続元の情報を保存してから削除します。本当は既存の信号線を 死区ブロックに繋ぎ変えられればよいのですが、残念ながら Simulin万博1manbetxkAPIでは信号線の繋ぎ変えはできません。そのため、信号線の接続元の情報を保存し、その信号線を削除し、新しい信号線を接続する必要があります。
さて、それではまず信号線の接続元の情報を取得します。入力端子と同様、信号線も 获取参数関数を使うことでプロパティにアクセスできます。今回は接続元の情報が欲しいので、SrcPortHandleプロパティを指定します。
>> SRC = get_param(line,“SrcPortHandle”)%信号線の接続元を取得
src =
447.0006
信号線の接続元のハンドルを取得することができました。それではこの信号線を削除してしまいましょう。信号線の削除はdelete_line関数を使用します。
>>删除_行(行);%信号線を削除
我们的锅に繋がっていた信号線が削除されました。
5.信号線を繋ぐ
あとは削除しし信号线线接続元と,追加した死区ブロックのの力子子,死区ブロックのの力端子ととブロックのの端子をそれぞれするだけです。信号线线を接続するときは,接続元と
>>ph_死区=获取参数(“vdp /死区”,“PortHandles”)%死区ブロックの端子情報を取得
ph_死区=
フィールドをもつ 结构:
Inport:118.0002
外港:120.0001
启用:[]
触发器:[]
状态:[]
LConn: []
RConn: []
Ifaction: []
重置:[]
轮廓尺寸が入力端子のハンドル,外港が出力端子のハンドルです。どちらも問題なく取得できてそうですね。
それでは信号線を接続していきましょう。add_line関数を使うことで、端子間に信号線を繋ぐことができます。先ほど取得した、削除した信号の接続元ポート srcと 死区ブロックの入力端子を接続します。
>>添加线(“vdp”,src,ph_死区。输入端口);%接続元から死区ブロックに信号を接続
死区ブロックと 外埠ブロックの接続も同様です。
>>添加线(“vdp”、ph_deadzone.Outport ph_outport.Inport);%死区ブロックから 外埠ブロックに接続
死区ブロックに信号が接続されました!
オプション:ブロックの移動
以上の操作でモデル内にブロックを挿入することができました。モデルとしてはこれで正常に実行可能なのですが,追加したブロックが変なところにあって,見栄えが悪いですね。追加した死区ブロックを適当な位置に配置してみましょう。
ブロックの位置は、位置パラメータによって定まっています。現在の 死区ブロックの位置を、获取参数で確認してみましょう。
>> pos = get_param(“vdp /死区”,“位置”)%死区ブロックの位置を取得
pos =
160 45 190 75
4要素のベクトルが返ってきました。これらは(左端上端右端下端]の位置を表しています。これを使うことで,所望の位置にブロックを配置することが可能です。
pos_outport=get_param(输出端口{1}),“位置”);
左= pos_outport (1) -50;%外港ブロックより50だけ左
中间=(位置输出端口(2)+位置输出端口(4))/2;%外港ブロックと同じ高さ
尺寸=30;% 30の大きさ
set_param (“vdp /死区”,“位置”,[left middle size/2 left+size middle+size/2]);
いい感じの位置に配置することができました。マウス操作でブロックを追加したときと遜色のないモデルが完成しましたね!
提示
万博1manbetxSimulink.BlockDiagram.arrangeSystem関数や万博1manbetxSimulink.BlockDiagram.routeLine関数を使うと,ブロックや信号線をいい感じに配置してくれます。具体的な位置を求める必要がない場合はこちらの方が手軽に位置調整ができるのでオススメです。詳しい使い方については各関数のドキュメントをご確認ください。
おわりに
今回の記事では模万博1manbetx型APIの関数を駆使してモデルの特定の場所にブロックを挿入する方法を紹介しました。もちろんマウス操作で編集したほうが楽な場合が多いですが,冒頭でも記載した通り,単純な編集作業の繰り返しや修正ミスを防ぎたい場合は重宝します。
また,GUI的な操作を崔的に行うというのには何とも言えぬロマンがありますよね。プログラムが得意な人は,スクリプトから華麗にモデルを編集することで,周りの人をあっと驚かせることができるかもしれませんよ!
评论
要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。