ぷち影響解析ツール
ぷち影響解析ツールが欲しいという記事を書きましたところ、通りすがりのSL初心者様がそのものズバリのツールを作って下さいました。
それをベースにほんの少しだけ調整をいれたものを、公開します。
使い方はとっても簡単で、信号線を右クリックして「Lineをトレース」をクリックするだけです。
すると、接続先のブロックがパカッパカッと点滅してくれます。
インストール
Line Tracerは、2つのファイルで構成されています。ZIPファイル中のフォルダー line_tracerをPC上のどこかに配置した上で、そこにMATLAB Pathを通していただければインストール完了です。
パスを設定した直後は、MATLABコマンドプロンプトにて、
sl_refresh_customizations
と入力してください。
このコマンドは、Simulinkメニュー等のカスタマイズ設定をリフレッシュするためのものです。Line Tracerを新たにMATLABパスに加えたため、必要となりました。
MATLAB起動時に Line TracerのあるフォルダがMATLABパスに設定されているようであれば、いちいち実行する必要はありません。
お好きにお使いいただいてかまいませんが、何かあっても責任は取れませんのであしからず。
足りない機能
Line Tracer Ver1.00では、信号線を前にたどる(=伝播先を見つける)ことはできますが、後ろにたどる(=ソースを見つける)ことはできません。これはこれで欲しい機能なので、そのうち機能追加するかもわかりません。
もう1点、ブロックが多すぎて1画面に納まらないような場合の対処も必要です。ブロックが多すぎる場合、画面をスクロールさせていかないと全ブロックを表示できません。すると、せっかくLine Tracerが見つけたいブロックを点滅させているのに、それが画面に表示されていないという悲劇も考えられます。
これに関しては、次のような処理をするのが理想です。
(1)点滅させたいブロックが確実に表示されるよう、画面をスクロールする
(2)点滅させたいブロックを点滅させる
これも、そのうち対処したいところです。
今回も勉強になりました。
MATLAB言語自体あまり知らないので、文法的なところとか大変参考になります。
ちなみに、このスクリプトだと、他のサブシステムも結線が選択されていたら、対象になってしまうかもしれませんね^^;
ソースを探すほうは、DstPortHandleをSrcPortHandleに、inport/outportの処理をそれぞれ反対にしたら、概ねいけそうですけどね。まぁ、共通化とかスマートに書いたりしようとするとそこそこめんどくさいですが。
表示に関しては、ださい方法だと、とりあえず、ScrollbarOffsetでセットしてしまえば、とりあえずはでるけど、なんかイマイチって感じかもしれませんね。
またまたお節介ながら、とはいえ、毎度スクリプトをだらだらと書くのも長くなるので、今回は吉武様のスクリプトのdiffだけを^^;
↓↓↓
29c29
port_handle = get_param(tmp(i), ‘SrcPortHandle’);
44c44
port = find_system(port_parent, ‘Port’, int2str(get_param(port_handle(j), ‘PortNumber’)), ‘BlockType’, ‘Outport’);
49,50c49,50
< if strcmp( get_param( port_parent, 'BlockType' ), 'Outport' )
if strcmp( get_param( port_parent, ‘BlockType’ ), ‘Inport’ )
> % それがInportの場合
53c53
% 最上位のInportであれば、それをハイライトする
56c56
% 最上位のInportでなければ、
60,61c60,61
< outport = portHandles.Outport( portNumber ); % 該当する出力ポート
< hilite_blocks( end + 1 ) = get_param( outport, 'Line' ); %#ok
—
> inport = portHandles.Inport( portNumber ); % 該当する出力ポート
> hilite_blocks( end + 1 ) = get_param( inport, ‘Line’ ); %#ok
64c64
% Inportではない場合
81c81,86
parent_system = get_param( target, ‘Parent’ );
> open_system( parent_system );
>
> % 表示エリアにもってきておく
> target_position = get_param(target, ‘Position’);
> set_param(parent_system, ‘ScrollbarOffset’, target_position([1:2]));
↑↑↑ここまで
年末のお繁忙のところ、通りすがってばかりで^^;
では、よいお年をお過ごしくださいませ。
またまた有難うございます。なんだか楽しくなってきました。
「他のサブシステムも結線が選択されていた」ケースは、致命的じゃないので放っておいてもいいかなぁ、なんて思っています。対処できなくはないですけど。
ScrollbarOffsetの対処は私がやるにしてももこんな感じかなぁ、と感じました。凝りだしたらキリがないですしね。
それで気が付いたんですけど、hilite_systemだと自動的にスクロールしてくれてるようです。せっかく通りすがりのSL初心者様がhilite_systemで書いてくださってたので、それをそのまま使えば良かったかな・・・とちょっと反省中です。
ともあれ、せっかくパッチをいただいたので、組み込んだものを再リリースさせていただきます。(ほとんど作ってもらったようなものなので、ここで公開するのも気が引けますが、通りすがりのSL初心者様がメイン、私がサブの共作というようなイメージでここはひとつ^^)
いつも横から楽しく勉強させていただいております。
本件、MATLAB R2006bに無理にパスを通してRT-LAB上でBuildをするとString index out of range: -491エラーが発生してしまう事が判りました。(なのに裏ではコンパイルに成功しているという・・・)
原因は2006ではLine Tracerが出来ないと判っていながら我慢できずにやってしまった私です^^;
正規の操作ではありえないエラーですが、事例を残す意味も兼ねまして投稿させていただきます。
コメントありがとうございます。エラーの原因はおそらく、LineTracerの初期化エラーだと思いますので、RT-LABのビルド自体に悪影響は無いかと思います。
それはそれとして、なぜこういった現象が起きるのか気になるので、そのうち(5月に入ってから?)時間を取って調べてみる事にします。
今後ともよろしくお願い致します
SrcPortHandle
を使う方が良い場合もありますし、
‘PortConnectivity’を使うと、いろいろ見れる情報が増えるので、
それを使うと楽に信号を追いかえる事ができるケースがあります。
さらに、関数内に
timer()関数を仕込んで、5秒後に自動的に
hilite_system(***,’none’)を実行させれば
強調表示が消えるので、便利です。
コメントありがとうございます。
SrcPortHandleとPortConnectivity、実はあまり区別しないでその場のノリで使い分けていました。どう使い分けるのが良いのか知りたくってマニュアルを見てみましたが、私の頭では理解できませんでした。実際にMATLABをいじくって、もうちょっと調べてみます。
ハイライトの件、次の記事では pause を使って0.3秒毎に点滅するようにしてみました。
http://blog.smooth-works.net/archives/2869
一方、コメントいただいたように、timer関数を仕込んでおくのも良いですね。pauseしている間はユーザー操作(ウィンドウを動かしたりとか)が効きませんが、timerだと5秒の間にもユーザー操作できるのがいいですね。ちょうど今、お客様のためにツールを作っている所なので、早速このアイデアを使わせていただきます!