OPC客户端程序开发的步骤与实现
(1)建立新工程或项目,在“工程”菜单下选择“引用”,如图1所示。只有引用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组 考虑到代码的可反复使用性,采用子程序进行编程。 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,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,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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- objective-c – 在applicationWillResignActive中发送内存警
- 进程交互-基于NOR Flash的嵌入式简易文件系统设计(3)
- Flash与C#结合,打造完美WinForm程序
- c# – 检测Windows Server 2012上是否安装了websocket
- ruby-on-rails – 在Travis CI中使用API??身份验证运行测试
- ios – 将’NSNumber’桥接到’Int’警告
- C多个运算符=()
- sqlite基本操作
- 重写ajax方法实现异步请求session过期时跳转登录页面
- c# – 检测应用程序是否在Microsoft Surface RT上运行?