OPC Items unbegrenzt erweitern
#11
Hallöchen,
Zum Dimensionieren nimmt man Konstanten. Alternativ dimensioniert man ohne Wert und programmiert anschliessend den Wert mit Redim.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#12
Hallo,

kannst du mir zeigen wie das funktioniert? Ich habe es probiert bin aber am verzweifeln.

Gruß

Lukas
Top
#13
Hallöchen,

im Prinzip so:

Code:
Dim whandles
Redim whandles(anzahlzeilen)
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#14
Hallo,

das hab ich so gemacht gehabt. Also ist das wohl nicht die Lösung für mein Problem.

Gruß
Top
#15
Hallöchen,

Hm. Aber darauf kann ich jetzt auch keine Antwort geben.... Das war zur Frage nach dem Fehler mit dem konstanten Ausdruck. Der muss ja nun weg sein.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#16
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
Top
#17
Hallo Lukas,

zielführender wäre es gewesen, wenn Du Deine Versuche mit ReDim geschrieben hättest.
Das ganze drumherum ist doch erst einmal völlig uninteressant. Wink

Hier solltest Du die kleinen, aber feinen Unterschiede erkennen können:
Sub Test1()
 Dim lngZ As Long
 Dim Feldvariable As Variant    '<<< so geht es!
 
 lngZ = 7
 ReDim Feldvariable(lngZ)
 
 MsgBox UBound(Feldvariable)
End Sub

Sub Test2()
 Dim lngZ As Long
 Dim Feldvariable As Long    '<<< so geht es nicht!
 
 lngZ = 7
 ReDim Feldvariable(lngZ)
 
 MsgBox UBound(Feldvariable)
End Sub

Sub Test3()
 Dim lngZ As Long
 Dim Feldvariable() As Long    '<<< so geht es!
 
 lngZ = 7
 ReDim Feldvariable(lngZ)
 
 MsgBox UBound(Feldvariable)
End Sub
Gruß Uwe
Top
#18
Hallo,

ja den Unterschied erkenne ich danke. Aber wie kann ich das ganze jetzt in meinen cmd_write einbauen? Und bitte nicht gleich draufhauen Big Grin wenn ihr meinen Versuch sieht.


Code:
Private Sub cmdWrite__Click()

Dim lngZ As Long
Dim Feldvariable() As Long
Dim shandles() As Long
Dim Values() As Variant
Dim Errors() As Long
Dim i As Integer

lngZ = WorksheetFunction.CountA(Range("A9:A999999"))

shandles(lngZ) = MyOPCItems(lngZ).serverhandle

ReDim Feldvariable(lngZ)
For i = 1 To lngz
Values(i) = Cells(8 + i, 8)
If Values(i) = "" Then Values(i) = 0
Call MyOPCGroup.SyncWrite(lngZ, shandles, Values, Errors)
Next i

End Sub

Ich dachte so könnte es funktionieren...

Gruß

Lukas
Top
#19
Hallo Lukas,

so vielleicht:
Private Sub cmdWrite_Click()

Dim shandles() As Long 'parameter value
Dim varValues() As Variant 'parameter value
Dim myErrors() As Long 'return value
Dim i As Integer
Dim lngVariableZahl As Long

lngVariableZahl = 7
ReDim shandles(lngVariableZahl)
ReDim varValues(lngVariableZahl)

For i = 1 To lngVariableZahl
shandles(i) = MyOPCItems(i).serverhandle
Next i

For i = 1 To lngVariableZahl
varValues(i) = Cells(8 + i, 8)
If varValues(i) = "" Then varValues(i) = 0
Call MyOPCGroup.SyncWrite(lngVariableZahl, shandles, varValues, myErrors)
Next i

End Sub
Gruß Uwe
[-] Folgende(r) 1 Nutzer sagt Danke an Kuwer für diesen Beitrag:
  • sAkuL1703
Top
#20
Hallo Uwe,

ich bedanke mich vielmals!!! Habe das noch ein bisschen umgeschrieben und die 7 mit einem Zähler ersetzt und connect_read_write in einen Button zusammengefasst. Funktioniert erstmal ganz gut. Am Ende bin ich aber noch nicht, ihr werdet bestimmt nächstens wieder von mir hören :D.

Aber bis dahin recht herzlichen Dank!!!

Gruß
Lukas
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste