LabVIEWForum.de
Event Callback Knoten verursacht Probleme mit den Treibern eines Devices - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: ActiveX & .Net (/Forum-ActiveX-Net)
+---- Thema: Event Callback Knoten verursacht Probleme mit den Treibern eines Devices (/Thread-Event-Callback-Knoten-verursacht-Probleme-mit-den-Treibern-eines-Devices)



Event Callback Knoten verursacht Probleme mit den Treibern eines Devices - wonx - 17.07.2009 10:40

Hallo liebe LV-Community,

ich hab mal wieder ein ganz spezielles Problem wo ich eure Hilfe benötige. Es geht um Folgendes:

Allgemein:
Ich habe ein Test-Device über USB verbunden und muss nachdem ein Testmodus im Device aktiviert wurde den ankommenden Datenstrom auswerten.
Da das Ganze eine Zeitmessung ist wurde in die Treiber des Devices ein Eventtrigger eingebaut, der immer dann auslöst wenn eine neue Nachricht über den USB Port hereinkommt.

LabVIEW:
Ein entpsrechendes .NET-Refnum, welches auf das Objekt zeigt das den Eventtrigger enthält, wird mit einem "Register Event Callback"-Block verbunden. Auf diese Art uns Weise wird nun jedes mal wenn der Eventtrigger ausgelöst wird ein Event Callback VI gestartet indem die Daten ausgewertet werden können.

Der Programmablauf:
Anlegen der entsprechenden Windows Objekte durch die Treiber --> Öffnen der Verbindung zum Device--> zwischenspeichern aller nötigen Refnums auf die angelegten Windowsobjekte --> verknüpfen des entsprechenden Refnum mit dem "Register Event Callback"-Knoten --> Starten des internen Testmodus --> Stoppen des internen Testmodus --> Unregistrieren des Event-Blocks per "Unregister for Events" Block --> Schließen der Referenz auf das Callback VI per "Close Reference" Block --> Schließen der Verbindung --> entsorgen der Windows Objekte für die Verbindung (Treiberfunktion, entspricht in etwa der Funktionalität des Close Reference Blocks. Kann mich aber auch irren die ganze Windows/Treiber Sache ist nicht gerade meine Stärke)

Problem:
Wenn ich das ganze Programm in einer Schleife laufen lasse tritt beim zweiten Durchlauf ein Fehler beim anlegen der Windows Objekte und Öffnen der Verbindung auf:
(System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
Inner Exception: System.InvalidOperationException: Could not create and open PhoneControl object. Reason: The invoked member is not supported in a dynamic assembly.
Inner Exception: System.NotSupportedException: The invoked member is not supported in a dynamic assembly.
) in test_phone_connection.vi

Wie sich herausgestellt hat liegt das Problem am Registrieren des Events per "Register Event Callback" Blocks da durch diesen irgend ein angelegtes Windows Objekt (so meine momentane Vermutung) beim Dispose wohl nicht gelöscht wird und beim nächsten Versuchsaufbau den obigen Fehler verurasacht. Denn wenn ich LabVIEW komplett schließe und wieder aufmache kann die Verbindung beim ersten Durchlauf ohne Probleme aufgebaut und auch wieder geschlossen werden (beim Dispose tritt offiziell kein Fehler auf)

Kennt sich Jemand von Euch mit sowas aus und kann mir sagen ob ich irgendwo was Falsch mache, bzw. etwas vergessen habe zu machen?

Gruß, wonx


Event Callback Knoten verursacht Probleme mit den Treibern eines Devices - rolfk - 22.07.2009 07:36

' schrieb:Wie sich herausgestellt hat liegt das Problem am Registrieren des Events per "Register Event Callback" Blocks da durch diesen irgend ein angelegtes Windows Objekt (so meine momentane Vermutung) beim Dispose wohl nicht gelöscht wird und beim nächsten Versuchsaufbau den obigen Fehler verurasacht. Denn wenn ich LabVIEW komplett schließe und wieder aufmache kann die Verbindung beim ersten Durchlauf ohne Probleme aufgebaut und auch wieder geschlossen werden (beim Dispose tritt offiziell kein Fehler auf)

Kennt sich Jemand von Euch mit sowas aus und kann mir sagen ob ich irgendwo was Falsch mache, bzw. etwas vergessen habe zu machen?

Für Event Callbacks gibt es auch eine Deregistrierungsfunktion. Rufst Du die auf bevor Du im nächsten Durchlauf wieder versuchst den Callback zu registrieren? Besser wäre die Registrierung nur einmal am Anfang der Software zu machen und danach am Ende vor dem Abschliessen die Deregistrierung.

Rolf Kalbermatter


Event Callback Knoten verursacht Probleme mit den Treibern eines Devices - wonx - 28.07.2009 12:38

Zitat:Für Event Callbacks gibt es auch eine Deregistrierungsfunktion. Rufst Du die auf bevor Du im nächsten Durchlauf wieder versuchst den Callback zu registrieren?

Ja das habe ich versucht, jedoch ohne Erfolg. Nach der Analyse des Problems hat sich letztendlich herausgestellt, dass beim Registrieren des Events LabVIEW die Referenz überschreibt. Zwar lassen sich dann noch die Propertys und Methoden wie z.B "Dispose" ohne Fehler aufrufen jedoch verwirft .Net bei Letzterem die Objekte nicht wie gewollt. Dadurch kam es natürlich immer zu Fehlern bei dem Versuch die Objekte neu anzulegen.


Zitat:Besser wäre die Registrierung nur einmal am Anfang der Software zu machen und danach am Ende vor dem Abschliessen die Deregistrierung.

Letztendlich ist es auch auf diese Realisierung hinausgelaufen. Ich lege nun zu Beginn die Treiber mit ein paar Dummy-Objekten für das Device an und "scanne" während des Programms lediglich nur noch nach dem angeschlossenen Device. So gesehen sogar eine weniger aufwendig und rechenintensive LösungSmile

Glücklicherweise konnte ich mein Problem auf diese Weise lösen allerdings denke ich sollte sich NI vielleicht einmal mit dieser Thematik auseinandersetzen da hier ja irgendwas mit .Net nicht reibungslos funktioniert.

Trotzdem Danke dass Du Dich mit meinem recht speziellen Problem befasst hast.

Gruß, Christian W.


Event Callback Knoten verursacht Probleme mit den Treibern eines Devices - rolfk - 28.07.2009 14:32

Ich glaube nicht das das Problem bei LabVIEW liegt. Wenn Du ein Object in .Net (und COM/ActiveX) initilisiert hast musst Du es auch wieder deinitialisieren. Also für jedes Register Even muss auch irgendwo ein Deregister sein. So wie Du das beschreibst scheint das verwendete Objekt noch eine eigene zusätzliche Limitation zu haben, dass es nämlich sogenannt (pseduo)-statisch ist, also nur einmal instantiert werden kann. Das ist nicht nach .Net Regeln aber wenn es das tut sollte es das dann auf die richtige Weise tun und nicht seine eigene interne statische Referenz bei Neuinstantierung überschreiben.

Sollte trotzdem gehen wenn Du nachdem Du einmal Register gemacht hast immer auch wieder Deregister machst bevor Du wieder Register machst. Wenn das nicht geht ist etwas ziemlich faul mit dem .Net Control.

Rolf Kalbermatter