質問失礼します。
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
あなたの回答
tips
プレビュー