VB.Net
PLC
MCプロトコル
MELSEC
Ether通信

(MX Component を使わない) MCプロトコル によるPLC Ether通信(VB.NET)

Q71E71-E100 のマニュアルにサンプルがあるが昔のやつなので今は動かないので、Socket クラスの Write, Readで実装した。

【動作環境】
CPU:Q00U
Ether:Q71E71-E100

【PLCのネットワーク設定(GX-Works2)】
Ether動作設定:バイナリコード更新
Etherオープン設定:TCP,Unpassive,送信,手順あり,ペアにしない,確認しない

【本文】

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Const E71msec As Integer = 250

    Dim objSck As New System.Net.Sockets.TcpClient
    Dim objStm As System.Net.Sockets.NetworkStream


    objSck.Connect("192.168.1.10", 2000)
    ' ソケットストリーム取得
    objStm = objSck.GetStream()


    ' Dレジへのワード単位読み込み
    ' Dim dat As Byte() = {&H50, &H0, &H0, &HFF, &HFF, &H3, &H0, &HC, &H0, &H10, &H0, &H1, &H4, &H0, &H0, &H2C, &H1, &H0, &HA8, &H3, &H0}
    'Dレジへのワード単位書き込み。書き込みのときは書き込みデータにおうじて電文命令長が異なるので、「要求データ長」をちゃんと変更すること。
    '     Dim dat As Byte() = {&H50, &H0, &H0, &HFF, &HFF, &H3, &H0, &HE, &H0, &H10, &H0, &H1, &H14, &H0, &H0, &H2C, &H1, &H0, &HA8, &H1, &H0, &HFF, &HFF}

    Dim 送信データ() As Byte = {&HFA, &HFF}


    Dim dat(送信データ.Length + 20) As Byte
    dat(0) = &H50 : dat(1) = &H0 'サブヘッダであり固定
    dat(2) = &H0 : dat(3) = &HFF 'ネットワーク番号(PCとE71との通信であればH0, FF . CC-Linkなどを介する場合はマニュアルp74を参考に)
    dat(4) = &HFF : dat(5) = &H3 : dat(6) = &H0 '二重化CPUでないならFF, 03, 00. その他ならマニュアルp102を参考に
    dat(7) = 12 + 送信データ.Length : dat(8) = &H0 '送信データ長
    dat(9) = T250msec2HEX(E71msec, 0) : dat(10) = T250msec2HEX(E71msec, 1)   'CPU監視タイマ
    dat(11) = &H1 : dat(12) = &H14         'コマンド
    dat(13) = &H0 : dat(14) = &H0  'サブコマンド
    dat(15) = &H2C : dat(16) = &H1 : dat(17) = &H0   '先頭デバイス(16進数6桁
    dat(18) = &HA8
    dat(19) = &H1
    dat(20) = &H0
    Array.Copy(送信データ, 0, dat, 21, 送信データ.Length)


    Dim data As Byte()


    objStm.Write(dat, 0, dat.GetLength(0))


    System.Threading.Thread.Sleep(250)


    Dim 応答データ As String


    ' ソケット受信
    If objSck.Available > 0 Then
        data = New Byte(objSck.Available - 1) {}
        objStm.Read(data, 0, data.GetLength(0))


        For i = 0 To data.Length - 1



            応答データ = 応答データ & Convert.ToString(data(i), 16).PadLeft(2, "0")

        Next

        MsgBox(応答データ)

    End If


    objStm.Close()
    objSck.Close()


End Sub



Public Function T250msec2HEX(msec As Integer, i As Integer) As Integer 'msecをHEXに変換する
    Dim hexi As Integer
    If msec > 38796720 Then : msec = 38796720 : End If : If msec < 0 Then : msec = 0 : End If
    If i = 0 Then : hexi = CInt("&H" & CInt(msec / 250).ToString("x4").Substring(0, 2)) : End If
    If i = 1 Then : hexi = CInt("&H" & CInt(msec / 250).ToString("x4").Substring(2, 2)) : End If
    If i = 2 Then : hexi = CInt(msec / 250) : End If
    Return hexi
End Function

記事
http://www.kaigi-bento.net/admin/soft/nonmxmc.html