自動車業界では、MATLAB/Simulinkをベースとしたモデルベース開発が有望視されています。言うと、適用方法によってはそれなりに工数削減や品質向上が出来ると言う事が実証されてきたからです。一方ではモデルベース開発によって逆に工数が増加してしまうケースもあり、まだまだ課題が山積みです。これは、ユーザー様にとっては課題が山積みと言えますが、私にとっては仕事のネタが山積みとも言えます。このブログでは、そういったモデルベース開発に関わっていく中で思った事について書いていきます。更新日は月曜日+気が向いた日です。Simulink基礎編4回目です。これまでは、対象となるモデルやブロックの名前が分かっている状態で、それらのパラメータを読み書きしていました。「モデルの中にあるConstantブロックの値をすべて列挙したい」というような場合はどうでしょう。そもそもモデル中のどこにConstantブロックがあるのか?すらわかっていない状況では、パラメータを読み込むどころではありません。Constantブロックがどこにあるのかを探さないといけません。このように、「モデル中にある○○ブロックをすべて列挙したい」というのが今回のテーマです。コマンドを使用します。検索してくれるものです。find_systemと入力していただければヘルプを見ることができます。基本形:Constantブロックを探し、その値を列挙するまず始めに、「find_systemコマンドにてConstantブロックを探し、その値を列挙する」という流れを「基本形」としてご紹介します。いうのも、もちろんfind_systemはConstantブロックを探す以外にも多様な検索が行えるのですが、それらはすべてこの「基本形」をチョコチョコ修正するだけで実現可能だからです。その「基本形」ですが、find_systemコマンドの引数に「検索条件」を渡すと「検索結果(ハンドル配列)」が返ります。その「検索結果」を「ループで処理」するという流れを持っています。コードとしては次のようになります。)endさっそく演習という形で試してみましょう。作成し、そこにConstantブロックを3つ置きます。ハンドルを取得します。ハンドルが取得できました手順2手順2:MATLABコマンドウィンドウにて、Constantブロックを検索し、そのハンドルを取得します。)結果2:Constantブロックのハンドルが取得できましたConstantブロックは3つあるので、ハンドルも3つあります。手順3手順3:MATLABコマンドウィンドウにて、各ConstantブロックのValueを取得します。find_systemはハンドルの配列を返すのですが、その配列の要素数こそが見つかったブロックの数になります。することで要素数を取得します。いうように配列要素を1つずつ取り出しては操作(get_paramの引数にするとか)を行います。いうコマンドを使用しましたが、これの引数について見てみましょう。これは「どのモデルを検索するのか?」という指定です。これは2つで1つの意味を成します。パラメータ「BlockType」が、「Constant」という値をもつものを検索しなさいという意味になります。Constantブロックにはパラメータ「BlockType」というものがあって、その値が「Constant」なのです。その他のブロックにもパラメータ「BlockType」があるため、’Constant’の部分を変えれば別のブロックを検索する事が出来ます。Constantブロックの「BlockType」パラメータは’Constant’オマケの課題このコード、Constantブロックが0個、もしくは1個の時にもちゃんと動くのだろうか?と疑問に思われた方もいらっしゃるでしょう。物はためし、実際にやってみてください。コマンドを使用します。検索条件をfind_systemに渡すと、見つかったブロックのハンドルを返してくれるため、あとはforループで処理するなり何なり好きに利用すれば良いというのが今回の話でした。次回は、この「基本形」をどのように変更する事で、どのような応用ができるのかご紹介します。今回の話を読んで、「ちょっと待て。使い方と違うぞ」と思われた方もいらっしゃるでしょう。その方に向けて、釈明(?)をしておきます。Constantブロックを検索するにあたり、こうされる方もいらっしゃるでしょう。)これを実行すると次のように「Constantブロック名」のセル配列が返ります。ポイントは第一引数です。いうモデル名を直接指定しています。find_systemは、第一引数に何を渡すかによって戻り値の型が変わります。セル配列が返るという関係にあります。ハンドルにこだわっているのか?というと、そこには2つほど意図があります。意図その1:基礎編(2)でご紹介したように、ブロック名に特殊文字が入っている場合でもハンドルであれば問題が起きませんが、セル配列(=文字列のあつまり)では問題となってしまいます意図その2:find_systemではブロックだけではなく信号線、注釈も検索できるのですが、これらの結果は強制的にハンドルで返ってきます。ブロックと信号線とで取り扱いを変えるのも面倒(だし、プログラミング上の安全性が下がる)ため、ハンドルでの統一を推奨する事にしました。これは私の個人的な好みによる所が大きいため、絶対に「文字列を渡してセル配列を受け取る」というパターンを使っちゃいけないわけではありません。