OPC Items unbegrenzt erweitern
#1
Hallo miteinander,

ich habe ein Problem und hoffe ihr könnt mir ein bisschen auf die Sprünge helfen.

Ich habe mit Hilfe einer Anleitung und vielem hin und her eine OPC Connection zwischen Excel und dem ABB Freelance Engineering geschaffen. Die Verbindung steht und ich kann auch Werte lesen und diese im ExcelSheet verändern. So weit so gut. Nun habe ich bei meinem Code das Problem, das wenn ich weitere Items hinzufüge immer wieder den Code erweitern muss das er diese auch liest und ich sie bearbeiten kann.


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(6)
For i = 1 To 6
Set MyOPCItems(i) = MyOPCGroup.OPCItems.AddItem(Cells(20 + i, 1), 20 + 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 cmdWrite__Click()

Dim shandles(6) As Long 'parameter value
Dim Values(6) As Variant 'parameter value
Dim Errors() As Long 'return value
Dim i As Integer
Dim n As Interior

[color=#339933]shandles(1) = MyOPCItems(1).serverhandle[/color]
[color=#339933]shandles(2) = MyOPCItems(2).serverhandle[/color]
[color=#339933]shandles(3) = MyOPCItems(3).serverhandle[/color]
[color=#339933]shandles(4) = MyOPCItems(4).serverhandle[/color]
[color=#339933]shandles(5) = MyOPCItems(5).serverhandle[/color]
[color=#339933]shandles(6) = MyOPCItems(6).serverhandle[/color]                                                            
'shandles(7) = MyOPCItems(7).serverhandle

For i = 1 To 6
Values(i) = Cells(20 + i, 8)
If Values(i) = "" Then Values(i) = 0
Call MyOPCGroup.SyncWrite(6, 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

   

Ich hätte es nun gerne so, das wenn ich in Spalte A egal ob in Zeile 27 oder 1000 eine Messstelle eintrage das ich diese auch sofort lesen und schreiben kann ohne immer den Code zu verändern.
Das Problem liegt also hauptsächlich im markierten Bereich (denke ich :20: )

Ich hoffe mir kann hier jemand weiter helfen.

Liebe Grüße

Lukas
Top
#2
Code tags ?

Beispieldatei ?
Top
#3
Hier ist die Excel-Datei. Was meinst du mit "code tags?"
Also bin auf dem Gebiet ein absoluter Neuling deshalb bitte ich um entschuldigung wenn ich nicht alles sofort verstehe.


.xlsm   Connect_to_ABB.xlsm (Größe: 33,8 KB / Downloads: 1)

Gruß
Top
#4
Hallo,

(04.11.2016, 18:31)sAkuL1703 schrieb: Was meinst du mit "code tags?"

Das vierte oder fünfte Object von rechts sind die Tags wo Du Code besser lesbar darstellen kanst.


Angehängte Dateien Thumbnail(s)
   
Gruß Stefan
Win 10 / Office 2016
[-] Folgende(r) 1 Nutzer sagt Danke an Steffl für diesen Beitrag:
  • sAkuL1703
Top
#5
Hallöchen,

Deine "27" lässt mich vermuten, dass das Problem nicht in der markierten Zelle D8 liegt, sondern in den Schleifen im Code.

So eine Schleife
Code:
For i = 1 To 6
Set MyOPCItems(i) = MyOPCGroup.OPCItems.AddItem(Cells(20 + i, 1), 20 + i)
Next i
bearbeitet fix die Einträge der 21. bis 26. Zeile. Nun wäre die Frage, ob Du beim Eintrag in die 27. Zeile alles ab Zeile 21 bearbeiten willst oder nur die 27.

Den letzten Eintrag einer Spalte könntest Du z.B. so ermitteln und in Deine Schleife einbauen

Code:
For i = 1 To Cells(Rows.Count,1).End(xlUp).Row
Set MyOPCItems(i) = MyOPCGroup.OPCItems.AddItem(Cells(20 + i, 1), 20 + i)
Next i
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#6
Hallo, 
bin leider noch nicht dazugekommen es zu testen.

Zu deiner Frage:
Ich habe es so geplant, das man einmalig die Messstellenliste einliest und dann über einen Filter beliebig eine Messstelle auswählt und diese dann bearbeitet. Die Excel-Datei soll dann auf beliebig große Projekte angewandt werden können. Wenn nun ein Projekt 800 Messstellen und das nächste 634 Messstellen hat, möchte ich den Code nicht noch anpassen müssen. Ich hoffe mein Problem kommt so ein bisschen rüber ;)

Auf alle Fälle vielen Dank für deine so schnelle Antwort!!

Gruß
Top
#7
Hallöchen,

kommst Du denn da mit meinem Ansatz zurecht?

Da wr noch ein kleiner "logischer" Fehler drin.
Statt
For i = 1 To Cells(Rows.Count,1).End(xlUp).Row
Dann z.B.
For i = 1 To Cells(Rows.Count,1).End(xlUp).Row -20

Du musst die letzte Zeile natürlich auch beim Redim des Array berücksichtigen. Also nicht
Redim MyOPCItems(6)
sondern
Redim MyOPCItems(Cells(Rows.Count,1).End(xlUp).Row-20)


Du müsstest nur schauen, ob die 6 noch irgendwo eine Rolle spielt.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#8
Hallo,

danke dir. Also ein bisschen was kann ich schon damit anfagen.
Ich kann aber absolut nicht nachvollziehen für was die -20 steht?!?!

Gruß

Lukas
Top
#9
Hallo Lukas,

die Schleife in Deinem Code ging von 1 bis 6, die Zelleinträge erfolgten in die Zeilen 21 bis 26. Ich würde mit meinem Code z.B. die Zeile 26 als belegte Zeile feststellen. Dann würde Die Schleife ohne Korrektur von 1 bis 26 gehen ... Falls ich da noch einen Denkfehler hab, sind es vielleicht auch nur 14. Hab den Code jetzt nicht im "Hinterkopf" Wink, Muss schnell zum Abendbrot.

Mach aber eine Kopie der Originaldaten.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#10
Sad 
Hallo,

ich habe dein Code eingefügt und alles angepasst das funktioniert beim commando connect auch sehr gut. Heißt egal in welcher Zeile eine Messstelle steht wird diese beim drücken von Connect mit eingelesen. Danke dafür.

Jetzt habe ich aber ein weiteres Problem.

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
Public anzahlzeilen As Variant

Private Sub cmdConnect__Click()
anzahlzeilen = WorksheetFunction.CountA(Range("A9:A15"))
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("Gruppe 1")
'apply for DataChange
MyOPCGroup.IsSubscribed = True
MyOPCGroup.UpdateRate = 500
'add Items
ReDim myopcitems(anzahlzeilen)
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row - 20
Set myopcitems(i) = MyOPCGroup.opcitems.AddItem(Cells(20 + i, 1), 20 + 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 cmdWrite__Click()

anzahlzeilen = WorksheetFunction.CountA(Range("A9:A15"))

Dim whandles(anzahlzeilen) As Long 'parameter value             <---- FEHLER "KONSTANTER AUSDRUCK ERFORLDERLICH"
Dim Values(anzahlzeilen) As Variant 'parameter value
Dim Errors() As Long 'return value
Dim i As Integer

whandles(anzahlzeilen) = myopcitems(anzahlzeilen).serverhandle
'shandles(2) = MyOPCItems(6).ServerHandle
'shandles(3) = MyOPCItems(7).ServerHandle
'shandles(4) = MyOPCItems(8).ServerHandle
'find out the values which are written into the following cells (line 11+12, column F)
'this values should be writen into PLC
For i = 1 To anzahlzeilen
Values(i) = Cells(20 + i, 8)
If Values(i) = "" Then Values(i) = 0
Call MyOPCGroup.SyncWrite(anzahlzeilen, whandles, Values, Errors)
Next i

End Sub

Private Sub CommandButton1_Click()

Dim shandles() 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 source As Integer
Dim numitems As Long

Dim i As Integer

'save ServerHandles


'shandles() = myopcitems().serverhandle
'shandles() = myopcitems().serverhandle
'shandles() = myopcitems().serverhandle
'shandles() = myopcitems().serverhandle
'shandles() = myopcitems().serverhandle
'shandles() = myopcitems().serverhandle

Call MyOPCGroup.SyncRead(source, numitems, shandles, Values, Errors, Qual, TS)
'fill the cells with the read values
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row - 20
Cells(20 + i, 16) = Values(i) 'column "read"
Cells(20 + i, 14) = Qual(i) 'column "quality"
Cells(20 + i, 15) = TS(i) 'column "timestamp"
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

Ich wollte das ganze auch beim commando write einfügen, das hat aber nicht funktioniert. So bin ich auf die Idee gekommen eine globale Variable zu erstellen die, die Anzahl der gefüllten Zeilen zählt. Dies funktioniert leider auch nicht. Wie im Code geschrieben kommt dann immer der Fehler "Konstanter Ausdruck erforderlich". Weiß jemand wie ich das umbauen könnte das dies funktioniert?

Gruß

Lukas
Top


Gehe zu:


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