Передайте диалоговые параметры S-функциям

О диалоговых параметрах

Можно передать параметры S-функции в начале и во время симуляции, с помощью поля S-параметров-функции диалогового окна Block Parameters. Такие параметры называются параметрами диалогового окна, чтобы отличить их от параметров периода выполнения, созданных S-функцией, чтобы упростить генерацию кода (см., Создают и Параметры периода выполнения S-функции Обновления).

Примечание

Вы не можете использовать Model Explorer, диалоговое окно S-function Block Parameters или маску, чтобы настроить параметры исходной S-функции, т.е. S-функции, которая имеет выходные параметры, но никакие входные параметры, в то время как симуляция запускается. Для получения дополнительной информации смотрите Мелодию и Эксперимент со Значениями Параметров блоков.

Используя диалоговые параметры S-функции C

Механизм Simulink® хранит значения параметров диалогового окна в S-функции структура SimStruct. Используйте методы коллбэка S-функции и макросы SimStruct, чтобы получить доступ и проверять параметры и использовать их, чтобы вычислить S-функцию вывод. Чтобы использовать диалоговые параметры в вашей S-функции C, выполните следующие шаги, когда вы создадите S-функцию:

  1. Определите порядок, в котором параметры должны быть заданы в диалоговом окне блока.

  2. В функции mdlInitializeSizes используйте макрос ssSetNumSFcnParams, чтобы сказать механизм Simulink, сколько параметров S-функция принимает. Задайте S в качестве первого аргумента и количества параметров диалогового окна в качестве второго аргумента. Если ваша S-функция реализует метод mdlCheckParameters, стандартная программа mdlInitializeSizes должна вызвать mdlCheckParameters, чтобы проверять валидность начальных значений параметров. Например, функция mdlInitializeSizes в sfun_runtime1.c начинается со следующего кода.

    ssSetNumSFcnParams(S, NPARAMS);  /* Number of expected parameters */
    #if defined(MATLAB_MEX_FILE)
        if (ssGetNumSFcnParams(S) == ssGetSFcnParamsCount(S)) {
            mdlCheckParameters(S);
            if (ssGetErrorStatus(S) != NULL) {
                return;
            }
        } else {
            return; /* Parameter mismatch reported by the Simulink engine*/
        }
    #endif
  3. Доступ к параметрам диалогового окна в S-функции с помощью макроса ssGetSFcnParam.

    Задайте S в качестве первого аргумента, и относительное положение параметра в списке ввело в диалоговое окно (0, первое положение) в качестве второго аргумента. Макрос ssGetSFcnParam возвращает указатель на mxArray, содержащий параметр. Можно использовать ssGetDTypeIdFromMxArray, чтобы получить тип данных параметра. Также можно использовать ssGetSFcnParamDataType, чтобы получить тип данных параметра путем определения индекса параметра.

    Например, в sfun_runtime1.c, следующие операторы #define в начале S-функции задают порядок трех параметров диалогового окна и получают доступ к их значениям на диалоговом окне блока.

    #define SIGNS_IDX 0
    #define SIGNS_PARAM(S) ssGetSFcnParam(S,SIGNS_IDX) /* First parameter */
    
    #define GAIN_IDX  1
    #define GAIN_PARAM(S) ssGetSFcnParam(S,GAIN_IDX) /* Second parameter */
    
    #define OUT_IDX   2
    #define OUT_PARAM(S) ssGetSFcnParam(S,OUT_IDX) /* Third parameter */

При выполнении симуляции необходимо задать параметры в поле S-параметров-функции диалогового окна S-Function Block Parameters в том же порядке, что вы задали их на шаге 1. Можно ввести любое допустимое выражение MATLAB® как значение параметра, включая литеральные значения, имена переменных рабочей области, вызовов функции или арифметических выражений. Механизм Simulink выполняет выражение и передает его значение S-функции.

Как другой пример, следующий код является частью S-функции драйвера устройства. Используются четыре входных параметра: BASE_ADDRESS_PRM, GAIN_RANGE_PRM, PROG_GAIN_PRM и NUM_OF_CHANNELS_PRM. Код использует операторы #define во главе S-функции, чтобы сопоставить конкретные входные параметры с названиями параметра.

/* Input Parameters */
#define BASE_ADDRESS_PRM(S)     ssGetSFcnParam(S, 0)
#define GAIN_RANGE_PRM(S)       ssGetSFcnParam(S, 1)
#define PROG_GAIN_PRM(S)        ssGetSFcnParam(S, 2)
#define NUM_OF_CHANNELS_PRM(S)  ssGetSFcnParam(S, 3)

При выполнении симуляции введите четыре имен переменных или значения в поле S-параметров-функции диалогового окна S-Function Block Parameters. Первое соответствует первому ожидаемому параметру, BASE_ADDRESS_PRM(S). Второе соответствует следующему ожидаемому параметру и так далее.

Функция mdlInitializeSizes содержит этот оператор.

ssSetNumSFcnParams(S, 4);

Настраиваемые параметры

Диалоговые параметры могут быть или настраиваемыми или ненастраиваемыми. Настраиваемый параметр является параметром, который может изменить пользователь, в то время как симуляция запускается.

Примечание

Параметры диалогового окна являются настраиваемыми по умолчанию. Тем не менее, это - хорошая методика программирования, чтобы установить приспособляемость каждого параметра, даже те, которые являются настраиваемыми. Если вы включаете диагностике симуляции S-function upgrades needed, механизм Simulink выпускает диагностику каждый раз, когда это сталкивается с S-функцией, которой не удается задать приспособляемость всех ее параметров.

Метод mdlCheckParameters позволяет вам подтвердить изменения в настраиваемых параметрах во время симуляции. Механизм вызывает метод mdlCheckParameters каждый раз, когда вы изменяете значения параметров во время цикла симуляции. Этот метод должен проверять параметры диалогового окна S-функции, чтобы гарантировать, что изменения допустимы.

Дополнительный метод коллбэка mdlProcessParameters позволяет S-функции обрабатывать изменения в настраиваемых параметрах. Механизм вызывает этот метод, только если допустимые изменения параметра произошли в предыдущем временном шаге. Типичное использование этого метода должно выполнить вычисления, которые зависят только от значений параметров и следовательно должны быть вычислены только, когда значения параметров изменяются. Метод может кэшировать результаты вычислений параметра в векторах работы или, предпочтительно, как параметры периода выполнения (см., Создают и Параметры периода выполнения S-функции Обновления).

Используя настраиваемые параметры в S-функции C

В S-функции C используйте макро-ssSetSFcnParamTunable в mdlInitializeSizes, чтобы задать приспособляемость каждого параметра диалогового окна S-функции. Код ниже взят из функции mdlInitializeSizes в примере sfun_runtime1.c. Код сначала определяет номер параметров диалогового окна S-функции к три прежде, чем вызов mdlCheckParameters. Если проверка параметра передает, приспособляемость трех параметров диалогового окна S-функции задана.

 ssSetNumSFcnParams(S, 3); /* Three dialog box parameters*/

 #if defined(MATLAB_MEX_FILE)
    if (ssGetNumSFcnParams(S) == ssGetSFcnParamsCount(S)) {
        mdlCheckParameters(S);
        if (ssGetErrorStatus(S) != NULL) {
            return;
        }
    } else {
        return; /* Parameter mismatch reported by the Simulink engine*/
    }
 #endif

 ssSetSFcnParamTunable(S,GAIN_IDX,true);   /* Tunable */
 ssSetSFcnParamTunable(S,SIGNS_IDX,false); /* Not tunable */
 ssSetSFcnParamTunable(S,OUT_IDX,false);   /* Not tunable */

Примечание

Стандартная программа mdlInitializeSizes S-функции вызывает метод mdlCheckParameters, чтобы гарантировать, что начальные значения параметров допустимы.

Настройка параметров в режиме external mode

Когда вы настройки параметров во время симуляции, механизм Simulink вызывает S-функцию метод mdlCheckParameters, чтобы подтвердить изменения и затем метод mdlProcessParameters S-функций, чтобы дать S-функции шанс обработать параметры в некотором роде. Механизм также вызывает эти методы при выполнении в режиме external mode, но это передает необработанные изменения в цели S-функции. Таким образом, если важно, чтобы ваш параметр процесса S-функции изменился, необходимо создать файл Компилятора выходного языка (TLC), который встраивает S-функцию, включая ее код обработки параметра, во время процесса генерации кода. Для получения информации о встраивании S-функций см. “S-функции Встраивания” в документации Компилятора Выходного языка Simulink Coder™.

Смотрите также

Похожие темы