C++ 在matlab中编译代码时,如何访问实时工具的内核文件ttnetwork.cpp中的svalue[10800]数组?
该工具出现在以下链接中。内核目录中有一个文件ttkernel.cpp,我根据examples/networked/c++/controller_init.cpp中的svalue[]矩阵做出了一些决定C++ 在matlab中编译代码时,如何访问实时工具的内核文件ttnetwork.cpp中的svalue[10800]数组?,c++,arrays,matlab,C++,Arrays,Matlab,该工具出现在以下链接中。内核目录中有一个文件ttkernel.cpp,我根据examples/networked/c++/controller_init.cpp中的svalue[]矩阵做出了一些决定 嗯?你是在问如何将变量传递给函数吗?您是否在询问如何将变量传递给函数? #define S_FUNCTION_NAME controller_init #include "ttkernel.cpp" double svalue[10800]; int k=0; struct PD_Data {
嗯?你是在问如何将变量传递给函数吗?您是否在询问如何将变量传递给函数?
#define S_FUNCTION_NAME controller_init
#include "ttkernel.cpp"
double svalue[10800];
int k=0;
struct PD_Data {
// ctrl params
double K, Td, N, h, ad, bd;
// ctrl states
double yold, Dold, u;
};
// Kernel data strucutre
struct Kernel_Data {
struct PD_Data *pddata;
double *dummydata;
};
// controller code function
double controller_code(int seg, void *data)
{
double *msg;
double r, y, P, D;
PD_Data* d = (PD_Data*) data;
switch(seg) {
case 1:
msg = (double*) ttGetMsg(); // get sensor value
if (msg != NULL) {
y = *msg;
svalue[k++]=y;
delete msg; // delete message
} else {
mexPrintf("Error in controller: no message received!\n");
y = 0.0;
}
r = ttAnalogIn(1);
P = d->K*(r-y);
D = d->ad*d->Dold + d->bd*(d->yold-y);
d->u = P + D;
d->Dold = D;
d->yold = y;
return 0.0005;
default:
msg = new double;
*msg = d->u;
ttSendMsg(1, msg, 80); // Send 80 bits to node 1 (actuator)
return FINISHED;
}
}
void init() {
// Initialize TrueTime kernel
ttInitKernel(prioDM); // deadline-monotonic scheduling
// Allocate kernel data and store pointer in UserData
Kernel_Data *kdata = new Kernel_Data;
ttSetUserData(kdata);
// Read the input argument from the block dialogue
mxArray *initarg = ttGetInitArg();
if (!mxIsDoubleScalar(initarg)) {
TT_MEX_ERROR("The init argument must be a number!\n");
return;
}
// Create task data (local memory)
PD_Data *data = new PD_Data;
kdata->pddata = data;
data->h = 0.010;
data->K = 1.0;
data->Td = 0.04;
data->N = 100.0;
data->ad = data->Td/(data->N*data->h+data->Td);
data->bd = data->N*data->K*data->ad;
data->yold = 0.0;
data->Dold = 0.0;
data->u = 0.0;
// Sporadic controller task, activated by arriving network message
double deadline = data->h;
ttCreateTask("controller_task", deadline, controller_code, data);
ttAttachNetworkHandler("controller_task");
}
void cleanup() {
Kernel_Data *kdata = (Kernel_Data *)ttGetUserData();
delete kdata->pddata;
delete kdata;
}