65.9K
CodeProject 正在变化。 阅读更多。
Home

OPCWare DA 自动化封装器 - VB.NET

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.55/5 (9投票s)

2007年4月23日

CPOL

3分钟阅读

viewsIcon

104161

本文提供了 OPC (用于过程和控制的 OLE) 的基本技术概述,以及一个示例 VB.NET OPC 客户端,用于使用 OPCware DA 自动化封装器组件访问数据。它描述了 VB.NET 客户端如何与 OPC 服务器通信。

OPCWare DA 自动化封装器 - VB.NET

摘要

本文提供了 OPC (用于过程和控制的 OLE) 的基本技术概述,以及一个示例 VB.NET OPC 客户端,用于使用 OPCware DA 自动化封装器组件访问数据。它描述了 VB.NET 客户端如何与 OPC 服务器通信。本文的目标读者是软件开发人员。(本文假设读者具有 OPC 和 VB.NET 的基本知识)

引言

OPC (用于过程和控制的 OLE) 是一种从过程控制设备访问数据的工业标准。 它是一种在系统之间交换数据的标准。它有一组规范,用于连接不同的多厂商设备和控制应用程序。 OPC 规范由 OPC 基金会维护。 以下章节将解释 OPC 的需求和 OPC 基金会的目标。

为什么需要 OPC 和 OPC 基金会

过去,制造商有许多不同的数据源,例如 PLC、DCS、数据库和其他设备。 供应商将使用自己的设备接口在其应用程序中捕获此数据。 只能通过供应商特定的专有接口访问数据。 因此,为了访问数据,制造商应始终被迫依赖供应商。 因此,制造商希望能够使用一种使制造商能够超越专有解决方案的赋能技术。 引入 OPC 来解决这个问题,它通过提供一种工业通信标准来实现多媒体设备之间的数据交换,而没有任何专有限制。

OPC 为多厂商之间的通信提供了开放标准,以实现多厂商设备之间的通信。 这些开放标准由“OPC 基金会”组织形成和维护。

OPC 基金会的主要目标是消除供应商特定的限制。 因此,硬件制造商只需要为其设备提供一个 OPC 服务器,即可与任何 OPC 客户端通信。 软件供应商只需在其产品中包含 OPC 客户端功能,即可立即与其他数千个硬件设备兼容。

以下章节将解释 OPC 的基本概述和客户端通信。

OPC 的工作原理

Screenshot - image002.jpg

在高层次上,OPC 由几个对象组成,例如 OPC 服务器、OPC 组和 OPC 项目。 OPC 服务器充当 OPC 组的容器。 OPC 组包含逻辑组织的 OPC 项目。 有两种类型的 OPC 组,即公共组和私有组。 公共组可以由多个客户端访问,而私有组则供单个客户端使用。 OPC 项目代表与数据源的连接。 OPC 项目将没有任何自定义接口,因此 OPC 客户端可以通过 OPC 组访问 OPC 项目。 每个 OPC 项目都是一个值、质量和时间戳。 OPC 项目不是数据源,它们只是与数据源的连接。 当 OPC 客户端想要与 OPC 服务器通信时,它需要实例化一个 OPC 服务器对象/OPC 组。 建立连接后,可以通过 OPC 组和 OPC 项目对象访问 OPC 项目。 以下部分将提供一个基本 OPC 客户端应用程序的代码片段。

示例 OPC 客户端程序

本节包含一个示例代码片段,该片段充当 OPC 客户端程序,用于向 OPC 服务器读取和写入数据。 此代码使用“Matrikon.OPC.Simulation”作为 OPC 服务器。 (可以从 Internet 下载模拟服务器)

Screenshot - image004.jpg
图 Matrikon.OPC.Simulation 服务器 示例 OPCClient 项目

以下示例代码片段是在 VB.net 中开发的
Option Strict Off
Option Explicit On
'########## Include the reference "OPCWare DA Automation Wrapper"
Imports OPCAutomation
Imports System.Runtime.InteropServices
Public Class Form1
Dim WithEvents ObjOPCServer As OPCAutomation.OPCServer
Dim WithEvents ObjOPCGroups As OPCAutomation.OPCGroups
Dim WithEvents ObjOPCGroup As OPCAutomation.OPCGroup
Dim ObjOPCItems As OPCAutomation.OPCItems
Dim ObjOPCItem As OPCAutomation.OPCItem
Const NoOfItems = 2
Dim Array_Items(NoOfItems) As String
Dim Array_ClientHanlers(NoOfItems) As Integer
Dim Array_ServerHandlers(NoOfItems) As Integer
Dim Array_Values(NoOfItems) As Object
'########## Form Load Event  ###################################
Private Sub Form1_Load(ByVal sender As System.Object, _
                        ByVal e As System.EventArgs) Handles MyBase.Load
 Call StartOPCClient("Matrikon.OPC.Simulation.1")
 Call ReadData()
 Call WriteData()
End Sub
'################################################################
 '########## Sub procedure to read OPC Item values ##############
Private Sub ReadData()
Try
Dim ObjOPCItem As OPCAutomation.OPCItem
For Each ObjOPCItem In ObjOPCGroup.OPCItems
    ObjOPCItem.Read(OPCAutomation.OPCDataSource.OPCDevice)
    Array_Values(ObjOPCItem.ClientHandle) = ObjOPCItem.Value
    MsgBox(ObjOPCItem.ItemID & ":-> " & vbCrLf & "Value:" & ObjOPCItem.Value &_
            vbCrLf & "TimeStamp:" & ObjOPCItem.TimeStamp & vbCrLf &_
            "Quality:" & ObjOPCItem.Quality)
Next
ObjOPCItem = Nothing
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "OPC Client")
End Try
End Sub
'################ Sub procedure to initialize OPC Server ######
Private Sub StartOPCClient(ByVal OPCServerName As String)
Dim liCounter As Integer
Dim gpServerHandlers As Array
Dim gsErrors As Array
Try
            ObjOPCServer = New OPCAutomation.OPCServer
'##### Initialize OPC Server ################################
            ObjOPCServer.Connect(OPCServerName, "")
            ObjOPCGroups = ObjOPCServer.OPCGroups
            ObjOPCGroup = ObjOPCGroups.Add("OPCGroup1")
'Add OPCGroup
            ObjOPCGroup.UpdateRate = 1000
            ObjOPCGroup.IsActive = False
            ObjOPCGroup.IsSubscribed = ObjOPCGroup.IsActive
            ObjOPCItems = ObjOPCGroup.OPCItems
            'Build OPCItems Array
            For liCounter = 1 To NoOfItems
                Array_Items(liCounter) = "OPCClient.Device" & liCounter
                Array_ClientHanlers(liCounter) = liCounter
            Next
            'Add OPCItems
            ObjOPCItems.AddItems(NoOfItems, Array_Items,Array_ClientHanlers, _
                                 gpServerHandlers, gsErrors)
            'Get the server handlers
            For liCounter = 1 To NoOfItems
                If gsErrors(liCounter) = 0 Then
                    Array_ServerHandlers(liCounter) = gpServerHandlers(liCounter)
                Else
                    MsgBox("Item" & liCounter & "has problem", _
                           MsgBoxStyle.Critical, "OPC Client")
                End If
            Next
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "OPC Client")
        End Try
    End Sub
'#################### Sub procedure to write OPC Item data 
    Private Sub WriteData()
        Try
            Dim liCounter As Integer
            Dim Errors As Array
            '##### Assign new values
            For liCounter = 1 To NoOfItems
                Array_Values(liCounter) = CStr(liCounter * Rnd() * 100)
            Next
            'Write back to OPC Server
            ObjOPCGroup.SyncWrite(NoOfItems, Array_ServerHandlers, _
                                 Array_Values, Errors)
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "OPC Client")
        End Try
    End Sub
End
Class

结论

借助 OPC,工业自动化在集成和可扩展性方面得到了改进。 不同的自动化系统供应商将不会花钱开发与其他供应商产品兼容的软件组件。

OPC 使跨供应商、设备、软件和系统的即插即用软件和硬件成为可能,制造可以轻松地将其集成到公司范围内的自动化和业务系统中。

© . All rights reserved.