Я пытаюсь использовать векторы PWork в пользовательской S-функции. Я надеюсь использовать их для хранения указателя на DLL, которую мне нужно использовать.
В моем mdlInitializeSizes у меня есть:
ssSetNumPWOrk(S,1);
В mdlRTW у меня есть:
static void mdlRTW(SimStruct *S)
{
if(!ssWrteRTWWorkVect(S, "PWork",1,"PworkDLL",1)) {
return; /*An error will be reported by SL*/
}
}
В mdlStart:
#define MDL_START
void mdlStart(SimStruct *S){
real_T *xD = ssGetDiscStates(S);
HINSTANCE dllptr = LoadLibrary("TactorInterface.dll");
void **Pwork = ssGetPWork(S);
Pwork[0] = dllptr;
//ssSetPWorkValue(S,0,dllptr);
WritetoVibrotactor_Start_wrapper(xD,Pwork);
}
Мне нужно также реализовать этот PWork в файле .tlc, но я не знаю, как это сделать правильно. Похоже, не так много документации или примеров того, как сделать это правильно. У меня есть это до сих пор в файле .tlc:
%%Function: Start ========================================================
%function Start(block, system) Output
/* S-Function "WritetoVibrotactor_wrapper" Block: %<Name> */
%assign pxd = LibBlockDWorkAddr(DSTATE, "", "", 0)
%assign pwd = LibBlockPWork(PworkDLL, "", "", 0)
WritetoVibrotactor_Start_wrapper(%<pxd>,%<pwd>);
%%
%endfunction
В моей функции-обертке:
void WritetoVibrotactor_Start_wrapper(real_T *xD, void *Pwork)
{
HINSTANCE hGetProcIDDLL;
hGetProcIDDLL = (HINSTANCE)Pwork[0];
// void * hGetProcIDDLL = LoadLibrary("TactorInterface.dll");
InitializeFn _InitializeTI =
(InitializeFn)GetProcAddress(hGetProcIDDLL,"InitializeTI");
//other stuff...
}
Если я пытаюсь построить модель, я получаю неопределенный идентификатор PworkDLL в файле .tlc.
Задача ещё не решена.
Других решений пока нет …