SungjuNewPrime/OPC Server Setting/OPC Client sample(DotNet to Delphi13)/DotNetDAautoSample/Form1.vb
jhw 6516e4a8f0 first upload
OPC test program upload
2026-09-04 11:41:21 +09:00

797 lines
30 KiB
VB.net
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'==============================================================================
' TITLE: Form1.vb - Ver2.00(DotNetDAautoSample)
'
' CONTENTS:
'
'
' (c) Copyright 2004-2010 Takebishi Electric Sales Corporation
' ALL RIGHTS RESERVED.
'
' DISCLAIMER:
' This code is provided by the Takebishi Corporation solely to assist
' in understanding and use of the appropriate OPC Specification(s).
' This code is provided as-is and without warranty or support of any sort.
'
' MODIFICATION LOG:
'
' Version Date By Notes
' -------- -------- -------- --------
' 1.00 2004/02/27 Mike First release.
' 1.01 2004/12/27 Mike Revised memory leak.
' 1.02 2005/02/08 Mike Fixed to support array type.
' 1.03 2005/03/10 Mike Fixed that if object is nothing, do not read value.
' Fixed to change value to string.
' 1.04 2005/04/21 Mike Used method is changed from 'Read' of OPCItem to 'SyncRead' of OPCGroup.
' 1.05 2006/09/21 Mike Modified for VS2005.
' Fixed to add product version.
' 2.00 2010/02/05 ykishimo Fixed ini file path for Windows Vista and Windows7.
'==============================================================================
Option Strict Off
Option Explicit On
Imports System.Runtime.InteropServices
Imports System.Threading ' 06/09/21 for VS2005
Public Class Form1
Inherits System.Windows.Forms.Form
' This delegate enables asynchronous calls for setting
' the text property on a TextBox control.
Delegate Sub SetValueCallback(ByVal i As Integer) ' 06/09/21 for VS2005
Delegate Sub SetTimeCallback(ByVal i As Integer) ' 06/09/21 for VS2005
Delegate Sub SetQualityCallback(ByVal i As Integer) ' 06/09/21 for VS2005
' This thread is used to demonstrate both thread-safe and
' unsafe ways to call a Windows Forms control.
Private threadCopy As Thread = Nothing ' 06/09/21 for VS2005
Const ITEMMAX As Integer = 8
Const STR_OPC_INI As String = "DAAutoDotNET.ini"
Const VAL_CTRL_SPACE As Integer = 8
Const VAL_CTRL_TOP As Integer = 192
Const VAL_CTRL_LEFT As Integer = 16
Const VAL_ITEMNAME_HEIGHT As Integer = 24
Const VAL_ITEMNAME_WIDTH As Integer = 88
Const VAL_VALUE_HEIGHT As Integer = VAL_ITEMNAME_HEIGHT
Const VAL_VALUE_WIDTH As Integer = 48
Const VAL_TIME_HEIGHT As Integer = VAL_ITEMNAME_HEIGHT
Const VAL_TIME_WIDTH As Integer = 128
Const VAL_QUALITY_HEIGHT As Integer = VAL_ITEMNAME_HEIGHT
Const VAL_QUALITY_WIDTH As Integer = 40
Dim WithEvents OPCMyServer As OPCAutomation.OPCServer
Dim WithEvents OPCMyGroups As OPCAutomation.OPCGroups
Dim WithEvents OPCMyGroup As OPCAutomation.OPCGroup
Dim OPCMyItems As OPCAutomation.OPCItems
Dim OPCMyItem As OPCAutomation.OPCItem
Dim sItemName(ITEMMAX) As String
Dim cH(ITEMMAX) As Integer
Dim sH(ITEMMAX) As Integer
Dim oVal(ITEMMAX) As Object
Dim dTime(ITEMMAX) As Date
Dim wQuality(ITEMMAX) As Short
Dim bConnect As Boolean
Dim csSpFolder As String
Dim csIniPath As String
Dim txtItemName(ITEMMAX - 1) As System.Windows.Forms.TextBox
Dim txtValue(ITEMMAX - 1) As System.Windows.Forms.TextBox
Dim txtTime(ITEMMAX - 1) As System.Windows.Forms.TextBox
Dim txtQuality(ITEMMAX - 1) As System.Windows.Forms.TextBox
Enum COPY_DIR
DISP_TO_MEM ' display to memory
MEM_TO_DISP ' memory to display
End Enum
#Region " Windows <20>t<EFBFBD>H<EFBFBD>[<5B><> <20>f<EFBFBD>U<EFBFBD>C<EFBFBD>i<EFBFBD>Ő<EFBFBD><C590><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>R<EFBFBD>[<5B>h "
Public Sub New()
MyBase.New()
' <20><><EFBFBD>̌Ăяo<D18F><6F><EFBFBD><EFBFBD> Windows <20>t<EFBFBD>H<EFBFBD>[<5B><> <20>f<EFBFBD>U<EFBFBD>C<EFBFBD>i<EFBFBD>ŕK<C595>v<EFBFBD>ł<EFBFBD><C582>B
InitializeComponent()
' InitializeComponent() <20>Ăяo<D18F><6F><EFBFBD>̌<EFBFBD><CC8C>ɏ<EFBFBD><C98F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>lj<EFBFBD><C789><EFBFBD><EFBFBD>܂<EFBFBD><DC82>B
End Sub
' Form <20>́A<CD81>R<EFBFBD><52><EFBFBD>|<7C>[<5B>l<EFBFBD><6C><EFBFBD>g<EFBFBD><EFBFBD>Ɍ㏈<C98C><E38F88><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>s<EFBFBD><73><EFBFBD><EFBFBD>߂<EFBFBD> dispose <20><><EFBFBD>I<EFBFBD>[<5B>o<EFBFBD>[<5B><><EFBFBD>C<EFBFBD>h<EFBFBD><68><EFBFBD>܂<EFBFBD><DC82>B
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 <20>t<EFBFBD>H<EFBFBD>[<5B><> <20>f<EFBFBD>U<EFBFBD>C<EFBFBD>i<EFBFBD>ŕK<C595>v<EFBFBD>ł<EFBFBD><C582>B
Private components As System.ComponentModel.IContainer
' <20><><EFBFBD><EFBFBD> : <20>ȉ<EFBFBD><C889>̃v<CC83><76><EFBFBD>V<EFBFBD>[<5B>W<EFBFBD><57><EFBFBD>́AWindows <20>t<EFBFBD>H<EFBFBD>[<5B><> <20>f<EFBFBD>U<EFBFBD>C<EFBFBD>i<EFBFBD>ŕK<C595>v<EFBFBD>ł<EFBFBD><C582>B
'Windows <20>t<EFBFBD>H<EFBFBD>[<5B><> <20>f<EFBFBD>U<EFBFBD>C<EFBFBD>i<EFBFBD><69><EFBFBD>g<EFBFBD><67><EFBFBD>ĕύX<CF8D><58><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
' <20>R<EFBFBD>[<5B>h <20>G<EFBFBD>f<EFBFBD>B<EFBFBD>^<5E><><EFBFBD>g<EFBFBD><67><EFBFBD>ĕύX<CF8D><58><EFBFBD>Ȃ<EFBFBD><C882>ł<EFBFBD><C582><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
Public WithEvents btnAsyncWrite As System.Windows.Forms.Button
Public WithEvents btnAsyncRead As System.Windows.Forms.Button
Public WithEvents txtSvrName As System.Windows.Forms.TextBox
Public WithEvents btnAdvise As System.Windows.Forms.Button
Public WithEvents txtUpdateRate As System.Windows.Forms.TextBox
Public WithEvents btnWrite As System.Windows.Forms.Button
Public WithEvents btnRead As System.Windows.Forms.Button
Public WithEvents btnConnect As System.Windows.Forms.Button
Public WithEvents Label6 As System.Windows.Forms.Label
Public WithEvents Label5 As System.Windows.Forms.Label
Public WithEvents Label4 As System.Windows.Forms.Label
Public WithEvents Label3 As System.Windows.Forms.Label
Public WithEvents Label2 As System.Windows.Forms.Label
Public WithEvents Label1 As System.Windows.Forms.Label
Friend WithEvents Label7 As System.Windows.Forms.Label
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.btnAsyncWrite = New System.Windows.Forms.Button
Me.btnAsyncRead = New System.Windows.Forms.Button
Me.txtSvrName = New System.Windows.Forms.TextBox
Me.btnAdvise = New System.Windows.Forms.Button
Me.txtUpdateRate = New System.Windows.Forms.TextBox
Me.btnWrite = New System.Windows.Forms.Button
Me.btnRead = New System.Windows.Forms.Button
Me.btnConnect = New System.Windows.Forms.Button
Me.Label6 = New System.Windows.Forms.Label
Me.Label5 = New System.Windows.Forms.Label
Me.Label4 = New System.Windows.Forms.Label
Me.Label3 = New System.Windows.Forms.Label
Me.Label2 = New System.Windows.Forms.Label
Me.Label1 = New System.Windows.Forms.Label
Me.Label7 = New System.Windows.Forms.Label
Me.SuspendLayout()
'
'btnAsyncWrite
'
Me.btnAsyncWrite.BackColor = System.Drawing.SystemColors.Control
Me.btnAsyncWrite.Cursor = System.Windows.Forms.Cursors.Default
Me.btnAsyncWrite.Enabled = False
Me.btnAsyncWrite.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.btnAsyncWrite.ForeColor = System.Drawing.SystemColors.ControlText
Me.btnAsyncWrite.Location = New System.Drawing.Point(240, 120)
Me.btnAsyncWrite.Name = "btnAsyncWrite"
Me.btnAsyncWrite.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.btnAsyncWrite.Size = New System.Drawing.Size(104, 32)
Me.btnAsyncWrite.TabIndex = 60
Me.btnAsyncWrite.Text = "Async Write"
'
'btnAsyncRead
'
Me.btnAsyncRead.BackColor = System.Drawing.SystemColors.Control
Me.btnAsyncRead.Cursor = System.Windows.Forms.Cursors.Default
Me.btnAsyncRead.Enabled = False
Me.btnAsyncRead.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.btnAsyncRead.ForeColor = System.Drawing.SystemColors.ControlText
Me.btnAsyncRead.Location = New System.Drawing.Point(128, 120)
Me.btnAsyncRead.Name = "btnAsyncRead"
Me.btnAsyncRead.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.btnAsyncRead.Size = New System.Drawing.Size(104, 32)
Me.btnAsyncRead.TabIndex = 59
Me.btnAsyncRead.Text = "Async Read"
'
'txtSvrName
'
Me.txtSvrName.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.txtSvrName.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.txtSvrName.Location = New System.Drawing.Point(96, 8)
Me.txtSvrName.Name = "txtSvrName"
Me.txtSvrName.Size = New System.Drawing.Size(136, 20)
Me.txtSvrName.TabIndex = 58
Me.txtSvrName.Text = "Takebishi.Dxp.1"
'
'btnAdvise
'
Me.btnAdvise.BackColor = System.Drawing.SystemColors.Control
Me.btnAdvise.Cursor = System.Windows.Forms.Cursors.Default
Me.btnAdvise.Enabled = False
Me.btnAdvise.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.btnAdvise.ForeColor = System.Drawing.SystemColors.ControlText
Me.btnAdvise.Location = New System.Drawing.Point(16, 120)
Me.btnAdvise.Name = "btnAdvise"
Me.btnAdvise.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.btnAdvise.Size = New System.Drawing.Size(104, 32)
Me.btnAdvise.TabIndex = 57
Me.btnAdvise.Text = "Advise"
'
'txtUpdateRate
'
Me.txtUpdateRate.AcceptsReturn = True
Me.txtUpdateRate.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.txtUpdateRate.BackColor = System.Drawing.SystemColors.Window
Me.txtUpdateRate.Cursor = System.Windows.Forms.Cursors.IBeam
Me.txtUpdateRate.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.txtUpdateRate.ForeColor = System.Drawing.SystemColors.WindowText
Me.txtUpdateRate.Location = New System.Drawing.Point(96, 40)
Me.txtUpdateRate.MaxLength = 0
Me.txtUpdateRate.Name = "txtUpdateRate"
Me.txtUpdateRate.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.txtUpdateRate.Size = New System.Drawing.Size(64, 20)
Me.txtUpdateRate.TabIndex = 54
Me.txtUpdateRate.Text = "1000"
Me.txtUpdateRate.TextAlign = System.Windows.Forms.HorizontalAlignment.Right
'
'btnWrite
'
Me.btnWrite.BackColor = System.Drawing.SystemColors.Control
Me.btnWrite.Cursor = System.Windows.Forms.Cursors.Default
Me.btnWrite.Enabled = False
Me.btnWrite.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.btnWrite.ForeColor = System.Drawing.SystemColors.ControlText
Me.btnWrite.Location = New System.Drawing.Point(240, 80)
Me.btnWrite.Name = "btnWrite"
Me.btnWrite.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.btnWrite.Size = New System.Drawing.Size(104, 32)
Me.btnWrite.TabIndex = 49
Me.btnWrite.Text = "Write"
'
'btnRead
'
Me.btnRead.BackColor = System.Drawing.SystemColors.Control
Me.btnRead.Cursor = System.Windows.Forms.Cursors.Default
Me.btnRead.Enabled = False
Me.btnRead.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.btnRead.ForeColor = System.Drawing.SystemColors.ControlText
Me.btnRead.Location = New System.Drawing.Point(128, 80)
Me.btnRead.Name = "btnRead"
Me.btnRead.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.btnRead.Size = New System.Drawing.Size(104, 32)
Me.btnRead.TabIndex = 48
Me.btnRead.Text = "Read"
'
'btnConnect
'
Me.btnConnect.BackColor = System.Drawing.SystemColors.Control
Me.btnConnect.Cursor = System.Windows.Forms.Cursors.Default
Me.btnConnect.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.btnConnect.ForeColor = System.Drawing.SystemColors.ControlText
Me.btnConnect.Location = New System.Drawing.Point(240, 16)
Me.btnConnect.Name = "btnConnect"
Me.btnConnect.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.btnConnect.Size = New System.Drawing.Size(104, 32)
Me.btnConnect.TabIndex = 47
Me.btnConnect.Text = "Connect"
'
'Label6
'
Me.Label6.BackColor = System.Drawing.SystemColors.Control
Me.Label6.Cursor = System.Windows.Forms.Cursors.Default
Me.Label6.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.Label6.ForeColor = System.Drawing.SystemColors.ControlText
Me.Label6.Location = New System.Drawing.Point(16, 40)
Me.Label6.Name = "Label6"
Me.Label6.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.Label6.Size = New System.Drawing.Size(80, 16)
Me.Label6.TabIndex = 56
Me.Label6.Text = "Update Rate"
Me.Label6.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'Label5
'
Me.Label5.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.Label5.BackColor = System.Drawing.SystemColors.Control
Me.Label5.Cursor = System.Windows.Forms.Cursors.Default
Me.Label5.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.Label5.ForeColor = System.Drawing.SystemColors.ControlText
Me.Label5.Location = New System.Drawing.Point(16, 8)
Me.Label5.Name = "Label5"
Me.Label5.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.Label5.Size = New System.Drawing.Size(80, 16)
Me.Label5.TabIndex = 55
Me.Label5.Text = "Server Name"
Me.Label5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'Label4
'
Me.Label4.BackColor = System.Drawing.SystemColors.Control
Me.Label4.Cursor = System.Windows.Forms.Cursors.Default
Me.Label4.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.Label4.ForeColor = System.Drawing.SystemColors.ControlText
Me.Label4.Location = New System.Drawing.Point(304, 168)
Me.Label4.Name = "Label4"
Me.Label4.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.Label4.Size = New System.Drawing.Size(48, 16)
Me.Label4.TabIndex = 53
Me.Label4.Text = "Quality"
'
'Label3
'
Me.Label3.BackColor = System.Drawing.SystemColors.Control
Me.Label3.Cursor = System.Windows.Forms.Cursors.Default
Me.Label3.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.Label3.ForeColor = System.Drawing.SystemColors.ControlText
Me.Label3.Location = New System.Drawing.Point(168, 168)
Me.Label3.Name = "Label3"
Me.Label3.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.Label3.Size = New System.Drawing.Size(65, 16)
Me.Label3.TabIndex = 52
Me.Label3.Text = "Date/Time"
'
'Label2
'
Me.Label2.BackColor = System.Drawing.SystemColors.Control
Me.Label2.Cursor = System.Windows.Forms.Cursors.Default
Me.Label2.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.Label2.ForeColor = System.Drawing.SystemColors.ControlText
Me.Label2.Location = New System.Drawing.Point(112, 168)
Me.Label2.Name = "Label2"
Me.Label2.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.Label2.Size = New System.Drawing.Size(41, 16)
Me.Label2.TabIndex = 51
Me.Label2.Text = "Value"
'
'Label1
'
Me.Label1.BackColor = System.Drawing.SystemColors.Control
Me.Label1.Cursor = System.Windows.Forms.Cursors.Default
Me.Label1.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.Label1.ForeColor = System.Drawing.SystemColors.ControlText
Me.Label1.Location = New System.Drawing.Point(16, 168)
Me.Label1.Name = "Label1"
Me.Label1.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.Label1.Size = New System.Drawing.Size(65, 16)
Me.Label1.TabIndex = 50
Me.Label1.Text = "Item Name"
'
'Label7
'
Me.Label7.Location = New System.Drawing.Point(232, 448)
Me.Label7.Name = "Label7"
Me.Label7.Size = New System.Drawing.Size(128, 16)
Me.Label7.TabIndex = 61
Me.Label7.Text = "DAAutoDotNET ver2.0"
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(360, 470)
Me.Controls.Add(Me.Label7)
Me.Controls.Add(Me.btnAsyncWrite)
Me.Controls.Add(Me.btnAsyncRead)
Me.Controls.Add(Me.txtSvrName)
Me.Controls.Add(Me.btnAdvise)
Me.Controls.Add(Me.txtUpdateRate)
Me.Controls.Add(Me.btnWrite)
Me.Controls.Add(Me.btnRead)
Me.Controls.Add(Me.btnConnect)
Me.Controls.Add(Me.Label6)
Me.Controls.Add(Me.Label5)
Me.Controls.Add(Me.Label4)
Me.Controls.Add(Me.Label3)
Me.Controls.Add(Me.Label2)
Me.Controls.Add(Me.Label1)
Me.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)
End Sub
#End Region
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim i%
' create TextBox
For i = 0 To ITEMMAX - 1
txtItemName(i) = New System.Windows.Forms.TextBox
txtItemName(i).AutoSize = False
txtItemName(i).Top = VAL_CTRL_TOP + (VAL_ITEMNAME_HEIGHT + VAL_CTRL_SPACE) * i
txtItemName(i).Left = VAL_CTRL_LEFT
txtItemName(i).Height = VAL_ITEMNAME_HEIGHT
txtItemName(i).Width = VAL_ITEMNAME_WIDTH
Me.Controls.Add(txtItemName(i))
txtValue(i) = New System.Windows.Forms.TextBox
txtValue(i).AutoSize = False
txtValue(i).Top = VAL_CTRL_TOP + (VAL_VALUE_HEIGHT + VAL_CTRL_SPACE) * i
txtValue(i).Left = VAL_CTRL_LEFT + (VAL_ITEMNAME_WIDTH + VAL_CTRL_SPACE)
txtValue(i).Height = VAL_VALUE_HEIGHT
txtValue(i).Width = VAL_VALUE_WIDTH
Me.Controls.Add(txtValue(i))
txtTime(i) = New System.Windows.Forms.TextBox
txtTime(i).AutoSize = False
txtTime(i).Top = VAL_CTRL_TOP + (VAL_TIME_HEIGHT + VAL_CTRL_SPACE) * i
txtTime(i).Left = VAL_CTRL_LEFT + (VAL_ITEMNAME_WIDTH + VAL_CTRL_SPACE) + (VAL_VALUE_WIDTH + VAL_CTRL_SPACE)
txtTime(i).Height = VAL_TIME_HEIGHT
txtTime(i).Width = VAL_TIME_WIDTH
Me.Controls.Add(txtTime(i))
txtQuality(i) = New System.Windows.Forms.TextBox
txtQuality(i).AutoSize = False
txtQuality(i).Top = VAL_CTRL_TOP + (VAL_QUALITY_HEIGHT + VAL_CTRL_SPACE) * i
txtQuality(i).Left = VAL_CTRL_LEFT + (VAL_ITEMNAME_WIDTH + VAL_CTRL_SPACE) + (VAL_VALUE_WIDTH + VAL_CTRL_SPACE) + (VAL_TIME_WIDTH + VAL_CTRL_SPACE)
txtQuality(i).Height = VAL_QUALITY_HEIGHT
txtQuality(i).Width = VAL_QUALITY_WIDTH
Me.Controls.Add(txtQuality(i))
Next
Try
' Get My document Path
csSpFolder = System.Environment.GetFolderPath(Environment.SpecialFolder.Personal)
csSpFolder = csSpFolder + "\\TAKEBISHI\\DeviceXPlorer OPC Server\\Sample\\"
csIniPath = csSpFolder + STR_OPC_INI
' import ini file
If System.IO.File.Exists(csIniPath) = True Then
FileOpen(1, csIniPath, OpenMode.Input)
Input(1, txtSvrName.Text)
Input(1, txtUpdateRate.Text)
i = 0
Do While Not EOF(1) ' loop until end of file
If i > ITEMMAX Then
Exit Do
End If
Input(1, txtItemName(i).Text)
i = i + 1
Loop
FileClose(1)
Else
txtSvrName.Text = "Takebishi.Dxp.1" ' 07/06/23 for DXP2007
txtUpdateRate.Text = "1000"
For i = 1 To ITEMMAX
txtItemName(i - 1).Text = "Device1.D" + Format$(i - 0)
Next i
End If
Catch ex As Exception
Trace.WriteLine(ex.ToString())
End Try
End Sub
Private Sub Form1_Closed(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Closed
Dim i As Short
If bConnect = True Then
btnConnect_Click(btnConnect, New System.EventArgs)
End If
Try
' Check ini file path
If System.IO.File.Exists(csIniPath) = False Then
' create ini file
Dim hStream As System.IO.FileStream
System.IO.Directory.CreateDirectory(csSpFolder)
hStream = System.IO.File.Create(csIniPath)
' Close
If Not hStream Is Nothing Then
hStream.Close()
End If
End If
FileOpen(1, csIniPath, OpenMode.Output)
PrintLine(1, txtSvrName.Text)
PrintLine(1, txtUpdateRate.Text)
For i = 1 To ITEMMAX
PrintLine(1, txtItemName(i - 1).Text)
Next i
FileClose(1)
Catch ex As Exception
Trace.Write(ex.ToString())
End Try
End Sub
Protected Overrides Sub Finalize()
MyBase.Finalize()
End Sub
Private Sub btnConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConnect.Click
Dim i%
Dim ServerHandles As Array
Dim Errors As Array
If txtSvrName.Text = "" Then
MsgBox("Server Name is not registed.")
Exit Sub
End If
If IsNumeric(txtUpdateRate.Text) = False Then
MsgBox("Update Rate is unsuitable.")
Exit Sub
End If
If bConnect = False Then
'--- connect OPCServer
OPCMyServer = New OPCAutomation.OPCServer
OPCMyServer.Connect(txtSvrName.Text, "")
OPCMyGroups = OPCMyServer.OPCGroups
OPCMyGroup = OPCMyGroups.Add("Group1")
OPCMyGroup.UpdateRate = Val(txtUpdateRate.Text) ' UpdateRate is 1000msec
OPCMyGroup.IsActive = False
OPCMyGroup.IsSubscribed = OPCMyGroup.IsActive
OPCMyItems = OPCMyGroup.OPCItems
For i = 1 To ITEMMAX
sItemName(i) = txtItemName(i - 1).Text
cH(i) = i
Next
OPCMyItems.AddItems(ITEMMAX, sItemName, cH, ServerHandles, Errors)
For i = 1 To ITEMMAX
If Errors(i) = 0 Then
sH(i) = ServerHandles(i)
Else
MsgBox("Registing Items is failed : " + sItemName(i))
End If
Next
bConnect = True
txtSvrName.Enabled = False
txtUpdateRate.Enabled = False
btnConnect.Text = "Disconnect"
btnAdvise.Enabled = True
btnAdvise.Text = "Advise"
btnRead.Enabled = True
btnWrite.Enabled = True
btnAsyncRead.Enabled = False
btnAsyncWrite.Enabled = False
For i = 1 To ITEMMAX
txtItemName(i - 1).Enabled = False
Next i
' read data
btnRead_Click(btnRead, New System.EventArgs)
Else
'--- disconnect OPCServer
OPCMyGroup.IsActive = False
OPCMyGroups.Remove(OPCMyGroup.ServerHandle)
OPCMyItems = Nothing
OPCMyItem = Nothing
OPCMyGroups = Nothing
OPCMyGroup = Nothing
OPCMyServer.Disconnect()
'ret = Marshal.ReleaseComObject(OPCMyServer)
OPCMyServer = Nothing
System.GC.Collect() 'Execute Garbage Collection compulsorily.
bConnect = False
txtSvrName.Enabled = True
txtUpdateRate.Enabled = True
btnConnect.Text = "Connect"
btnAdvise.Enabled = False
btnRead.Enabled = False
btnWrite.Enabled = False
btnAsyncRead.Enabled = False
btnAsyncWrite.Enabled = False
For i = 1 To ITEMMAX
txtItemName(i - 1).Enabled = True
Next i
End If
End Sub
Private Sub btnRead_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRead.Click
'05/04/21 Used method is changed from 'Read' of OPCItem to 'SyncRead' of OPCGroup.
Dim ItemValues As Array
Dim Qualities As Array
Dim TimeStamps As Array
Dim Errors As Array
Dim i%
OPCMyGroup.SyncRead(OPCAutomation.OPCDataSource.OPCDevice, ITEMMAX, sH, ItemValues, Errors, Qualities, TimeStamps)
For i = 1 To ITEMMAX
oVal(i) = ItemValues(i)
dTime(i) = TimeStamps(i)
wQuality(i) = Qualities(i)
Next i
Copy(COPY_DIR.MEM_TO_DISP)
'Dim anItem As OPCAutomation.OPCItem
'For Each anItem In OPCMyGroup.OPCItems
' anItem.Read(OPCAutomation.OPCDataSource.OPCDevice) ', value, qual, time ' If subscribed, don't do this!
' oVal(anItem.ClientHandle) = anItem.Value
' dTime(anItem.ClientHandle) = anItem.TimeStamp
' wQuality(anItem.ClientHandle) = anItem.Quality
'Next anItem
'anItem = Nothing
'Copy(COPY_DIR.MEM_TO_DISP)
End Sub
Private Sub btnWrite_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnWrite.Click
Dim Errors As Array
Copy(COPY_DIR.DISP_TO_MEM)
OPCMyGroup.SyncWrite(ITEMMAX, sH, oVal, Errors)
End Sub
Private Sub btnAdvise_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdvise.Click
OPCMyGroup.IsActive = Not OPCMyGroup.IsActive
OPCMyGroup.IsSubscribed = OPCMyGroup.IsActive
If OPCMyGroup.IsActive = True Then
btnAdvise.Text = "Unadvise"
btnAsyncRead.Enabled = True
btnAsyncWrite.Enabled = True
' read data
btnRead_Click(btnRead, New System.EventArgs)
Else
btnAdvise.Text = "Advise"
btnAsyncRead.Enabled = False
btnAsyncWrite.Enabled = False
End If
End Sub
Private Sub btnAsyncRead_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAsyncRead.Click
Static Dim wTransID As Integer = 1000
Dim wCancelID As Integer
Dim Errors As Array
wTransID = wTransID + 1
OPCMyGroup.AsyncRead(ITEMMAX, sH, Errors, wTransID, wCancelID)
'wTransID = wTransID + 1
'OPCMyGroup.AsyncRead(ITEMMAX, sH, Errors, wTransID, wCancelID)
'OPCMyGroup.AsyncCancel(wCancelID)
End Sub
Private Sub btnAsyncWrite_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAsyncWrite.Click
Static Dim wTransID As Integer = 2000
Dim wCancelID As Integer
Dim Errors As Array
Copy(COPY_DIR.DISP_TO_MEM)
wTransID = wTransID + 1
OPCMyGroup.AsyncWrite(ITEMMAX, sH, oVal, Errors, wTransID, wCancelID)
End Sub
Private Sub OPCMyGroup_DataChange(ByVal TransactionID As Integer, ByVal NumItems As Integer, ByRef ClientHandles As System.Array, ByRef ItemValues As System.Array, ByRef Qualities As System.Array, ByRef TimeStamps As System.Array) Handles OPCMyGroup.DataChange
Dim i%
For i = 1 To NumItems
oVal(ClientHandles(i)) = ItemValues(i)
dTime(ClientHandles(i)) = TimeStamps(i)
wQuality(ClientHandles(i)) = Qualities(i)
Next i
Me.threadCopy = New Thread(New ThreadStart(AddressOf Me.ThreadProcCopy)) ' 06/09/21 for VS2005
Me.threadCopy.Start()
'Copy(COPY_DIR.MEM_TO_DISP)
End Sub
Private Sub OPCMyGroup_AsyncReadComplete(ByVal TransactionID As Integer, ByVal NumItems As Integer, ByRef ClientHandles As System.Array, ByRef ItemValues As System.Array, ByRef Qualities As System.Array, ByRef TimeStamps As System.Array, ByRef Errors As System.Array) Handles OPCMyGroup.AsyncReadComplete
Dim i%
For i = 1 To NumItems
oVal(ClientHandles(i)) = ItemValues(i)
dTime(ClientHandles(i)) = TimeStamps(i)
wQuality(ClientHandles(i)) = Qualities(i)
Next i
Me.threadCopy = New Thread(New ThreadStart(AddressOf Me.ThreadProcCopy)) ' 06/09/21 for VS2005
Me.threadCopy.Start()
'Copy(COPY_DIR.MEM_TO_DISP)
End Sub
Private Sub OPCMyGroup_AsyncWriteComplete(ByVal TransactionID As Integer, ByVal NumItems As Integer, ByRef ClientHandles As System.Array, ByRef Errors As System.Array) Handles OPCMyGroup.AsyncWriteComplete
End Sub
Private Sub OPCMyGroup_AsyncCancelComplete(ByVal CancelID As Integer) Handles OPCMyGroup.AsyncCancelComplete
End Sub
'05/02/08 Support array type
Private Sub Copy(ByVal Direction As COPY_DIR)
Dim i%
Dim j%
Dim sBufGet As String
Dim sBufPut() As String
Select Case Direction
Case COPY_DIR.DISP_TO_MEM
For i = 1 To ITEMMAX
If IsArray(oVal(i)) Then
Erase sBufPut
sBufPut = Split(txtValue(i - 1).Text, ",")
For j = 0 To UBound(oVal(i))
If j > UBound(sBufPut) Then Exit For
If IsNumeric(sBufPut(j)) Then oVal(i)(j) = sBufPut(j)
Next j
Else
If IsNumeric(txtValue(i - 1).Text) Then oVal(i) = txtValue(i - 1).Text
End If
If IsDate(txtTime(i - 1).Text) = True Then
dTime(i) = txtTime(i - 1).Text
dTime(i) = dTime(i).ToUniversalTime()
'dTime(i) = Time(i - 1).Text
End If
If IsNumeric(txtQuality(i - 1).Text) = True Then
wQuality(i) = txtQuality(i - 1).Text
End If
Next
Case COPY_DIR.MEM_TO_DISP
For i = 1 To ITEMMAX
If Not IsNothing(oVal(i)) Then '05/03/10 If object is nothing, do not read value.
If IsArray(oVal(i)) Then
sBufGet = ""
For j = 0 To UBound(oVal(i))
sBufGet = sBufGet & oVal(i)(j).ToString & "," '05/03/10 Change value to string
'sBufGet = sBufGet & oVal(i)(j) & ","
Next j
txtValue(i - 1).Text = sBufGet
Else
txtValue(i - 1).Text = oVal(i).ToString
'txtValue(i - 1).Text = oVal(i)
End If
End If
If Not IsNothing(dTime(i)) Then txtTime(i - 1).Text = dTime(i).ToLocalTime().ToString
'txtTime(i - 1).Text = dTime(i).ToString
If Not IsNothing(wQuality(i)) Then txtQuality(i - 1).Text = wQuality(i).ToString
Next
End Select
End Sub
'************************
Private Sub ThreadProcCopy() ' 06/09/21 for VS2005
Dim i As Integer
For i = 1 To ITEMMAX
Me.SetValue(i)
Me.SetQuality(i)
Me.SetTime(i)
Next
End Sub
Private Sub SetValue(ByVal [i] As Integer) ' 06/09/21 for VS2005
'// InvokeRequired required compares the thread ID of the
'// calling thread to the thread ID of the creating thread.
'// If these threads are different, it returns true.
If Me.txtValue(i - 1).InvokeRequired Then
Dim d As New SetValueCallback(AddressOf SetValue)
Me.Invoke(d, New Object() {[i]})
Else
Dim j As Integer
Dim sBufGet As String
If Not IsNothing(oVal(i)) Then '05/03/10 If object is nothing, do not read value.
If IsArray(oVal(i)) Then
sBufGet = ""
For j = 0 To UBound(oVal(i))
sBufGet = sBufGet & oVal(i)(j).ToString & "," '05/03/10 Change value to string
'sBufGet = sBufGet & oVal(i)(j) & ","
Next j
txtValue(i - 1).Text = sBufGet
Else
txtValue(i - 1).Text = oVal(i).ToString
'txtValue(i - 1).Text = oVal(i)
End If
End If
End If
End Sub
Private Sub SetTime(ByVal [i] As Integer) ' 06/09/21 for VS2005
'// InvokeRequired required compares the thread ID of the
'// calling thread to the thread ID of the creating thread.
'// If these threads are different, it returns true.
If Me.txtTime(i - 1).InvokeRequired Then
Dim d As New SetTimeCallback(AddressOf SetTime)
Me.Invoke(d, New Object() {[i]})
Else
If Not IsNothing(dTime(i)) Then txtTime(i - 1).Text = dTime(i).ToString
End If
End Sub
Private Sub SetQuality(ByVal [i] As Integer) ' 06/09/21 for VS2005
'// InvokeRequired required compares the thread ID of the
'// calling thread to the thread ID of the creating thread.
'// If these threads are different, it returns true.
If Me.txtQuality(i - 1).InvokeRequired Then
Dim d As New SetQualityCallback(AddressOf SetQuality)
Me.Invoke(d, New Object() {[i]})
Else
If Not IsNothing(wQuality(i)) Then txtQuality(i - 1).Text = wQuality(i).ToString
End If
End Sub
End Class