忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

BHT-BASIC4.0:バーコードの読込み(バーコードスキャン)について
ハンディターミナルを使用する最大の要因は、バーコードの読込みを行うことです。 商品に貼られたバーコードや、商品棚に印刷されたバーコードを読み取り、いろいろな作業を行います。

BHTシリーズで読込み可能なバーコードには EAN-13(JAN-13)、EAN-8 (JAN-8)、NW-7、Code39、Code93、Code128等があります。

バーコードを読込む処理は以下の一連の命令の実行で行います。

・OPEN命令によりバーコードデバイスをオープンする。
・バーコードが読込まれるのを待つ。
・バーコードバッファから読込まれた文字列を取得する。
・CLOSE命令によりバーコードデバイスをクローズする。

■バーコードデバイスのオープン

バーコードデバイスのオープンの OPEN命令 について説明します。

[書式1:パラメタを直接指定]
 OPEN "BAR:[読取モード][ブザー制御][LED制御]" AS [#]ファイル番号 CODE 読取コード[,読取コード...]

[書式2:パラメタをシステム設定値から指定]
 OPEN "BAR:SP" AS [#]ファイル番号

<引き数>
・[読取モード]:
 ■モメンタリスイッチモード(M):
  トリガスイッチを押している間だけ照明LEDが点灯し、
  バーコードを読み取ることができる。

 ■オートオフモード(F)
  トリガスイッチを押すと照明LEDが点灯し、トリガスイッチを放すか、
  またはバーコードを読み取ると、照明LED は消える。

 ■オルタネートスイッチモード(A)
  トリガスイッチを押すと照明LEDが点灯し、トリガスイッチを放しても、
  照明LED は点灯している。バーコードデバイスファイルがクローズされるか、
  またはトリガスイッチを再度押すと照明LED は消える。

 ■連続読み取りモード(C)
  トリガスイッチに関係なく照明LEDはバーコードデバイスファイルが
  クローズされるまで点灯しています。

 ※4モードとも照明LEDが点灯している間は、
  バーコードを読み取ることができます。

・[ブザー制御]:"B"
 バーコードの読み取り成功時にブザー(バイブレータ)を作動

・[LED制御]:"L"
 バーコードの読み取り成功時に青LED が点灯しないようにする

・ファイル番号:(OPEN命令で指定したファイル番号を指定)

・読取コード:
 ■共通商品コード("A","B","C")
   先頭文字(国フラグ)やアドオンの指定ができますが
   "A"のみ指定でEAN-13(JAN-13),EAN-8(JAN-8),UPC-E全てが
   読込める

 ■NW-7("N"):
   書式:N[:[最小桁数[-最大桁数]][スタート ストップ][CD]
       [,[最小桁数[-最大桁数]][スタート ストップ][CD]]
       [,[最小桁数[-最大桁数]][スタート ストップ][CD]]]

 ■Code39("M"):
   書式:M[:[最小桁数[-最大桁数]][CD]
       [,[最小桁数[-最大桁数]][CD]]
       [,[最小桁数[-最大桁数]][CD]]]

 ■Code93("L"):
   書式:L[:[最小桁数[-最大桁数]
       [,[最小桁数[-最大桁数]]
       [,[最小桁数[-最大桁数]]]

 ■Code128("K"):
   書式:K[:[最小桁数[-最大桁数]
       [,[最小桁数[-最大桁数]]
       [,[最小桁数[-最大桁数]]]

上記のほかにいろんな指定がありますが、それは各BHTの取説を見てください。
■オープン指定の例

OPEN "BAR:M" AS #1 CODE "A", "M:4-25",  "K:4-25"

この例では読取モードとしてはモメンタリスイッチモードで、読取コードは 共通商品コード、Code39の4桁~25桁、Code128の4桁~25桁を可能としています。

このオープン例を使った簡単なテストプログラムを以下に示します。
  PRIVATE intLen%, pstrBarCode$
  'バーコードデバイスオープン
  OPEN "BAR:M" AS #1 CODE "A", "M:4-25",  "K:4-25"
  'バーコードスキャニング待ち
  WAIT 0, &h02
  'バーコードバッファ内の文字数取得
  intLen% = LOC(#1)
  'バーコード読込
  pstrBarCode$ = INPUT$(intLen%, #1)
  'バーコードデバイスクローズ
  CLOSE #1
  PRINT "BARCODE=" + pstrBarCode$
  WAIT 0, &H1	'キー待ち
  END

実際の処理としては、上記のテストプログラムでは不十分です。 商品などのバーコードコードをスキャンする場合、そのバーコードが準備されていればいいのですが、 準備できていないことがあります。
そんな時には、バーコードスキャンでもキー入力でもコード入力が可能な様に組んでおくことが必要です。
■バーコード・キー入力の両方を行える関数例

以下のソースはバーコードスキャンを途中でやめて、キー入力出来る様にしたバーコード入力関数の例です。

この関数の処理は以下の様な仕様になっています。
(1)最初にカーソル位置を退避する。
(2)バーコードデバイスオープンを行い、キー入力とバーコードスキャンを待つ。
(3)バーコードスキャンがあれば、コードを変数に戻し、関数を終わる。
(4)[F4]キーが押下された場合は、戻り値にそのフラグを持って関数を終わる。
(5)[F1]キーが押下された場合は、キー入力処理になる。
(6)数字キーであれば入力文字列に追加する。
(7)[F2]キーが押下された場合は、バーコードスキャン(2)に戻る。
(8)[F4]キーが押下された場合は、戻り値にそのフラグを持って関数を終わる。
'この変数はどこかで宣言する
	Global GcKeyF1$ : GcKeyF1$ = "A"
	Global GcKeyF2$ : GcKeyF2$ = "B"
	Global GcKeyF3$ : GcKeyF3$ = "C"
	Global GcKeyF4$ : GcKeyF4$ = "D"
	Global GcGetRetNormal% : GcGetRetNormal% = 0  '[ENT]キーでの終了
	Global GcGetRetF1%     : GcGetRetF1% = 1      '[F1]キーでの終了
	Global GcGetRetF2%     : GcGetRetF2% = 2      '[F2]キーでの終了
	Global GcGetRetF3%     : GcGetRetF3% = 3      '[F3]キーでの終了
	Global GcGetRetF4%     : GcGetRetF4% = 4      '[F4]キーでの終了

'---------------------------------------
'バーコード入力
'---------------------------------------
'Function GfGetBar%(Byref pstrBarCode$)
'引 数:
'	pstrBarCode$:入力されたバーコード文字列
'戻り値:
'	GfGetBar%	:どのキーで終了したかを示す以下のフラグを返す
'				:	GcGetRetNormal% = 0  '[ENT]キーでの終了
'				:	GcGetRetF4% = 4      '[F4]キーでの終了
'---------------------------------------
	Function GfGetBar%(Byref pstrBarCode$)
		Private intX%, intY%, intLoop%, intLen%, strKey$, intRet%, strInp$
		'エラー処理宣言
		On Error Goto GfGetBar.ErrProc
		'結果格納領域の初期化
		pstrBarCode$ = ""
		'カーソル位置退避
		intY% = CSRLIN
		intX% = POS(0)
GfGetBar.ReStart	'バーコード再スタート
		Locate intX%, intY%, 2
		Cursor ON
		'バーコードデバイスオープン
		OPEN "BAR:M" AS #1 CODE "A", "M:4-25",  "K:4-25"

		intLoop% = GcTrue%
		While intLoop% = GcTrue%
			'キー入力とバーコードスキャニング待ち
			Wait 0, &h03
			'バーコードバッファ内の文字数取得
			intLen% = Loc(#1)
			If intLen% <> 0 Then 
				'バーコードスキャニングがあった場合
				pstrBarCode$ = Input$(intLen%, #1) 'バーコードをセット
				intRet% = GcGetRetNormal%
				intLoop% = GcFalse%
			Else
				'キー入力があった場合
				strKey$ = Input$(1) '入力されたキーの文字を取得
				SELECT strKey$
					CASE "A" 
						'[F1]キー文字の場合
						intLoop% = GcFalse%
						intRet% = GcGetRetF1%	'下のキー入力をさせる
					CASE "D" 
						'[F4]キー文字の場合
						intLoop% = GcFalse%
						intRet% = GcGetRetF4%	'関数を抜ける
				END SELECT
			End If
		WEnd
		'バーコードデバイスクローズ
		Close #1

		if intRet% = GcGetRetF1% Then
			'キー入力ループ
			intLoop% = GcTrue%
			While intLoop% = GcTrue%
				'表示
				Cursor OFF
				Locate intX%, intY%
				Print "               ";
				Locate intX%, intY%
				Print strInp$;
				Cursor ON
				'キーを1文字取得
				strKey$ = GfGetKey$
				'数字のみしか受け付けない!!
				IF "0" <= strKey$ And strKey$ <= "9" THEN
					strInp$ =strInp$ + strKey$
				ELSE
					'数字以外の場合
					SELECT strKey$
						CASE CHR$(13)
							'[ENT]キー文字の場合
							If strInp$ <> "" Then
								pstrBarCode$ = strInp$	'コード戻す
								intLoop% = GcFalse%		'ループ脱出
								intRet% = GcGetRetNormal%
							Endif
						CASE CHR$(8)
							'[BS]キーの場合
							If  LEN(strInp$) > 0 Then
								strInp$ = LEFT$(strInp$, LEN(strInp$) - 1)
							Endif
						CASE CHR$(24)
							'[クリア]キーの場合
							strInp$ = ""
						CASE "B" 
							'[F2]キー文字の場合
							intLoop% = GcFalse%
							intRet% = GcGetRetF2%	'バーコード再入力へ
						CASE "D" 
							'[F4]キー文字の場合
							intLoop% = GcFalse%
							intRet% = GcGetRetF4%	'関数を抜ける
					END SELECT
				ENDIF
			WEnd
		Endif
		If intRet% = GcGetRetF2% Then
			'バーコード再入力へ
			Goto GfGetBar.ReStart
		Endif
		GfGetBar% = intRet%
GfGetBar.Return	'関数戻り
		On Error Goto 0
		Exit Function
'-----
'エラー処理
'-----
GfGetBar.ErrProc
		GfGetBar% = GcGetRetNormal%
		pstrBarCode$ = ""
		Resume GfGetBar.Return
	End Function

'-----
'この関数の実行例
'-----
	SCREEN 1				'漢字モード
	LOCATE , , 2			'カーソルをブロック表示
	PRIVATE intRet%, intLen%, pstrBarCode$
	WHILE 1
		LOCATE 1, 2
		PRINT "                   ";
		LOCATE 1, 2
		PRINT "CODE=";
		intRet% = GfGetBar%(pstrBarCode$)
		LOCATE 1, 4
		PRINT "                   ";
		LOCATE 1, 4
		If intRet% = GcGetRetF4% Then
			PRINT "**コード無しでの戻り"
		Else
			PRINT "INP=" + pstrBarCode$
		Endif
	WEND

この関数はまだまだ足りない点があると思いますので、改造をして下さい。


=====
2016/04/02:の時の情報











PR

コメント

コメントを書く