Wie kann ich eine S-Funktion in Simulink mit einem Eingangsport erstellen, der ein 2D-Array ist?

Wie kann ich eine S-Funktion in Simulink mit einem Eingangsport erstellen, der ein 2D-Array ist?


Ich versuche, eine S-Funktion in Simulink mit dem S-Function-Builder zu erstellen, der ein 2D-Array als Eingabe akzeptiert. In den Eingabeports gebe ich die Dimensionen an:2d, Zeilen:4, Spalten:4. Wenn ich versuche, mit f[x][y] auf den Eingabeport zuzugreifen, wird ein Fehler ausgegeben:"Fehler C2109:Index erfordert Array oder Zeiger type", für die Zeilen, in denen der Eingangsport angesprochen wird.


Wie kann ich eine S-Funktion in Simulink mit einem Eingangsport erstellen, der ein 2D-Array ist?


Relevanter Code:


static void mdlInitializeSizes(SimStruct *S)
{
DECL_AND_INIT_DIMSINFO(inputDimsInfo);
DECL_AND_INIT_DIMSINFO(outputDimsInfo);
ssSetNumSFcnParams(S, NPARAMS);
if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
return; /* Parameter mismatch will be reported by Simulink */
}
ssSetNumContStates(S, NUM_CONT_STATES);
ssSetNumDiscStates(S, NUM_DISC_STATES);
if (!ssSetNumInputPorts(S, NUM_INPUTS)) return;
/*Input Port 0 */
inputDimsInfo.width = INPUT_0_WIDTH;
ssSetInputPortDimensionInfo(S, 0, &inputDimsInfo);
ssSetInputPortMatrixDimensions( S ,0, INPUT_0_WIDTH, INPUT_DIMS_0_COL);
ssSetInputPortFrameData(S, 0, IN_0_FRAME_BASED);
ssSetInputPortDataType(S, 0, SS_DOUBLE);
ssSetInputPortComplexSignal(S, 0, INPUT_0_COMPLEX);
ssSetInputPortDirectFeedThrough(S, 0, INPUT_0_FEEDTHROUGH);
ssSetInputPortRequiredContiguous(S, 0, 1); /*direct input signal access*/
if (!ssSetNumOutputPorts(S, NUM_OUTPUTS)) return;
ssSetNumSampleTimes(S, 1);
ssSetNumRWork(S, 0);
ssSetNumIWork(S, 0);
ssSetNumPWork(S, 0);
ssSetNumModes(S, 0);
ssSetNumNonsampledZCs(S, 0);
/* Take care when specifying exception free code – see sfuntmpl_doc.c */
ssSetOptions(S, (SS_OPTION_EXCEPTION_FREE_CODE |
SS_OPTION_USE_TLC_WITH_ACCELERATOR |
SS_OPTION_WORKS_WITH_CODE_REUSE));
}

In mdlOuputs Ich versuche, f zu behandeln (der Port) als normales Array.
Beispiel:


x=f[0][0];

Dies löst den Fehler aus.


Edit:
Na ja, hab es irgendwie herausgefunden.


Sie stellen die Portdimensionen gemäß den Eingabeparametern ein, dann können Sie die Werte mit f[x*xw+y] ansprechen, wobei x und y die x- und y-Positionen (beginnend mit 0) und xw die Anzahl der Spalten sind.


Habe noch keinen besseren Weg gefunden, aber dieser funktioniert.


Antworten:


Ich vermute, dass der S-Function-Builder Code generiert, der wie folgt in mdlOutputs aussieht :


real_T *y0 = (real_T *)ssGetOutputPortSignal(S, 0);
// OR
real_T *y0 = ssGetOutputPortRealSignal(S, 0);

Mit entweder Zeile y0 ist ein Zeiger auf ein 1-D-Array. Wenn Sie also versuchen, mit 2 Indizes darauf zuzugreifen, als wäre es ein 2-D-Array, beschwert sich der Compiler.


Sie können dies beheben, indem Sie die 2-D-Indexierung in eine lineare Indexierung ändern, während Sie in der Bearbeitung gepostet haben. Dies funktioniert einwandfrei, tatsächlich müsste der Compiler dies sowieso hinter den Kulissen tun, wenn Sie mit 2 Indizes in ein 2-D-Array indizieren.


Die andere Möglichkeit besteht darin, den Rückgabewert von ssGetInputPortSignal umzuwandeln (oder ssGetInputPortRealSignal ) zu einem Zeiger auf Zeigertyp .


real_T **y0 = (real_T **)ssGetOutputPortSignal(S, 0);
y0[1][1] = 0;