はじめに
やりたいこととしては、外部機器に測定指示を出し、測定値を取得し、それを画面に表示させることです。
本記事では、測定指示と測定値の取得にフォーカスします。
※古いシステムへの導入だったため、ターゲットフレームワークは .NET Framework 2.0 を想定します。
シリアル通信の設定
外部機器とシリアル通信を行うためには、SerialPort
クラスを使用します。
まず、シリアルポートの各種設定を行います。
※シリアルポートの設定は環境によって適宜変えてください。
SerialPort2.PortName = "COM6" ' ポート番号の設定
SerialPort2.BaudRate = 9600 ' ボーレートの設定
SerialPort2.Parity = IO.Ports.Parity.None ' パリティの設定
SerialPort2.DataBits = 8 ' データビット長の設定
SerialPort2.StopBits = IO.Ports.StopBits.Two ' ストップビット数の設定
SerialPort2.ReadBufferSize = 4096 ' 入力バッファサイズの設定
SerialPort2.WriteBufferSize = 4096 ' 出力バッファサイズの設定
SerialPort2.Handshake = IO.Ports.Handshake.None ' フロー制御の設定
上記の設定は、外部機器の仕様に応じて適宜変更する必要があります。
シリアルポートのオープンとバッファのクリア
ポートを開く際に、既存のデータを破棄することで、不要なデータを受信しないようにします。
Try
SerialPort2.Open()
Catch ex As Exception
MessageBox.Show("シリアルポートを開けませんでした: " & ex.Message)
End Try
SerialPort2.DiscardInBuffer() ' 受信バッファをクリア
SerialPort2.DiscardOutBuffer() ' 送信バッファをクリア
シリアルポートが正常に開けない場合、エラーメッセージを表示する処理を入れています。
測定指示の送信
測定値を取得するには、まず測定指示を外部機器へ送信します。
Dim strCommand As String = "XXX" ' 送信コマンド
SerialPort2.WriteLine(strCommand)
測定値の受信
外部機器から送信される測定値を受信し、適切に処理します。
Dim strReadLNG As String = ""
Try
strReadLNG = SerialPort2.ReadLine()
If strReadLNG = "" Then
Console.WriteLine("測定器から値が取得できませんでした。")
End If
Catch ex As TimeoutException
Console.WriteLine("【測定値受信エラー】通信に失敗しました: " & ex.Message)
End Try
測定器がデータを送らない場合や、通信がタイムアウトした場合の処理も考慮しています。
しかし、この状態では受信がうまくいきませんでした。
以下の設定を受信の前に追加することで、測定値の受信が正常に行えるようになりました。
SerialPort2.RtsEnable = True
測定値の解析
受信した測定値を解析し、適切に処理します。
If Microsoft.VisualBasic.Left(strReadLNG, 1) = "G" Then
If Val(Mid(strReadLNG, 3)) > 99999 Then
Console.WriteLine("異常値検出: " & strReadLNG)
Else
Console.WriteLine("取得した測定値: " & Val(Mid$(strReadLNG, 3)))
End If
Else
Console.WriteLine("測定値のフォーマットが正しくありません: " & strReadLNG)
End If
ここでは、測定値のフォーマットが正しいかどうかを確認し、異常値(99999以上)を除外する処理を行っています。
まとめ
本記事では、VBで外部機器とシリアル通信を行い、測定指示を送信し、測定値を受信する方法について解説しました。
特に 「SerialPort2.RtsEnable = True」 を設定しないと受信がうまくいかない点に注意が必要です。