-> Hier kostenlos registrieren
Hallo zusammen.
Ich habe Versucht die Siemens Vorlage für einen Excel Client zu modifizieren. Speziel wollte ich 100 Variablen lesen können.
Nun funktioniert das eigentlic auch, aber nach einer weile und paar Simulierten Variablen änderungen am Server hängt sich der Client auf.
Weis jemand um Rat?
Geändert habe ich eigentlich nur die For schleifen. Da müsste der Fehler versteckt sein.
Eine andere Frage die mich quält, ist warum nur der erste Wert beim button click auf Start Client ausgelsen wird, die anderen erst beim ändern der Variablen.
Ich habe Versucht die Siemens Vorlage für einen Excel Client zu modifizieren. Speziel wollte ich 100 Variablen lesen können.
Nun funktioniert das eigentlic auch, aber nach einer weile und paar Simulierten Variablen änderungen am Server hängt sich der Client auf.
Weis jemand um Rat?
Geändert habe ich eigentlich nur die For schleifen. Da müsste der Fehler versteckt sein.
Eine andere Frage die mich quält, ist warum nur der erste Wert beim button click auf Start Client ausgelsen wird, die anderen erst beim ändern der Variablen.
Code:
Option Explicit 'Variablennamen müssen eindeutig sein
Option Base 1 'Indizes beginnen bei 1 (nicht 0)
Dim WithEvents MyOPCServer As OPCServer 'OPCServer-Objekt wird definiert
Dim MyOPCGroupColl As OPCGroups 'OPCGroups-Objekt wird definiert
Dim WithEvents MyOPCGroup As OPCGroup 'OPCGroup-Objekt wird definiert
Dim MyOPCItemColl As OPCItems 'OPCItems-Objekt wird definiert
Dim MyOPCItem As OPCItem 'OPCItem-Objekt wird definiert
Dim ClientHandles(1 To 100) As Long
Dim ServerHandles() As Long
Dim Values(1 To 100) As Variant
Dim Errors() As Long
Dim ItemIDs(1 To 100) As String
Dim ServerName As String
Dim NodeName As String
Dim GroupName As String
Dim CONNECTING As Boolean
Dim n As Long
Dim t As Integer
Sub StartClient()
'Connect to Server, create Groups, items etc.
On Error GoTo ErrorHandler 'sollte eigentlich verwendet werden!
CONNECTING = True
For n = 1 To 100
ClientHandles(n) = n
Next n
ServerName = Range("b4").Value
GroupName = Range("d4").Value
NodeName = Range("c4").Value
For n = 1 To 100
ItemIDs(n) = Cells(12 + n, 2).Value
Next n
'----------- Get an instance of the OPC server
Set MyOPCServer = New OPCServer
MyOPCServer.Connect ServerName, NodeName
Set MyOPCGroupColl = MyOPCServer.OPCGroups
'----------- Set the default active state for adding groups
MyOPCGroupColl.DefaultGroupIsActive = True
'----------- Add our group to the Collection
Set MyOPCGroup = MyOPCGroupColl.Add(GroupName)
Set MyOPCItemColl = MyOPCGroup.OPCItems
'----------- Add one item, ServerHandles are returned
MyOPCItemColl.AddItems 100, ItemIDs, ClientHandles, ServerHandles, Errors
'----------- A group that is subscribed receives asynchronous notifications
MyOPCGroup.IsSubscribed = True
Range("f4").Value = "Client on"
Range("g4").Value = CStr(MyOPCServer.LastUpdateTime)
Range("h4").Value = MyOPCItemColl.Count
Range("i4").Value = MyOPCServer.ServerState
Range("i4").Interior.Color = vbGreen
CONNECTING = False
Exit Sub
ErrorHandler:
MsgBox "Error: " & Err.Description, vbCritical, "ERROR"
CONNECTING = False
End Sub
Sub StopClient()
'----------- Release the Group and Server objects
If (Range("i4").Value <> 1) Then Exit Sub
MyOPCGroupColl.RemoveAll
'----------- Disconnect from the server and clean up
MyOPCServer.Disconnect
Set MyOPCItemColl = Nothing
Set MyOPCGroup = Nothing
Set MyOPCGroupColl = Nothing
Set MyOPCServer = Nothing
Range("f4").Value = "Client off"
Range("i4").Value = 0
Range("i4").Interior.Color = vbRed
Range("c5").Value = ""
End Sub
Private Sub StartButton_Click()
StartClient
Range("c5").Value = MyOPCServer.VendorInfo
End Sub
Private Sub StopButton_Click()
StopClient
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)
'------------ Ereignis wird ausgeloest, wenn sich Daten am Server ändern
'es wird jeweils nur ein Item abgefragt. es wird angenommen, daß sich nur eines gleichzeitig ändert
For n = 1 To 100
'wenn nur 2. Item sich geändert hat
If ClientHandles(1) = n Then Cells(12 + n, 9).Value = ItemValues(1) 'etc.
Next n
'If NumItems > 1 Then Range("B7").Value = ItemValues(2) 'Bedingung, wenn sich erstes Item ändert ist 2.Value nicht bekannt
Range("g4").Value = CStr(MyOPCServer.LastUpdateTime)
End Sub
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
'------------ Ereignis wird ausgeloest, wenn sich Daten in Arbeitsblatt ändern
If Range("i4").Value = 0 Or CONNECTING Then Exit Sub 'Abbruch falls nicht verbunden
'Abbruch falls sich nicht einer der Variablen-Werte geändert hat
For n = 1 To 100
If (Target <> Cells(12 + n, 9)) Then t = 0 Else t = 1
' wenn nicht Werte geändert -> exit
Next n
If (t = 0) Then Exit Sub
For n = 1 To 14
Values(1) = Cells(12 + n, 9).Value
Next n
MyOPCGroup.SyncWrite n, ServerHandles, Values, Errors 'Werte im Synchron-Modus auf Server schreiben
End Sub
Zuletzt bearbeitet: