Hallo,
ja nicht missverstehen ich bin über jede Antwort sehr glücklich. Ich glaube ich habe mich auch etwas schwammig ausgedrückt deshalb versuche ich mein Problem nochmals zu formulieren.
Also ich habe meinen Code dieser funktioniert auch super. ABER ich kann nun mit folgendem Code eine Verbindung zu ABB Freelance herstellen. In Excel schreibe ich meine Variablen rein und die Live Daten werden ausgelesen, ganz egal in welcher Zeile die Variablen stehen. Das ist schon mal super. Nun mein Problem (sub WRITE) wenn ich eine Variable ändern will, kann ich immer nur eine bestimmt Anzahl an Variablen ändern. In diesem Fall jetzt 7. Da ich aber manchmal 10 manchmal 100 manchmal 500 Variablen drin stehen hab möchte ich nicht immer den Code dazu anpassen.
Ich habe es versucht mit einem Zähler, heißt ich habe einen Zähler deklariert der jede belegte Zeile zählt und diesen dann mit der Zahl 7 ersetzt. Dann meckert Excel und sagt es braucht an dieser Stelle einen konstanten Wert. Das mit Dim und ReDim habe ich auch ausprobiert hat aber auch nicht geklappt (vielleicht habe ich auch was falsch gemacht).
Hat da jemand eine Idee das ich genau wie beim lesen von Daten auch beliebig viele Variablen schreiben kann? Mir wäre es auch schon recht das wenn ich alle Variablen eingelesen hab dann eine ändere und direkt diese Variable geschrieben wird. Excel muss ja nicht immer alle 500 Werte neu reinschreiben wenn nur ein Wert geändert wird.
Ich hoffe mir kann jemand helfen, hänge da echt schon lange dran.
Code:
Option Explicit ' every variable has to be declared
Option Base 1 ' every Array starts on Index 1
Private MyOPCServer As OPCServer
Private WithEvents MyOPCGroup As OPCGroup
Private MyOPCItems() As OPCItem
Private Sub cmdConnect__Click()
Dim i As Integer
Set MyOPCServer = New OPCServer
'connect the OPC Server
Call MyOPCServer.Connect(Cells(4, 2))
'add one OPC Group
Set MyOPCGroup = MyOPCServer.OPCGroups.Add("Gruppe1")
'apply for DataChange
MyOPCGroup.IsSubscribed = True
MyOPCGroup.UpdateRate = 500
'add Items
ReDim MyOPCItems(Cells(Rows.Count, 1).End(xlUp).Row - 8)
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row - 8
Set MyOPCItems(i) = MyOPCGroup.opcitems.AddItem(Cells(8 + i, 1), 8 + i)
Next i
'set buttons
End Sub
Private Sub cmdDisconnect__Click()
'disconnect the OPC Server
Call MyOPCServer.Disconnect
Set MyOPCServer = Nothing
'set buttons
End Sub
Private Sub cmdRead__Click()
Dim shandles(7) As Long 'parameter value
Dim Values() As Variant 'return value
Dim Errors() As Long 'return value
Dim Qual As Variant 'return value
Dim TS As Variant 'return value
Dim i As Integer
'save ServerHandles
shandles(1) = MyOPCItems(1).serverhandle
shandles(2) = MyOPCItems(2).serverhandle
shandles(3) = MyOPCItems(3).serverhandle
shandles(4) = MyOPCItems(4).serverhandle
shandles(5) = MyOPCItems(5).serverhandle
shandles(6) = MyOPCItems(6).serverhandle
shandles(7) = MyOPCItems(7).serverhandle
Call MyOPCGroup.SyncRead(OPCCache, 7, shandles, Values, Errors, Qual, TS)
For i = 1 To 7
Cells(8 + i, 5) = Values(i) 'column "read"
'Cells(8 + i, 8) = Qual(i) 'column "quality"
'Cells(8 + i, 9) = TS(i) 'column "timestamp"
Next i
End Sub
Private Sub cmdWrite__Click() <-- hier hängts! kann immer nur 7 bzw die konstante Zahl schreiben lassen die in der Klammer steht
Dim shandles(7) As Long 'parameter value
Dim Values(7) As Variant 'parameter value
Dim Errors() As Long 'return value
Dim i As Integer
shandles(1) = MyOPCItems(1).serverhandle
shandles(2) = MyOPCItems(2).serverhandle
shandles(3) = MyOPCItems(3).serverhandle
shandles(4) = MyOPCItems(4).serverhandle
shandles(5) = MyOPCItems(5).serverhandle
shandles(6) = MyOPCItems(6).serverhandle
shandles(7) = MyOPCItems(7).serverhandle
For i = 1 To 7
Values(i) = Cells(8 + i, 8)
If Values(i) = "" Then Values(i) = 0
Call MyOPCGroup.SyncWrite(7, shandles, Values, Errors)
Next i
End Sub
Private Sub MyOPCGroup_DataChange(ByVal TransactionID As Long, _
ByVal NumItems As Long, _
ClientHandles() As Long, _
ItemValues() As Variant, _
Qualities() As Long, _
TimeStamps() As Date)
Dim i As Integer
For i = 1 To NumItems
Cells(ClientHandles(i), 6) = ItemValues(i)
Next i
End Sub
Gruß
Lukas