紫外工控论坛

 找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 2251|回复: 0

[VB/VB.NET] 【转】用VB开发OPC客户端程序的步骤与实现

[复制链接]
冰糖 发表于 2011-7-2 16:32:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
来自:http://tyfixn.blog.163.com/blog/ ... romSearchEngine=yes
(1)建立新工程或项目,在“工程”菜单下选择“引用”,如图5-3所示。只有引用OPCDAAuoto.DLL后,在程序中才能创建服务器对象,然后进行一系列的操作。

(2)在弹出的引用窗口里单击“浏览(B)…”按钮,弹出添加引用窗口,选择OPCDAAuoto.DLL文件。

(3)在引用窗口里的OPC Automation 2.0前面打钩,按“确定”按钮。

(4)定义全局变量,这样可以在窗体的任何方法的代码内应用。变量类型应该指定为对象型。这些对象最好在窗体的通用部分声明加上“Option Explicit”语句,表示模块里的所有变量都需要显式声明。由于OPC自动化接口的数组的索引要求必须从1开始,而系统默认是从0开始,为了避免错误最好在代码的最初加上“Option Base 1”语句。为了使对象可以处理事件,必须将objTestGrp和objServer的声明中加上“WithEvents”语句,表示声明的对象可以响应事件。

Option Explicit

Option Base 1

Dim WithEvents objServer As OPCServer

Dim objGroups As OPCGroups

Dim WithEvents objTestGrp As OPCGroup

Dim objItems As OPCItems

(5)连接OPC服务器和建立OPC?br>考虑到代码的可反复使用性,采用子程序进行编程。

Sub Connect(strProgID As String, Optional strNode As String)

    If objServer Is Nothing Then

        ' 建立一个OPC服务器对象

        Set objServer = New OPCServer

    End If

服务器状态ServerState属性一共有OPCRunning、OPCFailed、OPCNoconfig、OPCSuspended、OPCTest和OPCDisconnected六个值,分别表示正在运行、失败、没有配置、暂停、测试和没有连接六种OPC服务器当前的状态。如果OPC服务器没有连接,我们才执行objServer.Connect strProgID, strNode语句。strProgID就是ProgID,strNode就是用于远程通信的IP地址。

If objServer.ServerState = OPCDisconnected Then

        ' 连接OPC服务器

        objServer.Connect strProgID, strNode

   End If

在Visual Basic中,通过执行一个Set操作实现调用其它接口的方法。

   If objGroups Is Nothing Then

        ' 建立一个OPC组集合

        Set objGroups = objServer.OPCGroups

    End If

    If objTestGrp Is Nothing Then

        ' 添加一个OPC组

        Set objTestGrp = objGroups.Add("Group")

    End If

End Sub

(6)添加OPC标签

对服务器进行访问前,必须先在OPC组里添加要访问的OPC标签。OPC客户端程序要按照用户指定的标签或者从组态文件里读取需要添加的OPC标签。

Sub AddItem()

    Dim strItemIDs(17) As String

    Dim lClientHandles(17) As Long

    Dim lErrors() As Long

    Dim I As Integer

    If objTestGrp Is Nothing Then

        Exit Sub

    End If   

    If Not objItems Is Nothing Then

        If objItems.Count > 0 Then

            Exit Sub

        End If

    End If

    ' 设置组活动状态。只有处于活动状态的OPC才进行定期的数据更新。非活动状态的OPC组,除了在接到显然的数据读写要求外,并不收集任何数据。

    If mnuSubscribtion.Checked = True Then

        objTestGrp.IsActive = True

    Else

        objTestGrp.IsActive = False

    End If

    ' 启动组异步通知。进行订阅的OPC组可以自动收到从服务器送来的数据变化通知。

    objTestGrp.IsSubscribed = True

    ' 建立OPC项集合

    Set objItems = objTestGrp.OPCItems

    ' 生成从TAG1到TAG17的项标识符

    For I = 1 To 17

        strItemIDs(I) = "Server.Group.TAG" & I

        lClientHandles(I) = I

    Next

    ' 添加OPC项

    Call objItems.AddItems(17, strItemIDs, lClientHandles, lServerHandles, lErrors)

End Sub

(7)异步读取代码的实现

在定时器事件内进行执行AsyncRead子程序的读取代码,而在读取完成事件处理返回的数据访问结果。

Sub AsyncRead()

Dim lErrors() As Long

   If objTestGrp Is Nothing Then

        Exit Sub

    End If

    If objTestGrp.OPCItems.Count > 0 Then

        ' 异步读取

        lTransID_Rd = lTransID_Rd + 1

objTestGrp.AsyncRead 17, lServerHandles, lErrors, lTransID_Rd, lCancelID_Rd

   End If

End Sub

Private Sub objTestGrp_AsyncReadComplete( _

    ByVal TransactionID As Long, ByVal NumItems As Long, _

    ClientHandles() As Long, ItemValues() As Variant, _

    Qualities() As Long, TimeStamps() As Date, Errors() As Long)

……

Sub

(8)在按钮中执行AsyncWrite子程序,完成异步写的操作。

Sub AsyncWrite(nIndex As Integer, ByRef vtItemValues() As Variant, _

    ByRef lErrors() As Long)

Dim lHandle(1) As Long

    If objTestGrp Is Nothing Then

        Exit Sub

    End If

    If objTestGrp.OPCItems.Count > 0 Then

        lHandle(1) = lServerHandles(nIndex)

        ' 异步写入

        lTransID_Wt = lTransID_Wt + 1

        objTestGrp.AsyncWrite 1, lHandle(), vtItemValues, _

                lErrors, lTransID_Wt, lCancelID_Wt

    End If

End Sub

(9)断开OPC服务器

连接着OPC服务器的OPC客户应用程序,在退出前必须断开和OPC服务器的连接。因为OPC服务器并不知道OPC客户应用程序的退出。如果不先断开连接,那么OPC服务器使用的计算机资源就不会被释放。如果这样的问题反复发生,久而久之,连续运转的自动控制系统可能会计算机资源渐渐枯竭从而发生严重问题,可以显式地把它设置为“Nothing”。

Sub Disconnect()

    Dim lErrors() As Long

    If Not objItems Is Nothing Then

        If objItems.Count > 0 Then

            objItems.Remove 17, lServerHandles, lErrors ' 清除OPC项

        End If

        Set objItems = Nothing

    End If   

    If Not objTestGrp Is Nothing Then

        objGroups.Remove "Group"' 清除OPC组

        Set objTestGrp = Nothing

    End If   

    If Not objGroups Is Nothing Then

        Set objGroups = Nothing

    End If   

    If Not objServer Is Nothing Then

        If objServer.ServerState <> OPCDisconnected Then

            objServer.Disconnect' 断开OPC服务器.

        End If

        Set objServer = Nothing

    End If

End Sub


不错,不知道OPCDAAuoto.DLL这个文件是vb自带的还是需要在哪里下载?

  下面引用由tigermu在 2007-12-18 21:16:00 发表的内容:

  不错,不知道OPCDAAuoto.DLL这个文件是vb自带的还是需要在哪里下载?

--------------------------------------------------------------------------------------------

这个VB当然不会带了,一般安装OPC类软件都有,也可直接安装OPC环境,就是这些必须的库

哦,是这样。那么直接安装OPC环境怎么安装呢?是在OPC的网站有吗?不熟悉这个,见谅!


学习了,没看懂?有详细的资料吗?


收藏了                     


OPCDAAuoto.DLL  上开发OPC客户端,我用C++BUILDER6编过,结果别人的OPC SERVER是S7-200的PC ACCESS1。0,

失败了,令我傻眼了,但用KEPWARE的OPC通用客户程序却能成功了,为何我的没有通用性呢?

我发现,原来有的OPC SERVER厂家,不一定用OPCDAAuoto.DLL ,是失败的原因,我不得不重新找别人的

OPC 客户程序模拟,终于成功了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


--------------------------------------------------------------------------------------------------------------------
本站是工控技术交流站点,论坛内容均为网络收集或会员所发表,并不代表本站立场,会员拥有该内容的所有权力及责任!
本站内容如有侵犯您的版权,请按下面方式联系本站管理员,我们将及时删除处理
管理员:冰糖 QQ:5483695(请直击主题), Mail:admin#ziwai.net(#改成@) 其它非本人.
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论!

QQ|Archiver|手机版|小黑屋|紫外工控论坛. ( 苏ICP备11032118号-1 )

GMT+8, 2024-4-29 19:03 , Processed in 0.343752 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表