投稿者   (社会人) 投稿日時 2024/12/4 16:27:38
質問失礼します。
Vb.netでPLCとUDP通信しようと思い以下のプログラミングを組みました。
以下のプログラムはタイマーに設定された時間毎にM3000の値を読み出しTextbox2に表示するといったプログラミングです。
しかし、いざ動かしてみるとフリーズしてしまいます。UDPではなくTCPにすると動くのですがUDPで作り上げたいのでUDPのまま動かしたいです。
https://momomo-97.com/communicate-with-mitsubishi-plc-using-vb-net-mc-protocol/#google_vignette
上記を参考にUDPにしようとたらうまくいきませんでした。

何が原因かわかる方いましたらアドバイス等していただけると幸いです。
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.Windows.Forms.VisualStyles.VisualStyleElement.Rebar
Public Class Form1
    '送信メッセージ作成
    Dim T As Date
    Dim _socket As Socket =
    New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
    Public Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim ipAddress As String = "192.168.xxx.xxx"     'アドレス番号指定
        Dim portNo As Integer = xxxx              'ポート番号指定
        _socket.Connect(ipAddress, portNo)          '接続先
    End Sub

    Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed
        _socket.Close() 'フォームを閉じると同時にソケット通信を終了
    End Sub
    Private Function SendAndRecieve(sendMessage As String()) As Byte() 'ソケット通信を行う
        '送信メッセージを変換 String⇒Byte
        Dim byteSendMessage As Byte() = StringsToBytes(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
    Private Function StringsToBytes(src() As String) As Byte()
        Dim returnBytes(src.Length - 1) As Byte
        '1要素ずつ変換
        Dim i As Integer
        For i = 0 To src.Length - 1
            returnBytes(i) = Convert.ToByte(src(i), 16)
        Next
        Return returnBytes
    End Function

    Public Sub M3000_Tick(sender As Object, e As EventArgs) Handles M3000.Tick   'M3000番を一定時間ごとに読み取る
       
        '送信メッセージ作成
        Dim sendMessage(20) As String
        'サブヘッダ
        sendMessage(0) = "50" '50で固定
        sendMessage(1) = "00" '00で固定
        'アクセス経路
        sendMessage(2) = "00" 'ネットワーク番号
        sendMessage(3) = "FF" ' PC番号
        sendMessage(4) = "FF" '要求先ユニットI/O番号
        sendMessage(5) = "03" '要求先ユニットI/O番号
        sendMessage(6) = "00" '要求先ユニット局番号
        '要求データ長(2Byte)
        sendMessage(7) = "0C" '要求データ長34 12点⇒000C
        sendMessage(8) = "00" '要求データ長12 12点⇒000C
        '監視タイマ(2Byte)
        sendMessage(9) = "10"
        sendMessage(10) = "00"
        '要求データ
        sendMessage(11) = "01" 'コマンド 読取0401⇒04"01"
        sendMessage(12) = "04" 'コマンド 読取0401⇒"04"01
        sendMessage(13) = "01" 'サブコマンド ビット読取0001⇒00"01"
        sendMessage(14) = "00" 'サブコマンド ビット読取0001⇒"00"01
        sendMessage(15) = "B8" 'デバイス番号56 0⇒0000"B8" M3000は16進数でBB8
        sendMessage(16) = "0B" 'デバイス番号34 0⇒00"0B"00
        sendMessage(17) = "00" 'デバイス番号12 0⇒"00"0000
        sendMessage(18) = "90" 'デバイスコード M⇒90
        sendMessage(19) = "01" '読取点数34 1点⇒00"01"
        sendMessage(20) = "00" '読取点数12 1点⇒"00"01
        'メッセージ送信&受信
        Dim byteReciveMessage = SendAndRecieve(sendMessage)
        Dim M3000 = Hex(byteReciveMessage(11)).PadLeft(2, "0").Substring(0, 1)
        TextBox2.Text = M3000