k'weet niet of hier OPC kenners tussen de forumgebruiker zitten, maar ik probeer het toch even. Ik ben in Visual Basic 2005 Express een OPC-client aan het maken. Ik heb er reeds één in VBA (excel) gemaakt. T'is te zeggen een sample gerewrite.
In de file Taglist.csv staat een OPCItemID lijst welke ik in de string Tagscsv binnenhaal. Deze string wordt gesplitst in TagsCsvSplit() welke op zijn beurt in de array OPCItemID wordt geschreven.
Bij het runnen van mijn programma gaat de code in fout op de aangegeven regel met als melding 'Specified array was not of the expected type.'
Hieronder vindt je de code terug. Misschien zijn er masterbrains die me zo aan een oplossing kunnen helpen.
----------------------------------------------------------------------------------------------------------------------------------
Public Class Form1
Dim WithEvents MyServer As OPCAutomation.OPCServer
Dim WithEvents MyGroup As OPCAutomation.OPCGroup
Public MyOPCBrowser As OPCAutomation.OPCBrowser
Public MyGroups As OPCAutomation.OPCGroups
Public MyOPCItemCollection As OPCAutomation.OPCItems
Public MyOPCWriteItemCollection As OPCAutomation.OPCItems
Public MyOPCItem As OPCAutomation.OPCItem
Public SelectedServer As String
Public BranchIndex As Integer
Public GroupName As String
Public MajorVersion As Integer
Public MinorVersion As Integer
Public BuildNumber As Integer
Public ServerNode As String
Public OPCServerErrorString As String
Dim MyOPCItemID(0 To 86) As String
Dim MyItems(86) As Object
Public AddItemCount As Long
Public SelAddItemCount As Long
Public i, k, n, m, x, y, z, w, q As Integer
Public SubStep As Integer
Public ServerIndex As Long
Dim MyServerErrors As OPCAutomation.OPCErrors
Dim DefaultGroupUpdateRate As Long
Dim ClientHandles(0 To 86) As Long
Dim MyOPCItemServerHandles() As Long
Dim MyOPCItemServerErrors() As Long
Dim MyRequestedDataTypes(0 To 86) As Integer
Public ka As Integer
Dim MyNumitems As Long
Dim DataType As String
Const OPC_DS_CACHE = 1
Const OPC_DS_DEVICE = OPC_DS_CACHE + 1
Dim AantalTags As Integer 'PROFICOS
Dim TagsCsv As String 'PROFICOS
Dim TagsCsvSplit As String() 'PROFICOS
Public Sub MyOPCServer()
'Connect the Server **********************************************************
MyServer = New OPCAutomation.OPCServer
MyServer.Connect("PhoenixContact.Interbus.2")
'Define a Group Name **********************************************************
GroupName = "Group_1"
AddItemCount = 0
k = 0
' Bepalen van het aantal gedefinieerde tags
AantalTags = 87
AddItemCount = AantalTags
'Inladen van csv-bestand met tags
TagsCsv = My.Computer.FileSystem.ReadAllText("G:\Engineering\VISUALISATIE\Definitieve files\Taglist.csv")
TextBox1.Text = TagsCsv
TagsCsvSplit = TagsCsv.Split(vbCrLf)
For q = 0 To AantalTags - 1
TagsCsvSplit(q) = Mid(TagsCsvSplit(q), 2)
Next q
' OPC-items opbouwen aan de hand van tags en lokaties
For k = 0 To AantalTags - 1
MyOPCItemID(k) = TagsCsvSplit(k)
Next k
' OPC-groep maken
MyGroup = MyServer.OPCGroups.Add(GroupName)
If MyGroup.IsActive Then
MyOPCItemCollection = MyGroup.OPCItems
' Alle Items toevoegen ******************************************************************
For x = 0 To AddItemCount - 1
ClientHandles(x) = x
Next x
MyOPCItemCollection.AddItems(AddItemCount, MyOPCItemID, ClientHandles, MyOPCItemServerHandles, MyOPCItemServerErrors, MyRequestedDataTypes)
MyGroup.UpdateRate = 100
MyGroup.IsSubscribed = True
Dim f As Integer
For f = 0 To AddItemCount - 1
If ClientHandles(f) = 0 Then Exit For
'Range("g" & Format(f + 9)) = Format(f)
'Range("h" & Format(f + 9)) = MyOPCItemCollection.Item(f).ItemID
DataType = GetDataType(MyOPCItemCollection.Item(f).CanonicalDataType)
'Range("i" & Format(f + 9)) = DataType
Next f
End If
End Sub
Private Sub MyGroup_DataChange(ByVal TransactionID As Long, ByVal NumItems As Long, ByVal ClientHandles() As Long, ByVal ItemValues() As Object, ByVal Qualities() As Long, ByVal TimeStamps() As Date)
Dim Index As Long
For Index = 0 To NumItems - 1
'On Error GoTo errhandler
If ClientHandles(Index) >= 1 Then
'Range("j" & Format(ClientHandles(Index)) + 9) = ItemValues(Index)
'Range("k" & Format(ClientHandles(Index)) + 9) = Qualities(Index)
End If
Next Index
'Application.DefaultSaveFormat = xlWorkbookNormal
'ActiveWorkbook.SaveCopyAs ("G:\Engineering\VISUALISATIE\Definitieve files\LOG.xls")
Exit Sub
'errhandler:
'Range("l" & Format(ClientHandles(Index)) + 9) = "- empty -"
Resume Next
End Sub
Public Function GetDataType(ByVal DataType As Integer) As String
On Error GoTo FOUT
Select Case DataType
Case 2
GetDataType = "INTEGER"
Case 3
GetDataType = "DINT"
Case 4
GetDataType = "REAL"
Case 5
GetDataType = "FLOAT"
Case 8
GetDataType = "STRING"
Case 11
GetDataType = "BOOL"
Case 16
GetDataType = "SINT"
Case 17
GetDataType = "BYTE"
Case 18
GetDataType = "WORD"
Case 19
GetDataType = "DWORD"
End Select
FOUT:
GetDataType = "ERROR"
Resume
End Function
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
TagsCsv = ""
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MyOPCServer()
End Sub
End Class
In de file Taglist.csv staat een OPCItemID lijst welke ik in de string Tagscsv binnenhaal. Deze string wordt gesplitst in TagsCsvSplit() welke op zijn beurt in de array OPCItemID wordt geschreven.
Bij het runnen van mijn programma gaat de code in fout op de aangegeven regel met als melding 'Specified array was not of the expected type.'
Hieronder vindt je de code terug. Misschien zijn er masterbrains die me zo aan een oplossing kunnen helpen.
----------------------------------------------------------------------------------------------------------------------------------
Public Class Form1
Dim WithEvents MyServer As OPCAutomation.OPCServer
Dim WithEvents MyGroup As OPCAutomation.OPCGroup
Public MyOPCBrowser As OPCAutomation.OPCBrowser
Public MyGroups As OPCAutomation.OPCGroups
Public MyOPCItemCollection As OPCAutomation.OPCItems
Public MyOPCWriteItemCollection As OPCAutomation.OPCItems
Public MyOPCItem As OPCAutomation.OPCItem
Public SelectedServer As String
Public BranchIndex As Integer
Public GroupName As String
Public MajorVersion As Integer
Public MinorVersion As Integer
Public BuildNumber As Integer
Public ServerNode As String
Public OPCServerErrorString As String
Dim MyOPCItemID(0 To 86) As String
Dim MyItems(86) As Object
Public AddItemCount As Long
Public SelAddItemCount As Long
Public i, k, n, m, x, y, z, w, q As Integer
Public SubStep As Integer
Public ServerIndex As Long
Dim MyServerErrors As OPCAutomation.OPCErrors
Dim DefaultGroupUpdateRate As Long
Dim ClientHandles(0 To 86) As Long
Dim MyOPCItemServerHandles() As Long
Dim MyOPCItemServerErrors() As Long
Dim MyRequestedDataTypes(0 To 86) As Integer
Public ka As Integer
Dim MyNumitems As Long
Dim DataType As String
Const OPC_DS_CACHE = 1
Const OPC_DS_DEVICE = OPC_DS_CACHE + 1
Dim AantalTags As Integer 'PROFICOS
Dim TagsCsv As String 'PROFICOS
Dim TagsCsvSplit As String() 'PROFICOS
Public Sub MyOPCServer()
'Connect the Server **********************************************************
MyServer = New OPCAutomation.OPCServer
MyServer.Connect("PhoenixContact.Interbus.2")
'Define a Group Name **********************************************************
GroupName = "Group_1"
AddItemCount = 0
k = 0
' Bepalen van het aantal gedefinieerde tags
AantalTags = 87
AddItemCount = AantalTags
'Inladen van csv-bestand met tags
TagsCsv = My.Computer.FileSystem.ReadAllText("G:\Engineering\VISUALISATIE\Definitieve files\Taglist.csv")
TextBox1.Text = TagsCsv
TagsCsvSplit = TagsCsv.Split(vbCrLf)
For q = 0 To AantalTags - 1
TagsCsvSplit(q) = Mid(TagsCsvSplit(q), 2)
Next q
' OPC-items opbouwen aan de hand van tags en lokaties
For k = 0 To AantalTags - 1
MyOPCItemID(k) = TagsCsvSplit(k)
Next k
' OPC-groep maken
MyGroup = MyServer.OPCGroups.Add(GroupName)
If MyGroup.IsActive Then
MyOPCItemCollection = MyGroup.OPCItems
' Alle Items toevoegen ******************************************************************
For x = 0 To AddItemCount - 1
ClientHandles(x) = x
Next x
MyOPCItemCollection.AddItems(AddItemCount, MyOPCItemID, ClientHandles, MyOPCItemServerHandles, MyOPCItemServerErrors, MyRequestedDataTypes)
MyGroup.UpdateRate = 100
MyGroup.IsSubscribed = True
Dim f As Integer
For f = 0 To AddItemCount - 1
If ClientHandles(f) = 0 Then Exit For
'Range("g" & Format(f + 9)) = Format(f)
'Range("h" & Format(f + 9)) = MyOPCItemCollection.Item(f).ItemID
DataType = GetDataType(MyOPCItemCollection.Item(f).CanonicalDataType)
'Range("i" & Format(f + 9)) = DataType
Next f
End If
End Sub
Private Sub MyGroup_DataChange(ByVal TransactionID As Long, ByVal NumItems As Long, ByVal ClientHandles() As Long, ByVal ItemValues() As Object, ByVal Qualities() As Long, ByVal TimeStamps() As Date)
Dim Index As Long
For Index = 0 To NumItems - 1
'On Error GoTo errhandler
If ClientHandles(Index) >= 1 Then
'Range("j" & Format(ClientHandles(Index)) + 9) = ItemValues(Index)
'Range("k" & Format(ClientHandles(Index)) + 9) = Qualities(Index)
End If
Next Index
'Application.DefaultSaveFormat = xlWorkbookNormal
'ActiveWorkbook.SaveCopyAs ("G:\Engineering\VISUALISATIE\Definitieve files\LOG.xls")
Exit Sub
'errhandler:
'Range("l" & Format(ClientHandles(Index)) + 9) = "- empty -"
Resume Next
End Sub
Public Function GetDataType(ByVal DataType As Integer) As String
On Error GoTo FOUT
Select Case DataType
Case 2
GetDataType = "INTEGER"
Case 3
GetDataType = "DINT"
Case 4
GetDataType = "REAL"
Case 5
GetDataType = "FLOAT"
Case 8
GetDataType = "STRING"
Case 11
GetDataType = "BOOL"
Case 16
GetDataType = "SINT"
Case 17
GetDataType = "BYTE"
Case 18
GetDataType = "WORD"
Case 19
GetDataType = "DWORD"
End Select
FOUT:
GetDataType = "ERROR"
Resume
End Function
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
TagsCsv = ""
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MyOPCServer()
End Sub
End Class