現在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
あなたの回答
tips
プレビュー