OnlineVariablen in ModulElement MouseOver

OnlineVariablen in ModulElement MouseOver

Hallo,
in meinem Projekt haben sich über die Zeit viele DDE Variablen angesammelt. Mittlerweile über 5000. Um den Treiber und die Kommunikation zu meiner Master SPS (Beckhoff) etwas zu entlasten, wollte ich meine VBA Skripte jetzt umschreiben und auf OnlineContainer umstellen. Leider bin ich nicht sehr erfolgreich.
Bei meinem Bespiel ermittle ich aus einem Element per VBA (Mouseover) die verknüpfte Variable, aus der Variable mittels Stringoperationen einen Feld Index. Jetzt möchte ich abhängig von diesem Index auf zwei nicht im Bild verlinkte Variablen zugreifen. Ich habe eine Funktion erstellt die mir einen OnilneContainer erstellt und eine die ihn mir wieder zerstört.
Die Variablennamen werden einfach per Array als String übergeben.
Leider sind die Variablen nicht direkt nach dem Befehl .define verfügbar.
Wenn ich nach .define z.B. eine MsgBox ausgebe oder den Code im Debugmode schrittweise durchführe funktioniert es und ich kann den Wert der Variablen lesen. Ohne diese Unterbrechungen scheint es so, dass der Code schneller abgearbeitet wird als die Variablen eingelesen werden.
Hat hier jemand Erfahrung? Wie komme ich von den DDE Variablen weg, wie schaffe ich es, in einem Modulelement (z.B. LeftClickUp, MouseOver etc.) OnlineContainer zu nutzen und die Variablen nur für diesen Zeitraum zu lesen?
VBA Code:

Dim zOLVSub As OnlineVariable
Const strOLVSub As String = "OnlineVariablesSub"
Public Sub CreateOVL(sArr)
Dim StrVariables() As String
On Error GoTo ERROR_HANDLING
ReDim StrVariables(UBound(sArr))
For i = 0 To UBound(sArr)
StrVariables(i) = sArr(i)
Next i
'deactivate 'VariableChange' event
If Not zOLVSub Is Nothing Then zOLVSub.Undefine
thisProject.OnlineVariables.DeleteOnlineVariables (strOLVSub)
Set zOLVSub = Nothing
'get object if already exists
Set zOLVSub = thisProject.OnlineVariables.Item(strOLVSub)
If zOLVSub Is Nothing Then
'if not exitst, create a new OnlineVariable container
Set zOLVSub = thisProject.OnlineVariables.CreateOnlineVariables(strOLVSub)
'add variables (array) as bulk to the online container
zOLVSub.AddBulk StrVariables()
End If
'activate OnlineContainer
zOLVSub.Define
Exit Sub
ERROR_HANDLING:
'deactivate 'VariableChange' event
zOLVSub.Undefine
thisProject.OnlineVariables.DeleteOnlineVariables (strOLVSub)
Set zOLVSub = Nothing
MsgBox ("Skriptfehler")
End Sub


VBA Code:

Public Sub TerminateOVL()
On Error GoTo ERROR_HANDLING
'deactivate 'VariableChange' event
zOLVSub.Undefine
thisProject.OnlineVariables.DeleteOnlineVariables (strOLVSub)
Set zOLVSub = Nothing
Exit Sub
ERROR_HANDLING:
MsgBox ("Skriptfehler")
End Sub

VBA Code:

Public Sub MouseOver_Index_EnergieZaehler_Setzen(obElem As Element, vPosX As Variant, vPosY As Variant)
'Declarations
Dim nIndex As Integer
Dim sArr(1) As String
On Error GoTo ERROR_HANDLING
'Index aus verknüpfter Variable bestimmen
nIndex = Val(Mid(obElem.ItemVariable(0).Name, InStr(1, obElem.ItemVariable(0).Name, "[") + 1, (InStr(1, obElem.ItemVariable(0).Name, "]") - 1 - InStr(1, obElem.ItemVariable(0).Name, "[") + 1))) 'CStr(obElem.Name)
sArr(0) = "S0_.InitializeVariablesEnergyCounter[" & nIndex & "].adrSlave"
sArr(1) = "S0_.InitializeVariablesEnergyCounter[" & nIndex & "].adrEnergyArrayElementSlave"
'OnlineContainer mit den Benötigten Variablen erstellen, damit die Werte vom Treiber verfügbar sind
Call CreateOVL(sArr)
'Mit ermitteltem Index im Master den Slave und den Index im Slave bestimmen
'....
thisProject.Variables.Item("Visu_int_Index_Energiezähler").Value = zOLVSub.Item("S0_.InitializeVariablesEnergyCounter[" & nIndex & "].adrEnergyArrayElementSlave").Value
'Löschen des erstellten OnlineContainers um die Abfrage durch den Treiber von nicht benötigten Variablen zu stoppen
Call TerminateOVL
Exit Sub
ERROR_HANDLING:
'deactivate 'VariableChange' event
zOLVSub.Undefine
thisProject.OnlineVariables.DeleteOnlineVariables (strOLVSub)
Set zOLVSub = Nothing
End Sub


This is a migrated post! Originally posted on 13.07.2015 by user zero. Please be aware that information can be outdated.