10.01.2006, 16:06
Hallo an alle,
Ich weiß, dass diese Frage schon öfters gestellt wurde - bin ich aus keiner der gegebenen antworten wirklich schlau geworden.
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
Ich weiß, dass diese Frage schon öfters gestellt wurde - bin ich aus keiner der gegebenen antworten wirklich schlau geworden.
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