Page 1 of 2 1 2 LastLast
Showing results 1 to 10 of 15

Thread: Makro ausführen nach Textfeldeingabe

  1. #1
    Join Date
    12.07.2013
    Posts
    20

    Frage Makro ausführen nach Textfeldeingabe

    Guten Tag.

    Giebt es eine Möglichkeit in Zenon, ein Makro direkt nach der erfolgreichen Eingabe eines Textes in ein Textfeld auszuführen?

    Bislang habe ich nichts dergleichen entdecken können.
    Das ganze sollte ohne Schleife, welche eine Wertänderung überwacht funktionieren.

    Ist das Möglich?

    Vielen Dank schonmal für alle Antworten.

  2. #2

    Default Re: Makro ausführen nach Textfeldeingabe

    Hallo Stoessa,

    Was für Textfeld wäre das genau? Ist das ein sollwert setzen und liegt eine zenon Variable dahinter wo der Text gespeichert ist?

    Mfg
    Mark

  3. #3
    Join Date
    12.07.2013
    Posts
    20

    Default Re: Makro ausführen nach Textfeldeingabe

    Hallo markclemens.

    Es handelt sich um einen dynamischen Text, mit der Eigenschaft SW setzen aktiv.
    Die Variable ist eine String Variable vom internen Treiber.


    Bislang werte ich den String über eine Reaktionsmatrix aus, jedoch wäre es meiner Meinung nach (auf meinen Fall bezogen) über ein Makro, welches nach einer Textänderung aufgerufen wird praktischer.

    Eine andere Frage habe ich noch:
    Bei den Funktionen giebt es die Auswahl: "VBA-Makro-Ausführen"
    Innerhalb des Fensters, welches sich nach der auswahl öffnet, sollte ich ein VBA Makro auswählen können. Innerhalb des Makro-Auswahlfensters befinden sich jedoch keine meiner angelegten Makros.
    Wo muss ich die Makros anlegen, damit sie in diesem Fenster erscheinen?

    Mfg
    Stoessa
    Last edited by stoessa : 27th August 2013 at 09:28

  4. #4

    Default Re: Makro ausführen nach Textfeldeingabe

    Hallo stoessa,

    Quote Originally Posted by stoessa View Post

    Es handelt sich um einen dynamischen Text, mit der Eigenschaft SW setzen aktiv.
    Die Variable ist eine String Variable vom internen Treiber.


    Bislang werte ich den String über eine Reaktionsmatrix aus, jedoch wäre es meiner Meinung nach (auf meinen Fall bezogen) über ein Makro, welches nach einer Textänderung aufgerufen wird praktischer.
    Das ist sehr einfach möglich über eine OnlineVariable in VBA. Dieses Objekt wird mit Events global deklariert, und im Project Active Event gesetzt. Für jede zenon Variable die der OnlineVariable hinzugefügt wird, gibt es bei einer Wertänerung oder Statusänderung, ein Event in VBA, wo eine Aktion ausgeführt werden kann. Ein Beispiel wie man eine OnlineVariable erstellt und verwendet, gibt es in der zenon online hilfe im Kapitel "Programming interfaces" -> Object Model


    Quote Originally Posted by stoessa View Post
    Eine andere Frage habe ich noch:
    Bei den Funktionen giebt es die Auswahl: "VBA-Makro-Ausführen"
    Innerhalb des Fensters, welches sich nach der auswahl öffnet, sollte ich ein VBA Makro auswählen können. Innerhalb des Makro-Auswahlfensters befinden sich jedoch keine meiner angelegten Makros.
    Wo muss ich die Makros anlegen, damit sie in diesem Fenster erscheinen?

    Mfg
    Stoessa

    Makros die in der Runtime ausgeführt werden sollen, sollen in der Regel unter "ThisProject" im VBA Editor für das jeweilige Projekt angelegt werden.

    Die Funktion "VBA Makro ausführen" zeigt nur solche Makros an, die mit der Anzahl der Übergabeparameter übereinstimmen.

    Ein Makro "Sub Test1()" sollte also ohne definierte Parameter auswählbar sein. Ein Makro "Sub Test2(tString as String) sollte auswählbar sein, wenn bei der zenon Funktion VBA Makro Ausführen ein Parameter definiert ist.

    Mfg
    Mark

  5. #5
    Join Date
    12.07.2013
    Posts
    20

    Default Re: Makro ausführen nach Textfeldeingabe

    Hallo,

    Wo legt man den Container überhaupt im VBA Project an?
    Es handelt sich um die Zeile: "Public WithEvents Container As OnlineVariable"
    In den Declarations wird diese rot, als Fehler, angezeigt.
    Wo muss diese also untergebracht werden?

    Es handelt sich bei meinen Variablen um ein Array mit mehreren tausend Variablen, die ich zwar alle benötige, aber nicht immer.
    Wäre folgende Vorgehensweise Vorteilhaft?

    In einer For-Schleife, zu beginn eines Zyklus erstelle ich einen Container mit einigen Variablen, werte diese für diesen Zyklus aus und lösche am Ende dieses Schleifenzyklus den Container wieder.
    Im nächsten Schleifenzyklus erstelle ich diesen Container erneut, mit anderen Variablen (über den index steigend), werte diese aus und lösche den Container erneut. usw... bis die For-Schleife zuende ist.
    Reply With Quote

  6. #6
    Join Date
    20.08.2009
    Posts
    293

    Default AW: Re: Makro ausführen nach Textfeldeingabe

    Hallo,

    Quote Originally Posted by stoessa View Post
    Wo legt man den Container überhaupt im VBA Project an?
    Es handelt sich um die Zeile: "Public WithEvents Container As OnlineVariable"
    In den Declarations wird diese rot, als Fehler, angezeigt.
    Wo muss diese also untergebracht werden?
    Normalerweise hier:
    thisProject -> General:
    Click image for larger version

Name:	olc.PNG
Views:	19
Size:	3.2 KB
ID:	1188


    Quote Originally Posted by stoessa View Post
    Es handelt sich bei meinen Variablen um ein Array mit mehreren tausend Variablen, die ich zwar alle benötige, aber nicht immer.
    Wäre folgende Vorgehensweise Vorteilhaft?

    In einer For-Schleife, zu beginn eines Zyklus erstelle ich einen Container mit einigen Variablen, werte diese für diesen Zyklus aus und lösche am Ende dieses Schleifenzyklus den Container wieder.
    Im nächsten Schleifenzyklus erstelle ich diesen Container erneut, mit anderen Variablen (über den index steigend), werte diese aus und lösche den Container erneut. usw... bis die For-Schleife zuende ist.
    Reply With Quote
    Ja, bei vielen Variablen welche nicht permanent benötigt werden macht es Sinn Onlinecontainer dynamisch zur Runtime zu verwalten.

    MfG,
    Bernhard

  7. #7
    Join Date
    12.07.2013
    Posts
    20

    Default Re: Makro ausführen nach Textfeldeingabe

    Hallo,

    danke für die hilfe.

    Ich habe den Container nun in "thisProject" deklariert und ebenfalls in "thisProject" ein Private Sub geschrieben, das durch eine Funktion aufgerufen wird.
    Innerhalb dieser Funktion möchte ich den Container erschaffen, Variablen zuweisen, diese auslesen und anschließend den Container entfernen.

    Das problem dabei ist, sobald ich den Container erschaffe stürzt meine Runtime ab.

    Hier der Teil, der für das Abstürzen Sorgt:

    Public WithEvents Container As OnlineVariable
    
    Public Sub FiltereArray()
    
        Debug.Print "--------------------Starte Filterung--------------------"
    
            Set Container = thisProject.OnlineVariables.CreateOnlineVariables(Verbrauchsdaten_Container)

    Ich weiß nicht, was genau ich falsch mache, da in der hilfe nur die programmfetzen zu finden sind, jedoch kein komplettes Programm, um zu sehen wie alles zusammenhängt.

  8. #8
    Join Date
    10.12.2007
    Posts
    176

    Lächeln AW: Re: Makro ausführen nach Textfeldeingabe

    Quote Originally Posted by stoessa View Post
            Set Container = thisProject.OnlineVariables.CreateOnlineVariables(Verbrauchsdaten_Container)
    Ist Verbrauchsdaten_Container eine String-Variable mit Inhalt? Eine Onlinevariable muss mit einem Namen erzeugt werden.
    Evtl. existiert auch bereits eine Onlinevariable mit diesem Namen.
    Ich erzeuge/zerstöre Onlinevariablen immer mit zwei extra Prozeduren:
    Private Function CreateOlv(ByVal strName As String) As OnlineVariable
    Dim zOv As OnlineVariable
    
    DestroyOlv strName
    Set zOv = thisProject.OnlineVariables.CreateOnlineVariables(strName)
    Set CreateOlv = zOv
    Set zOv = Nothing
        
    End Function
    
    Private Sub DestroyOlv(ByVal strName As String)
    Dim zOv As OnlineVariable
    
    Set zOv = thisProject.OnlineVariables.Item(strName)
    If Not zOv Is Nothing Then
        If zOv.Aktiv Then
            zOv.Undefine
        End If
        Set zOv = Nothing
        thisProject.OnlineVariables.DeleteOnlineVariables strName
    End If
    
    End Sub
    Wie man sieht, wird beim Erzeugen immer zuerst eine ggf. vorhandene Onlinevariable mit gleichem Namen zerstört. Damit ist sichergestellt, dass die Onlinevariable neu erstellt wird.

    Die Prozedur wird dann je nachdem aufgerufen wo man will. z.B.:
    Const cstr_OlvName As String = "Onlinecontainer"             'Name der Onlinevariable
    Private Sub Project_Active()
    Dim i As Long
    
    Set zOlv = CreateOlv(cstr_OlvName)
    For i = 0 To thisProject.Variables.Count - 1
        zOlv.Add thisProject.Variables.Item(i).Name
    Next i
    zOlv.Define
    
    End Sub
    
    Private Sub Project_Inactive()
    
    DestroyOlv cstr_OlvName
    
    End Sub
    Last edited by mst : 28th August 2013 at 10:50

  9. #9
    Join Date
    12.07.2013
    Posts
    20

    Default Re: Makro ausführen nach Textfeldeingabe

    Hallo,

    vielen Dank für deinen Post! Ich habe viel daraus lernen können.

    Aber irgendwie gelingt es mir nochnicht so ganz, meine Variablen aus der Beckhoff SPS (in diesem vereinfachten Versuch: "Ver[1].Send_Zaehlerstand") auszulesen und in Interne Variablen zu schreiben. (in diesem vereinfachten Versuch: "Verbrauchsdaten_Trend[0]" und "000FunktionstestContainer")

    Das vereinfachte Programm, ohne Schleife und mit nur einer SPS Variable, habe ich mal hinzugefügt.
    Die Runtime läuft zwar stabil und ohne Probleme, beim Ausführen des Public Sub FiltereArray, aber ich bekomme auch keinen Wert aus der Onlinevariable.

    Ist es irgendwie möglich das VBA Programm, während es in der Runtime ausgeführt wird, zu überwachen?

    Public WithEvents Container As OnlineVariable
    
    Public Sub FiltereArray()
    
        Debug.Print "--------------------Starte Filterung--------------------"
        Const sVerbrauchsdaten As String = "cVerbrauchsdaten"
        
        Set Container = CreateOlv(sVerbrauchsdaten)
        Container.Add ("Ver[1].Send_Zaehlerstand")
        Container.Define
        
        thisProject.Variables.Item("Verbrauchsdaten_Trend").SubItem(0).Value = Container.Item(0).Value
        thisProject.Variables.Item("000FunktionstestContainer").Value = Container.Item(0).Value
        
        DestroyOlv (strName)
    
    End Sub
    
    Private Function CreateOlv(ByVal strName As String) As OnlineVariable
    Dim Container As OnlineVariable
     
    DestroyOlv (strName)
    Set Container = thisProject.OnlineVariables.CreateOnlineVariables(strName)
    Set CreateOlv = Container
    Set Container = Nothing
     
    End Function
     
    Private Sub DestroyOlv(ByVal strName As String)
    Dim Container As OnlineVariable
    
    Set Container = thisProject.OnlineVariables.Item(strName)
    If Not Container Is Nothing Then
        If Container.Aktiv Then
            Container.Undefine
        End If
        Set Container = Nothing
        thisProject.OnlineVariables.DeleteOnlineVariables strName
    End If
     
    End Sub

  10. #10
    Join Date
    10.12.2007
    Posts
    176

    Default AW: Makro ausführen nach Textfeldeingabe

    Hm, ich bin mir nicht sicher, ob dieser Zugriff:

    thisProject.Variables.Item("Verbrauchsdaten_Trend").SubItem(0).Value

    funktioniert. Wenn Du den kompletten Variablennamen weisst (also inkl. Index) dann wäre es evtl. besser über den ganzen Namen zuzugreifen. z.B.:

    thisProject.Variables.Item("Verbrauchsdaten_Trend[0]").Value

    Allgemein würde ich in deinem Fall die Onlinevariable nicht mit WithEvents definieren, denn Du willst ja gar nicht auf Variablenänderung reagieren. Wenn die Variable mit WithEvents definiert wurde, dann wird nach Aufruf der Define Methode für jede Variable im Container das VariableChange Event aufgerufen - das kann ggf. bremsen.

    Der Ablauf lässt sich ganz einfach überprüfen indem Du entweder eine Stop-Anweisung in den Code einbaust (dadurch wird in der Runtime automatisch der Debugger aufgerufen), oder den VBA-Editor in der Runtime mit der zenon Funktion "VBA-Editor anzeigen" aufrufst und einen Haltepunkt in den Code setzt wo er unterbrochen werden soll.
    Im Debugmodus kannst Du dann Watchausdrücke definieren und damit herausfinden wo das Problem liegt.

Similar Threads

  1. Funktion mit VBA Makro aufrufen
    By jochenh in forum VBA
    Replies: 7
    Last Post: 27th June 2013, 23:36
  2. Filtern nach nicht verwendeten Variablen
    By ralfkindel in forum zenon Supervisor
    Replies: 1
    Last Post: 7th December 2011, 00:55
  3. VBA Makro wird nicht Abgearbeitet
    By philipp.muehlberger@nat.eu in forum VBA
    Replies: 9
    Last Post: 27th September 2011, 09:58
  4. Makro für aktuellen Focus
    By niclasfl in forum VBA
    Replies: 6
    Last Post: 22nd August 2011, 19:56
  5. VBA Makro geöffnete Bilder schliessen
    By perschke in forum VBA
    Replies: 5
    Last Post: 31st August 2010, 13:25

Posting Rules

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