发布于 2004-02-22 01:01:26
0楼
下面是wincc和excel连接的例程代码,里面只读取wincc的一个变量,读2个的方法我按下面【】里那样改,(修改后的东西用【】括在原代码后面取代前面的原代码,新加的语句也用【】括住)。在第一次运行时能读到2个变量,随后只要wincc的值一改变,excel马上出错,错误为:下标越界,请熟悉VB的朋友看一下,错在那里。
Option Explicit
Option Base 1
Const ServerName = "OPCServer.WinCC"
Dim WithEvents MyOPCServer As OpcServer
Dim WithEvents MyOPCGroup As OPCGroup
Dim MyOPCGroupColl As OPCGroups
Dim MyOPCItemColl As OPCItems
Dim MyOPCItems As OPCItems
Dim MyOPCItem As OPCItem
Dim ClientHandles(1)【(2)】 As Long
Dim ServerHandles() As Long
Dim Values(1) As Variant
Dim Errors() As Long
Dim ItemIDs(1)【(2)】 As String
Dim GroupName As String
Dim NodeName As String
'---------------------------------------------------------------------
' Sub StartClient()
' 目的:连接至OPC_server,创建组和添加条目
'---------------------------------------------------------------------
Sub StartClient()
' On Error GoTo ErrorHandler
'----------- 可以自由选择ClientHandle和GroupName
ClientHandles(1) = 1
GroupName = "MyGroup"
'----------- 从单元“A1”得到ItemID
NodeName = Range("A1").Value
ItemIDs(1) = Range("A2").Value
【ItemIDs(2) = Range("A3").Value】
'----------- 得到一个OPC服务器的实例
Set MyOPCServer = New OpcServer
MyOPCServer.Connect ServerName, NodeName
Set MyOPCGroupColl = MyOPCServer.OPCGroups
'----------- 为添加组设置缺省的激活状态
MyOPCGroupColl.DefaultGroupIsActive = True
'----------- 添加组至收集
Set MyOPCGroup = MyOPCGroupColl.Add(GroupName)
Set MyOPCItemColl = MyOPCGroup.OPCItems
'----------- 添加一个条目、返回ServerHandles
MyOPCItemColl.AddItems 1【2】, ItemIDs, ClientHandles, ServerHandles, Errors
'----------- 用于接受不同的信息组
MyOPCGroup.IsSubscribed = True
Exit Sub
ErrorHandler:
MsgBox "Error: " & Err.Des cription, vbCritical, "ERROR"
End Sub
'---------------------------------------------------------------------
' Sub StopClient()
' 目的:从服务器释放对象并且断开连接
'---------------------------------------------------------------------
Sub StopClient()
'----------- 释放组和服务器对象
MyOPCGroupColl.RemoveAll
'----------- 与服务器断开连接并且清除
MyOPCServer.Disconnect
Set MyOPCItemColl = Nothing
Set MyOPCGroup = Nothing
Set MyOPCGroupColl = Nothing
Set MyOPCServer = Nothing
End Sub
'---------------------------------------------------------------------
' Sub MyOPCGroup_DataChange()
' 目的:组中的数值、质量或时间标志改变时,该事件激活
'---------------------------------------------------------------------
'----------- 如果OPC-DA Automation 2.1被安装,使用:
Private Sub MyOPCGroup_DataChange(ByVal TransactionID As Long, ByVal NumItems As Long, ClientHandles() As Long, ItemValues() As Variant, Qualities() As Long, TimeStamps() As Date)
'----------- 设置数据表单元值为数值读
Range("B2").Value = CStr(ItemValues(1))
Range("C2").Value = Hex(Qualities(1))
Range("D2").Value = CStr(TimeStamps(1))
【Range("B3").Value = CStr(ItemValues(2))】(这就是下标越界的那句,新加的)
End Sub
'---------------------------------------------------------------------
' Sub worksheet_change()
' 目的:工作表改变时,该事件激活,因此可以写一个新的数值
'---------------------------------------------------------------------
Private Sub worksheet_change(ByVal Selection As Range)
'----------- 仅在单元“B3”改变时,写该值
If Selection <> Range("B3")【("B4")】 Then Exit Sub
Values(1) = Selection.Cells.Value
'----------- 以不同的模式写新的数值
MyOPCGroup.SyncWrite 1, ServerHandles, Values, Errors
End Sub