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

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

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

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

Q&A

0回答

968閲覧

PLCのシュミレーターを作成したい

anpan___

総合スコア28

VB.NET

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

0グッド

0クリップ

投稿2020/07/21 12:25

現在VB.NETを利用した三菱電機のシーケンサ(PLC)シュミレーターの作成を行っています。
その中で詰まっているのは下記の二点です。

・データを管理するための領域の作成方法
・アプリからPLCシュミレーターに送られた「書き込みor読み込み」の伝文に対する応答

また、その機能を実装するPLCシュミレーターで行いたいことは下記のとおりです。
【目的】
・アプリとPLCの通信をデバックするため
・PLCで足りないと感じる機能を追加するため

【PLCシュミレーターで行うこと】
1、ポートをオープンしてリクエストを待ち続ける
2、書き込みor読み込みリクエストを受信
3、書き込みの場合→管理しているデータの更新等をし応答
読み込みの場合→対象のレジスタの番号とどのビットが立っているかの状況を返す。
4、1~3の繰り返し

上記のようなアプリ(PLCシュミレーター)を作成したいと考えております。

何万とあるレジスタを再現するにはどのような方法が適切なのか、また、データ内の状況を応答として返すにはどのような処理が必要なのかを教えていただければ幸いです。

かなり端的なまとめになってしまって申し訳ありませんが、不足な点は修正依頼のほうに書いていただければすぐに追加させていただきます。
どうぞよろしくお願いします…。

現状のコードの重要な部分のみまとめておきます↓

VB

1 2 3Public Class MAIN 4 Dim UDPObj As TUDPCommClass 5 6 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 7 8 UDPObj = New TUDPCommClass 9 UDPObj.Open("127.0.0.1", 8888) 10 11 'リクエストを待ち続ける 12 While True 13 14 ' 警告対策 15 Dim RcvTxt As String = "" 16 17 '受信処理 18 Dim Ret As Integer = UDPObj.Receive(RcvTxt) 19 20 End While 21 22 End Sub 23 24End Class 25 26Public Class TUDPCommClass 27 28 Private fRemotePort As Integer = 0 29 Private fRemoteHost As String = "127.0.0.1" 30 Private localAddress As System.Net.IPAddress = System.Net.IPAddress.Parse(fRemoteHost) 31 Private fUDPSocketObj As System.Net.Sockets.UdpClient 32 Private fOPened As Boolean = False 33 Private fENC As System.Text.Encoding = System.Text.Encoding.UTF8 34 35 36 '***************************************************************************************** 37 ' OPEN処理 38 '***************************************************************************************** 39 Public Function Open(ByVal RemoteHost As String, ByVal RemotePort As Integer) As Integer 40 If fOPened Then 41 Return TUDPCommConst.UDPAlreadyOpened 42 End If 43 Try 44 'ソケット作成 45 Dim localEP As New System.Net.IPEndPoint(localAddress, RemotePort) 46 fUDPSocketObj = New System.Net.Sockets.UdpClient(localEP) 47 48 fOPened = True 49 50 fRemoteHost = RemoteHost 51 fRemotePort = RemotePort 52 Return TUDPCommConst.UDPSucceed 53 54 Catch ex As Exception 55 fOPened = False 56 Return TUDPCommConst.UDPOpenException 57 End Try 58 End Function 59 60 61 '***************************************************************************************** 62 ' 送信処理 63 '***************************************************************************************** 64 Public Function Send(ByVal SndTxt As String) As Integer 65 If Not fOPened Then 66 Return TUDPCommConst.UDPNotOpened 67 End If 68 69 If SndTxt.Length = 0 Then 70 Return TUDPCommConst.UDPSendTxtNoting 71 End If 72 73 Dim SendBytes As Byte() = fENC.GetBytes(SndTxt) 74 Try 75 Return fUDPSocketObj.Send(SendBytes, SendBytes.Length, fRemoteHost, PcPort) 76 77 Catch ex As Exception 78 Return TUDPCommConst.UDPSendException 79 End Try 80 81 End Function 82 83 '***************************************************************************************** 84 ' 受信処理 85 '***************************************************************************************** 86 Public Function Receive(ByRef RcvTxt As String) As Integer 87 If Not fOPened Then 88 Return TUDPCommConst.UDPNotOpened 89 End If 90 91 If fUDPSocketObj.Available > 0 Then 92 Dim RemoteEP As System.Net.IPEndPoint = Nothing 93 Try 94 Dim rcvBytes As Byte() = fUDPSocketObj.Receive(RemoteEP) 95 RcvTxt = fENC.GetString(rcvBytes) 96 97 98 If RcvTxt.Length = 42 Then '読み込みリクエスト受信時 99 100 ’読み込みに対する応答を作成し、送信する処理 101 102 ElseIf RcvTxt.Length = 222 Then '書き込みリクエスト受信時 103 104 ’書き込みに対する応答を作成し、送信する処理 105 106 End If 107 108 109 Catch ex As Exception 110 Return TUDPCommConst.UDPRecieveException 111 End Try 112 If Not RcvTxt Is Nothing Then 113 Return RcvTxt.Length 114 End If 115 Return TUDPCommConst.UDPRcvFail 116 Else 117 Return TUDPCommConst.UDPRcvNoData 118 End If 119 End Function 120 121End Class 122

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

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

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

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

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

YAmaGNZ

2020/07/21 22:26

現在はどのようにして各デバイスのメモリを保持しているのですか? 「データ内の状況を応答として返すにはどのような処理が必要なのか」とはどういうことですか? 電文解析を行って適切な応答を返す以外に必要なことですか?具体的にどのようなことを聞きたいのか記載してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問