S-Function Level 2 C Simulink (R2006b),从参数中获取字符串

S-function Level 2 C Simulink (R2006b) , Getting string from parameter

我找不到方法来获取在 S-Function(C,级别 2)块的对话框中指定的字符串并将其保存在与该块对应的 .c 文件内的变量中。

通过*mxGetPr(ssGetSFcnParam(S, 0))只能得到字符串中第一个位置的值。 在对话框块中输入的参数与 ssGetSFcnParam(S, 0) 相关的是“123”。 在块的封装编辑器中,类型为 'edit'.

#define S_FUNCTION_NAME ver_file_data
#define S_FUNCTION_LEVEL 2
#define NPARAMS 14
#define DVC_TYPE(S) ssGetSFcnParam(S, 0)

static void mdlInitializeSizes(SimStruct *S){
    DECL_AND_INIT_DIMSINFO(outputDimsInfo);
    ssSetNumSFcnParams(S, NPARAMS);  /* Number of expected parameters */


ssSetSFcnParamTunable(S, 0, 0);
ssSetSFcnParamTunable(S, 1, 0);

#if defined(MATLAB_MEX_FILE)  if (ssGetNumSFcnParams(S) == ssGetSFcnParamsCount(S)) {
  mdlCheckParameters(S);
  if (ssGetErrorStatus(S) != NULL) {
      return;
  }    } else {
 return;   }
#endif

ssSetNumContStates(S, 0);
ssSetNumDiscStates(S, 0);

if (!ssSetNumInputPorts(S, NUM_INPUTS)) return;

if (!ssSetNumOutputPorts(S, NUM_OUTPUTS)) return;
/* Output Port 0 */
ssSetOutputPortWidth(S, 0, 1);
ssSetOutputPortDataType(S, 0, SS_UINT8);


ssSetNumSampleTimes(S, 1);
ssSetNumRWork(S, 0);
ssSetNumIWork(S, 0);
ssSetNumPWork(S, 0);
ssSetNumModes(S, 0);
ssSetNumNonsampledZCs(S, 0);
}

static void mdlInitializeSampleTimes(SimStruct *S){
    ssSetSampleTime(S, 0, -1);
    ssSetOffsetTime(S, 0, 0.0);
}

static void mdlOutputs(SimStruct *S, int_T tid){
    ssPrintf("DVC_IND_NO = %x\n",*mxGetPr(DVC_IND_NO(S)));
}

mdlRTW (SimStruct *S){

}

在通过输出端口获取任何内容之前,我希望能够使用 ssPrintf("DVC_IND_NO = %x\n",*mxGetPr(DVC_IND_NO(S))); 打印123.

谢谢,最诚挚的问候。

mxGetPr returns 指向 double 的指针,因此如果参数是 char 数组则没有任何意义。在使用 *mxGetPr 时,你是说你想要指向的值(即第一个元素,如果它是一个多元素 double 数组),这就是为什么你只得到第一个值。

如果输入应该是一个字符串(即 char 的数组),那么您应该使用 mxArrayToString 来访问它。

无论哪种方式,在使用适当的函数访问数据之前,您绝对应该使用 mxIsChar and mxIsDouble 等辅助函数来检查数据类型。

在顶部添加以下内容

#define DVC_IND_NO(S) = ssGetSFcnParam(S,0)

以及您的 mdlOutputs 中的以下内容

char* str;
int i = 0;
str = mxArrayToString(DVC_IND_NO(S));
ssPrintf("DVC_IND_NO = ");
while (str[i]!='[=11=]')
{
ssPrintf("%c",str[i]);
i++;
}