この記事で扱っていること
- プログラムを止めずにエラーを複数ポップアップさせる方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
LabVIEWでプログラムを作っていざ運用開始の段階になっても、予期せぬ動作は起こりえます。そんなときのためにエラー処理をしっかり実装しておくのが大切です。
LabVIEWのプログラムでエラーが出た場合、エラーワイヤにエラー情報がクラスタの形で後続の処理に渡されてエラー処理が行われるわけですが、エラーが起きたことをユーザーに知らせる方法の一つとして、エラーをポップアップさせる「シンプルエラー処理」が挙げられます。
この関数が実行されるとエラーがあった場合にユーザーにエラーの情報をポップアップで通知してプログラムを継続するか終了するかを選択させるといったことができます。
ただし、このシンプルエラー処理によってポップアップが出ている間はプログラムそのものの実行を一時的にでも止めるため、「エラーのポップアップは出したいけれどプログラム自体は動いていてほしい」という場合には使えません。
ポップアップでなくてもエラーワイヤにエラー表示器を付けてこれを常にフロントパネルに表示しておくということもできますが、ポップアップを使用することでよりエラーが発生したことを目立たせたいという場合もあると思います。
この記事では、エラーが発生してポップアップとして表示しなおかつプログラムそのものは止めない書き方の一例を紹介しています。
どんな結果になるか
プログラムの書き方の例なので、今回はわざとエラーを出すように仕向けます。
エラーコードを数値で指定するための数値制御器と、エラーを発生させるためのブール、そしてプログラム終了のボタンがあります。
プログラムを実行して適当なエラーコードを入力後、エラーを発生させるとポップアップが表示されます。その後、同じエラーあるいは違うエラーのコードを指定して再度エラーを発生させると別のポップアップウィンドウが開きます。
プログラムの構造
ポップアップされるエラー表示の正体は、再入実行を許可したサブviです。ただし、これをメインのviから呼び出す際には非同期呼び出しを行う必要があります。
まず全体の流れとしては、生産者消費者デザインとして消費者にあたるほうでサブviを非同期で呼び出す処理を行っています。
生産者側の処理は今回はわざとエラーを起こすためにイベントストラクチャを使用してエラー情報(エラーコード)をキューに入れていますが、今回はサンプルなのでこのようにしているのであって、実際は具体的なコードを用意してそのコードを実行中にエラーが発生したらキューに入れるような書き方になると思います。
デキュー側ではエラーをポップアップ表示するためのサブviを指定してVIリファレンスを開き、非同期呼び出しを開始させています。
こうすることで、メインのviは止まらず(サブviを非同期で呼び出しているため、サブviが終了したかどうかを判断せずにメインviは実行を続けるため)、複数のエラーが起きた場合でも複数のポップアップを表示することができます。
なお、エラーを表示させるerror_dialogue.viは以下のようになっていて、ウィンドウを閉じるボタンが押されれば消えることになります。
ブロックダイアグラムに「フロントパネル:タイトル」のプロパティノードが使用されていますが、もしこの部分がないとポップアップされるエラーのウィンドウタイトルで「クローン」表示されてしまいます。
このerror_dialogue.viは非再入実行だと非同期実行させる意味がなくなってしまうので、VIプロパティ(Ctrl + I)を開いて実行のカテゴリで再入実行の設定を行います。
また、VIプロパティにてウィンドウの外観カテゴリからカスタマイズを選び、ウィンドウを閉じることをユーザに許可しないとするのもいいと思います。(単に上記で紹介したことを実現するだけであれば必須ではありません)
エラーの「出すぎ」に注意
上記のプログラムの場合、ポップアップは際限なく表示されます。つまり、何らかの処理の連続を行っているときに毎回エラーが起こるようだと、エラーのポップアップが数多く発生することになります。
これで画面が埋め尽くされてしまうことを防ぐために、例えばポップアップは5個までしか表示させないといったような組み方にしたい場合には、現在実行されているクローンviの数を数えてその数がしきい値を超えたら非同期呼び出しを行わないようにする必要があります。
メインのviのブロックダイアグラムは、構造自体はほぼ変わっていませんが、ところどころにサブviを追加しています。
error_dialogue.viにも少し修正を加え、サブviを設けています。
新たに加えたサブviの正体はclone_counter.viで、現在クローン表示されているウィンドウがどの程度あるかをカウントする機能を持っています。
構造としては機能的グローバル変数としています。4つのステートは以下のように非常にシンプルです。
恐らく、グローバル変数を使うよりももっと適切な実装方法があると思います。が、ここでは実装の簡単さを重視して単にカウンタの値の増減および現在のカウンタ値をチェックするだけの機能を設けました。
本記事ではプログラムを止めずにエラーのポップアップを表示させる例を紹介しました。
むやみやたらにエラーを表示させるのがいいわけではないですが、数多くの並列ループがありそのうちのいくつかだけでエラーが出ている場合に、それぞれ独立させてエラー表示をさせるのが役に立つことがあるので参考になればうれしいです。
ここまで読んでいただきありがとうございました。
コメント