この記事では、PCへの入力デバイスの一つであるバーコードスキャナを用いてLabVIEWに情報を入力する方法とその応用例について紹介しています。
何かバーコード情報を読み取るような操作が必要でその情報を保存したり読み取った情報を表示、あるいはその値に関連した項目を表示して計算するといった使い方をする場合について、プログラムの例を紹介しています。
バーコードスキャナで文字を読み取る
LabVIEWに対してユーザーが何か入力を行うとき、最もよく使われる方法としてはキーボードからの入力かと思います。
しかし、PCへの入力方法は何もキーボードだけでなく他の方法も考えられ、その中の一つにバーコードスキャナがあります。
今回、古いバーコードスキャナ「IT3800」がたまたま使える状態であったので、これを使ってLabVIEWへの入力を試してみました。
原理的には、スキャナもPCへの入力デバイスの一種であるため、スキャンされた情報をLabVIEW側で受け取ることができるはずです。
(「IT3800」を使用した場合には、LabVIEWで使用するにあたって特別ドライバの設定などは必要ありませんでした。他のバーコードスキャナも特別なドライバが必要ではないかどうかはわからないので、もしこの記事に書いてあるような感じで入力ができないということであれば、個別に設定が必要かもしれません。)
![](https://marblerule.com/wp-content/uploads/2024/04/scanhowto-1024x577.png)
実際にスキャナを使用しての入力はとても簡単で、本当に文字通りバーコードをスキャンするだけで情報を読み取れました。
読み取った情報は、文字列制御器に入力されますが、これを表示させるためには文字列制御器にフォーカスがある必要があります。
そして、キーボードで文字列制御器に文字を入れるとき同様、これはviが実行されていなくてもできてしまいます。
![](https://marblerule.com/wp-content/uploads/2024/04/focusexplain-1024x577.png)
フォーカスは、ユーザーが文字列制御器をクリックすることでできますが、プログラム実行中であれば、プログラム的にフォーカスを強制することもできます。
![](https://marblerule.com/wp-content/uploads/2024/04/focusexplain2-1024x577.png)
プログラム実装例
ただ単に読み取りを続けているだけだと、文字列制御器の中でどんどん改行されていくだけです。
![](https://marblerule.com/wp-content/uploads/2024/04/continuousscan-1024x577.png)
これだと一つ一つのデータが扱いずらいので、読み取った内容を一つずつ要素に持つ配列を作るようにしてみます。
![](https://marblerule.com/wp-content/uploads/2024/04/toarrayexplain-1024x577.png)
実装の例は以下の通りです。
常に文字列制御器の状態をループでみているようにし、もし制御器の中身が空ではない状態になったら、スキャンした文字列が読み取られている途中であると判断し、外側のケースストラクチャがTrueになります。
以降は、スキャンが終わるまで外側のケースストラクチャはTrueであり、最終的にスキャンが終わる、つまり前のループの時点での文字列の中身と今のループでの文字列の中身が変わらない状態になったら内側のケースストラクチャがTrueとなり、配列にその文字列を連結しています。
内側のケースストラクチャがTrueになったときにさらに文字列を空にしたりキーフォーカスを改めてTrueに設定することで、連続的にこれらの操作が行えるようにしています。
![](https://marblerule.com/wp-content/uploads/2024/04/toarrayexplain2-1024x577.png)
これで、一つ一つのスキャンしたデータを配列の個別の要素に入れられることが分かったので、もう少し実用的なプログラムにつなげられます。
例えばバーコードスキャンした結果をファイルに保存するといった場面があり得ると思います。
![](https://marblerule.com/wp-content/uploads/2024/04/filesave-1024x577.png)
バーコードスキャンした結果そのものというより、そのスキャンした項目が具体的にどのようなものかという情報を保存する方が便利かと思い、下のプログラムはそのような実装を意識しています。
![](https://marblerule.com/wp-content/uploads/2024/04/filesave2-1024x577.jpg)
基本的な考え方は、既に紹介した、1行ずつ配列に入れる方法と同じです。
今回は、配列に入れる代わりにキューに入れて消費者ループに渡しているという点が異なります。
生産者消費者の形にしているのは、生産者側で連続的にパパっとバーコードを読み取る場合でも遅れが生じにくくするためです。
![](https://marblerule.com/wp-content/uploads/2024/04/filesave3-1024x577.png)
あるいは、あらかじめ「このバーコードにはこの商品が割り当てられており値段はいくら」という情報がcsvファイル等にまとまっていて、バーコードスキャンしたら商品名と単価、これまでスキャンしたものの合計が表示されるといったプログラムもありえます。
お店に行ってレジで会計をしてもらう際の処理をイメージするとわかりやすいと思います。
![](https://marblerule.com/wp-content/uploads/2024/04/register-1024x577.png)
こちらについては以下のような実装が考えられます。
スキャンした読み取り値と商品名、値段の情報が入ったファイル(以下の例ではscan list.csv)を読んでおき、この2次元配列を基に、スキャンしたデータと照らしてどの項目が読み込まれたのか、そしてその項目に紐づく値段を数値として計算するといった処理を行っています。
なお、Whileループに入る前に、Forループが2重になっていて空白文字を削除している部分がありますが、これはcsvファイルから読み取った文字列の前後に空白文字があった場合に正しく判定できなくなるため、これを防ぐ目的で入れています。
生産者ループ(上側のWhileループ)の内外のケースストラクチャのFalseケースは既に紹介したプログラムと同じなのでここでは省略しています。
![](https://marblerule.com/wp-content/uploads/2024/04/register2-1024x577.jpg)
本記事ではLabVIEWへの入力にバーコードスキャナを使用する場合の実例を紹介しました。
用途が限られるかもしれませんが、こういった入力デバイスとも組み合わせられるんだという事例として参考になればうれしいです。
ここまで読んでいただきありがとうございました。
コメント