none
VBとPLCの通信 RRS feed

  • 質問

  • パソコン(VB)とKeyence製のPLC(KV-7500)とをEthernetで通信させ、デバイスの読み書きをしたいと思っています。

    Keyence側のマニュアルには このコマンドを送ればこういう動作をする ということは書いてあるのですが

    具体的なコードは載っていませんでした。

    Microsoftに問い合わせても答えられないと言われどうすればいいのか分かりませんでした。

    上記のようなことをするためにはどうしたらよいのでしょうか?

    どなたかご回答いただけたら助かります。

    お願いいたします。

    2017年3月15日 2:43

回答

  • 上位リンクで読み書きならこんな感じになると思う
    #Ether接続できるのは手元にないので動作確認してないです

    Module Module1
    
        Sub Main()
            Dim address = New System.Net.IPAddress(New Byte() {127, 0, 0, 1}) 'シーケンサに設定したIP4アドレスを指定
            Dim port As Integer = 8501 'シーケンサに設定したポート番号
            Dim endpoint = New System.Net.IPEndPoint(address, port)
    
            Using client = New System.Net.Sockets.TcpClient() 'TCP/IPを使用の場合 (UDPならSystem.Net.Sockets.UdpClient)
    
                '必要ならタイムアウトを設定
                client.SendTimeout = 1000
                client.ReceiveTimeout = 5000
    
                Try
                    client.Connect(endpoint) '#コネクションオープン
                Catch ex As Exception
                    Console.WriteLine(ex.Message)
                End Try
    
                If (Not client.Connected) Then
                    Console.WriteLine("接続できません")
                    Return
                End If
    
                Dim stream = client.GetStream()
                Dim reader As New System.IO.StreamReader(stream, System.Text.Encoding.ASCII) 'コマンドはASCIIでやりとり
                Dim writer As New System.IO.StreamWriter(stream, System.Text.Encoding.ASCII)
                writer.AutoFlush = True '*** AutoFlushで自動的にFlushさせる ***
                writer.NewLine = vbCr 'コマンドの終端はCR
    
                Dim cmd As String = "?K" + vbCr
                writer.WriteLine("?K") '#コマンド (機種の問い合わせを送信(CR終端))
                'writer.Flush()
                'stream.Flush() 'stream.Flushでパケット送信させる
    
                Dim response = reader.ReadLine() '#レスポンス (終端CRLFまで読み取り(CRLFは除く))
    
                Dim typeNumber As Integer
                If (Not Integer.TryParse(response, typeNumber)) Then 'Notの入れ間違い
                    Console.WriteLine("応答異常")
                Else
                    Select Case typeNumber
                        Case 55
                            Console.WriteLine("KV-7500")
                        Case Else
                            Console.WriteLine("機種が違います")
                    End Select
                End If
    
                '以下てきとうに()
                writer.WriteLine("RD R000000")
                response = reader.ReadLine()
                Console.WriteLine(response)
    
                client.Close() '#クローズ
            End Using
        End Sub
    End Module


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2017年3月15日 3:55
  • ソースコード変更しました。

    StreamWriteに書き込んだ後にフラッシュしていなかったのでパケットが送信されてなかったみたいです。
    AutoFlushプロパティをTrueにしておくかWrite後にFlushをするとパケットが送られるようになります。

    あとは、KV-7500を上位リンクに設定して割り当てたDMに受信回数と送信回数が入るみたいなので、回数が増えるかモニタしてみてください。

    #KEYENCEのマニュアルでは上位リンクプロトコルはTCP/IPのペイロードにASCIIのコマンド+CRが入っているだけなので、複雑な手順は要らないはず


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2017年3月15日 16:21
  • キーエンスのPLCは使用したことがないですが、初期設定も含めてマニュアルはチェックしているのでしょうか?

    https://www.keyence.co.jp/products/controls/plc-building/kv-7000/models/kv-7500/

    https://www.keyence.co.jp/ss/controls/setsuzoku/chapter2/ethernet-ip/

    https://www.keyence.co.jp/products/controls/plc-building/kv-7000/models/kv-h9j/

    KV-7500が対応を謳っているEtherNet/IPは通常のイーサネットとは異なる方式のようですが大丈夫ですか?

    http://odvatagjapan.iinaa.net/EtherNet/EtherNet.html

    多分、通常のIP通信の上にCIPプロトコルの層があるので、CIPの通信手順が実装されていないと上手く動作しない可能性が高いです。

    検索すると以下が見つかりますが具体的事例がないと厳しいかもしれませんね。

    https://eipnet.codeplex.com/

    有償ライブラリも提供されているので仕様が公開されていない場合は購入が必要かもしれないので、営業さんに確認されるか、マニュアル一式を良く読んだ方が良いのではないでしょうか?

    2017年3月15日 15:09

すべての返信

  • コードを記述できる開発者を雇うしかないのではと思います。
    2017年3月15日 2:46
  • 検索しただけですし古い情報ですが、方向性の参考になるのではないかと思います。

    PLCとPCの通信
    https://oshiete.goo.ne.jp/qa/5242974.html


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2017年3月15日 3:10
    モデレータ
  • 上位リンクで読み書きならこんな感じになると思う
    #Ether接続できるのは手元にないので動作確認してないです

    Module Module1
    
        Sub Main()
            Dim address = New System.Net.IPAddress(New Byte() {127, 0, 0, 1}) 'シーケンサに設定したIP4アドレスを指定
            Dim port As Integer = 8501 'シーケンサに設定したポート番号
            Dim endpoint = New System.Net.IPEndPoint(address, port)
    
            Using client = New System.Net.Sockets.TcpClient() 'TCP/IPを使用の場合 (UDPならSystem.Net.Sockets.UdpClient)
    
                '必要ならタイムアウトを設定
                client.SendTimeout = 1000
                client.ReceiveTimeout = 5000
    
                Try
                    client.Connect(endpoint) '#コネクションオープン
                Catch ex As Exception
                    Console.WriteLine(ex.Message)
                End Try
    
                If (Not client.Connected) Then
                    Console.WriteLine("接続できません")
                    Return
                End If
    
                Dim stream = client.GetStream()
                Dim reader As New System.IO.StreamReader(stream, System.Text.Encoding.ASCII) 'コマンドはASCIIでやりとり
                Dim writer As New System.IO.StreamWriter(stream, System.Text.Encoding.ASCII)
                writer.AutoFlush = True '*** AutoFlushで自動的にFlushさせる ***
                writer.NewLine = vbCr 'コマンドの終端はCR
    
                Dim cmd As String = "?K" + vbCr
                writer.WriteLine("?K") '#コマンド (機種の問い合わせを送信(CR終端))
                'writer.Flush()
                'stream.Flush() 'stream.Flushでパケット送信させる
    
                Dim response = reader.ReadLine() '#レスポンス (終端CRLFまで読み取り(CRLFは除く))
    
                Dim typeNumber As Integer
                If (Not Integer.TryParse(response, typeNumber)) Then 'Notの入れ間違い
                    Console.WriteLine("応答異常")
                Else
                    Select Case typeNumber
                        Case 55
                            Console.WriteLine("KV-7500")
                        Case Else
                            Console.WriteLine("機種が違います")
                    End Select
                End If
    
                '以下てきとうに()
                writer.WriteLine("RD R000000")
                response = reader.ReadLine()
                Console.WriteLine(response)
    
                client.Close() '#クローズ
            End Using
        End Sub
    End Module


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2017年3月15日 3:55
  • 私がやるしかないので困っています
    2017年3月15日 7:44
  • 書籍が出ているのですね。

    最近のものでもないか探してみます。

    2017年3月15日 7:45
  • 具体的なコードをありがとうございます。

    32行目の

    Dim response = reader.ReadLine() '#レスポンス (終端CRLFまで読み取り(CRLFは除く))

    の部分で

    #---------------------------------------------------------------------------------------------------

    System.IO.IOException: '転送接続からデータを読み取れません: 接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。。'

    内部例外

    SocketException: 接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。

    #---------------------------------------------------------------------------------------------------

    というエラーが出てしまいました。

    ポート、Ipアドレスは確認したところ正しいのですが原因がわかりません。

    2017年3月15日 7:50
  • キーエンスのPLCは使用したことがないですが、初期設定も含めてマニュアルはチェックしているのでしょうか?

    https://www.keyence.co.jp/products/controls/plc-building/kv-7000/models/kv-7500/

    https://www.keyence.co.jp/ss/controls/setsuzoku/chapter2/ethernet-ip/

    https://www.keyence.co.jp/products/controls/plc-building/kv-7000/models/kv-h9j/

    KV-7500が対応を謳っているEtherNet/IPは通常のイーサネットとは異なる方式のようですが大丈夫ですか?

    http://odvatagjapan.iinaa.net/EtherNet/EtherNet.html

    多分、通常のIP通信の上にCIPプロトコルの層があるので、CIPの通信手順が実装されていないと上手く動作しない可能性が高いです。

    検索すると以下が見つかりますが具体的事例がないと厳しいかもしれませんね。

    https://eipnet.codeplex.com/

    有償ライブラリも提供されているので仕様が公開されていない場合は購入が必要かもしれないので、営業さんに確認されるか、マニュアル一式を良く読んだ方が良いのではないでしょうか?

    2017年3月15日 15:09
  • ソースコード変更しました。

    StreamWriteに書き込んだ後にフラッシュしていなかったのでパケットが送信されてなかったみたいです。
    AutoFlushプロパティをTrueにしておくかWrite後にFlushをするとパケットが送られるようになります。

    あとは、KV-7500を上位リンクに設定して割り当てたDMに受信回数と送信回数が入るみたいなので、回数が増えるかモニタしてみてください。

    #KEYENCEのマニュアルでは上位リンクプロトコルはTCP/IPのペイロードにASCIIのコマンド+CRが入っているだけなので、複雑な手順は要らないはず


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2017年3月15日 16:21
  • ありがとうございます。

    無事通信することが出来ました。

    2017年3月17日 0:57