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