【VB.NET】上位リンク通信でKEYENCE PLCと通信

パソコン

どうも、もももです。

今回はVB.NETでKEYENCE社PLCと上位リンク通信で通信を行う方法について紹介します。

上位リンク通信 読み書きコマンド

上位リンク通信のコマンドについては下記で紹介しているので参照下さい。

構成イメージ

PCとPLCをEthernetケーブルで接続します。

サンプルプログラム

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Imports System.Net.Sockets
Imports System.Text
Public Class Form1
Dim _socket As Socket =
New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim ipAddress As String = "192.168.0.10"
Dim portNo As Integer = 8501
_socket.Connect(ipAddress, portNo)
End Sub
Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed
_socket.Close()
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'送信メッセージ作成
Dim sendMessage = "RD R000" + vbCr
'メッセージ送信&受信
Dim byteReciveMessage = SendAndRecieve(sendMessage)
Me.TextBox1.Text = Encoding.ASCII.GetString(byteReciveMessage, 0, 1)
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
'送信メッセージ作成
Dim sendMessage = ""
If Me.RadioButton1.Checked Then
sendMessage = "WR R000 1" + vbCr
Else
sendMessage = "WR R000 0" + vbCr
End If
'メッセージ送信&受信
Dim byteReciveMessage = SendAndRecieve(sendMessage)
End Sub
Private Function SendAndRecieve(sendMessage As String) As Byte()
'送信メッセージを変換 String⇒Byte
Dim byteSendMessage As Byte() = Encoding.ASCII.GetBytes(sendMessage)
'メッセージ送信
_socket.Send(byteSendMessage, byteSendMessage.GetLength(0), SocketFlags.None)
'応答メッセージを受信
Dim byteReciveMessage As Byte()
Dim reciveSize As Integer = 0
Do
byteReciveMessage = New Byte(_socket.Available - 1) {}
reciveSize =
_socket.Receive(byteReciveMessage, byteReciveMessage.GetLength(0), SocketFlags.None)
Loop While reciveSize = 0
Return byteReciveMessage
End Function
End Class
Imports System.Net.Sockets Imports System.Text Public Class Form1 Dim _socket As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim ipAddress As String = "192.168.0.10" Dim portNo As Integer = 8501 _socket.Connect(ipAddress, portNo) End Sub Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed _socket.Close() End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click '送信メッセージ作成 Dim sendMessage = "RD R000" + vbCr 'メッセージ送信&受信 Dim byteReciveMessage = SendAndRecieve(sendMessage) Me.TextBox1.Text = Encoding.ASCII.GetString(byteReciveMessage, 0, 1) End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click '送信メッセージ作成 Dim sendMessage = "" If Me.RadioButton1.Checked Then sendMessage = "WR R000 1" + vbCr Else sendMessage = "WR R000 0" + vbCr End If 'メッセージ送信&受信 Dim byteReciveMessage = SendAndRecieve(sendMessage) End Sub Private Function SendAndRecieve(sendMessage As String) As Byte() '送信メッセージを変換 String⇒Byte Dim byteSendMessage As Byte() = Encoding.ASCII.GetBytes(sendMessage) 'メッセージ送信 _socket.Send(byteSendMessage, byteSendMessage.GetLength(0), SocketFlags.None) '応答メッセージを受信 Dim byteReciveMessage As Byte() Dim reciveSize As Integer = 0 Do byteReciveMessage = New Byte(_socket.Available - 1) {} reciveSize = _socket.Receive(byteReciveMessage, byteReciveMessage.GetLength(0), SocketFlags.None) Loop While reciveSize = 0 Return byteReciveMessage End Function End Class
Imports System.Net.Sockets
Imports System.Text

Public Class Form1

    Dim _socket As Socket =
        New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim ipAddress As String = "192.168.0.10"
        Dim portNo As Integer = 8501

        _socket.Connect(ipAddress, portNo)
    End Sub

    Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed
        _socket.Close()
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        '送信メッセージ作成
        Dim sendMessage = "RD R000" + vbCr

        'メッセージ送信&受信
        Dim byteReciveMessage = SendAndRecieve(sendMessage)

        Me.TextBox1.Text = Encoding.ASCII.GetString(byteReciveMessage, 0, 1)

    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        '送信メッセージ作成
        Dim sendMessage = ""
        If Me.RadioButton1.Checked Then
            sendMessage = "WR R000 1" + vbCr
        Else
            sendMessage = "WR R000 0" + vbCr
        End If

        'メッセージ送信&受信
        Dim byteReciveMessage = SendAndRecieve(sendMessage)

    End Sub

    Private Function SendAndRecieve(sendMessage As String) As Byte()

        '送信メッセージを変換 String⇒Byte
        Dim byteSendMessage As Byte() = Encoding.ASCII.GetBytes(sendMessage)

        'メッセージ送信
        _socket.Send(byteSendMessage, byteSendMessage.GetLength(0), SocketFlags.None)

        '応答メッセージを受信
        Dim byteReciveMessage As Byte()
        Dim reciveSize As Integer = 0
        Do
            byteReciveMessage = New Byte(_socket.Available - 1) {}
            reciveSize =
                _socket.Receive(byteReciveMessage, byteReciveMessage.GetLength(0), SocketFlags.None)
        Loop While reciveSize = 0
        Return byteReciveMessage
    End Function

End Class

コード解説

上記は「Bit読み取り」ボタンを押下すると、「R000」の内容を「Bit読み取り」 テキストに表示(ON=1/OFF=0)し、「Bit書き込み」ボタンを押下するとラジオボタンの状態に応じて 「R000」 をON/OFFするサンプルプログラムです

・フォーム ロードイベント(9~14行)

画面起動時にソケット通信を確立します。

KV STUDIOでPLCのIPアドレスと上位リンクのポート番号を確認し、設定して下さい。

下記ではIPアドレスやポート番号の確認方法を紹介しています。

・フォーム クローズドイベント(16~18行)

画面終了時にソケット通信をクローズします。

・Bit読み取りボタン クリックイベント(20~30行)

Bit読み取りの要求メッセージ(R000)をString配列で作成⇒送信し、応答メッセージの内容をテキストボックスに反映します。(ONの場合は1、OFFの場合は0)

応答メッセージ(Byte配列)の内容は

  • ONの場合:[49, 13, 10]
  • OFFの場合:[48, 13, 10]

後ろ2つの要素は改行コードなので1つ目の要素のみ文字列に変換しています。

・Bit書き込みボタン クリックイベント(32~45行)

Bit書き込みの要求メッセージをString配列で作成⇒送信しています。

・メッセージの送受信処理(47~64行)

引数のString配列をByte配列(ASCIIコード)に変換して要求メッセージとして送信し、応答メッセージを戻り値として返します。

上位リンクはASCIIコード交信のため、String配列からByte配列の変換はASCIIコード変換で行います。

また、ソケット通信の詳細については下記でも紹介しています。

まとめ

VB.NETでKEYENCE社PLCと上位リンク通信で通信を行う方法についてまとめました。

三菱PLCのMCプロトコル通信に比べて操作コマンドが簡単に編集できます。

コメント

タイトルとURLをコピーしました