質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

0回答

495閲覧

VB.netでPLCとUDP通信をしたいのですが・・・

Hatu

総合スコア0

Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

2クリップ

投稿2024/12/04 07: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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiroki-o

2024/12/04 13:27

どの行でフリーズしているか、特定できていますか?
Hatu

2024/12/05 04:07 編集

ひろきさん コメントありがとうございます。 エラーが発生するとSocket.csというタブ?が開き public int Receive(byte[] buffer, int offset, int size, SocketFlags socketFlags) { SocketError errorCode; int bytesTransferred = Receive(buffer, offset, size, socketFlags, out errorCode); if (errorCode != SocketError.Success) { throw new SocketException((int)errorCode); ←ここでエラーが発生 } return bytesTransferred; } System.Net.Sockets.SocketException: 'データグラム ソケットで送信されたメッセージが、内部のメッセージのバッファーまたはほかのネットワークの制限を超えています。または、データグラムの受信に使われるバッファーがデータグラムより小さく設定されています。'とエラーが出てしまいます。 TCP通信の際は問題ないのですがUDP通信に変えるとこのエラーになってしまいます。
kikukiku

2024/12/05 00:05

PLC側でTCP設定からUDP設定に変えていますか?
nururi

2024/12/05 02:00 編集

参考にしてるサンプルがあまり良くないので、C#のSocket.SendToAsync使ったUDP非同期通信のサンプルを探して、それをVB.NETに読み変えるなり、コンバートするなりした方がいい気がします。 (そもそも何故サンプルの多いC#ではなくVB.NETを?) ただ、他にも通信は同期にするか非同期にするか、タイムアウト処理をどうするか等考慮すべき事が多いので、通信の基礎をよく理解しないままWebのサンプルだけコピーしてきてもメンテできないと思います。Socketクラスの仕様をきちんと確認し、色々なサンプルを試してみた方がいいと思います。 あとは、市販のPLC通信用のミドルウェア等を採用した方がメンテが楽で、通信部分作る作業時間の人件費より安上がりになる可能性もありますので、そういったものを検討してみるのも一手だとは思います。通信詳しくないのであれば尚更です。
kikukiku

2024/12/06 01:31

PLC側の設定が正しいかどうかの切り分けを実施してみたらどうでしょうか? 例えば、使ったことはないですが、UDP送信用ツールが下記からダウンロードできます。 これを使って応答がきちんと返ってくれば、アプリに問題ありと言えますし、 応答が返ってこなければ、コマンドに問題があるのか、PLCに問題があるということになると思います。 http://nonsoft.la.coocan.jp/Download/UdpTool/index.html
Hatu

2024/12/08 23:23

皆様いろいろなご意見ありがとうございます! https://qiita.com/Hatu123456/questions/b51f435385bf420bcae4 こちらのほうに回答してくださった方のプログラムで試してみたところUDP通信することができました! この度は誠にありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問