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!
Ich probiere grade eine kleine in Delphi 7 geschriebene DLL in LabVIEW zum laufen zu bringen. Die DLL soll nur eine eingegebene Zahl mit 3 multiplizieren und dann wieder ausgeben.
Wenn ich in der "Call Library Funktion" unter "Calling Conventions" "C" eingestellt habe, gibt LabVIEW die in die DLL eingegebene Zahl wieder aus, ohne die Multiplikation durchzuführen.
Wenn ich unter "Calling Conventions" "stdCall (WinAPI)" einstelle, bekomme ich eine Fehlermeldung.
Hab das ganze noch nicht verstanden. Vieleicht funktioniert die Delphi DLL ja nicht unter LabVIEW?
Ich habe meine DLL dementschprechend geändert und bekomme keine Fehlermeldung mehr wenn ich in meinem Multi.vi die Option stdcall verwende. Aber ich habe immer noch den Effekt, dass die Zahl, die ich in die DLL schiebe, scheinbar unverändert wieder herraus kommt.
Leider kann ich mit meinem LabVIEW 7.0 deine Datei nicht öffnen. Vielleicht kannst du die Datei nochmal für mein LV speichern oder ein Bild von der Änderung einstellen. Ich wäre dir sehr dankbar!
Aber Danke erstmal für deine Mühe!
Gruß an alle!
26.10.2006, 19:30 (Dieser Beitrag wurde zuletzt bearbeitet: 26.10.2006 19:30 von IchSelbst.)
' schrieb:Aber ich habe immer noch den Effekt, dass die Zahl, die ich in die DLL schiebe, scheinbar unverändert wieder herraus kommt.
Stimmt. Du musst ja den Wert "Ausgabe-Parameter" benutzen anstelle des durchgereichten MULTI. "Ausgabe-Parameter" ist der Wert der Funktion, "MULTI" wäre eine Rückgabe "by Reference".
Zitat:Leider kann ich mit meinem LabVIEW 7.0 deine Datei nicht öffnen.
Du kannst dich ja mal bei NI beschweren.
; Passt das jetzt?
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Ja schönen Dank, jetzt habe ich gesehen, wie das hier funktioniert!
Aber wie sieht das aus, wenn man mehrere Funktionen in einer DLL nutzt oder diese eine Funktion mehrmals, dann kann ja nicht alles aus diesem Ausgabe Parameter heraus purzeln. Dann geht doch alles durcheinander.
Aber mit NI hast du recht, die LV 7.0 und 7.1 liegen für mich nicht so weit auseinander. Da sollten eigentlich alle Datein der Version 7 geöffnet werden können. Aber so wollen die wahrscheinlich ihr Geld verdienen.
Aber alles habe ich leider immer noch nicht verstanden. Hier eine Beispieldatei, in der ich die Funktion Multi zwei mal verwenden möchte. So wie sie jetzt ist, bekome ich keine Werte herraus. Wenn ich bei den multis von Value auf Pointer stelle gibt es einen Programmabsturz.
Ich hoffe ich nerve dich nicht zu sehr und du kannst mir nochmal weiterhelfen?
Aber wie grade merkte, habe ich Probleme mit meinem Rechner. Als ich dein Programm ausführen wollte, ist LV abgestürzt, wie bei meinen Programmierversuchen auch. Jetzt habe ich mal die LV Trial auf einen anderen PC installiert und siehe da, dein Programm geht.
Da muss ich jetzt erstmal meinen Rechner auseinandernehmen.
ich bin mal wieder auf Probleme gestoßen. Diesmal versuche ich ein Array in einer DLL zu erzeugen und die Daten des Array an LabVIEW zu übergeben.
Der Code in Delphi sieht so aus:
type DArray = array of Integer;
Function arrdll(laenge: Integer; Var arr: DArray):integer; stdcall; export;
var i,n: Integer;
begin
n:=laenge;
SetLength(arr, n);
for i:=0 to n do
begin
arr[i]:=i+3;
end;
end;
Exports
arrdll;
Dabei sollte folgendes passieren: Von LabVIEW übergebe ich einen Wert, der die Göße des Arrays angibt, bei mir im Programm "Arraylaenge" genannt. In der DLL wird dann ein Array dieser Größe erzeugt, und mit Daten aufgefüllt (hier i+3). Die Daten des Arrays sollen anschließend an LabVIEW übergeben werden.
Folgendes passiert dann:
(1) Der erste Wert in der Schleife der DLL ist i:=0. D.h. müsste dann arr[i];=i+3 =0+3=3 sein. Im Ausgabearray in LV erscheint aber der Wert 4.
(2) Im Ausgabearray sind beim ersten Durchlauf schon drei Felder initialisiert mit diesen Werten (4,0,0). Warum?
(3) Erhöht man die "Arraylaenge" werden die drei initialisierten Felder gefüllt (4,5,6). Bei weiterer Erhöhung der Arraylänge, werden keine anderen Werte mehr ausgegeben.
Der Sinn dieser ganzen Aktion ist der, dass in der DLL von einer Messkarte Daten erzeugt werden sollen, die in einem Array gespeichert werden. Parameter für die Messung sollen vom LV an die DLL übergeben werden und die Messdaten von der DLL zu LV.
Ich habe da wohl noch ein paar grundlegende Probleme mit LV und den Parametereinstellungen zur DLL. Leider habe ich in der Uni Bibo keine entsprechende Literatur für diese probleme gefunden. Ich hoffe man kann mir hier noch weiterhelfen
Meine Dateien hänge ich mit an. Bie mir läuft LV 7.0 und Delphi 7.
Schönen Gruß!