MATLABプログラミング Simulink基礎編(5)
MATLABプログラミング Simulink基礎編5回目です。
前回は、Constantブロックの検索を行いました。
今回は、もっと色々なパターンの検索を見ていきます。
Constantブロックの検索
(前回と同じ内容ですが)Constantブロックを検索するには、次のようにします。
hModel = get_param( 'モデル名', 'Handle' ); hConstant = find_system( hModel, 'BlockType', 'Constant' ); for i = 1:length( hConstant ) get_param( hConstant( i ), 'Value' ) end
find_systemの引数は次のようになっています。
特定のサブシステム上にあるブロックの検索
特定のサブシステム上にあるブロックの検索をするには次のようにします。
hSubsystem = get_param( 'サブシステム名', 'Handle' ); hBlock = find_system( hSubsystem, 'SearchDepth', 1 ); for i = 1:length( hBlock ) get_param( hBlock( i ), 'Name' ) end
ポイントは2つあります。
ポイント1:第一引数が、モデルのハンドルではなく、サブシステムのハンドルになっています。
ポイント2:SearchDepth を指定します。これは、何階層下まで検索するか?という特殊キーワードです。
マスクの中身も検索する
find_systemで検索をする場合、マスクされたブロックの中身は検索対象に含まれません。これを含まれるようにするには、次のようにします。
hModel = get_param( 'モデル名', 'Handle' ); hBlock = find_system( hModel, 'LookUnderMasks', 'on' ); for i = 1:length( hBlock ) get_param( hBlock( i ), 'Name' ) end
ポイントは、LookUnderMasksの指定です。これを on とすることで、マスクブロックの中身も検索されます。
信号線を検索する
find_systemを使うと、信号線を検索する事もできます。たとえば、モデルに含まれる全信号線を検索するには次のようにします。
hModel = get_param( 'モデル名', 'Handle' ); hLine = find_system( hModel, 'FindAll', 'on', 'Type', 'line' ); for i = 1:length( hLine ) getfullname( hLine( i ) ) end
ポイントは、FindAllを on にすることです。これを指定しないと、信号線や注釈は検索対象から自動的に外れてしまいます。
注釈を検索する
find_systemを使うと、注釈を検索する事もできます。たとえば、モデルに含まれる全注釈を検索するには次のようにします。
hModel = get_param( 'モデル名', 'Handle' ); hAnnotation = find_system( hModel, 'FindAll', 'on', 'Type', 'annotation' ); for i = 1:length( hAnnotation ) get_param( hAnnotation( i ), 'Text' ) end
ポイントは、FindAllを on にすることです。これを指定しないと、信号線や注釈は検索対象から自動的に外れてしまいます。
Data Store Memory/ Read / Write をまとめて検索する
Data Store Memory, Data Store Read, Data Store Write をまとめて検索する事も出来ます。
hModel = get_param( 'モデル名', 'Handle' ); hBlock = find_system( hModel, 'RegExp', 'on', 'BlockType', '^DataStore' ); for i = 1:length( hBlock ) get_param( hBlock( i ), 'Name' ) end
ポイントは、RegExpを on にすることです。これを指定すると、以降のパラメータ指定に正規表現を用いることができます。
対象としたい3つのブロックのBlockTypeは、それぞれ DataStoreMemory , DataStoreRead , DataStoreWrite です。そのため、正規表現で ‘^DataStore’ (=DataStoreから始まる)という指定をしてやることで、これら3ブロックすべてを検索対象とする事ができます。
まとめ
ブロックや信号線、注釈を検索するには、find_systemコマンドに色々なパラメータを組み合わせて指定してやります。
何をどう組み合わせたらよいかは、今回の記事や find_system コマンドのマニュアルを見ていただければ、おおよその使い方は分かるかと思います。
find_system, get_param, set_param の3コマンドさえ覚えておけば、かなりの事が出来るようになります。
オマケ
以前の記事で、ブロック名が Cons/tant というブロックにアクセスしようとしてエラーが出ることを確認しました。
このように名前に / が含まれるような特殊なブロックの場合、get_param , set_param をする事ができません。
そんな場合には、 find_system コマンドを使用してブロックハンドルを取得してしまうという方法があります。上記の例であれば、
>> hModel = get_param( ‘ex1_4’, ‘Handle’ );
>> hBlock = find_system( hModel, ‘Parent’, ‘ex1_4’, ‘Name’, ‘Cons/tant’ )
とします。ポイントは、パラメータ Parent, Name の2つを検索キーワードとしている事です。
Parentというのは、そのブロックがどのサブシステムにあるのか?を示すパラメータです。適当なブロックに対して、get_param( ‘ブロック名’, ‘Parent’ ) としてもらえると分かりやすいかと思います。
これであれば、ブロック名や、そのブロックが存在するサブシステム名などに、 / などの特殊文字が含まれていても平気です。
ちょっと面倒ですが、必ず find_system を使ってブロックハンドルを取得してから get_param , set_param するようにすれば、より堅牢なプログラムが出来ます。