VB.netでPLCとUDP通信したいのですが・・・
投稿者 (削除されました)  ()
投稿日時
2024/12/4 17:13:57
(削除されました)
投稿者 とくま  (社会人)
投稿日時
2024/12/4 17:37:55
マルチポスト
https://www.petitmonte.com/bbs/answers?question_id=30218
https://www.petitmonte.com/bbs/answers?question_id=30218
投稿者 Hatu  (社会人)
投稿日時
2024/12/5 08:31:50
とくまさん
ありがとうございます。;;
ありがとうございます。;;
投稿者 とくま  (社会人)
投稿日時
2024/12/5 08:42:10
TCPとUDPでは通信の応答手順が違うので、流用しても動かなくて当たり前だけど、
それってTCPとは?UDPとは?といったレベルの一番初期に学ぶ基礎知識。それを
知らないって事は、通信の基礎知識さえ全く勉強する気がないようにこちらには
見えてしまいます。
PLCとの通信ねぇ。。。
大学の研究室レベルの話なら、機材が壊れたところで自業自得で済む話だけど、
発電所の現地の制御盤とか、繋がってる先が大掛かりだと影響範囲が大きいです。
初心者丸出し、基礎知識も勉強できない技術者には関わって欲しくない分野ですね。
それってTCPとは?UDPとは?といったレベルの一番初期に学ぶ基礎知識。それを
知らないって事は、通信の基礎知識さえ全く勉強する気がないようにこちらには
見えてしまいます。
PLCとの通信ねぇ。。。
大学の研究室レベルの話なら、機材が壊れたところで自業自得で済む話だけど、
発電所の現地の制御盤とか、繋がってる先が大掛かりだと影響範囲が大きいです。
初心者丸出し、基礎知識も勉強できない技術者には関わって欲しくない分野ですね。
投稿者 H  (社会人)
投稿日時
2024/12/17 08:56:08
https://qiita.com/Hatu123456/questions/b51f435385bf420bcae4
こちらで解決いたしました。
こちらで解決いたしました。
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