Hallo,
ik wil van een OPC server alle tags ophalen en vervolgens naar een SQLdb schrijven.
het wegschrijven van de tags is totaal geen probleem, enkel het ophalen van de tags blijkt een grote uitdaging.
ik heb een helpmij draadje gevonden uit 2007 waar een mooi voorbeeldsnippet te vinden is waar ik op verder kan borduren
..../showthread.php/285576-VB-net-OPC-client-vraag
mijn code ziet er nu als volgt uit:
bij het debuggen kwam de volgende melding naarboven:

ik heb hierna de declaraties benodigd voor myOpcAddItems.add() gewijzigd van Long naar Integer (omdat dit stuk uit vb6 komt zou je int16/short verwachten, maar dan blijft de error).
nu krijg ik de volgende error:

ik vermoed dat het iets temaken heeft met de grote/vulling van alle vermelde declaraties.
na dagen prutsen en sjoemelen met alle declaratiegrotes en types ben ik nu eindelijk op het punt aangekomen door mn ideeën heen te zijn.
ik blijf in de tussentijd nog aanmodderen terwijl al het andere werk rondom me blijft liggen... maar heeft iemand in de tussentijd enig idee waar ik tegenaan loop?
de originele code werkte toendertijd ook niet, deze code is m.i. de enige werkbare OPC client code welke in de buurt komt van wat ik nodig heb.
andere werkende voorbeelden waren niet (iig niet door mij) aan te passen naar mijn wensen.
wie o wie kan me hiermee helpen.. mijn dank zou enorm zijn!
Groeten Tommie
ik wil van een OPC server alle tags ophalen en vervolgens naar een SQLdb schrijven.
het wegschrijven van de tags is totaal geen probleem, enkel het ophalen van de tags blijkt een grote uitdaging.
ik heb een helpmij draadje gevonden uit 2007 waar een mooi voorbeeldsnippet te vinden is waar ik op verder kan borduren
..../showthread.php/285576-VB-net-OPC-client-vraag
mijn code ziet er nu als volgt uit:
Code:
Public Class mainOPC
#Region "declarations"
Public opcTags_temp As List(Of String) = tagCollector.tags_ok
Public opcTags_ok() As String = opcTags_temp.ToArray
Public tagCount As Integer = opcTags_ok.Count
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 MyOPCItemID(0 To tagCount) As String
'Dim MyItems(86) As Object
Dim MyItems(tagCount) As Object
Public AddItemCount As Integer 'was long
Public SelAddItemCount As Integer 'was long
'Public i, n, k, m, x, y, z, w, q As Integer
Public SubStep As Integer
Public ServerIndex As Integer 'was long
Dim MyServerErrors As OPCAutomation.OPCErrors
Dim DefaultGroupUpdateRate As Integer 'was long
'Dim ClientHandles(0 To 86) As Long
Dim ClientHandles(0 To tagCount) As Integer 'was long
Dim MyOPCItemServerHandles() As Integer 'was long
Dim MyOPCItemServerErrors() As Integer 'was long
'Dim MyRequestedDataTypes(0 To 86) As Integer
Dim MyRequestedDataTypes(0 To tagCount + 5) As Integer
Public ka As Integer
Dim MyNumitems As Integer 'was long
Dim DataType As String
Const OPC_DS_CACHE = 1
Const OPC_DS_DEVICE = OPC_DS_CACHE + 1
Dim AantalTags As Integer 'Intellution
' Dim TagsCsv As String 'Intellution
' Dim TagsCsvSplit As String() 'Intellution
Public defTextColor As Color = Color.Red
#End Region
Public Sub stat(ByVal msg As String, Optional ByVal sameLine As Boolean = False, Optional ByVal txtColor As Color = Nothing)
If txtColor = Nothing Then txtColor = defTextColor Else defTextColor = txtColor
txtStatus.ForeColor = defTextColor
Me.Visible = True
Application.DoEvents()
Dim newMsg As String = String.Empty
If sameLine = False Then newMsg &= vbCrLf
newMsg &= (msg).Replace(vbNewLine, String.Empty)
Do While newMsg.EndsWith(" ")
newMsg = newMsg.Substring(0, newMsg.Length - 1)
Loop
Do While newMsg.StartsWith(" ")
newMsg = newMsg.Substring(1)
Loop
txtStatus.AppendText(newMsg)
Application.DoEvents()
Threading.Thread.Sleep(40)
End Sub
Public Sub MyOPCServer()
'Connect the Server **********************************************************
MyServer = New OPCAutomation.OPCServer
stat("establishing OPC connection..")
MyServer.Connect("Intellution.OPCiFIX.1")
stat("creating opcGroup")
GroupName = "Group_1"
AddItemCount = 0
' k = 0
stat("defining tag count (=" & tagCount & ")")
'AantalTags = 87
AantalTags = tagCount
AddItemCount = AantalTags
'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
stat("building opc structure..", , Color.Orange)
' OPC-items opbouwen aan de hand van tags en lokaties
For k As Integer = 1 To AantalTags - 1
'MyOPCItemID(k) = TagsCsvSplit(k)
MyOPCItemID(k) = "SCADA1." & opcTags_ok(k) & ".F_CV"
Next k
stat(" " & MyOPCItemID.Count & " items build", True)
stat("adding opc Group..")
' OPC-groep maken
MyGroup = MyServer.OPCGroups.Add(GroupName)
If MyGroup.IsActive Then
MyOPCItemCollection = MyGroup.OPCItems
' Alle Items toevoegen ******************************************************************
stat("adding client handles")
For x = 1 To AddItemCount - 1
ClientHandles(x) = x
Next x
stat(" " & ClientHandles.Count & " handles added", True)
stat("subscribing items to OPCwatcher", , Color.LimeGreen)
'For v = 1 To AddItemCount - 1
' Try
' MyOPCItemCollection.AddItem(MyOPCItemID(v), ClientHandles(v))
' Catch ex As Exception
' End Try
'Next
AddItemCount += 1
MyOPCItemID(0) = MyOPCItemID(1)
Try
'MyOPCItemCollection.AddItems(AddItemCount, MyOPCItemID, ClientHandles, MyOPCItemServerHandles, MyOPCItemServerErrors, MyRequestedDataTypes)
MyOPCItemCollection.AddItems(AddItemCount, MyOPCItemID, ClientHandles, MyOPCItemServerHandles, MyOPCItemServerErrors, MyRequestedDataTypes)
MyGroup.UpdateRate = 100
MyGroup.IsSubscribed = True
Catch ex As Exception
End Try
MyGroup.UpdateRate = 100
MyGroup.IsSubscribed = True
stat("doing first round of data-fetch!")
Dim f As Integer
For f = 1 To AddItemCount - 1
Try
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
Catch ex As Exception
End Try
Next f
End If
stat(">cycle complete<")
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
MsgBox(ItemValues(Index))
'Range("j" & Format(ClientHandles(Index)) + 9) = ItemValues(Index)
MsgBox(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" : Exit Function
Case 3
GetDataType = "DINT" : Exit Function
Case 4
GetDataType = "REAL" : Exit Function
Case 5
GetDataType = "FLOAT" : Exit Function
Case 8
GetDataType = "STRING" : Exit Function
Case 11
GetDataType = "BOOL" : Exit Function
Case 16
GetDataType = "SINT" : Exit Function
Case 17
GetDataType = "BYTE" : Exit Function
Case 18
GetDataType = "WORD" : Exit Function
Case 19
GetDataType = "DWORD" : Exit Function
End Select
FOUT:
GetDataType = "ERROR"
Resume
End Function
Private Sub mainOPC_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Visible = True : Me.Refresh() : Me.Focus()
stat("initializing software..")
stat("Tags from Harvest process loaded! (" & opcTags_temp.Count & "/" & tagCollector.tags_ok.Count & ")")
stat("starting OPC server..")
MyOPCServer()
stat("OPC server running!", False, Color.LimeGreen)
End Sub
End Class
bij het debuggen kwam de volgende melding naarboven:

ik heb hierna de declaraties benodigd voor myOpcAddItems.add() gewijzigd van Long naar Integer (omdat dit stuk uit vb6 komt zou je int16/short verwachten, maar dan blijft de error).
nu krijg ik de volgende error:

ik vermoed dat het iets temaken heeft met de grote/vulling van alle vermelde declaraties.
na dagen prutsen en sjoemelen met alle declaratiegrotes en types ben ik nu eindelijk op het punt aangekomen door mn ideeën heen te zijn.
ik blijf in de tussentijd nog aanmodderen terwijl al het andere werk rondom me blijft liggen... maar heeft iemand in de tussentijd enig idee waar ik tegenaan loop?
de originele code werkte toendertijd ook niet, deze code is m.i. de enige werkbare OPC client code welke in de buurt komt van wat ik nodig heb.
andere werkende voorbeelden waren niet (iig niet door mij) aan te passen naar mijn wensen.
wie o wie kan me hiermee helpen.. mijn dank zou enorm zijn!
Groeten Tommie