S-функция Уровень 2 C Simulink (R2006b), Получение строки из параметра - PullRequest
0 голосов
/ 07 октября 2019

Я не нахожу способ получить строку, указанную в диалоговом окне блока S-функции (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 =% х \ п», * mxGetPr (DVC_IND_NO (S)));123.

Спасибо, с наилучшими пожеланиями.

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Добавьте следующее вверху

#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]!='\0')
{
ssPrintf("%c",str[i]);
i++;
}
0 голосов
/ 07 октября 2019

mxGetPr возвращает указатель на double, поэтому не имеет смысла, если параметр является массивом char. И при использовании *mxGetPr вы говорите, что хотите указать значение, на которое указывает указатель (т. Е. Первый элемент, если он является многоэлементным double массивом), поэтому вы получаете только первое значение.

Если ожидается, что ввод будет строкой (т. Е. Массивом char), тогда вы должны использовать mxArrayToString для доступа к нему.

В любом случае, вы определенно должны бытьиспользование вспомогательных функций, таких как mxIsChar и mxIsDouble , для проверки типа данных перед использованием соответствующей функции для доступа к данным.

...