Showing results 1 to 10 of 10

Thread: OnlineVariablen in ModulElement MouseOver

  1. #1

    Default 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?
    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


    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

    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
    Zenon 8.00

    Zenon Server Windows R2016

    Clients WebClientStarter / Windows 10 Enterprise

    ZenonWebserver 8.00



    --trust me i'm an engineer--

  2. #2
    Join Date
    30.05.2007
    Location
    Salzburg
    Posts
    881

    Default Re: OnlineVariablen in ModulElement MouseOver

    am einfachsten wäre es diese 3 variablen (quellvariablen - z.B. Motor1.xxxxx) auf einem zenon Standardbild (Pop-Up) zu verlinken. dann eine einfache bildumschaltfunktion mit subsititution mit einer indexvariable. anschließend einfach mit VBA (LeftClickDown) die stringvariable beschreiben (=ziel-substitution - z.B. Motor2) und bei loslassen der Maus (Up-Event) wird dann automatisch die funktion ausgeführt...

    Im folgenden Thread hab ich mal einen Beitrag dazu gemacht: http://www.copadata.com/forums/showthread.php?t=2515
    mit einem Demo-Projekt: http://www.copadata.com/forums/showp...8&postcount=10

    da braucht man sich dann nicht um online-container variablen kümmern... da macht dann zenon alles selbst...

    gruß,
    herbert


  3. #3

    Default AW: OnlineVariablen in ModulElement MouseOver

    Hallo Herbert,

    und Danke für deine Antwort. Leider ist dies keine Möglichkeit für mich. Zum einen ist dies nur ein Beispiel und ich möchte schließlich alle meine 5000 DDE Variablen loswerden, zum anderen mache ich hier eine doppelte Indizierung. Dies ist mit Zenon meines Wissens nach nicht direkt möglich. Das bedeutet, ich bestimme mittels VBA MouseOver einen Index aus einem Bildelement. Mit diesem Index bestimme ich zwei Variablen (aus insgesamt 800, deshalb möchte ich diese nicht auf einem Popup verlinken, es sollen nur diese beiden vom Treiber geladen werden) auf einer SPS. Diese 2 Variablen beinhalten jeweils einen Index (einmal für eine SPS und einmal für das Feldelement der gesuchten Variablen in dieser SPS) Diese beiden gesuchten Indexe schreibe ich in interne Zenonvariablen, mit denen ich dann bei Klick auf das oben schon genannte Bildelement die bildumschaltungsinterne Indizierung nutze. Ich hoffe es ist jetzt etwas verständlicher.
    Meine eigentliche Frage ist, stehen Variablen in einem OnlineContainer nach dem Define Befehl nicht direkt zur Verfügung? Es scheint mir eine sehr elegante Lösung zu sein, das ein VBA Skript die Variablen die es während seiner Abarbeitung benötigt einfach durch den Treiber läd und nach dem es ausgeführt wurde die Abfrage durch den Treiber wieder beendet um ihn zu entlasten.

    Gruß Tobi
    Zenon 8.00

    Zenon Server Windows R2016

    Clients WebClientStarter / Windows 10 Enterprise

    ZenonWebserver 8.00



    --trust me i'm an engineer--

  4. #4
    Join Date
    30.05.2007
    Location
    Salzburg
    Posts
    881

    Default Re: OnlineVariablen in ModulElement MouseOver

    Meine eigentliche Frage ist, stehen Variablen in einem OnlineContainer nach dem Define Befehl nicht direkt zur Verfügung? Es scheint mir eine sehr elegante Lösung zu sein, das ein VBA Skript die Variablen die es während seiner Abarbeitung benötigt einfach durch den Treiber läd und nach dem es ausgeführt wurde die Abfrage durch den Treiber wieder beendet um ihn zu entlasten.
    -> nein, das hängt mitunter ab wie lange die steuerung braucht die angeforderten werte zu liefern
    -> erst wenn die variable methode .IsOnline() true zurückgibt sind die variablen am treiber advised und haben einen gültigen wert

    siehe auch Handbuch -> Programmierschnittstellen -> Objectmodel -> Variable -> Variable-Methods -> IsOnline

    oder einfach hier im forum nach *IsOnline* suchen...

    gruß,
    herbert


  5. #5

    Default AW: OnlineVariablen in ModulElement MouseOver

    Hallo

    Ich habe schon versucht über die abfrage .IsOnline zu gehen, bzw. habe ich eine Variable hochzählen lassen, um mir hier eine Variable Wartezeit im VBA Code zu generieren. Wärend .IsOnline False liefert. Leider bringt das nichts. Genau so mit der Funktion Sleep oder Aplication.Wait....Nur wenn der Code tatsächlich gestoppt wird, z.B. mit einer MsgBox und dann weiter ausgeführt wird ist die Variable sofort danach adviced.
    Vielleicht versuche ich mal eine Msgbox zu schalten und dies gleich wieder per Code zu schließen
    Gibt es vielleicht die Möglichkeit den Treiber über VBA anzusprechen und eine Aktualisierung zu erzwingen?
    Das macht mich langsam echt irre, das ich den Container nicht in einem Zug erstellen und benutzten kann....

    Gruß Tobi
    Zenon 8.00

    Zenon Server Windows R2016

    Clients WebClientStarter / Windows 10 Enterprise

    ZenonWebserver 8.00



    --trust me i'm an engineer--

  6. #6
    martins Gast

    Default AW: OnlineVariablen in ModulElement MouseOver

    hi,

    mit dem Event VariableChange bekommst du mit, wenn ein Wert aus dem Container verfügbar ist. Vorher ist die Variable offline - kein Wert da - sobald die Variable advised ist und ein Wert da ist wird auch das Event gefeuert.

    lg
    Martin

  7. #7
    Join Date
    30.05.2007
    Location
    Salzburg
    Posts
    881

    Default Re: OnlineVariablen in ModulElement MouseOver

    VBA Beispiel verfügbar unter:
    Handbuch -> Programmierschnittstellen -> Objectmodel -> OnlineVariables

    im VariableChange() event auch das IsError implementieren (wie im beispiel).


  8. #8

    Default AW: OnlineVariablen in ModulElement MouseOver

    Hallo,

    leider kann ich euch nicht ganz folgen, mir steht die Methode Dim WithEvent...nur im ObjectModul zur Verfügung. Aber ich programmiere ja im ModulEvent. (MouseOver, LeftClickUP etc.) Oder muss ich dann über die Funktion Makro ausführen gehen?
    Dann könnte ich aber wieder meine Parameter die im Element enthalten sind nicht mitgeben.

    Ich bin aktuell am überlegen, ob ich für jede DDE Variable eine Interne Variable anlege. Hier sollte der Treiber schnell genug sein. Und diese Internen Variablen Zyklusmäßig mit den Werten der SPS beschreibe. Dann kann ich in meinen Skripten die Internen Variablen verwenden und für das Beschreiben habe ich dann mehr Zeit und kann es in zwei zeitgesteuerten Funktionen mit genügend Abstand antriggern um eine Verfügbarkeit sicher zu stellen.

    Gruß Tobi
    Zenon 8.00

    Zenon Server Windows R2016

    Clients WebClientStarter / Windows 10 Enterprise

    ZenonWebserver 8.00



    --trust me i'm an engineer--

  9. #9
    Join Date
    30.05.2007
    Location
    Salzburg
    Posts
    881

    Default Re: OnlineVariablen in ModulElement MouseOver

    Ich bin aktuell am überlegen, ob ich für jede DDE Variable eine Interne Variable anlege. Hier sollte der Treiber schnell genug sein. Und diese Internen Variablen Zyklusmäßig mit den Werten der SPS beschreibe.
    -> das wird nicht viel bringen, da für das lesen dieser sps-variablen diese ja wieder advised sein müssen, damit deren wert dann auf die internen geschrieben werden können
    -> auch wenn diese sps-variablen in einer variablen zuweisung als quell-variable verlinkt sind, werden diese permanent gelesen (also gleich wie dde-aktiv,... )

    es gibt in zenon verschiedene mechanismen welche bewirken, dass eine variable immer gelesen wird:
    - in einem archiv verlinkt
    - variablengrenzwert als alarm oder "in cel" definiert
    - in einer variablenzuweisung als quell- oder triggervariable verlinkt
    - harddisk-speicherung
    - dde-aktiv (bzw. in den neueren versionen "ständig lesen")
    - online container welcher gleich beim project_active() event befüllt und gestartet wird (und erst mit project_inactive wieder zerstört wird)...
    - .....

    anstatt hier diese angedachten kunstgriffe mit irgendwelchen zähler (wartezeiten) versuchen zu implementieren noch einmal mein vorschlag hier die werte-anzeige dieser variablen über eine standard-zenon bild zu realisieren.

    es könnte ja z.b. beim mouseover() event eine bestehende bildumschaltfunktion zu einem popup-bild (standard bild) modifziert werden in welchem dummy variablen verlinkt sind. eben dann diese dummy variablen über substitution austauschen.

    Anstatt der wildcard-variablensubstitution (ersetze *Motor1* mit Motor2) kann auch eine explizite Substitution angwendet werden
    -> siehe Handbuch -> Bilder -> Bildelemente bearbeiten -> Verknüpfungen von Variablen und Funktionen ersetzen -> Verknüpfungen ersetzen bei Bildumschaltung

    b) Automatisiert ersetzen mit Regeln
    Mehrere Einträge werden durch ein Semikolon ";" getrennt.
    Beispiel:
    Quelle: A;b
    Ziel: C;d


    Die Performance eines pollenden Treibers (wie eben der BeckhNG Treiber) können mit den Treibervariablen gemessen werden.
    -> siehe Treiber -> BeckhNG -> Variablen anlegen -> Treibervariablen
    Zeit seit letzter Aktualisierung der Prioritätsgruppe Normal in Millisekunden (ms).
    MaxUpdateTimeNormal
    UDINT
    56

    Wenn seperate Prioritäten im Treiber vergeben wurden (also nicht Globale Updatezeit) gibt es hierfür auch entsprechende Treibervariablen.


    gruß,
    herbert


  10. #10

    Default AW: OnlineVariablen in ModulElement MouseOver

    Hallo,

    danke für die Antwort, war die letzten Tage im Urlaub, werd mich aber die Tage mal wieder dran setzten. Das mit den Treiber Variablen ist gut zu wissen. Wenn ich weiter gekommen bin lass ich es euch wissen. Vielen Dank für die Unterstützung.

    Gruß Tobi
    Zenon 8.00

    Zenon Server Windows R2016

    Clients WebClientStarter / Windows 10 Enterprise

    ZenonWebserver 8.00



    --trust me i'm an engineer--

Similar Threads

  1. MouseOver fonction
    By dilem in forum VBA
    Replies: 2
    Last Post: 22nd December 2016, 14:35
  2. Replies: 1
    Last Post: 14th July 2011, 08:02
  3. Mit Mouseover eine Funktion ausführen??
    By zuercher in forum VBA
    Replies: 4
    Last Post: 26th November 2009, 18:47
  4. Dynamische Onlinevariablen im Container
    By bzoller in forum VBA
    Replies: 10
    Last Post: 25th September 2008, 14:45

Posting Rules

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •