LabVIEWForum.de
Datenrückmeldung von DLL über Callback - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: DLL & externer Code (/Forum-DLL-externer-Code)
+---- Thema: Datenrückmeldung von DLL über Callback (/Thread-Datenrueckmeldung-von-DLL-ueber-Callback)



Datenrückmeldung von DLL über Callback - Kali - 20.10.2007 10:22

Hallo LabVIEW-Forum,

ich will eine dll in LV einbinden, welche die Verbindung zwischen einem Servocontroller und meiner LV Applikation herstellt.
Das Problem an der Sache ist das hier mit asynchroner Kommunikation gearbeitet wird. Die bedeutet dass die Antwort vom Servocontroller über eine Callbackfunktion kommt.

Hier die dll Funktion:

SetCallback(P_Callback)

P_Callback ist ein Zeiger auf eine Funktion CommandReply(cmd:TCommand)

TCommand ist eine Struktur mit folgendem Aufbau:
ID int(32)
Commad int(32)
Value int(32)
ByteArr byte[16]

Kann mir jemand einen Tip geben wie ich diesen Funktionspointer übergebe, bzw was ich mir unter LV als Funktion vorstellen kann ?
Wie kann ich außerdem mitbekommen wann dieses Callback auftritt, muss ich pollen oder kann ich das auch über einen Event abfangen?

Schon im Voraus besten Dank für jede Information

Gruß Kali


Datenrückmeldung von DLL über Callback - IchSelbst - 20.10.2007 15:32

Callbacks, wie du und ich sie gern hätten, gibt es nicht. Hast du dieses Tutorial mal überflogen? Ich glaub ich hab da was über Callbacks hineingeschreiben. Callsbacks würden schon gehen, aber nur so, wie LV das will.


Datenrückmeldung von DLL über Callback - IchSelbst - 20.10.2007 17:07

Eins hab ich vergessen: Wrapper-DLL - das geht immer.


Datenrückmeldung von DLL über Callback - rolfk - 22.10.2007 07:34

' schrieb:Kann mir jemand einen Tip geben wie ich diesen Funktionspointer übergebe, bzw was ich mir unter LV als Funktion vorstellen kann ?
Wie kann ich außerdem mitbekommen wann dieses Callback auftritt, muss ich pollen oder kann ich das auch über einen Event abfangen?

LabVIEW VIs sind das analoge von Funktionen in anderen Programmiersprachen. Aber LabVIEW VIs werden auf eine ganz andere Weise aufgerufen dann normale Funktionen, unter anderem sind die Parameter und lokalen Variablen nicht auf dem C Stack abgelegt sondern in LabVIEW eigenen Datenstrukturen. Deshalb ist es nicht möglich um ohne extra Aufwand ein LabVIEW VI als Callback Pointer an eine C Funktion zu geben. Was geht dann schon?

1) Eine Wrapper DLL stellt eine kompatible C Callback Funktion zur Verfügung und diese wird bei dem C Module auch registriert. Innerhalb dieser Callback Funktion findet eine Umsetzung des Events statt, etwa indem das Event in eine Queue geschrieben wird die von LabVIEW aus regelmässig gepollt wird, oder Umsetzung in eine LabVIEW Occurrence oder ein LabVIEW User Event. Persönlich habe ich es bis jetzt immer so gemacht, aber das ist nicht unbedingt für jeden weggelegt, da man doch einiges an C Programmierung machen muss und auch manchmal an den Rand dessen kommt was in LabVIEW noch dokumentiert ist.

2) Mit dem Applikation Builder ein VI in eine DLL umsetzen und darauf achten das der exportierte Funktionsprototyp genau übereinstimmt mit dem Interface der Callbackfunktion. Nun kannst Du mit LoadLibrary() diese DLL laden und mit GetProcAddress() einen Funktionspointer zu diesem umfunktionierten VI bekommen, sodass Du einen Pointer an Deine Set_Callback Funktion geben kannst. Auch das ist nicht ganz trivial und ohne einige C Kenntnisse etwa um den Funktionsprototypen wirklich korrekt nach dem Interface der Callbackfunktion zu bekommen, ein absolut sicherer Weg um eine Crashorgie zu starten.

2a) Mit .Net und Reflection kann man obiges Beispiel unter Punkt 2 nochmal enorm verkomplizieren um nun sicher zu sein dass möglichst viel der Windows Infrastruktur mit dieser Aufgabe getestet wird und die Chance auf unmittelbare Crashes zwar etwas verringern, aber um den zweifelhaften Vorteil dass es dann später immer mal wieder unter mysteriösen Umständen crasht.

Ausser obigen Beispielen, die alle nicht für jemanden sind der noch nie in C programmiert hat, ist die einzige Alternative entweder eine Methode ohne Callbacks zu benützen oder jemanden der da eben schon durchblickt damit zu beauftragen. Funktionspointer und damit Callbacks sind nun einmal nicht das Trivialste was es in C Land gibt.

Rolf Kalbermatter


Datenrückmeldung von DLL über Callback - Kali - 23.10.2007 16:48

Vielen Dank für die raschen Antworten,

ich werde dann mein Glück einmal mit einer Wrapper DLL versuchen Wink

Gruß Kali