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社のバーコードリーダー上でも簡単に使えるかと思います。
コメント