VB2008からカスタマディスプレイVFD2002Eにメッセージを表示する


シリアルポートに接続したカスタマディスプレイVFD2002Eに メッセージを表示する

カスタマディスプレイVFD2002Eは 、PCPOSレジでお客様に商品名や商品単価、値引き、お買い上げ合計金額やつり銭などの情報を表示する小型のディスプレイです。

レジよく見られる青緑色の文字のVFD(蛍光表示管)を用いたカスタマディスプレイです。
パソコンのシリアルインターフェースに接続し、コマンドで文字を表示します。

長めのシリアルケーブルを用い、パソコンと離れた場所へのメッセージ表示を行うことができます。
英数カタカナ文字での表示により、レジ業務以外の用途でも、店頭、工場、病院、学校、待合所、景品交換所などで各種表示に用いることができます。


この例では、プログラム言語としてVB2008やVB2008Expressを用い、シリアルポート(COMポート)に接続した、VFD2002Eにメッセージを表示する基本的な 操作を、具体的なプログラム例とともに解説します。

VB2008により簡単なプログラムを用いることでVFD2002Eに自由にメッセージを表示できることがわかります。

 

プログラムを試す際に、パソコン以外に必要なもの

  • VB2008 または VB2008 Express

  • VFD2002E

VB2008 Expressのインストール はこちらをご覧ください。

 

サンプルプログラムのダウンロード

 

サンプルの説明

上記サンプルのVFD2002E.vbprojをVB2008 / VB2008 Expressから起動することでサンプルの実行ができます。
添付サンプルではパソコンのシリアルポートにVFD2002Eが接続されていることを想定しています。
本例ではVB2008で搭載されているSerialPortコントロールを使用しています。SerialPortコントロールについてはこちらをご参照ください。

また、bin/ReleaseフォルダのVFD2002E.exeにより、直接実行して試すこともできます。(インストーラは作成してありません。)

ボタンには固定メッセージを割り付けてあり、商品売り上げボタンについては、ボタンを押すごとにメッセージがいくつか表示できるようなサンプルとなっています。

サンプル実行でのVFD2002E表示例 半角かなメッセージを表示中

VB2008のSerialPortコントロールは、VB6のMsCommで直接制御できなかったタイムアウト処理やVB2003では苦労したEncodeなどがVBとして使用できるため、シリアルポートを利用した業務プログラムが簡単に作成できるようになっています。

本例はシリアル通信が簡単にできることをわかっていただきたく作成したもので、そのまま何かに利用できるわけではありませんが、これがきっかけでVB2008やVFD2002Eを利用したプログラムを作成していただ くきっかけにでもしていただければ幸いです。

 

VB2008用 VFD2002E表示のサンプルソース

以下のソース中ではVFD2002Eに表示するメッセージとして半角のカタカナ文字を使用しています。
インターネット通信の経路によっては、半角カタカナ(8bit Code)は化ける恐れがあります。
(このWebを配信しているWebサーバの基本エンコードがSJISエンコードであるため)

以下のVB2008用ソースコードはダウンロードソースと同じものですので、このWeb表示で文字化けが発生する場合はそちらをご覧ください。

'
'   (C)Copyright by Techno Veins Co.,Ltd.
'   All right reserved. 2008
'

'
'   このプログラムの著作権はテクノベインズが保有します。
'   独自開発プログラムへソースの組込使用については自由に参考利用していただいてかまいません。(費用・登録等不要。)
'   VFD2002E販売の際、商品に添付して配布することはご自由に行ってください。
'
'   直接ソースの全部または一部を販売することは禁止します。
'   ソースの全部または一部を再配布や書籍・Web等への許可なき転載は禁止します。
'
'   本プログラムは参考用であり、すべてのお客様の環境で動作を保証するものではありません。
'   また、本プログラムを用いることで、何らかの不利益が発生した場合であっても、テクノベインズでは一切の保証を行いません。
'
'   説明のために1行で記述できる行も分解して記述している部分があります。
'
'
'   変更履歴
'               Jan.21.2008    Ver 0.01    Naoya Takaku
'

Public Class frmSampleVFD2002E

    '
    '   VFD2002E用
    '       簡単な表示およびシリアル制御のサンプル
    '
    '   
    '   VFD2002Eのコマンドについてはhttp://www.technoveins.co.jp/pdf/vfd2002e_manual.pdf
    '   を参照のこと
    '


    '   Serial Portコントロールプロパティにてボーレート等の通信条件を設定してある。
    '   通信にハンドシェークを用いるため、必ずタイムアウトを設定し、デッドロックを防止すること

    '   TextBox1はCOMポートの初期番号をiniComPortに自動保存している


    Dim MsgCount As Integer = 0

    '
    '   フォームロード処理  初期条件等を設定
    '
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Dim CheckPort As Boolean = False


        'My.Settingsに保存されている初期値を取得する。この後、ループ内で使用するために一旦Stringに入れている。
        'Tips: DIM宣言の代入の際に、Stringのメソッドを用い、合わせて文字の大文字化と前後空白削除を順に実行している
        Dim prevComPort As String = My.Settings.iniComPort.Trim.ToUpper      ' 保存されている通信ポート名


        '  For Each文で、実行時に登録されている全てのComポート名を取得する。
        '   VB2005で追加されたMyを使用して、SerialPort名一覧を取得
        For Each portName As String In My.Computer.Ports.SerialPortNames


            '   見つかったCOMポート名称のComboBox1への登録
            ComboBox1.Items.Add(portName)


            '  ポート名が保存されており、最終保存名と同じポートが存在するか?
            ' Tips: andalsoは条件不成立後は以降の式の評価を行わない。
            If prevComPort.Length > 0 AndAlso portName = prevComPort Then CheckPort = True

        Next

        '   登録されているポート名は現在有効である。
        If CheckPort Then
            '   保存されているポート名を使用する
            SerialPort1.PortName = prevComPort
            ComboBox1.Text = prevComPort

        Else
            '   ポート名が確定していない場合、最初のポートを初期ポートとする
            ' Tips:ComboBox1のプログラムからの選択は.SelectedIndexで行い、先頭のインデックスは0
            If ComboBox1.Items.Count > 0 Then ComboBox1.SelectedIndex = 0
        End If

        '   シリアルポート送信データの文字エンコードを指定する。(VB2005!!)
        SerialPort1.Encoding = System.Text.Encoding.GetEncoding(932)    ' SJIS



    End Sub


    '
    '   VFD2002Eへのシリアル送信
    '

    Private Sub SendVfd(ByVal mesTxtUpper As String, ByVal mesTxtLower As String)

        SendVfd(Chr(&HB) & radj(mesTxtUpper) & Chr(&HB) & Chr(&HA) & mesTxtLower)

    End Sub

    Function radj(ByVal mesTxt As String) As String
        Return mesTxt.PadRight(20).Substring(0, 20)
    End Function

    '
    '   通信条件はSerialPortコントロールのプロパティにて直接代入済み
    '
    Private Sub SendVfd(ByVal mesTxt As String)
        Try

            '   この例では、シリアルポートの所有権を1回送信ごとに開放している。
            '   高速な表示速度が要求される場合、プログラム実行中は常にシリアルポートをOPEN保持する方法もある。
            '   また、レシートプリンタへの出力で、紙切れエラーが送信から遅れて受信され、データ再送が必要な場合など、
            '   複雑な動きが想定される場合、スレッドを利用してバックグラウンドジョブとして送信する方法もある。

            '   この例では、送信タイムアウトはコントロールプロパティにて設定している
            SerialPort1.Open()

            '   送信
            ' Tips:SerialPortで直接Encode処理ができるため、VB2003までのような独自の文字Encord処理は不要
            SerialPort1.Write(mesTxt)


        Catch ex As Exception
            '   最小限のエラー処理しか行っていない。
            '   これだけでもケーブルが外れた場合などの際、タイムアウトのエラーで表示が行える。
            MsgBox("シリアル通信エラー", MsgBoxStyle.Critical)

        End Try

        '   送信バッファが空になるのを待ってClose処理を行う
        While SerialPort1.BytesToWrite > 0
            '   必要に応じて、タイムアウト処理を組み込む(この例のままではForever戻ってきません。)
        End While

        '   ポートのクローズ
        SerialPort1.Close()

    End Sub


    '
    '   COMポートの指定が変更された
    '
    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles ComboBox1.SelectedIndexChanged
        Try
            '   SerialPortコントロールのPort値を変更する
            SerialPort1.PortName = ComboBox1.Text

            ' ComboBox1.TextをMy.Settings.iniComPortにPropertyBindingで接続するか、変更があった場合手動で保存する
            My.Settings.iniComPort = ComboBox1.Text

            '   Formが終了される際にもMy.Settingsは自動的に保存されるが、ここで強制的の保存する例
            My.Settings.Save()

        Catch ex As Exception
            MsgBox("シリアルポート設定エラー", MsgBoxStyle.Critical)
        End Try
    End Sub

    '
    '   デモボタン
    '

    '   VFD2002Eハードウェア初期化
    Private Sub btnHardwareInit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHardwareInit.Click
        SendVfd(Chr(&H1B) & Chr(&H40))
    End Sub

    '   CLEAR SCREEN(&H0c)
    Private Sub btnCls_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCls.Click
        SendVfd(Chr(&HC)) ' 画面クリアコマンドのみ送信する
        MsgCount = 0
    End Sub

    Private Sub btnUriage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUriage.Click

        '   表示用ダミーカウント このボタンは、押すたびに異なるメッセージがサイクルする
        ' Tips VBでも+=が使えるようになりました。
        MsgCount += 1
        MsgCount = MsgCount Mod 3

        '   画面原点移動(&HB)と文字表示(半角40文字 20桁2行分)
        '   表示データをあらかじめ構成しておき、半角40文字として送信する
        '   画面をクリアするよりも、表示原点をホームポジションに移動して画面全てを書き換えたほうが高速に表示できる
        '   ホームポジションを入れなくとも40文字出力により毎回同じ位置に表示するが、
        '   通信エラーなど異常表示により表示がずれることを防ぐために、ホーム(&hB)を行っている

        Select Case MsgCount
            Case 0
                SendVfd("トマトケチャップ       \120", "ケイ: 3テン      \12,345")

            Case 1
                SendVfd("キャベツ           \100", "ケイ: 1テン       \5,545")

            Case Else
                SendVfd("マグロブツ       \1,500", "ケイ: 1テン      \12,545")

        End Select

    End Sub

    '   合計表示例
    Private Sub btnAzukari_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAzukari.Click
        SendVfd("ケイ   10テン     \8,500", "オツリ:          \1,500")
    End Sub

    '
    '   プログラム終了
    '
    Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
        Application.Exit()
    End Sub


End Class

上記例では、2通りのSendVfdで表示を行っています。
1つは、上下の文字列をそれぞれ別に与える方法で、もう1つは1行分 HOME+20桁2行(41Byte)を送信することで、簡単に画面更新が行えます。

いずれの場合も、先頭位置にポジショニングを行ってから、全画面分の文字を出力することで、画面クリアを行っていません。
画面クリアすると瞬間的に画面が消えることで目にフリッカーが残るために、画面クリアを行わずに表示を行ったほうが、見た目に美しく表示が行えます。

転送レート19200bpsでは、HOME制御や文字表示では通信ハンドシェークはほとんど発生しませんので、画面更新として41Byte送信するための通信時間である0.02秒程度で画面更新ができます。

.Netframework2.0になり、Win32のシリアル制御を呼ぶ必要がなくなったため、シリアル制御以上に難しかった、文字エンコードのための処理が上記のように簡単になったことで、シリアル通信初心者の方には敷居が思いっきり低くなったのではないでしょうか?

 

VB6はセキュリティ対応ということがほとんど考えられていない時代に開発された言語であるため、インターネット経由で通信を伴う 現在の業務用プログラムで使用するのは、かなり危険となってきています。 しかし、.Netframework1.1まではシリアルポートクラスが準備されていなかったため、シリアル通信に慣れていない多くの開発者にとっては障壁となっていました。

.Netframework2.0の登場により、この例のように簡単にシリアルポート制御ができるようになり、さらに現在ではVB2008 Expressなど無償で使用利用できる開発ツールもありますので、ぜひ気軽にチャレンジしてみてください。

 


参考


参考技術情報

 

VB/.Netframework開発関連 参考情報

Visual Basic 2013 [VB2013]による開発情報

VB2013 Expressのインストール

VS2013 Express

無償で開発ができるマイクロソフトの開発言語 Visual Studio Express 2013 のインストール

VB2013からカスタマディスプレイVFD2002Eにメッセージを表示する VB2013 Express SerialPort接続によるカスタマディスプレイVFD2002Eの制御

Visual Basic 2008 [VB2008]による開発情報

VB2008 Expressのインストール

VB2008 Express

無償で開発ができるマイクロソフトの開発言語 VB2008 Expressのインストール

VB2008 と VB2008Expressでのテンプレート比較 VB2008/VB2008 Express プロジェクトテンプレート一覧からによる対応環境の比較
VB2008からカスタマディスプレイVFD2002Eにメッセージを表示する VB2008 Express SerialPort接続によるカスタマディスプレイVFD2002Eの制御
VB2008から大型7セグメントLEDディスプレイ LED841 にメッセージを表示する VB2008 SerialPort接続によるカスタマディスプレイVFD2002Eの制御

Visual Basic 2005 [VB2005]による開発情報

VB2005 Expressセットアップ方法の説明

VB2005 Express

無償で開発ができるマイクロソフトの開発言語 VB2005 Expressのインストール

VB2005 はじめての実行 VB2005 / VB2005 Express VB2005での開発

シリアルポートをつかう通信クラス SerialPortについて

VB2005

SerialPortコントロールを使用した開発実例

VB2005からカスタマディスプレイVFD2002Eにメッセージを表示するサンプル VB2005 シリアルポートに接続したカスタマディスプレイLED841にメッセージを表示する

Visual Basic 6 [VB6]による開発情報

VB6からカスタマディスプレイVFD2002Eにメッセージを表示する

  VB6 

MsComm接続によるカスタマディスプレイVFD2002Eの制御 

VBA [Excel2000/2003, Access]による開発情報

VFD2002EをExcelで使用する解説

  VBAによるサンプル 

ExcelのVBAから簡易表示ユーティリティを呼び出し表示を行う例。自己署名によるデジタル署名付きマクロ登録など 

.Netframework開発情報

.Net Framework再頒布パッケージについて .NetFramework .NetFramework再配布パッケージの入手に関する情報

Windows は米国 Microsoft Corporation の米国およびその他の国における登録商標です。Microsoft Corporationのガイドラインに従って画面写真を使用しています。

技術情報Index

シリアル通信関連 参考情報

シリアル開発

シリアルポートをつかう通信クラス SerialPortについて VB2005 SerialPortコントロールを使用した開発実例
VB2008からカスタマディスプレイVFD2002Eにメッセージを表示する VB2008 SerialPort接続によるカスタマディスプレイVFD2002Eの制御
VB2005からカスタマディスプレイVFD2002Eにメッセージを表示するサンプル VB2005 SerialPort接続によるカスタマディスプレイVFD2002Eの制御
VB6からカスタマディスプレイVFD2002Eにメッセージを表示する VB6 MsComm接続によるカスタマディスプレイVFD2002Eの制御 

RS232シリアル情報

接続ケーブル シリアルケーブル シリアル接続ケーブル情報
通信ケーブル情報 シリアルケーブル シリアル接続ケーブル情報
シリアルインターフェース用 クロスケーブル シリアルケーブル シリアル接続ケーブル情報
シリアルインターフェース用 ストレートケーブル シリアルケーブル シリアル接続ケーブル情報
インターリンクケーブル シリアルケーブル シリアル接続ケーブル情報
IN-9FFケーブル資料 シリアルケーブル  
コネクタ資料 シリアルコネクタ シリアルコネクタ信号配置
コネクタ対比表 シリアルコネクタ  
コネクタ留めネジについて( インチネジ - ミリネジ ) シリアルコネクタ  

シリアル接続機器     

VFD2002Eカスタマディスプレィ シリアル接続 VFD表示ディスプレイ
DM-D110カスタマディスプレィ シリアル接続 VFD表示ディスプレイ
4206 - 2次元バーコード対応 高性能エリアイメージャ USBシリアル接続 バーコードスキャナ
TM-T884シリーズ サーマルレシートプリンタ シリアル接続 レシートプリンタ
TM-T90 シリアル接続 レシートプリンタ
TSP100 futurePRNT シリアル接続 レシートプリンタ
TM-L90サーマルラベルプリンタ シリアル接続 ラベルプリンタ
RS232-USB I/Fコンバータ USB232-00 USB接続 シリアルポートを増設するコンバータ
コネクタ防塵用キャップ Dsubコネクタ コネクタ保護キャップ
その他参考

技術情報Index

 


Last Update : 2023/04/26