この記事で扱っていること
- 特定の関数が使用されているプログラムをリストアップする方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
LabVIEWプログラムを自分で色々作成したりあるいはサンプルからプログラムを探すときに、ある特定の関数が使用されているかどうかで判断したいという場面がありました。
NIサンプルファインダではハードウェアの種類による絞込検索ができるのですが、それの関数版、みたいなイメージです。
特定のVIにどういった関数が使用されているかをプログラム的に確認し、該当する関数があればそのプログラム名を取得する、という構造にしたかったので、まずはVIのブロックダイアグラムの中身に外部のプログラムからアクセスできるようにする必要があります。
プロパティノードを使用するのですが、デフォルトでは機能が有効になっていない、「VIスクリプト」の機能を使用することで実現できました。
本記事ではどのような結果になるプログラムかを紹介し、具体的にそのブロックダイアグラムを紹介しています。
どんな結果になるか
メインのプログラムの作りはシンプルに検索場所を指定するための(検索対象とするプログラムが入っているフォルダを指定する)ファイルパス制御器、調べたい関数名、そして抽出されたプログラム名を表示させるための文字列配列を置いています。
試しに、プログラムを4つ用意しました。それぞれのプログラムは下の図のようになっています。
例えば、これらの4つのプログラムがfuncexampleというフォルダに入っていたとします。そして、これらのプログラムのうち、ファイルを閉じるの関数、つまりデータを保存するようなコードを書いているプログラムがどれかを抽出したいと考えたとします。
そこで今回のプログラムに必要な項目を入力して実行すると下の図のような結果になります。
確かに4つのプログラムでファイルを閉じるの関数を使用しているのは1と4だけでしたので、これで抽出できたことになります。
プログラムの構造
作りとしては、VIリファレンスを開いて各プログラムにアクセスし、プロパティノードでブロックダイアグラムのリファレンスを取得、次に全ノードのリファレンスを取得してそれを適切なクラスに変換してラベルを取得して・・・ということをしています。
実際のブロックダイアグラムの一例を以下に紹介します。
指定したフォルダ内にvi以外もあることを想定して、ファイル拡張子を取得関数で処理を分けています。
フォルダにあるviのパスをVIリファレンスを開くの関数に渡し、そのリファレンス出力をプロパティノードに渡しています。(デフォルトで表せる黄色のプロパティノードとは異なっています、こちらについてはブロックダイアグラム全体の紹介後に触れます。)
プロパティノードではまず、ブロックダイアグラムのリファレンスを取得し、そのリファレンスで今度はノードのリファレンスを取得しています。これはNodes[]と書いてあることからもわかる通り、配列になっています。
配列で得たリファレンスに対する常套手段として、Forループの自動指標付けを利用し、これをさらに「より特定のクラスに変換」関数で「関数」指定を行っています。ブロックダイアグラムのリファレンスを取得後の段階で「関数」クラスが得られていないための帳尻合わせみたいなものです。
変換される前後で互換性を持てば、変換後のプロパティノードは指定したクラスに対するプロパティの操作を行えるようになるのですが、互換性がないとエラーが起こります。
あとは関数のクラスに対してラベルのテキストを取得します。つまり関数名ですね。これがForループの外で指定した「調べたい関数名」と一致する項目があればそのTRUEの情報を大外のForループの最後、出力トンネルの条件に渡して、TRUEとなったviのみがForループから出て「プログラム名」文字列配列で得られる仕組みです。
このプログラムでエラー配線をしていないのは、どんなプログラムを読み込む可能性もあるために互換性のない変換を行ってしまう場合が多発するためです。エラーが起こってそれをシフトレジスタ等で次の処理やループに渡しているとそれ以降の処理は全て行われなくなってしまうため、わざとエラー配線をつなげていません。
さて、ブロックダイアグラム上で表れていた水色のプロパティノード、これはデフォルトの状態では表れません(選択できません)。これはVIスクリプトについての特別なプロパティノードです。
VIスクリプトは簡単に言うとプログラム的にプログラムを作るような場合に使用されるようです。私は操作に慣れていない(というかそのような必要がない)のでほぼ使いませんが、おそらくExpress VI等の仕組みに関連しているのではないかと思っています。
で、肝心の表示のさせ方なのですが、メニューバーの「ツール」から「オプション」で設定します。
これであとはプロパティノードを使用すると特定の項目が増えて、VIスクリプトについての項目を選ぶと色が水色に変わります。
指定はシビア
実はこのプログラム、扱いが少し難しい面があり、探す対象がちゃんと「関数」である必要があります。
関数パレットに表示されるもの全てが関数かというと実はそうではなく、使い分けが必要になります。
例えばファイルIOや文字列制御の関数、キュー関数などは「関数」にあたります。
例えば、特定のクラスに変換する関数へ渡す定数を「関数」ではなく「ノード」とすると、四則演算の「和」や「差」を探すことができます。
このプログラムを使用して以下のプログラムが入ったフォルダから和のノードを使用したプログラムのみを抜き出すとします。
結果は下の図のようになります。
また、「サブVI」とすると、「~.vi」となっているもの、例えばSine Waveform.viなどを探すことができます。
検索対象となる具体的なプログラムは省略しますが、仕組みは同じです。
これら以外にも、より特定のクラスに変換へ定数で渡せる項目はかなり種類があります。探す対象によって適切な定数を選ぶという手間はあるのですが、プログラムで変える部分はここだけです。
・・・と言いたいところなのですが、工夫を必要とする場面が他にあり、例えば「Whileループの中にある待機関数」を検索する場合にはプログラムの修正が必要です。
というのも、Whileループというストラクチャの中にある関数は上記のプログラムの方法では直接参照することができないようで、一度Whileループの中のオブジェクトというリファレンスを操作するなどワンクッション置く必要があります。
そのため冒頭のfuncexampleフォルダの中にあったプログラムで待機関数があるプログラムを調べるときのコードは例えば次のようにします。
他にも、関数名など探す対象は正確な表記である必要があります。例えば待機関数は正確には「待機 (ms)」であり、待機の文字の後に半角スペースを入れる必要があります。
もちろんこの文字表記のシビアさについては文字列パレットの関数(パターンで一致など)を使用すれば厳密に同じ表記にしなくても探すことはできるようになります。
・・・とまぁ何かと制約は多いのですが、プログラム管理の際にでも役に立つ場面があるかなと追うので参考にしていただけたら嬉しいです。
ここまで読んでいただきありがとうございました。
コメント