LabVIEWForum.de - dll in LabVIEW - dringend!!

LabVIEWForum.de

Normale Version: dll in LabVIEW - dringend!!
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo an alle,

Ich weiß, dass diese Frage schon öfters gestellt wurde - bin ich aus keiner der gegebenen antworten wirklich schlau geworden.Sad
Also mein Problem im Detail: Ich versuche ein Matlabprogramm in LabVIEW einzubinden - da ich unabhängig von Matlab agieren wollte, habe ich mich für eine DLL entschieden die über eine Call Libary Function Node eingefügt werden soll.
Für den Anfang habe ich mit einem einfachen Programm begonnen und wenn ich die DLL im LabVIEW erstelle sieht, dass ganze so aus:

/* Call Libary Source File */

#include "extcode.h"

_declspec (dllexport) long avg_num(float a[], long size, float *avg);

_declspec (dllexport) long avg_num(float a[], long size, float *avg)
{
int i;
float sum = 0;
if (a != NULL)
{
for(i=0;i < size; i++)
sum = sum + a[i];
}
else
return (1);
*avg = sum / size;
return (0);
}

und funktioniert super.
Wenn ich, dass ganze als Matlabprogramm schreibe:
function [avg] = avgnum(a)
a = input('Please enter an array')
size = length(a)
sum = 0
for i = size
sum = sum + a(i)
avg = sum / size
end

und dann compile finde ich folgendes:
/*
* MATLAB Compiler: 4.1 (R14SP1)
* Date: Tue Jan 10 14:20:25 2006
* Arguments: "-B" "macro_default" "-l" "avgnum"
*/

#include <stdio.h>
#include "avgnum.h"


static HMCRINSTANCE _mcr_inst = NULL;


#if defined( _MSC_VER) || defined(__BORLANDC__) || defined(__WATCOMC__) || defined(__LCC__)
#include <windows.h>

static char path_to_dll[_MAX_PATH];

BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, void *pv)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
char szDllPath[_MAX_PATH];
char szDir[_MAX_DIR];
if (GetModuleFileName(hInstance, szDllPath, _MAX_PATH) > 0)
{
_splitpath(szDllPath, path_to_dll, szDir, NULL, NULL);
strcat(path_to_dll, szDir);
}
else return FALSE;
}
else if (dwReason == DLL_PROCESS_DETACH)
{
}
return TRUE;
}
#endif
static int mclDefaultPrintHandler(const char *s)
{
return fwrite(s, sizeof(char), strlen(s), stdout);
}

static int mclDefaultErrorHandler(const char *s)
{
int written = 0, len = 0;
len = strlen(s);
written = fwrite(s, sizeof(char), len, stderr);
if (len > 0 && s[ len-1 ] != 'n')
written += fwrite("n", sizeof(char), 1, stderr);
return written;
}

bool avgnumInitializeWithHandlers(
mclOutputHandlerFcn error_handler,
mclOutputHandlerFcn print_handler
)
{
if (_mcr_inst != NULL)
return true;
if (!mclmcrInitialize())
return false;
if (!mclInitializeComponentInstance(&_mcr_inst, __MCC_avgnum_public_data,
__MCC_avgnum_name_data,
__MCC_avgnum_root_data,
__MCC_avgnum_session_data,
__MCC_avgnum_matlabpath_data,
__MCC_avgnum_matlabpath_data_count,
__MCC_avgnum_classpath_data,
__MCC_avgnum_classpath_data_count,
__MCC_avgnum_mcr_runtime_options,
__MCC_avgnum_mcr_runtime_option_count,
true, NoObjectType, LibTarget,
path_to_dll, error_handler,
print_handler))
return false;
return true;
}

bool avgnumInitialize(void)
{
return avgnumInitializeWithHandlers(mclDefaultErrorHandler,
mclDefaultPrintHandler);
}

void avgnumTerminate(void)
{
if (_mcr_inst != NULL)
mclTerminateInstance(&_mcr_inst);
}


void mlxAvgnum(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[])
{
mclFeval(_mcr_inst, "avgnum", nlhs, plhs, nrhs, prhs);
}

void mlfAvgnum(int nargout, mxArray** avg, mxArray* a)
{
mclMlfFeval(_mcr_inst, "avgnum", nargout, 1, 1, avg, a);
}

und damit kann weder LabVIEW noch ich etwas anfange.
Also falls mir vielleicht irgendwer wirklich konkret erklären könnte was ich falsch mache oder was ich mache muß, damit LabVIEW, das compilte Matlab file versteht wäre echt super.

lg
ALex
Hi Alex

Wenn ich dich richtig verstanden habe willst du dein matlab script oder function nicht über activex - matlaber server ausführen, sondern als compiliertes exec, sprich dll.
Jetzt ist mir nicht ganz klar warum, wenn du dein script compilierst, dann wieder C code erhälst ? eigentlich solltest du dann eine dll bekommen ?.
Ein weiteres problem wirts wahrscheinlich werden, wenn du daten an matlab (dll) übergeben willst, da die datenorganisation also wie zB. Structs in LabVIEW speichermäßig abgebildet werden, sich von der in matlab unterscheidet !!.
Außerdem mußt du darauf achten das du trotz dll noch immer die "runtime von matlab" also die grundlegenden functionen brauchst.

Hast du LabVIEW 8 ? da gibs jetzt einen neuen Scriptinghost der ziemlich ähnlich :-) den matlab scripting host ist. !!!!!

hoffe ich hab dir ein bissl weiterhelfen können.

lg Mario
Hallo Mario,

danke für die schnelle Antwort.

also eigentlich bekomme ich ja eine DLL wenn das Matlab script compile - aber die DLL die ich mit dem Matlab compiler erhalten habe funktioniert im LabVIEW eben nicht - weils da scheinbar ja kommunikationsprobleme gibt ( wie du auch angemerkt habe). Leider habe ich- muß ich zugeben noch nie mit DLL gearbeitet und habe auch keine Ahnung von C/C++. Sad
Eigentlich habe ich nach einer Möglichkeit gesucht, die MAtlab DLL umzuschreiben damit sie LabVIEW funktionier.
Aber es scheint als bin ich da nicht den richten Weg gegangen - oder kannst du mir einen Tip geben wie ich die Matlab DLL in LabVIEW verwenden kann :?:
Denn alle Informationen, die ich bisher gefunden habe waren sehr sehr allgemein und haben, dass Problem meist nur sehr grob umrissen.

Ich verwende im Moment LabVIEW 7.1 (habe aber prinzipell LabVIEW 8, habs nur noch nicht installiert, da ichs erst bekommen habe).
Welchen Vorteil hat der neue Scirpting host??

lg
Alex
Hallo an alle noch einmal,

danke an Mario für den Link. Hat mir aber leider nur teilweise weitergeholfen - das Programm läuft einfach nicht, obwohl die Syntax stimmt - auch der Support scheint sich daran die Zähne auszubeißen.
Also vielleicht hat irgendwer eine andere Idee wie ich ein matlab file (Differential glg sys) in mein LabVIEW programm integrieren könnte :?: . - Bin leider nicht wirklich ein advanced user Cry.

danke an alle Big Grin,
Alex
Referenz-URLs