18.01.2007, 11:17
Beitrag #1
|
Mr.T
LVF-SeniorMod
Beiträge: 1.007
Registriert seit: Jun 2005
2009
2005
kA
88400
Deutschland
|
Übergabe eines Pointers
Hallo!
Anbei mal ein Beispiel VI. Ich habe dem DLL Aufruf (Funktion erwartet u.A. einen Pointer) ein Numerisches Element aus einem Cluster zugewiesen. Die Funktion signalisiert über diesen Pointer, oder besser gesagt den Inhalt der Speicherstelle, einen Zustand.
Das heisst: Ich übergebe einen Pointer auf ein numerisches Bedienelement. Die Funktion sollte mittels des Pointers den Inhalt des Elemetns ändern, z.B. eine 1 hineinschreiben.
Da alle anderen DLL Aufrufe funktionieren, gehe ich davon aus, dass ich wohl falsch auf dieses Ereignis warte...:
Und hier das VI welches die Funktion aufruft:
DAQ_HalfReady.vi (Größe: 17,27 KB / Downloads: 276)
So, ich hoffe Ihr könnt mir da helfen...
Die LLB ist hier im Forum zu finden unter:
http://www.LabVIEWforum.de/index.php?showtopic=4511
Gruß und Dank!
Mit einem freundlichen Wort und etwas Gewalt erreicht man viel mehr als nur mit einem freundlichen Wort. [...Marcus zu Lennier, B5]
|
|
|
18.01.2007, 12:01
Beitrag #2
|
|
|
18.01.2007, 13:45
(Dieser Beitrag wurde zuletzt bearbeitet: 18.01.2007 13:46 von cb.)
Beitrag #3
|
cb
LVF-SeniorMod
Beiträge: 1.731
Registriert seit: Feb 2006
2018SP1
2001
EN
40xxx
Deutschland
|
Übergabe eines Pointers
' schrieb:Laut diverser LV-Experten sind lokale Variablen alles Kopien. Wenn dem so ist, wird das mit dem Pointer nichts.
Frage:
Ist das Element in der While-Schleife nun eine Kopie mit eigenem Speicherbereich, oder zeigen alle "Variablen-Instanzen" auf ein und den selben Speicherbereich?
weder noch ...
eine lokale Variable ist eigentlich eine Funktion, die entweder den Wert eines Controls verändern oder den Wert eines Controls lesen kann. Beim Schreiben wird automatisch das Frontpanel aktualisiert, damit der geschriebene Wert auch sichtbar ist. Mit Variablen im Sinne von Variablen in C/C++ hat das überhaupt nichts gemeinsam.
Die mit den Variablen in C/C++ vergleichbaren Elemente in LabVIEW sind die Drähte!
Was ichSelbst da nun macht ist: er prüft, ob ein Control auf dem Frontpanel einen bestimmten Wert hat. Wo dieser Wert nun herkommt ist dem Programm völlig wurschd. Das kann durch eine andere lokale Variable gesetzt worden sein, oder der User hat den Wert des Controls verändert, dabei wird immer der gerade aktuelle Wert gelesen. Wenn man nun schnell genug klicken kann, kann man durchaus den Wert einers Controls verändern, ohne dass die lokale Variable alle Änderungen mitbekommt ...
Ansonsten: in LV gibt es intern zwar durchaus Zeiger, aber die sind dem Benutzer nicht zugänglich noch in irgend einer anderen Art und Weise sichtbar. Die Aussage "Ich übergebe einen Pointer auf ein numerisches Bedienelement." ist also Quatsch.
|
|
|
18.01.2007, 14:19
Beitrag #4
|
|
|
18.01.2007, 17:36
Beitrag #5
|
Achimedes
LVF-Freak
Beiträge: 544
Registriert seit: Aug 2005
2011
2001
DE
72461
Deutschland
|
Übergabe eines Pointers
Huhu,
ich glaube so wolltest du das haben?
Oder?
DAQ_HalfReady.vi (Größe: 18,73 KB / Downloads: 352)
Wer Rechtschreibfehler findet .... darf sie behalten.
|
|
|
18.01.2007, 18:54
Beitrag #6
|
cb
LVF-SeniorMod
Beiträge: 1.731
Registriert seit: Feb 2006
2018SP1
2001
EN
40xxx
Deutschland
|
Übergabe eines Pointers
' schrieb:Pointer auf z.B. Datenwerte zum Zwecke der externen Manipulation dieses Datenwertes gibt es also nicht - demzufolge kann man sie auch nicht an die DLL übergeben.
Mr.T, warum macht du nicht einfach anstelle des Variablenzugriffs einen DLL-Aufruf zum Lesen des Wertes?
Wenn du die Call Library Node verwendest und einstellst, dass der Wert aus LabVIEW als Pointer übergeben werden soll, dann wird der Wert per Pointer übergeben. Einen "echten" Pointer kannst du in LV Blockdiagramm nicht erzeugen.
Ich frag mich aber, was das nun mit der lokalen Variaben aus dem Bild zu tun hat ?
|
|
|
18.01.2007, 19:05
Beitrag #7
|
IchSelbst
LVF-Guru
Beiträge: 3.696
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
Übergabe eines Pointers
' schrieb:Ich frag mich aber, was das nun mit der lokalen Variaben aus dem Bild zu tun hat ?
Soviel ich verstanden habe, will er folgendes machen:
In einem bestimmten DLL-Aufruf, z.B. ganz am Anfang des LV-Programmes, übergibt er einen Zeiger auf die Variable DAQ_HalfReady.Haldready (was ja gar nicht geht). Die DLL nun besitzt einen eigenen Prozessor-Thread, der mittels dieses Zeigers auf die Variable DAQ_HalfReady.Haldready schreiben wird. Im LV-Programm würde man dann alleine durch Abfragen dieser Variablen - siehe Bild - einen Status der DLL feststellen können, ohne die DLL selbst danach fragen zu müssen.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
19.01.2007, 07:20
Beitrag #8
|
cb
LVF-SeniorMod
Beiträge: 1.731
Registriert seit: Feb 2006
2018SP1
2001
EN
40xxx
Deutschland
|
Übergabe eines Pointers
' schrieb:Soviel ich verstanden habe, will er folgendes machen:
In einem bestimmten DLL-Aufruf, z.B. ganz am Anfang des LV-Programmes, übergibt er einen Zeiger auf die Variable DAQ_HalfReady.Haldready (was ja gar nicht geht). Die DLL nun besitzt einen eigenen Prozessor-Thread, der mittels dieses Zeigers auf die Variable DAQ_HalfReady.Haldready schreiben wird. Im LV-Programm würde man dann alleine durch Abfragen dieser Variablen - siehe Bild - einen Status der DLL feststellen können, ohne die DLL selbst danach fragen zu müssen.
ahso ... äh, ja ... das geht natürlich nicht. Wenn, dann muss man die DLL pollen ...
|
|
|
21.01.2007, 18:11
(Dieser Beitrag wurde zuletzt bearbeitet: 21.01.2007 18:17 von Mr.T.)
Beitrag #9
|
Mr.T
LVF-SeniorMod
Beiträge: 1.007
Registriert seit: Jun 2005
2009
2005
kA
88400
Deutschland
|
Übergabe eines Pointers
Hallo!
Erholt vom WE und dem Usertreff (wo ich dann doch einige hier aus dem Thema hier vermisst habe ) kann ich mich nun wieder meiner Frgaestellung widmen (Sorry dafür!).
Es geht mir um folgendes:
Die Funktion HalfReady() soll mittels des übergebenen Pointers signalisieren, dass Daten zum abholen bereit sind. Also würde ich in C einfach den Pointer übergeben, um der Funktion zu ermöglichen, mir irgendwie mitzuteilen, dass die Daten bereit zum abholen sind. Nämlich, in genau dieser übergebenen Speicherstelle (Pointer). Die DLL Funktion HalfReady() sollte den Wert, auf den der Pointer zeigt, verändern und somit mitteilen, dass ich was tun muß, um die Daten zu erhalten. Das sollte die while(HalfReady!=0) - Schleife andeuten.
Da Ihr jetzt schon so fleißig diskutiert habt, merke ich, dass ich das so garnicht realisieren kann. Die Frage bleibt nun: Wie dann?
Die DLL Funktion Teilt mir nunmal über den Inhalt der übergebenen Pontervariablen mit, dass ich was tun muß...
Was meint Ihr dann mit "DLL Pollen"?
Gruß und DANK!
Edit:
Die lokale Variable habe ich eingefügt, da das Bedienelement dazu weiter vorne im Programm verwendet wird - nur Optik. In diesem Bedienelement gibt es das Element "HalfReady", welches durch die DLL also verändert werden hätte sollen. klar, ich kann auch direkt das Bedienelement anschliessen, aber wie ich Euch verstehe, hätte das auch nichts gebracht. Das Zweite Element des Clusters (Bedienelementes) ist der andere Übergabeparameter der HalfReady(Pointer, 2.Parameter), auf welchem eingegeben wird, auf welche "id", also DAQ-Karte sich der DLL-Aufruf bezieht....
Mit einem freundlichen Wort und etwas Gewalt erreicht man viel mehr als nur mit einem freundlichen Wort. [...Marcus zu Lennier, B5]
|
|
|
21.01.2007, 19:14
|
IchSelbst
LVF-Guru
Beiträge: 3.696
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
Übergabe eines Pointers
' schrieb:Die DLL Funktion Teilt mir nunmal über den Inhalt der übergebenen Pontervariablen mit, dass ich was tun muß
Dieses Verfahren (das quasi einem Callback entspricht nur ohne Programm) ist aber nicht verträglich mit LV. Mit anderen Worten: Das geht nicht (zumindest bisher, bis ich den Rest ausprobiert habe).
Zitat:Was meint Ihr dann mit "DLL Pollen"?
Na, pollen halt - zyklisch nachfragen: DLL, hast du was für mich? DLL, hast du was für mich? DLL, hast du was für mich? DLL, hast du was für mich? (usw)
Zitat:klar, ich kann auch direkt das Bedienelement anschliessen, aber wie ich Euch verstehe, hätte das auch nichts gebracht.
Das bringt auch nichts: Am DLL-Knoten ist nämlich niemals ein Bedien/Anzeigeelement angeschlossen - sondern immer ein Draht, also eine ganz spezielle Datenkopie.
Hast du mal die Möglichkeit Callback angedacht?
Fazit:
Bis jetzt steht's schlecht aus.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
| |