tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルシリアル通信について
記事No11128
投稿日: 2013/08/29(Thu) 04:44
投稿者hoido
いつもお世話になっております。
早速ですが、シリアル通信のプログラムを現在作成しています。
プログラムの内容は以下のような感じです。

  Dim wkThread As New Thread

 'フォームが閉じるまでポートは開いたままにする
    Private Sub Form1_Load(
        SerialPort1.Open()
    End Sub

 'フォームが閉じるときポートを閉じる
    Private Sub Form1_FormClosed(
        SerialPort1.Close()
    End Sub

 'データ受信処理をスレッド処理させる
    Private Sub データ受信スタート_Click(
    wkThread = New Thread(New ThreadStart(AddressOf データ常時受信処理))
    wkThread.start
    End Sub

    Private Sub データ常時受信処理
    do
     【データ読み出しコマンド送信処理】
     【レスポンス受信処理】
          【Invokeメソッドを使用し受信データ表示】
        loop
    End Sub

 'データ受信処理が行われていれば終了させてからデータセットを行う
    Private Sub データセット_Click(
     If wkThread <> Nothing Then
             wkThread.Abort()
             wkThread.Join()
             wkThread=Nothing
          End If
     【データセットコマンド送信処理】
     【レスポンス受信処理】
          【Invokeメソッドを使用し受信データ表示】
    End Sub

上記のプログラムで動かすと(動作確認の為 [データ受信スタートボタン] と [データセットボタン]を交互に若干早くクリック)しているとたまにエラーも発生せずにプログラムが終了してしまいます。
エラーが出れば対処法を検索しようと思ったのですがそれも出来ず困っています。
スレッド処理を今回はじめて勉強して使ってみたので不安ではあるのですが・・・
または、DoからLoopの処理がいけないのか?・・・

申し訳ありませんがよろしくお願いいたします。

[ツリー表示へ]
タイトルRe: シリアル通信について
記事No11129
投稿日: 2013/08/29(Thu) 15:01
投稿者オショウ
> 上記のプログラムで動かすと(動作確認の為 [データ受信スタートボタン] と [データセットボタン]を交互に若干早くクリック)しているとたまにエラーも発生せずにプログラムが終了してしまいます。
> エラーが出れば対処法を検索しようと思ったのですがそれも出来ず困っています。

  根本的に作り方がダメだと思います。
  と言って、作り直したコードを掲載するのもどうかと・・・

  スレッドを生成しなくても、タイマーで十分と思うのですが
  送受信するレスポンスや間隔として、どの程度の時間を想定
  されているのでしょうか?

  タイマーで間隔を100msec程度で十分だと思いますし、通信す
  る相手(機械?)の性能にも依存しますので、その辺も記載
  して頂ければ、コメントのしようもあります。

以上。

[ツリー表示へ]
タイトルRe^2: シリアル通信について
記事No11130
投稿日: 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)
です。

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

[ツリー表示へ]
タイトルRe^3: シリアル通信について
記事No11131
投稿日: 2013/08/29(Thu) 19:11
投稿者オショウ
>   シリアル通信でのリアルタイム監視は難しいものなのでしょうか?

  シーケンサのメーカーによっては、やり方があります。

  メーカーの通信コマンドリファレンスはお持ちですか?

  監視したいデバイス・範囲を登録しておくと、変化があれば
  取得できますので・・・

  それと、PCやPLCの能力としてリアルタイムと言っても
  100msec間隔がよいところではないかと考えます。

  また、同期通信方式よりも非同期通信方式を採用された方が
  CPU負荷も軽減できます。

※ PLCのメーカーはどこ?

以上。

[ツリー表示へ]
タイトルRe^4: シリアル通信について
記事No11132
投稿日: 2013/08/29(Thu) 19:46
投稿者hoido
オショウ様回答ありがとうございます。
> シーケンサのメーカーによっては、やり方があります。
> メーカーの通信コマンドリファレンスはお持ちですか?
> 監視したいデバイス・範囲を登録しておくと、変化があれば
> 取得できますので・・・
   全然知りませんでした。すみません

> また、同期通信方式よりも非同期通信方式を採用された方が
> CPU負荷も軽減できます。
   こちらも全然知りませんでした。勉強不足ですみません。

> PLCのメーカーはどこ?
   シーケンサメーカーは【キーエンス】です。

よろしくお願いいたします。



  

[ツリー表示へ]
タイトルRe^5: シリアル通信について
記事No11133
投稿日: 2013/08/29(Thu) 21:39
投稿者オショウ
> オショウ様回答ありがとうございます。
> > PLCのメーカーはどこ?
>    シーケンサメーカーは【キーエンス】です。

  キーエンスなら・・・
  DATABUILDER をお使いになった方が、簡単に即、動
  作するもの作れますヨ!
  当然、有償製品ですが・・・

  難易度は上がりますが、リアルタイムと言う点では
  KVシリーズは、ソケット通信(TCP/IP)でも同様
  に通信できますので、より高速に通信できます。

  因みに、サイクリック通信と言う機能が増えている
  ので、それを使うのも手です。

  また、ネットワーク・シリアル通信ともに、モニタ
  登録・モニタ読み出しと言う方法もあるので、監視
  したい部位(デバイス・エリア)を登録して、その
  部分だけのデータを取得し・・・と言うことが通信
  量を少なくし、負荷軽減しつつ、動作を安定させれ
  ると思います。

  余談ですが・・・
  シリアル通信ポートは何をお使いですか?
  PC本体ポート?
  PCIホボード?
  USB・シリアル変換アダプタ?
  通信間隔を詰めた場合、USB・シリアル変換アダプタ
  の場合、ドライバーの出来不出来で、PCのOSがクラ
  ッシュして再起動・・・と言うことになったりもします。
  お気を付け下さい。

※ 最近のKVシリーズのファームウェアでは・・・
  三菱PLCのMCプロトコルも使えるようになっていま
  すので、三菱PLC用の通信コマンド(MCプロトコル)
  で、同様の通信を行わせることも問題ありません。

以上。参考まで

[ツリー表示へ]
タイトルRe^6: シリアル通信について
記事No11134
投稿日: 2013/08/29(Thu) 22:43
投稿者hoido
オショウ様回答ありがとうございます。
> キーエンスなら・・・
> DATABUILDER をお使いになった方が、簡単に即、動
> 作するもの作れますヨ!
> 当然、有償製品ですが・・・
  持ってます!!DATABUILDERはExcelでは使用したことがあったのですが、ActiveXコントロールは当時必要なく全然気づきませんでした。
  今、取説を読んでいたのですが、本当にやりたいことが簡単に出来そうです。
  早速試してみたいと思います。
  ありがとうございました。

> 難易度は上がりますが、リアルタイムと言う点では
> KVシリーズは、ソケット通信(TCP/IP)でも同様
> に通信できますので、より高速に通信できます。
> 因みに、サイクリック通信と言う機能が増えている
> ので、それを使うのも手です。
  こちらに関しては、シリアル通信しかしたことがいないので、大変興味はあるのですが、現在手元にEthernetユニットやFLユニットが無く、また高価な為またの機会にしたいと思います。
  

> 余談ですが・・・
> PC本体ポート?
> PCIホボード?
> USB・シリアル変換アダプタ?
> 通信間隔を詰めた場合、USB・シリアル変換アダプタ
> の場合、ドライバーの出来不出来で、PCのOSがクラ
> ッシュして再起動・・・と言うことになったりもします。
> お気を付け下さい。
  現在は、USB・シリアル変換アダプタを使用しています。
  ケーブルの当り外れは経験したことがあるですが、PCのOSがクラッシュして再起動は経験がありません。
  その為、再起動の危険性は初めて知りました。
  今回は、機械制御も念頭に入れているので、もし仮に再起動がかかった場合でも、誤動作等しないよう考慮してプログラムを組みたいと思います。

> 三菱PLCのMCプロトコルも使えるようになっていま
> すので、三菱PLC用の通信コマンド(MCプロトコル)
> で、同様の通信を行わせることも問題ありません。
  三菱のシーケンサでは通信処理をしたことがありませんでした。
  しかし、今後三菱製シーケンサでも通信を行う可能性もあるので、勉強できるときにしておきたいと思います。

オショウ様大変お世話になりました。
大変勉強になりました。
本当にありがとうございました。

[ツリー表示へ]