サンプルプログラムでPC-PLC通信をします「VB2008対応」

PC備忘録

PC-PLC通信するには、三菱の場合だと言語系で開発する場合は、MX-Compornetを使うと簡単に通信できます。今回は、Windows7Compact(K社)のハンディで通信させたいので、この通信部分をサンプルプログラムを転用して作ります。

サンプルプログラム

サンプルはVB2003で参考プログラムとして三菱PLCのマニュアル「sh080004ac[Q対応Ethernetインターフェースユニットユーザーズマニュアル(基本編)]」付10.3 Visual Basic®.NET を使用する場合を転用して使います。

[サンプルプログラム(Form1.vb)]

Option Strict Off

Option Explicit On

Imports System

Imports System.Text

Imports System.Net

Friend Class Form1

   Inherits System.Windows.Forms.Form

#Region “Windows フォーム デザイナによって生成されたコード”

   Public Sub New()

      MyBase.New()

      If m_vb6FormDefInstance Is Nothing Then

         If m_InitializingDefInstance Then

            m_vb6FormDefInstance = Me

         Else

            Try

            ’ スタートアップ フォームについては,最初に作成されたインスタンスが既定インスタンスになります。

            If System.Reflection.Assembly.GetExecutingAssembly.EntryPoint

               .DeclaringType Is Me.GetType Then

               m_vb6FormDefInstance = Me

            End If

         Catch

         End Try

      End If

   End If

   ’ この呼び出しは,Windows フォーム デザイナで必要です。

   InitializeComponent()

End Sub

 ’Form は,コンポーネント一覧に後処理を実行するために dispose をオーバーライドします。

   Protected Overloads Overrides Sub Dispose(ByVal Disposing As Boolean)

      If Disposing Then

         If Not components Is Nothing Then

            components.Dispose()

         End If

      End If

      MyBase.Dispose(Disposing)

      End Sub

      ’Windows フォーム デザイナで必要です。

      Private components As System.ComponentModel.IContainer

      Public WithEvents Command5 As System.Windows.Forms.Button

      Public WithEvents Command4 As System.Windows.Forms.Button

      Public WithEvents Command3 As System.Windows.Forms.Button

      Public WithEvents Command2 As System.Windows.Forms.Button

      Public WithEvents Command1 As System.Windows.Forms.Button

      Dim Ajsock As Sockets.Socket

      Private State As Boolean = False

         ’ メモ : 以下のプロシージャは Windows フォーム デザイナで必要です。

         ’Windows フォーム デザイナを使って変更できます。

         ’ コード エディタを使って修正しないでください。

      <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

         Me.Command5 = New System.Windows.Forms.Button

         Me.Command4 = New System.Windows.Forms.Button

         Me.Command3 = New System.Windows.Forms.Button

         Me.Command2 = New System.Windows.Forms.Button

         Me.Command1 = New System.Windows.Forms.Button

         Me.SuspendLayout()

         ’

         ’Command5

         ’

         Me.Command5.BackColor = System.Drawing.SystemColors.Control

         Me.Command5.Cursor = System.Windows.Forms.Cursors.Default

         Me.Command5.ForeColor = System.Drawing.SystemColors.ControlText

         Me.Command5.Location = New System.Drawing.Point(64, 152)

         Me.Command5.Name = “Command5”

         Me.Command5.RightToLeft = System.Windows.Forms.RightToLeft.No

         Me.Command5.Size = New System.Drawing.Size(72, 32)

         Me.Command5.TabIndex = 4

         Me.Command5.Text = ” 接続状態”

         ’

         ’Command4

         ’

  Me.Command4.BackColor = System.Drawing.SystemColors.Control

         Me.Command4.Cursor = System.Windows.Forms.Cursors.Default

         Me.Command4.ForeColor = System.Drawing.SystemColors.ControlText

         Me.Command4.Location = New System.Drawing.Point(144, 152)

         Me.Command4.Name = “Command4”

         Me.Command4.RightToLeft = System.Windows.Forms.RightToLeft.No

         Me.Command4.Size = New System.Drawing.Size(73, 32)

         Me.Command4.TabIndex = 3

         Me.Command4.Text = ” 閉じる”

         ’

         ’Command3

         ’

         Me.Command3.BackColor = System.Drawing.SystemColors.Control

         Me.Command3.Cursor = System.Windows.Forms.Cursors.Default

         Me.Command3.ForeColor = System.Drawing.SystemColors.ControlText

         Me.Command3.Location = New System.Drawing.Point(64, 96)

         Me.Command3.Name = “Command3”

         Me.Command3.RightToLeft = System.Windows.Forms.RightToLeft.No

         Me.Command3.Size = New System.Drawing.Size(152, 33)

         Me.Command3.TabIndex = 2

         Me.Command3.Text = ” 切断”

         ’

         ’Command2

         ’

         Me.Command2.BackColor = System.Drawing.SystemColors.Control

         Me.Command2.Cursor = System.Windows.Forms.Cursors.Default

         Me.Command2.ForeColor = System.Drawing.SystemColors.ControlText

         Me.Command2.Location = New System.Drawing.Point(64, 56)

         Me.Command2.Name = “Command2”

         Me.Command2.RightToLeft = System.Windows.Forms.RightToLeft.No

         Me.Command2.Size = New System.Drawing.Size(152, 31)

         Me.Command2.TabIndex = 1

         Me.Command2.Text = “E71 コマンド送信”

         ’

         ’Command1

         ’

         Me.Command1.BackColor = System.Drawing.SystemColors.Control

         Me.Command1.Cursor = System.Windows.Forms.Cursors.Default

         Me.Command1.ForeColor = System.Drawing.SystemColors.ControlText

         Me.Command1.Location = New System.Drawing.Point(64, 16)

         Me.Command1.Name = “Command1”

         Me.Command1.RightToLeft = System.Windows.Forms.RightToLeft.No

         Me.Command1.Size = New System.Drawing.Size(152, 31)

         Me.Command1.TabIndex = 0

         Me.Command1.Text = ” 接続”

 ’Form1

         ’

         Me.AutoScaleBaseSize = New System.Drawing.Size(5, 12)

         Me.BackColor = System.Drawing.SystemColors.Control

         Me.ClientSize = New System.Drawing.Size(280, 214)

         Me.Controls.Add(Me.Command5)

         Me.Controls.Add(Me.Command4)

         Me.Controls.Add(Me.Command3)

         Me.Controls.Add(Me.Command2)

         Me.Controls.Add(Me.Command1)

         Me.Cursor = System.Windows.Forms.Cursors.Default

         Me.Location = New System.Drawing.Point(329, 189)

         Me.Name = “Form1”

         Me.RightToLeft = System.Windows.Forms.RightToLeft.No

         Me.StartPosition = System.Windows.Forms.FormStartPosition.Manual

         Me.Text = “Form1”

         Me.ResumeLayout(False)

      End Sub

   #End Region

#Region ” アップグレード ウィザードのサポート コード”

   Private Shared m_vb6FormDefInstance As Form1

   Private Shared m_InitializingDefInstance As Boolean

   Public Shared Property DefInstance() As Form1

      Get

         If m_vb6FormDefInstance Is Nothing OrElse m_vb6FormDefInstance.IsDisposed

                                               Then

            m_InitializingDefInstance = True

            m_vb6FormDefInstance = New Form1()

            m_InitializingDefInstance = False

         End If

         DefInstance = m_vb6FormDefInstance

      End Get

      Set

         m_vb6FormDefInstance = Value

      End Set

   End Property

#End Region

Private Sub Command1_Click(ByVal eventSender As System.Object, ByVal eventArgs

   As System.EventArgs) Handles Command1.Click

      ’E71 と接続します。

      Dim sock As New Sockets.Socket(Sockets.AddressFamily.InterNetwork, _

      Sockets.SocketType.Stream, Sockets.ProtocolType.Tcp)

      Ajsock = sock

      Dim ip As IPAddress = Dns.Resolve(“192.0.1.253”).AddressList(0)

      Dim ipend As IPEndPoint = New IPEndPoint(ip, “8192”)

      Me.Ajsock.Connect(ipend)

      MsgBox(” 接続完了”)

      State = Me.Ajsock.Connected()

   End Sub

   Private Sub Command2_Click(ByVal eventSender As System.Object, ByVal eventArgs

   As System.EventArgs) Handles Command2.Click

      Dim SData As Byte()

      Dim RData(256) As Byte

      ’A 互換1E フレームのコマンドで,D0 ~ D4(5 点分)の読み出しを行います。

      SData = Encoding.ASCII.GetBytes(“01FF000A4420000000000500”)

      ’QnA 互換3E フレームのコマンドで,D0 ~ D4(5 点分)の読み出しを行います。

      ’SData = Encoding.ASCII.GetBytes

                     (“500000FF03FF000018000A04010000D*0000000005”)

      ’ データを送信します。

      Me.Ajsock.Send(SData)

      MsgBox(” 送信完了”, MsgBoxStyle.Information)

      ’CPU ユニットからの応答伝文(レスポンス)を読み出します。

      Me.Ajsock.Receive(RData)

      MsgBox(Encoding.ASCII.GetString(RData), MsgBoxStyle.Information)

   End Sub

   Private Sub Command3_Click(ByVal eventSender As System.Object, ByVal eventArgs

   As System.EventArgs) Handles Command3.Click

      ’TCP(UDP)接続しているソケットを閉じます。(回線切断)

      Me.Ajsock.Shutdown(Net.Sockets.SocketShutdown.Both)

      Me.Ajsock.Close()

      MsgBox(” 切断完了”, MsgBoxStyle.Information)

      State = Me.Ajsock.Connected()

   End Sub

   Private Sub Command4_Click(ByVal eventSender As System.Object, ByVal eventArgs

   As System.EventArgs) Handles Command4.Click

      ’ プログラムを終了します。

      End

   End Sub

   Private Sub Command5_Click(ByVal eventSender As System.Object, ByVal eventArgs

   As System.EventArgs) Handles Command5.Click

      ’ 接続状態の確認を行います。

      If State Then

         MsgBox(” 接続中”)

      Else

         MsgBox(” クローズ中”)

   End If

   End Sub

転用方法

記述はVB2003で書かれているので、VB2003で作成し、VB2005→VB2008とアップグレードしました。

伝文フレーム

MCプロトコルで共通で使えるようにしたいので伝文フレームをマニュアル「jy997d54901h[SLMP通信]」で確認しました。

‘QnA 互換E フレームのコマンドで,D2000 ~D2004(点分)の読み出しを行います。

‘”500000FF03FF000018000A04010000D*0000000005″

        ‘サブヘッダ 5000

        Buf = “5000”

        ‘要求先ネットワーク番号 要求先局番

        Buf = Buf + “00FF”

        ‘要求先ユニットIO番

        Buf = Buf + “03FF”

        ‘要求先マルチドロップ局番

        Buf = Buf + “00”

        ‘要求データ長

        Buf = Buf + “0018”

        ‘監視タイマ

        Buf = Buf + “000A”

        ‘コマンド

        Buf = Buf + “0401”

        ‘サブコマンド

        Buf = Buf + “0000”

        ‘デバイス範囲

        Buf = Buf + “D*”

        ‘デバイス番号

        Buf = Buf + “002000”

        ‘デバイス数

        Buf = Buf + “0005”

PC-PLC通信

実際に通信してみます。まずはPLC側の設定します。

ASCII交信、IPアドレス、プロトコル自局ポート番号を合わせます。

参考プログラムを実行した様子です。

ソケット通信なので、Win10でも実行できました。

まとめ

PC-PLC通信を通信ライブラリを使用せずに作るとかハードル高いと思いましたが、意外とこの方法だとできました。今後は、Win7ハンディを使うかどうかで開発ツールも変わってきますが、選択肢としては可能であると思います。

他には、MX-Componentを使う方法やGOTのアンドンや無線Wifiを使ってタブレットでやることも検討していきます。

それができると持ち歩きできるデバイスから、データ収集、データ入力もできDX促進が可能となるでしょう

相互リンク紹介

上の自作より、もっと使えそうなサイトがあったので、ご紹介します。

DLLなのでK社のバーコードリーダー上でも簡単に使えるかと思います。

PLC通信ライブラリ(Ethernet) | PLCのメモ書き
このカテゴリではこれまでPLCとの通信に関連することを記事にしてきました。こんな風にすれば、、こんな感じに考えれば、、というだけでは上から目線や言うだけ番長感が満載なので、Ethernet通信でデバイス読み書きが出来るなんちゃって通信ライブ

コメント

タイトルとURLをコピーしました