OPC client > expected array

Status
Niet open voor verdere reacties.

Tommie84

Gebruiker
Lid geworden
17 jul 2016
Berichten
6
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:

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:

unexpected.png

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:

unexpected2.png

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
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan