⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.vb

📁 OPC客户端用VB.NET
💻 VB
📖 第 1 页 / 共 2 页
字号:
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(360, 453)
        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%
        Dim ItemName As String

        ' 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
            FileOpen(1, STR_OPC_INI, 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)
        Catch
            txtSvrName.Text = "Takebishi.Melsec"
            txtUpdateRate.Text = "1000"
            For i = 1 To ITEMMAX
                txtItemName(i - 1).Text = "Device1.D" + Format$(i - 0)
            Next i
            FileClose(1)
        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

        FileOpen(1, STR_OPC_INI, 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)
    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
        Dim ret As Integer

        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) ''', RequestedDataTypes, AccessPaths
            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
        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

        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

        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


    Private Sub Copy(ByVal Direction As COPY_DIR)
        Dim i%
        Select Case Direction
            Case COPY_DIR.DISP_TO_MEM
                For i = 1 To ITEMMAX
                    oVal(i) = txtValue(i - 1).Text
                    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
                    txtValue(i - 1).Text = oVal(i)
                    txtTime(i - 1).Text = dTime(i).ToLocalTime().ToString
                    'txtTime(i - 1).Text = dTime(i).ToString
                    txtQuality(i - 1).Text = wQuality(i).ToString
                Next
        End Select
    End Sub
End Class

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -