LabVIEWForum.de
Delphi DLL in LabVIEW - 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: Delphi DLL in LabVIEW (/Thread-Delphi-DLL-in-LabVIEW)

Seiten: 1 2


Delphi DLL in LabVIEW - brenner2305 - 26.10.2006 12:32

[attachment=3771]
Hallo Leute!

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?

Danke schonmal für eure Hilfe!

Ich leg alle Dateien gezippt mit bei.


Delphi DLL in LabVIEW - IchSelbst - 26.10.2006 15:44

' schrieb:Vieleicht funktioniert die Delphi DLL ja nicht unter LabVIEW?
Die Schnittstelle einer DLL ist normiert - das muss gehen.

Im Delphi-Sourcecode ergänzt du folgendes:

Code:
Function Multipli(num : Integer):integer; far; stdcall; export;

Und das VI sieht so aus:


Delphi DLL in LabVIEW - brenner2305 - 26.10.2006 17:56

Vielen Dank für die Tipps!

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!


Delphi DLL in LabVIEW - IchSelbst - 26.10.2006 19:30

' 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. Tongue
; Passt das jetzt?


Delphi DLL in LabVIEW - brenner2305 - 27.10.2006 08:38

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.

Schönen Gruß!


Delphi DLL in LabVIEW - IchSelbst - 27.10.2006 09:41

' schrieb:Aber wie sieht das aus, wenn man mehrere Funktionen in einer DLL nutzt
Wenn du mehrere Funktionen hast - dann benutze sie halt. In Delphi stehen dann halt mehrere Funktionen im Sourcecode, so in der Art
Code:
function F1(parameter): type; stdcall; export;
function F2(parameter): type; stdcall; export;
function F3(parameter): type; stdcall; export;
In LV musst du dann in dem entsprechenden Auswahlfeld - dort, wo jetzt nur Multipl drinnen steht - die entsprechende auswählen: F1, F2 oder F3.

Zitat:oder diese eine Funktion mehrmals dann kann ja nicht alles aus diesem Ausgabe Parameter heraus purzeln.
Du meinst also: Durch den Aufruf einer einzigen Funktion mehrere Werte bekommen. Das entspricht dann quasi einem VI mit mehreren Ausgängen.

In Delphi benötigst du den VAR-Parameter (in C++ den *):
[code]function Multipli(VAR MAL: integer): integer; stdcall; export;
begin


Delphi DLL in LabVIEW - brenner2305 - 27.10.2006 12:56

Danke erstmal für die Infos!

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?

Schönen Gruß!

[attachment=3791]


Delphi DLL in LabVIEW - IchSelbst - 27.10.2006 16:56

' schrieb:in der ich die Funktion Multi zwei mal verwenden möchte.
Du verwendest die Funktion nicht zweimal - sondern: Du hat eine Funktion, von der du zwei Werte zurückbekommen willst.

Zitat:Wenn ich bei den multis von Value auf Pointer stelle gibt es einen Programmabsturz.
Is' ja klar: Du musst natürlich die DLL anpassen.

Guckst du hier:


Delphi DLL in LabVIEW - brenner2305 - 28.10.2006 12:10

Schönen Dank für das Beispiel!

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

Schönes WE und danke für die Hilfe!


Delphi DLL in LabVIEW - brenner2305 - 06.11.2006 13:57

[attachment=3897]

Hallo,

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