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

タイトル Re^2: シリアル通信について
投稿日: 2013/08/29(Thu) 18:29
投稿者hoido
オショウ様回答ありがとうございます。
> 根本的に作り方がダメだと思います。
  今回、スレッド処理というのを初めて覚え、使用してみたらたまたま動いてしまい満足していました。
  やはり、たまたまではダメですね。


> 通信する相手(機械?)
  シーケンサ(プログラマブルコントローラ)という機械です。


現在の動作の流れとしては、
  ○データ常時受信処理の場合
   Private Sub DataRead()
     DO
      @シーケンサへ通信可能か確認コード送信("CR"を送信) SerialPort1.Write("CR")
      Aシーケンサよりレスポンス受信("CC"を受信すれば通信可能なので次工程へ)) SerialPort1.ReadLine()
      Bシーケンサへ読出しコマンド送信("RDS DM100 1"等) SerialPort1.Write("RDS DM100 1")
      Cシーケンサよりレスポンス受信(0文字以上ならOK) buf.Length > 0
      D受信データの読み込み BeginInvoke(New Returntxt(AddressOf UpdTextBox), buf)
      E@工程へ戻る
        Loop
   End Sub
    上記を MyThread = New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf DataRead)) してスレッド処理を行っています。
    
という流れで作成していました。

> スレッドを生成しなくても、タイマーで十分と思うのですが
  受信処理としては、シーケンサ内の接点のON-OFFを出来るだけリアルタイムで受信したいと思い、タイマを設けず作成していました。
  ※一度、D工程とE工程の間にSystem.Threading.Thread.Sleep(500)とタイマを入れたのですが、トライした時に違和感を感じ、はずしてしまいました。
  シリアル通信でのリアルタイム監視は難しいものなのでしょうか?

  現在のシリアルポートの設定は下記で設定しています。
        SerialPort1.BaudRate = 38400
        SerialPort1.Parity = IO.Ports.Parity.Even
        SerialPort1.DataBits = 8
        SerialPort1.StopBits = IO.Ports.StopBits.One


  やはり一般的には、
      Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
           @シーケンサへ通信可能か確認コード送信("CR"を送信) SerialPort1.Write("CR")
        Aシーケンサよりレスポンス受信("CC"を受信すれば通信可能なので次工程へ)) SerialPort1.ReadLine()
        Bシーケンサへ読出しコマンド送信("RDS DM100 1"等) SerialPort1.Write("RDS DM100 1")
        Cシーケンサよりレスポンス受信(0文字以上ならOK) buf.Length > 0
        D受信データの読み込み BeginInvoke(New Returntxt(AddressOf UpdTextBox), buf)
      End Sub
  のような組み方が良いのでしょうか?


  ○データセット処理の場合
    If Not IsNothing(MyThread) Then
            MyThread.Abort()
            MyThread.Join()
            MyThread = Nothing
        End If
    上記で一旦スレッド処理を終了させる。
    @シーケンサへ通信可能か確認コード送信("CR"を送信) SerialPort1.Write("CR")
    Aシーケンサよりレスポンス受信("CC"を受信すれば通信可能なので次工程へ)) SerialPort1.ReadLine()
    Bシーケンサへセットコマンド送信("WRS R1111 1 1"等) SerialPort1.Write("WRS R1111 1 1"")
    Cシーケンサよりレスポンス受信("OK"をセット完了なので次工程へ))  SerialPort1.ReadLine() 
    Dデータ常時受信処理へ MyThread.Start

> 根本的に作り方がダメだと思います。
    実際強制終了がかかるのも、データ受信処理からデータセット処理への工程移行時(スレッド処理の終了の仕方が悪いのか?)に発生していると思います。
    今回初めて[スレッド]という言葉を知り、使ってみたかったというのも本音の一つでして、まだまだ、スレッド処理の扱いが不十分なのだと思います。
    それなので、この辺も根本的にと言うのに当てはまるのかも知れません。

上記でも申しましたとおり、私の希望動作は
  ○シーケンサの接点の常時監視
  ○VBプログラムからの接点情報の変更(ON ⇔ OFF)
です。

いろいろ検索はしたのですが、常時監視の方法がわからずやっとの想いでここまでたどり着きました。
もし、今一度ご助言願えるのであれば御願い致します。
長くなってしまい申し訳ありませんでした。

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

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