[CLA-R]開いているVIをサブパネルに挿入する

CLA更新試験(CLA-R)のサンプル問題に次のような問題がありました。

23. The front panel of Austin.vi is currently open. Assuming C:\Austin.vi is the correct path to the VI, what happens when this code runs?

a.The front panel of Austin.vi will close, and Austin.vi will appear in the subpanel
b.The front panel of Austin.vi will remain open, and Austin.vi will also appear in the subpanel
c. An error will occur
d. None of the above

引用元:Certified LabVIEW Architect (CLA) *サンプル問題のダウンロードにはログインが必要

このVIではエラーが発生してもstopボタンを押すまでVIが終了しないというものになっています。サンプル問題とはいえ、公式でそれでいいのか?とは思います。でも、ケースストラクチャでエラーを入れると、表示されていないケースで何しているのか余計な記述をする必要が出てきて面倒なのかな?この問題の本質はそこではないですし。問題文を日本語にするとこんな感じになると思います。

23. あなたはAustin.viのフロントパネルを開いています。C:\Austin.viのパスが正しい場合、画像のコードを実行するとどうなりますか?

a. 開いているAustin.viが閉じられ、Austin.viがサブパネルに表示される。
b. Austin.viが開かれたまま、Austin.viがサブパネルに表示される。
c. エラーが発生する。
d.
上記のどれでもない。

同じ問題をペリテックさんも LabVIEW再設計者認定試験(CLA-R) | ペリテックSI で取り上げています。正解は

C:An error will occur

です。エラーが発生します。具体的には、サブパネルには何も表示されず、次のエラーが発生します。

Error:1144、VIが開かれているため、サブパネルに挿入できません。

といった感じです。

…まあ、CLA-Rの問題ならそれだけですが、ただ、私が出題者でこの問題のベースに問題を作るならトラップを仕込むだろうなぁと思ってしまいます。暗記しただけの人をはめるトラップですね。どんなトラップをしかけるか、ここではそんなことについて考え、本番の試験で出題者の悪質な(?)トラップに引っかからないようにしたいと思います。

問題を再現できるようにする

まずは、ここで問題とするVIを作成しました。しかし、そのまま同じVIを作るとAustin.viをCドライブ直下に置く必要があり、めんどくさいです。なので、今回はこのようなVIにアレンジしました。

サブパネル挿入確認用VI

LabVIEW 2024からOpen VI ReferenceのVI Path入力端子にVI Referenceを入れられるようになりました。まあ、Sub PanelのVI RefにVI Referenceを直接入れればいいですが…。あと、Open VI Referenceのオプションにx0を入れていますが、これはデフォルト設定です。未配線の場合と同じですね。こうすることで、VIをCドライブ直下に置かなくても大丈夫なようにできます。この状態で実行すると、サンプル問題で想定されたエラーが発生します。というより、冒頭のエラーダイアログはこのVIで表示させています。

Austin.viは

Austin.vi

これだけの大したことのないVIです。この問題ではAustin.viの動作は重要ではなく、画面があればいいのでこのぐらいのものにしています。

ちなみに、問題文のAustinは何なのかというと、これはNIの本社の所在地ですね。NI Connectなどのイベントがテキサス州オースティンで開催されています。私は行ったことないですが。

細工をする

この問題、VIにちょっと細工をすると

Austin.viを開いたまま実行

エラーなしで実行できます。開いらAustin.viを開いたままサブパネルにAustin.viが表示されています。サブパネル側ももともと開いていた側もVIは実行されていません。これは実行する処理を入れていないからですね。今回はそこは重要ではないですが。どんな細工をしたのか?それを紹介します。

Austin.viの細工

Austin.viには次の細工をしています。

Austin.viのVIプロパティ

ここでは、Reentrancyを「Shared clone reentrant execution」にしています。クローン共有の再入実行にしているわけですね。これをすることで、VIがすでに呼ばれている状態で同じVIを呼び出すとクローンを生成して実行するようになります。

Shared clone reentrant executionの代わりにPreallocated clone reentrant execution (クローン事前割り当て再入実行)でもOKです。この2つの再入実行の違いは、

  • Shared clone:クローンが必要になったら作る
  • Preallocated clone:最初から必要な数のクローンを作っておく

Preallocatedのほうは、最初からクローンの数が分かっている場合を想定したものですね。VIを動的に呼び出す場合は必要なクローン数が不定なことがあるので、その場合はShared cloneを選ぶといいと思います。Preallocatedのほうでもクローンの数が足りなかったら追加で作っているような気もしますが。

サブパネル呼び出し側

呼び出し側ではこのような細工をしています。

呼び出し側の細工

Open VI Referenceのオプションをx8にしています。これはVIを開く際に再入実行をするためのものです。オプションについては公式ドキュメントを参照してください。

VIリファレンスを開く関数 – NI からの引用

開くとオプションについてのドキュメントが表示されます
オプションフラグ説明
0x01修正を記録―VIサーバによる変更が行われたことを示すアスタリスク (*) をVIタイトルの横に表示するには、このオプションフラグを使用します。修正を記録するためには、VIが編集モードである必要があります。
0x02編集のためにテンプレートを開く―.vitファイルの原本を開くにはこのオプションフラグを使用します。このオプションフラグを選択しない場合、LabVIEWはテンプレートVIの新規インスタンスを開きます。インスタンスに行われた編集は元の.vitファイルに適用されません。このオプションフラグはテンプレート以外のファイルには影響しません。
0x04保存を促すメッセージを表示―以下のすべての条件が満たされる場合にこのVIリファレンスを閉じるときに変更の保存を促す画面を表示するには、このオプションフラグを使用します。リファレンスVIまたはそのサブVIに未保存の変更が含まれている。同じVIに対する他のリファレンスが開いていない。リファレンスVIをメモリから解放できる。たとえば、他にVIを呼び出すVIがない、VIのフロントパネルが閉じている、VIが開いているプロジェクトライブラリのメンバーでないなどの場合、VIはメモリから解放できます。
0x08再入実行を準備する―このオプションフラグは、ターゲットVIではなく、ターゲットVIの再入可能クローンのリファレンスを使用する場合に選択します。VIの再入可能クローンを使用すると、同じVIのフロントパネルを複数開いたり、同じVIの複数のコピーを並列で実行したりできます。LabVIEWは、ターゲットVIへの各リファレンスに対してターゲットVIの個別のクローンを作成します。このクローンは、通常のサブVI呼び出しにより使用される共有クローンの一部でありません。タイプ識別子があるとターゲットVIが再入可能な場合は必ず再入クローンを使用できるため、タイプ識別子VIRefnum (タイプのみ) 入力が配線されている場合はこのフラグは無視されます。このとき、ターゲットVIが再入可能でなければ、エラー1096が返されます。

ヒント
複数の再入クローンを並列で実行するには、VIを実行メソッドをこのフラグと共に使用します。ターゲットVIを非同期実行するには、VIを実行メソッドの代わりに「非同期呼び出しを開始」ノードを使用します。非同期呼び出しを開始ノードを使用すると、インタフェースが簡潔になりパフォーマンスが向上するだけでなく、対応する非同期呼び出しを待機ノードによってターゲットVIの出力を取得できるようになります。
0x10見つからないサブVIの検索を促す画面を表示―このオプションフラグは、参照しているVIに見つからないサブVIがある場合に、それを検索するかどうかをユーザに確認するように設定するために使用します。
0x20ロードダイアログボックスを非表示―参照しているVI中の見つからないサブVIを検索中、ロードダイアログボックスが表示されないよう設定します。

メモ
このオプションフラグの設定は、見つからないVIの検索を確認するプロンプトの表示/非表示の設定には影響しません。
0x40再入可能VIの同時呼び出しを有効にする―このオプションフラグは、複数のリファレンス呼び出しノードと非同期呼び出しを開始ノードを使用して、再入可能ターゲットVIのクローンを並列実行する際に使用します。これらのノードは、Forループ内で並列ループ反復を有効にして使用します。このオプションフラグは、各リファレンス呼び出しノードをクローンVIのデータスペースにアクセスできるようにすることで、並列実行を可能にします。このオプションフラグを使用しないと、同一ターゲットVIへの各呼び出しは、データスペースに他の呼び出しがアクセスしている間は待機する必要があるため、1度に1つずつ実行されます。0x40オプションフラグは、以下の場合にのみ有効です。ターゲットVIが再入可能でクローンを共有する場合。ターゲットVIが再入可能で、さらに0x80または0x100オプションフラグを使用している場合。

メモ
0x40オプションフラグがターゲットVIまたは使用されているほかのオプションフラグに対して有効でない場合は、エラー1591が返されます。
0x80呼び出して放置―このオプションフラグは、非同期呼び出しを開始ノードによってターゲットVIを非同期で呼び出す必要がある一方で、VIから返されるデータとタイミングを使用する必要がない場合に使用します。このオプションフラグは0x08または0x100と併用できません。

メモ
リモートVIへのリファレンスにこのオプションフラグを使用すると、LabVIEWはエラー1578を返します。
0x100呼び出して収集を準備―このオプションフラグは、非同期呼び出しを待機ノードによるターゲットVIに対する非同期呼び出しの結果を使用する場合に使用します。このオプションフラグを使用する場合は、非同期呼び出しを開始ノードで開始する各呼び出しに非同期呼び出しを待機ノードを含めることで、開始された呼び出しが永久にメモリで維持されないようにする必要があります。このオプションフラグは0x08または0x80と併用できません。

メモ
リモートVIへのリファレンスにこのオプションフラグを使用すると、LabVIEWはエラー1578を返します。

オプションは内部的にはビット配列的なフラグがあって、どのビットをTrueにするかで管理していると考えられます。入力が16進数表記ですし。複数のオプションを有効にするには各オプションを合計して対応できます。

この場合、再入可能VIを再入実行で呼び出しているので、VIが開かれていてもクローンを作ってサブパネルに表示できるというわけです。

注意点として、エラーを起こさないようにするには、再入可能の設定と再入実行の呼び出しの両方が必要です。再入可能VIをオプションなし(=非再入実行)で呼び出すと、パネルを閉じないとエラーになりますし、非再入実行のVIを再入実行しようとしてもOpen VI Referenceでエラーが発生します。

ここまでのことをふまえると、最初の問題の解答としては、「Austin.viを非再入実行のオプションで呼んでいるが、Austin.viが開かれていてサブパネルに入れるインスタンスを作れないからエラーが発生する。」となります。インスタンスを作れるような設定にして、そうできるように呼び出せばサブパネルに入れられます。という感じですね。

感想

今回はCLA-Rのサブパネル挿入について試しました。ほぼ同じVIでもちょっとオプションを変えるだけで挙動が変わります。こういうのでミスリードするのはNI認定試験に限らずよくあることだと思います。それでも、暗記を超えた理解をしていれば大したことはないですね。…むしろ、英文の理解のほうがまずいです。CLA-Rの試験も近いので、ちゃんと勉強します。はい。

タイトルとURLをコピーしました