eminus hatena lab

技術系のメモと解説

LabVIEWで電卓を作る(6): キーボード操作に反応させる+サブVIの使い方について少し

前回の続き。まずは動画でどんな感じかを


LabVIEWで電卓を作ってみた:キーボード操作を処理する

大まかな流れは以下の通り

  1. イベントストラクチャでAdd Event CaseからThis VIのKey->Key Down?を追加
  2. Char, VKey, PlatModsを別に作ったサブVIで処理し、読みやすい形に変える

なお、このシリーズの初回はこちら:

 

eminus.hatenablog.com

 

Key Downのイベント

キーが押されたときに起きるイベント。二種類あってKey Down?とKey Downというのがある。これらは(筆者が正しく理解していれば)LabVIEW自体のキーボードショートカットとの兼ね合いになっていて

  • Key Downの場合、キー入力に応じたLabVIEWのキーボードショートカットが押された後、その結果が”通知”される
  • Key Down?の場合、LabVIEW本体で評価される前にEvent Structureに入り、場合によっては無視したりできる(右側の入力端子)。
  • たとえばF1キーはヘルプになっているが、別な機能に割り当てたい場合はKey Down?の端子(右側)を使って機能をoverrideしないといちいちヘルプウィンドウが立ち上がってうっとうしい。ちなみに上記動画の例だとoverrideしていないので、F1を押すとヘルプウィンドウが立ち上がってから「F1が押された」と言い始める

forums.ni.com

いずれにせよ、3つくらいの端子を読み取ることでキー入力のすべてを知ることができる。例えばCtrl, Shift, Altが押されているかどうかはPlatModsからわかり、どのキーが押されているかはVKeyとCharを組み合わせれば解読できる。

筆者は研究室でたまにキーボード入力を受け付ける計測・解析プログラムを書くので、上記3つの出力を自分に読みやすいような形にするサブVI=関数を作っている。中のブロックダイアグラムは上記動画を一時停止してみてもらうとして、(中でやっているのはこれまでに紹介した内容で理解できるはず)以下ではサブVIについて簡単に述べる。

注:上記VIはWindows/Linux環境だけで動かす場合を想定している。Macでも使いまわす場合、話がすこしだけ複雑になる(CtrlじゃなくてCmdなので、とかそういう話)

サブVI

それなりのサイズのプロジェクトなどで、よく使うプログラムはサブVIとして共通化するのが便利。普通のプログラミング言語でいうところの関数であるので、とても基本的な使い方の一つ。サブVIと今作っているようなトップレベルのVIと作り方は全く同じで、任意のControlとIndicatorを選択することでn入力m出力の四角い箱(細かい話をすると四角くなくてもいいのだが...)にすることができる。

入出力端子を選択するための枠(下図左側)とアイコン(下図右側)はフロントパネルのウィンドウの右上らへんにある。

f:id:eminus:20190115224249p:plain

サブVIの入出力端子(左)とアイコン(右)

入出力端子の選択

通常は入力端子が左側半分、出力端子が右側半分になるように作る。デフォルトではどこにも接続されていないため、白く塗られた四角がデフォルトでは12個くらいあると思う。これらの四角にControlやIndicatorを割り当てる。例えば左上の枠にどれかのControlを割り当てたい場合(ワイヤボンディングするみたいな感じ?)、先に白い四角をクリックして反転させた後、フロントパネル上でそこに接続したいControlをクリックする。そうするとそのControlのデータ型に応じた色で塗りつぶされる。

アイコンの編集

アイコンは上記の入出力端子の右側に表示されており、ダブルクリックで編集できる。これは別のVIからこのサブVIを呼び出すときに表示される画像になるので、わかりやすいアイコン(文字でもよいが)にしておくとよい。今回の例ではめんどくさいのでデフォルトのままにしている

別のVIからの呼び出し

別のVIから呼び出すには

  • VIのファイルをExplorerからドラッグする
  • VIを開いたウィンドウ右上に出ているアイコンをドラッグする

などをすればよい。適切に端子が設定されていれば、LabVIEW標準のブロック(加算など)と同じように入出力ができるはずだ。今回は単純に電卓のVIにEvent Caseを追加してキー入力を表示するだけの構造にしてみた(動画最後のほう参照)

次回以降の予定(順不同)・今後について

  • 数字キー入力を受け取って画面に表示する部分の解説
  • 配列
  • ループとループの入出力形式いろいろ
  • 実際に計算する部分の解説
  • クリアの実装(ここまでプロトタイプで実装済み)
  • メモリ機能の実装
  • 正負反転・ルート・2乗・逆数の実装、完成

本業が忙しいのと電子工作とかもしたいので、LabVIEW電卓の投稿は数日おきにしようと思います

第7回はこちら

 

eminus.hatenablog.com