OPC - Client programmieren mit Microsoft Visual Studio 2008

Zuviel Werbung?
-> Hier kostenlos registrieren
Aber dass man mit VB6 programmieren muss kann ja fast ned sein
nein man kann auch .NET nehmen dann wird es halt nur noch undurchsichtiger, denn das Erzeugen und Löschen von Objekten macht dann .NET und man selber steht doof da wenn man nicht sehen kann was und vor allem wann wirklich was passiert.

In deinem Fall glaubt .NET das ein Objekt gecastet werden muss und das geht natürlich nicht, die Collection gibt es anscheinend nicht. Das Group Objekt soll Erzeugt werden (SET Befehl in VB6) und anschließend soll in dieses nagelneue Objekt eine Zuweisung ("=" Operator) stattfinden und es soll genau das zugewiesen werden was als Rückgabewert aus der Add()-Methode der Collection herauskommt, die am Serverobjekt hängt. Das geht in VB6 in einer Zeile, in .NET offenbar nicht.

Da .NET das nicht kappiert wirst du dieser Supersprache etwas auf die Sprünge helfen müssen. Erst die Objekte (zu Fuß) erzeugen, dann (zu Fuß) initialisieren und wenn sie dann existieren kannst du hoffentlich auch Funktionen an ihnen aufrufen und etwas zuweisen.

Also in VB6 würde dein Programm schon laufen.

Ein Hinweis noch: ich habe gesehen das du die AddItem() Methode an der OPCItems Collection verwenden willst, wenn es bei einem Item bleibt ist das OK, wenn es aber mehrere Items werden sollen dann solltest du besser die AddItems (mit "s") Methode verwenden. Die hat zwar mehr Parameter aber diese Parameter brauchst du später sowieso (zum Read,Write,Remove, etc.)
 
Hallo zusammen,

dieses Problem interessiert mich momentan auch, da mir VS2008 die gleiche Fehlermeldung liefert (übrigens auch mit WEb-IO und Windows 7 (32Bit)).

Konnte schon jemand dass Problem erfolgreich lokalisieren und beheben?


Gruß,
Markus
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Juhu... ich hab meinen Fehler gefunden!!
Mein opcdaauto.dll war zu alt! Ich hatte Version 2.0.1.0.
Jetzt verwende ich 2.2.5.30. Damit geht es so wie wir zuerst dachten...
(Wie bei vb6)

Riesengroßes Dankeschön an Dr OPC für die Hilfe!!

Grüße Imod
 
Na das hört sich doch super an, da passte die DLL wohl nicht zum RCW.

Hier nochmal der gesamte Code eines Clients als Orientierung, habe ihn nicht getestet, sollte aber so ungefähr funktionieren bzw. einen Eindruck schaffen was man so beachten sollte.

Code:
Option Explicit
Option Base 1

Private WithEvents MyServer As OPCServer
Private WithEvents MyGroup As OPCGroup
'globals
Dim MyProgID1 As String
Dim MyNode1 As String
Dim MyItemIDs() As String
Dim MyServerHandles() As Long
Dim vDataBuffer() As Variant

' the main program
Private Sub Main()
' fill the ProgID of the Server
MyProgID1="OPC.Sample.1"
MyNode1="127.0.0.1"

' fill the ItemID wherever they come from, e.g. read from a file
ReDim MyItemIDs(3)
MyItemIDs(1)="Tag1" 
MyItemIDs(2)="Tag45" 
MyItemIDs(3)="Tag23" 

' now start the OPC Client
Call MyConnect()

'  the vDataBuffer(index) will always contain the latest value 
' ToDo: do something with the data

' don't forget to call MyDisconnect() in the Unload function

End Sub

' this function connects and adds one group and all items
Private Sub MyConnect()
Dim Errors() As Long
Dim CHs() As Long
Dim i As Long
Dim msgText As String

On Error GoTo errorhandler
    'connect to server
    Set MyServer = New OPCServer
    msgText = "connecting to " & ProgID1
    Call MyServer.Connect(ProgID1, Node1)
    
    'add group 
    MyServer.OPCGroups.DefaultGroupUpdateRate = 1000
    Set MyGroup = MyServer.OPCGroups.Add()
    'disable callbacks
    MyGroup.IsActive = False
    MyGroup.IsSubscribed = False
    
    'add items 
    ReDim CHs(UBound(MyItemIDs))
    For i = 1 To UBound(MyItemIDs)
        CHs(i) = i
    Next
    msgText = "adding items to " & ProgID1
    Call MyGroup.OPCItems.AddItems(UBound(MyItemIDs), MyItemIDs, CHs, MyServerHandles, Errors)
   'check for errors
    For i = 1 To UBound(MyItemIDs)
        If Errors(i) <> 0 Then
            Call MsgBox("AddItems for " & MyItemIDs(i) & " failed: " & MyServer.GetErrorString(Errors(i)), vbCritical)
        End If
    Next
    ReDim vDataBuffer(UBound(MyItemIDs))
    
    ' enable the callbacks
    MyGroup.IsActive = True
    MyGroup.IsSubscribed = True
    
    Exit Sub
errorhandler:
    Call MsgBox("ERROR when " & msgText, vbCritical)
    If Not MyServer Is Nothing Then Call MyDisconnect
End Sub

' this function cleans up
Private Sub MyDisconnect()
On Error GoTo errorhandler
    'remove the groups
    If Not MyGroup Is Nothing Then
        MyServer.OPCGroups.RemoveAll
        Set MyGroup = Nothing
    End If
    'disconnect the server
    If Not MyServer Is Nothing Then
        Call MyServer.Disconnect()
        Set MyServer = Nothing
    End If

    Exit Sub
    
errorhandler:
    Call MsgBox("Problems during disconnect", vbCritical)
End Sub

' event handler when server shuts down
Private Sub MyServer_ServerShutDown(ByVal Reason As String)
    Call MyDisconnect()
    Call MsgBox(MyServer.ServerName & vbCrLf & Reason, vbCritical)
End Sub

' event handler receiving new data from the server
Private Sub MyGroup_DataChange(ByVal TransactionID As Long, ByVal NumItems As Long, ClientHandles() As Long, ItemValues() As Variant, Qualities() As Long, TimeStamps() As Date)
Dim i As Long

For i = 1 To NumItems
    'check the quality before using the value
    If Qualities(i) = 192 Then
        'do not make call to the server again inside this callback (only fill the data buffer)
        vDataBuffer(ClientHandles(i)) = ItemValues(i)
    End If
Next

End Sub
Es braucht nur die ProgID es Servers und die Items befüllt werden und dann sind die Daten im DataBuffer.
 
Zuletzt bearbeitet:
Juhu... ich hab meinen Fehler gefunden!!
Mein opcdaauto.dll war zu alt! Ich hatte Version 2.0.1.0.
Jetzt verwende ich 2.2.5.30. Damit geht es so wie wir zuerst dachten...
(Wie bei vb6)

Riesengroßes Dankeschön an Dr OPC für die Hilfe!!

Grüße Imod

Hallo habe das gleiche Problem wie du... könntest du mir die opcdaauto.dll 2.2.5.30. mal zuschicken??

schon mal vielen Dank.
tn@solrosso.com
 
Zurück
Oben