INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Picotech TC-08 Thermologger



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!

22.01.2009, 15:24
Beitrag #21

AndiMetzger Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 77
Registriert seit: Jan 2006

7.1
2005
kA


Deutschland
Picotech TC-08 Thermologger
Hi Jens,

dieses VI funktioniert auch, ist das get_unit_info.vi!

Was hier nun anderst ist, es werden noch die Variablen string_length und line übergeben, was so nicht in der Doku zur DLL stand.

TOLL!Grrr

Das funktioniert soweit auch, aber sobald nur ein paar mehr Dinge parallel im Program passieren, so stürzt LabVIEW weiterhin ab.

Nun habe ich im Taskmanager des Windows XP die Priorität der LabVIEW.exe auf höchste Priorität gesetzt.

So funktioniert es. Was kann man da dauerhaft machen?


Angehängte Datei(en)
Sonstige .vi  get_unit_info_7.1_get_unit_info_neu.vi (Größe: 19,32 KB / Downloads: 238)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
01.02.2009, 08:42
Beitrag #22

rolfk Offline
LVF-Guru
*****


Beiträge: 2.306
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
Picotech TC-08 Thermologger
' schrieb:Hm, ich glaub du hast es jetzt nicht richtig verstanden!? Schau dir doch mal bitte nochmals den dritten screenshot oben von mir an!

Ich bekomme ja gar kein Cluster zurück also kann ich ja auch kein Cluster in einen String umwandeln.

Die Funktion gibt direkt einen String zurück, was ja falsch ist, welcher immer leer ist, weil ja der Funktionsaufruf ein Cluster ausgeben würde und nicht einen String.

Also wie bekommt man das hin, dass ein Cluster in 7.1 zurückgegeben wird?

Wenn Du Cluster an die Call Library Node geben willst und sie nicht mit Adapt To Type übergeben willst/kannst solltest Du diese nie in einen String verwandeln und dann als C String Pointer übergeben. Dann sucht nämlich LabVIEW beim Zürückkehren von der Funktion nach dem ersten NULL Byte im String und kappt denn String dort. Ein Cluster/struct hat fast immer irgendwo ein NULL Byte drin.
Wenn Du dagegen ein C Pointer zu einem Array of (unsigned) Bytes übergibst macht LabVIEW mit dem Pointer nichts weiter als ihn an die DLL Funktion zu übergeben und danach wieder mit der ursprünglichen Länge weiterzuverarbeiten, ob da jetzt NULL Bytes drin sind oder nicht.

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
01.02.2009, 09:00 (Dieser Beitrag wurde zuletzt bearbeitet: 01.02.2009 09:05 von rolfk.)
Beitrag #23

rolfk Offline
LVF-Guru
*****


Beiträge: 2.306
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
Picotech TC-08 Thermologger
' schrieb:Hi Jens,

dieses VI funktioniert auch, ist das get_unit_info.vi!

Was hier nun anderst ist, es werden noch die Variablen string_length und line übergeben, was so nicht in der Doku zur DLL stand.

TOLL!Grrr

Das funktioniert soweit auch, aber sobald nur ein paar mehr Dinge parallel im Program passieren, so stürzt LabVIEW weiterhin ab.

Nun habe ich im Taskmanager des Windows XP die Priorität der LabVIEW.exe auf höchste Priorität gesetzt.

So funktioniert es. Was kann man da dauerhaft machen?

Das kann auch gar nicht anders dann einen Crash geben. Schau Dir mal die CLN für die get_unit_info Funktion an. Dort übergibst Du der Funktion als zweiten Parameter einen leeren String. Ein leerer String ist aber ganz einfach ein Pointer auf einen Speicherbereich von 0 Bytes Länge. Als dritten Parameter gibst Du dann die Zahl 256 die als Namen string_length hat. Also gehe ich mal davon aus dass Du damit der DLL Funktion mitteilst hier hast Du einen String von 256 Bytes und bitte schreib mir da mal Deine Info rein. In Wirklichkeit gibst Du ihr aber einen Stringbuffer von 0 Bytes Länge. Die DLL kann nicht wissen dass Du sie verarscht hast und schreibt frisch fröhlich alles was sie zu sagen hat in den Speicher den der übergebene Pointer angibt bis zu der maximal angegeben Länge (oder weniger wenn sie nicht soviel zu sagen hat) und überschreibt Informationen in dahinterliegenden Speicherbereichen die von LabVIEW für anderweitige Zwecke verwendet werden.

Früher oder später versucht LabVIEW diese Informationen wieder zu interpretieren (zum Beispiel könnte es die Definition des Frontpanels enthalten die LabVIEW lesen muss wenn ein Neuzeichnen des Panels nötig ist). Die Information ist aber inzwischen durch die DLL zerstört und enthält aus Sicht von LabVIEW nur noch Mist, et voila -> Crash.

Wenn Du der DLL angibst dass Du da 256 Bytes als Buffer zur Verfügung stellst, musst Du diesen Buffer auch in LabVIEW explizit anlegen. So funktioniert nun einmal C Programmierung, wo der Aufrufer alle Speicherbereiche die von einer Funktion verwendet werden auch von irgendwo wiederverwenden oder anders selber anlegen muss. Zwar kann und wird LabVIEW dieses Memorymanagement für Dich automatisch erledigen solange Du in LabVIEW bleibst. Aber die DLL Schnittstelle hat keine Mechanismen die eine solche automatische Speicherverwaltung zuliesse und so bist Du da halt in der Situation des C Programmierers der sich um alle diese "Kleinigkeiten" selber kümmern muss.

Nun weisst Du endlich auch warum Du in LabVIEW programmierst und nicht in C! Lol

Wie macht man das in LabVIEW? Ganz einfach: Erzeuge mit "Initialize Array" ein Array of (unsigned) Bytes mit der nötigen Länge. Wenn Die DLL Funktion wirklich einen String zurückgibt dann konvertierst Du dieses Array mit der Byte Array To String Funktion noch in einen String und übergibst ihn als C String Pointer. Sonst kann man das Array auch gleich als C Array Pointer of unsigned Bytes übereben. Der einzige Unterwschied zwischen einem Parameter der als C String Pointer oder C Array Pointer übergeben wird ist dass LabVIEW bei einem C String Pointer nach der Rückkehr der DLL Funktion diesen String bis zur maximalen Länge auf ein NULL Byte absucht und den String bei erfolgreichem Fund auf diese Länge einkürzt.

Rolf Kalbermatter

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Datenerfassung mit Daqmx und dem Thermologger TC08 peder 4 6.620 11.08.2010 15:27
Letzter Beitrag: peder

Gehe zu: