Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
Ich habe ein Hauptprogramm mit einer Eventstruktur, in der auch auf Benutzerereignisse von anderen SubVIs aus reagiert werden soll.
Zu Testzwecken habe ich ein kleines SubVI erstellt, in dem ein Taster das Event auslösen und den Wert auf True/false setzen soll. Die Eventstruktur im Hauptprogramm "verschluckt" aber viele der Ereignisse aus dem SubVI, es wird dauern der timeout-case ausgelöst, manchmal zufällig auch der Richtige.
Falls mir jemand von Euch einen Tipp geben könnte, was die Ursache für dieses Problem ist, so würde ich mich sehr darüber freuen. Vielen Dank im Voraus.
Beim Erstellen eines Event-Cases ist der timeout-case standardmässig mit vorhanden und den lösche ich nicht, sondern erstelle nur neue weitere Cases. Das komplette VI kann ich aus Datenschutzgründen nicht hochladen, sondern nur in Auszügen Bildansichten.
Es hätte ja sein können, dass jemand einen Ansatz hat, warum ein definiertes Event manchmal ausgelöst wird und dann mal wieder nicht. Ich ging davon aus, wenn ich die Events einmal in einem VI registriet habe und die Referenzen (die ich in einer FGV nach dem Initialisieren ablegte) dann dazu verwenden kann, um aus einem anderen VI heraus ein Event auszulösen. Bisher funktionierte das auch ohne Probleme mit anderen Events, aber bei diesem nicht.
Ich habe mein Haupt-VI mit der Eventstruktur, die auf ein Benutzerereignis reagieren soll (siehe Bild). In dieser Eventstruktur ist auch ein timeout-Case vorhanden, auch wenn der nicht separat aufgeführt ist. In einem SubVI des Hauptprogramms initialisiere ich die Benutzerereignisse und speichere die Referenz in einer FGV. In dieser FGV sind die Einzelreferenzen zu den einzelnen Benutzerevents aufgeführt und die Referenz der Gesamtereignisse (siehe Bild).
Jetzt kann ich diese Referenzen auch in anderen VIs aus benutzen. Ich habe ich zwei SubVIs, in dem ich das gleiche Ereignis (KanalDefBearbVI) mit "Ereignis erzeugen" auslösen will. Wie oben in meinem anderen Beispieltestprogramm mit dem Button wird dort das Ereignis entweder auf true/false gesetzt, je nach dem, wie der Button gesetzt ist.
Meine Beobachtung ist folgende - die Ereignisse werden nur aus dem ersten SubVI vom Haupt-VI angenommen, von dem das Ereignis ausgelöst wurde. Wenn ich nun noch ein zweites SubVI habe, in dem ich auch das gleiche Ereignis auslösen will, wird im haupt-VI dann der timeout-case ausgelöst. Kann ich demzufolge ein Benutzerereignis ausschließlich von einem SubVI aus auslösen und nicht noch von einem zweiten anderen?
Ich habe nochmal ein kleines Testprogramm geschrieben, um das Problem einzeln zu betrachten. Ich habe ein Haupt-VI erstellt und zwei identische SubVIs, die ich mit SubVI1 und SubVI2 bezeichnet habe. An beide VIs werden die Referenzen übergeben und ich beobachte das gleiche - ich kann nicht von beiden VIs aus die Lampen in dem Haupt-VI ein- und ausschalten.
Ich habe das Beispielprogramm mit Hauptprogramm und den beiden SubVIs auch als Quellcode beigefügt, einmal in der Version 2012 und dann nochmal in der Version 2010 (Testprogramm_LV2010.zip).
Vielleicht kann sich ja einer von Euch das mal anschauen und mir weiterhelfen, ich würde mich sehr darüber freuen.
ich weiß nicht, was du hast, aber wenn ich dein Hauptprogramm (LV2010) starte und dann in den (von Hand zu öffnenden) subVIs Events auslöse, dann blinken die LEDs im Hauptprogramm...
vielen Dank, dass Du Dir mein Programm angeschaut hast.
Und Du kannst tatsächlich von beiden SubVIs aus die Events auslösen? Das Testprogramm bei mir funktioniert nur mit dem ersten SubVI, das zweite wird zwar auch gestartet, aber wenn ich dort die Events auslösen will, dann werden die nicht vom Hauptprogramm angenommen, sondern dort wird dann der timeout-Case anstelle des Benutzerevents ausgelöst.
01.07.2013, 15:29 (Dieser Beitrag wurde zuletzt bearbeitet: 01.07.2013 15:33 von GerdW.)
ich habe weiter damit rumgespielt und folgendes herausgefunden:
Du darfst die Events nicht in mehreren Eventstrukturen registrieren! Wenn du die dynamischen Events in den subVIs entfernst, funktioniert es problemlos!
Wenn es dir nur um den "Stopp"-Button geht: nutze doch dafür eine FGV!
Beim ersten Test hatte ich die subVIs nacheinander geöffnet...
registrieren tue ich die Events nur einmalig in dem Haupt-VI, das einzige was ich tue ist, dass ich die Referenz der Registrierung an die SubVIs übergebe, da ich darüber auch ein Event auslöse vom Hauptprogramm aus, um die SubVIs automatisch zu beenden, und diese deshalb auch in den SubVIs benötigt wird.
Aber vielleicht muss ich zwei separate Ereignisse registrieren, einmal für das subVI1 und für das SubVI2, weil ich so jetzt die Vermutung habe, dass im Speicher die Referenzadressen irgendwie durcheinandergebracht werden und dann garnichts mehr funktioniert. Eben hatt eich auch den Fall, dass es mit beiden subVIs zunächst von VI1 aus funktionierte, aber als ich dann einmal ein Event in subVI2 ausführte, funktionierte im subVI1 plötzlich auch nichts mehr und es wurde dann von beiden subVIs aus der timeout-case im Hauptprogramm ausgelöst.
mit "registrieren" meinte ich, dass du die Referenz der dyn. Events jedesmal über den Anschluß für "dyn. Events" einer Eventstruktur zuweist!
Woher soll LabVIEW nun wissen, welche Eventstruktur für die Abarbeitung dieser Events zuständig ist? 3 Strukturen, die sich alle um das gleiche Event kümmern sollen und die alle 3 sich darum rangeln, wer als erster den Zugriff auf die interne Event-Queue bekommt!
Da kann die beste IDE schon mal durcheinander kommen...