tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^3: VB2005で、シリアル通信について
投稿日: 2009/04/27(Mon) 17:58
投稿者オショウ
> 機器はオムロンのPLCになります。
> 上位リンクコマンドで通信をさせようと考えております。
> 一回、オショウ 様の指摘した部分を見直してみます。

  オムロンのPLCでしたら、数年前にVB2005で作成した通信クラス
  を保有しています。FINSコマンド体系です。

  シリアル通信設定は、そう差異が無いと思いますが・・・

            devPort = New Ports.SerialPort

            AddHandler devPort.DataReceived, AddressOf OnDataReceived

            CPU_NO = CpuNo

            devPort.BaudRate = Baudrate
            devPort.DataBits = Databit
            devPort.Parity = Paritybit
            devPort.StopBits = Stopbit
            devPort.WriteTimeout = Ports.SerialPort.InfiniteTimeout
            devPort.ReadTimeout = Ports.SerialPort.InfiniteTimeout
            devPort.PortName = "COM" + Port.ToString.Trim
            devPort.Handshake = Ports.Handshake.None
            devPort.ReadBufferSize = 512

            devPort.Open()

            devPort.DiscardInBuffer()
            devPort.DiscardOutBuffer()

            devPort.DtrEnable = True
            devPort.RtsEnable = True

  その時のシリアルポートをオープンする際の設定コードです。

※ 通信タイムウアトは、自分のクラス内で別途やってます。

  デリミタは、&h0D ですので・・・

    Public Sub OnDataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)

        Dim dev As SerialPort
        Dim bRet As Boolean
        Dim sz As String

        dev = DirectCast(sender, SerialPort)

        If e.EventType = SerialData.Chars Then
            Try
                sz = dev.ReadTo(VbCr)
            Catch ex As Exception
                sz = String.Empty
            End Try
            If sz <> String.Empty Then
                bRet = ConvertData(sz, dt)
                If bRet Then
                    If RecvTimeout IsNot Nothing Then
                        RecvTimeout.Dispose()
                        RecvTimeout = Nothing
                    End If

                    RaiseEvent ReceiveData(dt)

                    If ReceiveDone IsNot Nothing Then
                        ReceiveDone.Set()
                    End If
                End If
            End If
        End If

    End Sub

  実際のプログラムからの抜粋で、不必要な部分を抜いてますので
  このままでは正常に動作しません。
  適宜修正変更して下さい。

※ PLC通信クラスにしていますので、その受信イベントの中から
  受信データを元プログラムに戻す為にRaiseEvent使ってます。

※ RecvTimeoutは、通信タイムアウトを通信クラス内で別途定義し
  使っているものです。

  宣言は以下・・・
    Private RecvTimeout As Threading.Timer
    Private ReceiveDone As ManualResetEvent

以上。(あくまで)参考まで・・・

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。