VB.netでPLCとUDP通信をしたいのですが・・・
質問失礼します。
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