トップ回答者
VBとPLCの通信

質問
回答
-
上位リンクで読み書きならこんな感じになると思う
#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!)
- 編集済み gekkaMVP 2017年3月15日 16:12 AutoFlushの追加とTryParseのミス修正
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年3月16日 1:01
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年3月21日 1:46
-
ソースコード変更しました。
StreamWriteに書き込んだ後にフラッシュしていなかったのでパケットが送信されてなかったみたいです。
AutoFlushプロパティをTrueにしておくかWrite後にFlushをするとパケットが送られるようになります。あとは、KV-7500を上位リンクに設定して割り当てたDMに受信回数と送信回数が入るみたいなので、回数が増えるかモニタしてみてください。
#KEYENCEのマニュアルでは上位リンクプロトコルはTCP/IPのペイロードにASCIIのコマンド+CRが入っているだけなので、複雑な手順は要らないはず
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年3月16日 1:01
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年3月21日 1:46
-
キーエンスの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の通信手順が実装されていないと上手く動作しない可能性が高いです。
検索すると以下が見つかりますが具体的事例がないと厳しいかもしれませんね。
有償ライブラリも提供されているので仕様が公開されていない場合は購入が必要かもしれないので、営業さんに確認されるか、マニュアル一式を良く読んだ方が良いのではないでしょうか?
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年3月16日 1:01
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年3月21日 1:46
すべての返信
-
検索しただけですし古い情報ですが、方向性の参考になるのではないかと思います。
PLCとPCの通信
https://oshiete.goo.ne.jp/qa/5242974.html★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年3月16日 1:01
-
上位リンクで読み書きならこんな感じになると思う
#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!)
- 編集済み gekkaMVP 2017年3月15日 16:12 AutoFlushの追加とTryParseのミス修正
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年3月16日 1:01
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年3月21日 1:46
-
具体的なコードをありがとうございます。
32行目の
Dim response = reader.ReadLine() '#レスポンス (終端CRLFまで読み取り(CRLFは除く))
の部分で
#---------------------------------------------------------------------------------------------------
System.IO.IOException: '転送接続からデータを読み取れません: 接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。。'
内部例外
SocketException: 接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。
#---------------------------------------------------------------------------------------------------
というエラーが出てしまいました。
ポート、Ipアドレスは確認したところ正しいのですが原因がわかりません。
-
キーエンスの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の通信手順が実装されていないと上手く動作しない可能性が高いです。
検索すると以下が見つかりますが具体的事例がないと厳しいかもしれませんね。
有償ライブラリも提供されているので仕様が公開されていない場合は購入が必要かもしれないので、営業さんに確認されるか、マニュアル一式を良く読んだ方が良いのではないでしょうか?
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年3月16日 1:01
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年3月21日 1:46
-
ソースコード変更しました。
StreamWriteに書き込んだ後にフラッシュしていなかったのでパケットが送信されてなかったみたいです。
AutoFlushプロパティをTrueにしておくかWrite後にFlushをするとパケットが送られるようになります。あとは、KV-7500を上位リンクに設定して割り当てたDMに受信回数と送信回数が入るみたいなので、回数が増えるかモニタしてみてください。
#KEYENCEのマニュアルでは上位リンクプロトコルはTCP/IPのペイロードにASCIIのコマンド+CRが入っているだけなので、複雑な手順は要らないはず
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年3月16日 1:01
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年3月21日 1:46